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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 运维专题.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

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

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

docker run --cap-drop=NET_RAW ubuntu

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

通过Linuxgetpcaps命令(需要安装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

这个输出中:

  • 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"

可以看到控制台输出:

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。)

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
弹性计算 Ubuntu Linux
阿里云系统运维管理OOS一键安装宝塔面板,这个功能太牛了!
宝塔面板是实用的服务器管理工具,支持多种操作系统(如Ubuntu、CentOS等)。通过阿里云OOS可一键安装。安装前提包括ECS实例运行中且有公网,安全组需开放8888端口。安装步骤简单,进入ECS控制台选择预装应用并确认下单,完成后在控制台查看详情和登录信息。最后验证安装结果,确保能成功访问宝塔面板URL。
176 82
|
1月前
|
弹性计算 Ubuntu Linux
阿里云服务器一键安装Docker社区版教程,基于系统运维管理OOS
阿里云服务器一键安装Docker社区版教程,基于系统运维管理OOS自动化部署。支持Ubuntu 22.04/20.04、CentOS 7.7-7.9及Alibaba Cloud Linux 3.2104 LTS。前提条件:ECS实例需运行中且有公网。步骤:选择Docker扩展并安装,验证成功通过命令`docker -v`查看版本号。
296 79
|
13天前
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
81 28
|
4月前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
300 56
|
3月前
|
安全 网络安全 数据安全/隐私保护
利用Docker的网络安全功能来保护容器化应用
通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
65 5
|
3月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
633 1
|
4月前
|
缓存 运维 Docker
容器化运维:Docker Desktop 占用磁盘空间过大?教你轻松解决!
Windows Docker Desktop 使用过程中,因镜像、容器数据及构建缓存的累积,可能导致磁盘空间占用过高。通过删除无用镜像与容器、压缩磁盘以及清理构建缓存等方法,可有效释放空间。具体步骤包括关闭WSL、使用`diskpart`工具压缩虚拟磁盘、执行`docker buildx prune -f`清理缓存等。这些操作能显著减少磁盘占用,提升系统性能。
1057 4
|
4月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
6月前
|
运维 开发者 Docker
Docker容器化技术在运维中的应用实践
【8月更文挑战第27天】本文旨在探讨Docker容器化技术如何在现代运维工作中发挥核心作用,通过深入浅出的方式介绍Docker的基本概念、优势以及实际应用场景。文章将结合具体案例,展示如何利用Docker简化部署流程、提高资源利用率和加强应用的可移植性。读者将获得对Docker容器技术在实际运维中应用的全面认识,并能够理解其在提升运维效率与质量方面的重要性。
|
6月前
|
应用服务中间件 网络安全 nginx
运维专题.Docker+Nginx服务器的SSL证书安装
运维专题.Docker+Nginx服务器的SSL证书安装
288 3