暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker容器安全

运维DevOps 2024-04-20
54

Linux内核中的Capabilities特性用于划分特权集,以便进程可以只分配“执行特定功能”的特权

在引入此特性前,如果进程需要使用网络,则必须使用root来运行,通常是sudo或者添加suid,那么普通用户在使用ping时,ping就可以运行任何特权功能。引入Capabilities特性后,可以通过给ping应用添加NET_RAW特权集,使其具有使用网络的特权集,而不具备其他特权集。缺省ping具有cap_net_admin和cap_net_raw特权集,通过getcat命令查看,如图:

可通过查看进程状态,来获取当前进程的特权集,如图:

通过capsh来解码得到具体的特权集,如下:

    [root@db ~]# capsh --decode=00000000a80425fb
    0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap

    Docker也是支持capabilities的,在运行容器的时候如果指定了–privileged参数将会开启容器的所有CAP,如果不使用–privileged,那么可以通过–cap-add和–cap-drop这两个参数来调整,常用特权集如下:

    特权集权限
    chown修改文件所有者权限
    dac_override忽略文件的DAC访问限制
    dac_read_search忽略文件读及目录搜索的DAC访问限制
    fowner忽略文件属主ID必须和进程用户ID匹配的限制
    fsetid允许设置文件的setuid
    kill允许对不属于自己的进程发送信号
    setgid允许改变进程的GID
    setuid允许改变进程的UID
    linux_immutable允许修改文件的immutable和append鼠标标志
    net_bind_service允许绑定到小于1024的端口
    net_broadcast允许网络广播和多播访问
    net_admin允许执行网络管理任务
    net_raw允许网络广播和多播访问,比如ping命令
    ipc_lock允许锁定共享内存片段
    ipc_owner忽略IPC所有权检查
    sys_module允许插入和删除内核模块
    sys_rawio允许直接访问/devport、/dev/mem、/dev/kmem及原始块设备
    sys_chroot允许使用chroot()系统调用
    sys_ptrace允许跟踪任何进程
    sys_pacct允许执行进程的BSD审计
    sys_admin允许执行系统管理任务,如加载卸载文件系统设置磁盘配额
    sys_boot允许重启系统
    sys_nice允许提升优先级及设置其他进程优先级
    sys_resource忽略资源限制
    sys_time允许改变系统时钟
    sys_tty_config允许配置TTY设备
    mknod允许使用mknod()系统调用
    lease允许修改文件锁的FL_LEASE标志
    audit_write将记录写入内核审计日志
    audit_control启用/禁用内核审计,改变/检索审计状态,过滤规则
    setfcap允许为文件设置任意的capabilities
    mac_override覆盖MAC(Mandatory Access Control)
    mac_admin允许MAC配置或状态更改
    syslog允许使用syslog()系统调用
    wake_alarm允许触发能唤醒系统的东西(如CLOCK_BOOTTIME_ALARM计时器)
    block_suspendcap_audit_read使用可以阻止系统挂起的特性

    演示

    首先运行一个busybox容器,然后查看其特权集,如图:

    通过capsh来解码,可以得到默认的14个特权集,如下:

      [root@localhost ~]# capsh --decode=00000000a80425fb
      0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_serv

      1、进入容器中,执行ping命令,看是否可以执行,如图:

      从上图看出,默认情况下容器中可以执行ping命令的

      2、重新创建容器,将进程可执行ping的capabilities取消,如图:

      从上图看出,通过--cat-drop=net_raw命令即可取消ping权限

      3、下面给busybox容器中进程添加一个可修改系统时间的capabilities,首先运行容器,然后进入容器中修改时间,如图:

      从上图看出,修改时间提示没有权限,接下来重新创建容器并添加capabilities,如图:


      文章转载自运维DevOps,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论