运维专题.Docker功能权限(Capabilities)管理和查看

举报
jcLee95 发表于 2024/05/27 12:35:03 2024/05/27
【摘要】 本文介绍Docker中功能权限(Capabilities)管理和查看。
运维专题
Docker功能权限(Capabilities)

- 文章信息 -
Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://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)管理和查看。

在这里插入图片描述



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_ADMINSYS_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创建一个临时容器来演示。

  1. 启动一个容器并安装libcap2-bin:
docker run -it --rm ubuntu bash
  1. 在容器内安装libcap2-bin:
apt-get update
apt-get install -y libcap2-bin
  1. 查看容器内的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: 表示进程IDPID)为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来直接查看CapabilitiesDocker中,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

这个结果表示进程ID1的进程(通常是容器的主进程)拥有所有的有效(Effective)和允许(Permitted)Capabilities。(
=ep: 表示该进程拥有所有的有效(Effective)和允许(Permitted)Capabilities。)

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。