Docker容器的capability

linux capability是啥?

资料来源:

http://man7.org/linux/man-pages/man7/capabilities.7.html

 For the purpose of performing permission checks, traditional UNIX

       implementations distinguish two categories of processes: privileged

       processes (whose effective user ID is 0, referred to as superuser or

       root), and unprivileged processes (whose effective UID is nonzero).

       Privileged processes bypass all kernel permission checks, while

       unprivileged processes are subject to full permission checking based

       on the process's credentials (usually: effective UID, effective GID,

       and supplementary group list).

 

       Starting with kernel 2.2, Linux divides the privileges traditionally

       associated with superuser into distinct units, known as capabilities,

       which can be independently enabled and disabled.  Capabilities are a

       per-thread attribute.

原来linux系统为了将系统权限作了分类,虽然是root用户,如果没有赋予相关的权限也是白搭。

 

下面命令列出了系统支持的capability:

[root@centos /]# capsh --print

Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,35,36+ep

Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,35,36

Securebits: 00/0x0/1'b0

 secure-noroot: no (unlocked)

 secure-no-suid-fixup: no (unlocked)

 secure-keep-caps: no (unlocked)

uid=0(root)

gid=0(root)

groups=0(root)

 

下面来看看docker-containerd这个进程所有的capability:

cat /proc/`pidof docker-containerd`/status | grep Cap

CapInh: 0000000000000000

CapPrm: 0000001fffffffff

CapEff: 0000001fffffffff

CapBnd: 0000001fffffffff

CapAmb: 0000000000000000

 

capsh --decode=0x1fffffffff    // 解码

0x0000001fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,35,36

对比发现,与系统支持的相符合。(getpcaps `pidof docker-containerd`可以得到同样的输出)

 

下面来看看docker容器的capability:

[root@centos opt]#docker run -ti centos /bin/bash

[root@f45f03e236ec /]# capsh --print

Current: = 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+eip

Bounding set =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

Securebits: 00/0x0/1'b0

 secure-noroot: no (unlocked)

 secure-no-suid-fixup: no (unlocked)

 secure-keep-caps: no (unlocked)

uid=0(root)

gid=0(root)

groups=

对比发现,容器少了大致下面的capability:

cap_net_admin,cap_net_broadcast,cap_sys_module,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_syslog

 

因此,容器用户不允许执行ip、time这些命令。

 

 

vendor/github.com/containerd/containerd/oci/spec_unix.go,这个文件定义了缺省的capability。

func defaultCaps() []string {

        return []string{

                "CAP_CHOWN",

                "CAP_DAC_OVERRIDE",

                "CAP_FSETID",

                "CAP_FOWNER",

                "CAP_MKNOD",

                "CAP_NET_RAW",

                "CAP_SETGID",

                "CAP_SETUID",

                "CAP_SETFCAP",

                "CAP_SETPCAP",

                "CAP_NET_BIND_SERVICE",

                "CAP_SYS_CHROOT",

                "CAP_KILL",

                "CAP_AUDIT_WRITE",

        }

}

 

下面的命令可以动态的改动容器所有的capability:

[root@centos opt]#docker run --cap-drop all --cap-add net_admin -ti centos /bin/bash

[root@1db73e0aaf38 /]# capsh --print

Current: = cap_net_admin+eip   // 只具备net_admin

Bounding set =cap_net_admin

Securebits: 00/0x0/1'b0

 secure-noroot: no (unlocked)

 secure-no-suid-fixup: no (unlocked)

 secure-keep-caps: no (unlocked)

uid=0(root)

gid=0(root)

groups=

 

### 配置 AppArmor 以增强 Docker 容器安全性 AppArmor 是一种 Linux 内核安全模块,它为程序定义了一种简单而灵活的基于路径的强制访问控制方法。对于 Docker 来说,可以通过配置特定的应用程序抽象文件来限制容器的行为。 #### 创建自定义 AppArmor Profile 为了给 Docker 容器应用 AppArmor 策略,首先需要创建一个新的 AppArmor profile 文件: ```bash sudo nano /etc/apparmor.d/docker-container-default-with-nginx ``` 在这个例子中,假设要保护的是一个运行 Nginx 的 Web 服务器容器。编辑后的文件应该类似于这样: ```apparmor #include <tunables/global> profile docker-default flags=(attach_disconnected,mediate_deleted) { #include <abstractions/base> capability chown, capability dac_override, capability setgid, capability setuid, network inet tcp, file, mount options=(remount,ro) -> none, } ``` 上述配置限定了容器内的进程所能执行的操作权限[^1]。 #### 加载并验证新的 AppArmor Profile 保存更改后,加载新创建的 AppArmor profile: ```bash sudo apparmor_parser -r /etc/apparmor.d/docker-container-default-with-nginx ``` 确认该 profile 已被正确加载: ```bash sudo aa-status | grep 'docker' ``` 如果一切正常,则可以看到刚才添加的新条目已经生效。 #### 启动带有指定 AppArmor Profile 的 Docker 容器 最后,在启动 Docker 容器时指定所创建的 AppArmor profile 名称作为参数传递进去: ```bash docker run --security-opt apparmor=docker-container-default-with-nginx nginx:latest ``` 这一步骤确保了只有当满足预设条件的情况下,Nginx 才能在受限环境下工作,从而提高了整体系统的安全性[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值