容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

19 | 容器安全(1):我的容器真的需要privileged权限吗?

CAP_SYS_ADMIN
CAP_NET_ADMIN
以非root用户来运行程序
赋予容器合理的capabilities
gVisor
Kata
限制普通用户执行ping的能力
查看ping程序文件的capabilities
根据进程需要的最少特权赋予capabilities
不推荐使用"privileged"
容器中进程权限不足的处理
容器中的默认capabilities
进程权限与capabilities
capabilities细化特权操作
特权用户进程与非特权用户进程
用户运行容器时的安全考虑
容器接口标准兼容技术
shim/runC启动方式
Namespace资源隔离
容器与宿主机共享Linux内核
思考题
解决问题
Linux capabilities
容器安全性
容器架构特性
容器安全

该思维导图由 AI 生成,仅供参考

你好,我是程远。从今天这一讲,我们进入到了容器安全的模块。
容器安全是一个很大的话题,容器的安全性很大程度是由容器的架构特性所决定的。比如容器与宿主机共享 Linux 内核,通过 Namespace 来做资源的隔离,通过 shim/runC 的方式来启动等等。
这些容器架构特性,在你选择使用容器之后,作为使用容器的用户,其实你已经没有多少能力去对架构这个层面做安全上的改动了。你可能会说用Kata ContainergVisor 就是安全“容器”了。不过,Kata 或者 gVisor 只是兼容了容器接口标准,而内部的实现完全是另外的技术了。
那么对于使用容器的用户,在运行容器的时候,在安全方面可以做些什么呢?我们主要可以从这两个方面来考虑:第一是赋予容器合理的 capabilities,第二是在容器中以非 root 用户来运行程序。
为什么是这两点呢?我通过两讲的内容和你讨论一下,这一讲我们先来看容器的 capabilities 的问题。

问题再现

刚刚使用容器的同学,往往会发现用缺省 docker run的方式启动容器后,在容器里很多操作都是不允许的,即使是以 root 用户来运行程序也不行。
我们用下面的例子来重现一下这个问题。我们先运行make image 做个容器镜像,然后运行下面的脚本:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了容器安全性的重要性,强调了容器的安全性与其架构特性密切相关。作者提出了在使用容器时,赋予容器合理的capabilities和以非root用户来运行程序是增强安全性的关键。文章介绍了Linux capabilities的概念和作用,并警示读者不要滥用"privileged"参数,因为容器权限越高,对系统安全的威胁也越大。最后,文章提出了通过设置容器中程序的capabilities参数来赋予特定权限的方法,以提高容器的安全性。总的来说,本文深入浅出地介绍了容器安全方面的重要知识,对读者理解容器安全性有很大帮助。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 莫名
    getcap $(which ping) setcap -r $(which ping) 顺便举个之前使用过的例子:普通用户默认没有 tcpdump 抓包权限,可添加 net_raw、net_admin caps: sudo setcap cap_net_raw,cap_net_admin+ep $(which tcpdump)

    作者回复: 赞!

    2020-12-29
    3
    33
  • 朱新威
    已经更新20讲了,莫名有点心慌,生怕这么好的专栏结束了🤪

    编辑回复: 哈哈别慌哦,咱们后续还有专题加餐,等更新的时间里,你还可以复习已有内容哦。

    2020-12-28
    3
    7
  • morse
    老师, 您好, 我在 Ubuntu20.04 下删除 ping 的 capabilities 后, 切换别的用户后, 还是可以正常使用 ping 的, 我进行了以下操作. # getcap /usr/bin/ping # 发现ping 具有cap_net_raw capability /usr/bin/ping = cap_net_raw+ep # 删除全部 capabilites # sudo setcap -r /usr/bin/ping # 切换普通用户 sudo su - appuser # ping localhost # 可以正常工作 # capsh --print -- -c "/bin/ping -c 1 localhost" #可以看到还是具有cap_net_raw Current: = 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,cap_wake_alarm,cap_block_suspend,cap_audit_read .... # capsh --print # 打印当前用户全部 capabilities, 发现当前用户是具有 cap_net_raw 给我的感觉, 在 Ubuntu 20.04 中, useradd appuser 创建好的用户, 初始就具有一定的 capabilites, 所以在运行程序的时候, 用户自身的 capabilities+程序的 capabliities 是最终的. 所以就算把文件的 capabilities 删除, 只要用户还具有这个能力, 那么还是可以正常执行的. 那么我的问题来了, 我没有找到, 如何对一个用户限制这种 capabilities, 即我 useradd 一个 用户, 怎么限制这个用户的 capabilities.

    作者回复: @morse 你用capsh看到的cap_net_raw 应该是在Binding Cap而不是在Effective Cap里。 ubuntu20.04 里安装的ping程序本身允许普通用户ping ICMP. https://unix.stackexchange.com/questions/617927/why-ping-works-without-capability-and-setuid

    2021-01-11
    3
  • Sports
    selinux是不是实际上就是限制cap权限的操作

    作者回复: selinux 是通过对object, 例如进程\文件, 打上label来控制这些object的相互作用。

    2021-08-02
    1
  • Tony
    老师你好。请问在Linux中(比如centos),在允许普通用户使用docker以后,如何如何限制用户不能读取,宿主机上非该普通用户的文件?

    作者回复: 我想你问的问题是关于rootless container的?普通用户可以启动容器,但是用户权限并没有提高,非该用户的文件还是不能读写。

    2020-12-28
    2
    1
  • 老酒馆
    getcap /usr/bin/ping 查看ping进程当前cap setcap cap_net_admin,cap_net_raw+p /usr/bin/ping 设置ping进程cap
    2020-12-28
    5
  • heyhd9475
    老师想问一下文件的capabilities是保存在什么地方呢,getcap应该也是从什么地方读取的这些信息吧,是inode,file,dentry?
    2021-10-11
    1
  • 王皓月
    老师您好,我想要在容器中使用systemctl,除了启用特权模式还有别的办法吗?看到过大牛在docker run的时候加了/sys/fs/cgroup:/sys/fs/cgroup就可以在容器内使用systemctl,这个和特权模式有什么区别?
    2021-01-25
    1
  • 进击的Lancelot
    李老师,请教一个问题:“因为安全方面的考虑,容器缺省启动的时候,哪怕是容器中 root 用户的进程,系统也只允许了 15 个 capabilities。这个你可以查看runC spec 文档中的 security 部分,你也可以查看容器 init 进程 status 里的 Cap 参数,看一下容器中缺省的 capabilities。” 在这个例子当中,为什么容器中启动的 1 号进程的 CapPrm 是 00000000a80425fb?00000000a80425fb 只有 14 个 1,剩下的一个 1 哪里去了?
    2023-12-19归属地:广东
  • 段殷澄
    我ubuntu的root用户怎么默认只赋予了15个capabilities
    2022-11-07归属地:陕西
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部