当前位置:   article > 正文

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

运维专题.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)管理和查看。

在这里插入图片描述


1. Capabilities的概念

Linux系统中,Capabilities是一种细粒度的权限控制机制,它将传统的root权限分解为多个独立的权限单元。每个权限单元称为一个Capability

通过这种机制,可以为进程授予特定的权限,而不需要授予全部的root权限,从而提高系统的安全性。

2. Docker中的Capabilities

Docker中,容器 默认会被授予一组有限的Capabilities,以确保容器的安全性和隔离性。然而,有时容器需要额外的权限来执行特定的操作,这时可以通过添加或删除Capabilities来调整容器的权限。默认情况下Docker删减了一分部Capabilities,而仅仅保留了一部分Capabilities

2.1 Docker中默认保留的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设置文件能力。

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_ADMINSYS_TIME权限:

docker run --cap-add=NET_ADMIN --cap-add=SYS_TIME ubuntu
  • 1

4. --cap-drop 选项删除Capabilities

可以使用--cap-drop选项从容器中删除特定的Capabilities。例如,删除NET_RAW权限:

docker run --cap-drop=NET_RAW ubuntu
  • 1

5. 在容器内查看容器的Capabilities

通过Linuxgetpcaps命令(需要安装libcap2-bin)可以查看一个Liniux系统的能力授权。因此我们可以进入容器内查看。

例如,我们通过--rm创建一个临时容器来演示。

  1. 启动一个容器并安装libcap2-bin:
docker run -it --rm ubuntu bash
  • 1
  1. 在容器内安装libcap2-bin:
apt-get update
apt-get install -y libcap2-bin
  • 1
  • 2
  1. 查看容器内的Capabilities:
getpcaps 1
  • 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

在这里插入图片描述
从输出中,可以看到输出格式为:

1: cap_chown,cap_dac_override,...=ep
  • 1

这个输出中:

  • 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

6. 通过 sh -c 在启动容器时查看Capabilities

你也可以在运行容器时通过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"
  • 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

其中最后一行是这样的:

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

在这里插入图片描述
这样就显示了我们像查看的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

执行后,最后一行变成了:

1: =ep
  • 1

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/645337
推荐阅读
相关标签
  

闽ICP备14008679号