- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSite:http://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/139234378
HuaWei:https://bbs.huaweicloud.com/blogs/428080
【介绍】:本文介绍Docker中功能权限(Capabilities)管理和查看。
目 录
1. Capabilities的概念
在Linux系统中,Capabilities是一种细粒度的权限控制机制,它将传统的root
权限分解为多个独立的权限单元。每个权限单元称为一个Capability。
通过这种机制,可以为进程授予特定的权限,而不需要授予全部的root
权限,从而提高系统的安全性。
在Docker中,容器 默认会被授予一组有限的Capabilities,以确保容器的安全性和隔离性。然而,有时容器需要额外的权限来执行特定的操作,这时可以通过添加或删除Capabilities来调整容器的权限。默认情况下Docker删减了一分部Capabilities,而仅仅保留了一部分Capabilities。
2.1 Docker中默认保留的CapabilitiesDocker默认保留的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 | 设置文件能力。 |
2.1 Docker中默认去除的Capabilities
以下是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 | 读取审计日志。 |
3. --cap-add 选项添加Capabilities
可以使用--cap-add
选项为容器添加特定的Capabilities。例如,添加NET_ADMIN
和SYS_TIME
权限:
docker run --cap-add=NET_ADMIN --cap-add=SYS_TIME ubuntu
4. --cap-drop 选项删除Capabilities
可以使用--cap-drop
选项从容器中删除特定的Capabilities。例如,删除NET_RAW
权限:
docker run --cap-drop=NET_RAW ubuntu
5. 在容器内查看容器的Capabilities
通过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
- 查看容器内的Capabilities:
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。
6. 通过 sh -c 在启动容器时查看Capabilities
你也可以在运行容器时通过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。)