赞
踩
【介绍】:本文介绍Docker中功能权限(Capabilities)管理和查看。
在Linux系统中,Capabilities是一种细粒度的权限控制机制,它将传统的root
权限分解为多个独立的权限单元。每个权限单元称为一个Capability。
通过这种机制,可以为进程授予特定的权限,而不需要授予全部的root
权限,从而提高系统的安全性。
在Docker中,容器 默认会被授予一组有限的Capabilities,以确保容器的安全性和隔离性。然而,有时容器需要额外的权限来执行特定的操作,这时可以通过添加或删除Capabilities来调整容器的权限。默认情况下Docker删减了一分部Capabilities,而仅仅保留了一部分Capabilities。
Docker默认保留的Capabilities如:
Capability | 描述 |
---|---|
CAP_CHOWN | 修改文件的所有者。 |
CAP_DAC_OVERRIDE | 绕过文件读写检查。 |
CAP_FOWNER | 绕过文件所有者的权限检查。 |
CAP_FSETID | 设置文件的set-user-ID或set-group-ID位。 |
CAP_KILL | 发送信号给其他进程。 |
CAP_SETGID | 设置进程的组ID。 |
CAP_SETUID | 设置进程的用户ID。 |
CAP_SETPCAP | 修改进程的能力。 |
CAP_NET_BIND_SERVICE | 绑定到低编号的端口(<1024)。 |
CAP_NET_RAW | 使用RAW套接字和PACKET套接字。 |
CAP_SYS_CHROOT | 使用chroot()系统调用。 |
CAP_MKNOD | 创建特殊文件。 |
CAP_AUDIT_WRITE | 写入审计日志。 |
CAP_SETFCAP | 设置文件能力。 |
以下是Docker默认情况下删除的Capabilities,这些Capabilities通常具有较高的风险,因此在默认配置中被禁用:
Capability | 描述 |
---|---|
CAP_SYS_MODULE | 加载和卸载内核模块。 |
CAP_SYS_RAWIO | 直接访问硬件设备。 |
CAP_SYS_PACCT | 配置进程记账。 |
CAP_SYS_ADMIN | 执行系统管理操作(如挂载文件系统、加载内核模块等)。 |
CAP_SYS_NICE | 修改进程优先级。 |
CAP_SYS_RESOURCE | 增加资源限制。 |
CAP_SYS_TIME | 修改系统时间。 |
CAP_SYS_TTY_CONFIG | 配置TTY设备。 |
CAP_AUDIT_CONTROL | 配置审计子系统。 |
CAP_MAC_OVERRIDE | 绕过MAC(Mandatory Access Control)检查。 |
CAP_MAC_ADMIN | 配置MAC。 |
CAP_NET_ADMIN | 执行网络管理操作(如配置网络接口、路由表等)。 |
CAP_SYSLOG | 配置内核日志。 |
CAP_DAC_READ_SEARCH | 绕过目录读权限检查。 |
CAP_LINUX_IMMUTABLE | 设置文件的不可变属性。 |
CAP_IPC_LOCK | 锁定共享内存。 |
CAP_IPC_OWNER | 绕过IPC权限检查。 |
CAP_SYS_BOOT | 重新启动系统。 |
CAP_LEASE | 创建文件租约。 |
CAP_WAKE_ALARM | 设置系统唤醒闹钟。 |
CAP_BLOCK_SUSPEND | 阻止系统挂起。 |
CAP_AUDIT_READ | 读取审计日志。 |
可以使用--cap-add
选项为容器添加特定的Capabilities。例如,添加NET_ADMIN
和SYS_TIME
权限:
docker run --cap-add=NET_ADMIN --cap-add=SYS_TIME ubuntu
可以使用--cap-drop
选项从容器中删除特定的Capabilities。例如,删除NET_RAW
权限:
docker run --cap-drop=NET_RAW ubuntu
通过Linux 的getpcaps
命令(需要安装libcap2-bin)可以查看一个Liniux系统的能力授权。因此我们可以进入容器内查看。
例如,我们通过--rm
创建一个临时容器来演示。
libcap2-bin
包:docker run -it --rm ubuntu bash
libcap2-bin
包:apt-get update
apt-get install -y libcap2-bin
getpcaps 1
这里的1
是容器内的第一个进程(通常是/bin/bash
或/bin/sh
)。运行后,命令行显示:
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=ep
从输出中,可以看到输出格式为:
1: cap_chown,cap_dac_override,...=ep
这个输出中:
1:
表示进程ID(PID)为1
的进程。通常在Docker容器中,PID为1的进程是容器的主进程(例如/bin/bash
);
cap_chown,cap_dac_override,cap_fowner,...
是进程拥有的Capabilities列表;
=ep
:
e
表示Effective(有效的):该Capability在进程中是有效的。
p
表示Permitted(允许的):该Capability被允许使用。
在Capabilities列表部分,可以看到这个容器:
Capability | 描述 |
---|---|
cap_chown | 修改文件的所有者。 |
cap_dac_override | 绕过文件读写检查。 |
cap_fowner | 绕过文件所有者的权限检查。 |
cap_fsetid | 设置文件的set-user-ID或set-group-ID位。 |
cap_kill | 发送信号给其他进程。 |
cap_setgid | 设置进程的组ID。 |
cap_setuid | 设置进程的用户ID。 |
cap_setpcap | 修改进程的能力。 |
cap_net_bind_service | 绑定到低编号的端口(<1024)。 |
cap_net_raw | 使用RAW套接字和PACKET套接字。 |
cap_sys_chroot | 使用chroot()系统调用。 |
cap_mknod | 创建特殊文件。 |
cap_audit_write | 写入审计日志。 |
cap_setfcap | 设置文件能力。 |
就是上面我们说过的在Docker中默认保留的Capability。
你也可以在运行容器时通过sh -c
来直接查看Capabilities。Docker中,sh -c
是一个常见的命令行用法,用于在一个新的 shell 会话中执行指定的命令字符串。
其中
sh
: 表示一个指向 Bourne shell 的命令,它启动一个新的 shell 会话。-c
: 该选项表示接下来的字符串将作为命令在新的 shell 会话中执行。下面我们再次通过--rm
创建一个临时容器来作为示例:
docker run --rm ubuntu sh -c "apt-get update && apt-get install -y libcap2-bin && getpcaps 1"
可以看到控制台输出:
Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [89.7 kB]
Get:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease [89.7 kB]
Get:4 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [37.7 kB]
Get:5 http://archive.ubuntu.com/ubuntu noble-backports InRelease [89.7 kB]
Get:6 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [18.6 kB]
Get:7 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
Get:8 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
Get:10 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
Get:11 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [93.2 kB]
Get:12 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [41.7 kB]
Get:13 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [6387 B]
Fetched 22.3 MB in 6s (3993 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
libpam-cap
The following NEW packages will be installed:
libcap2-bin libpam-cap
0 upgraded, 2 newly installed, 0 to remove and 1 not upgraded.
Need to get 46.9 kB of archives.
After this operation, 196 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu noble/main amd64 libcap2-bin amd64 1:2.66-5ubuntu2 [34.5 kB]
Get:2 http://archive.ubuntu.com/ubuntu noble/main amd64 libpam-cap amd64 1:2.66-5ubuntu2 [12.4 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 46.9 kB in 1s (40.7 kB/s)
Selecting previously unselected package libcap2-bin.
(Reading database ... 4368 files and directories currently installed.)
Preparing to unpack .../libcap2-bin_1%3a2.66-5ubuntu2_amd64.deb ...
Unpacking libcap2-bin (1:2.66-5ubuntu2) ...
Selecting previously unselected package libpam-cap:amd64.
Preparing to unpack .../libpam-cap_1%3a2.66-5ubuntu2_amd64.deb ...
Unpacking libpam-cap:amd64 (1:2.66-5ubuntu2) ...
Setting up libcap2-bin (1:2.66-5ubuntu2) ...
Setting up libpam-cap:amd64 (1:2.66-5ubuntu2) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC entries checked: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.38.2 /usr/local/share/perl/5.38.2 /usr/lib/x86_64-linux-gnu/perl5/5.38 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.38 /usr/share/perl/5.38 /usr/local/lib/site_perl) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 8.)
debconf: falling back to frontend: Teletype
1: 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=ep
其中最后一行是这样的:
1: 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=ep
这样就显示了我们像查看的Capabilities。
当然,还可在运行容器时使用了--cap-add=ALL
选项:
docker run --rm --cap-add=ALL ubuntu sh -c "apt-get update && apt-get install -y libcap2-bin && getpcaps 1"
执行后,最后一行变成了:
1: =ep
这个结果表示进程ID为1
的进程(通常是容器的主进程)拥有所有的有效(Effective)和允许(Permitted)Capabilities。(
=ep: 表示该进程拥有所有的有效(Effective)和允许(Permitted)Capabilities。)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。