Docker容器安全

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_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap

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

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

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

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

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

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

4、创建容器总提示没权限,要使用–privileged才行,此时可以通过如下参数解决:

docker run -itd --name abcd --cap-add=SYS_ADMIN   #--cap-add=SYS_ADMIN参数

注:--cap-add=SYS_ADMIN仍然比 --privileged更安全,因为它只授予特定的权限,而不是所有 root 权限

标签