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

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

通过capsh来解码得到具体的特权集,如下:
[root@db ~]# capsh --decode=00000000a80425fb0x00000000a80425fb=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=00000000a80425fb0x00000000a80425fb=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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




