19 | 容器安全(1):我的容器真的需要privileged权限吗?
李程远
该思维导图由 AI 生成,仅供参考
你好,我是程远。从今天这一讲,我们进入到了容器安全的模块。
容器安全是一个很大的话题,容器的安全性很大程度是由容器的架构特性所决定的。比如容器与宿主机共享 Linux 内核,通过 Namespace 来做资源的隔离,通过 shim/runC 的方式来启动等等。
这些容器架构特性,在你选择使用容器之后,作为使用容器的用户,其实你已经没有多少能力去对架构这个层面做安全上的改动了。你可能会说用Kata Container、gVisor 就是安全“容器”了。不过,Kata 或者 gVisor 只是兼容了容器接口标准,而内部的实现完全是另外的技术了。
那么对于使用容器的用户,在运行容器的时候,在安全方面可以做些什么呢?我们主要可以从这两个方面来考虑:第一是赋予容器合理的 capabilities,第二是在容器中以非 root 用户来运行程序。
为什么是这两点呢?我通过两讲的内容和你讨论一下,这一讲我们先来看容器的 capabilities 的问题。
问题再现
刚刚使用容器的同学,往往会发现用缺省 docker run的方式启动容器后,在容器里很多操作都是不允许的,即使是以 root 用户来运行程序也不行。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了容器安全性的重要性,强调了容器的安全性与其架构特性密切相关。作者提出了在使用容器时,赋予容器合理的capabilities和以非root用户来运行程序是增强安全性的关键。文章介绍了Linux capabilities的概念和作用,并警示读者不要滥用"privileged"参数,因为容器权限越高,对系统安全的威胁也越大。最后,文章提出了通过设置容器中程序的capabilities参数来赋予特定权限的方法,以提高容器的安全性。总的来说,本文深入浅出地介绍了容器安全方面的重要知识,对读者理解容器安全性有很大帮助。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》,新⼈⾸单¥59
《容器实战高手课》,新⼈⾸单¥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-29333 - 朱新威已经更新20讲了,莫名有点心慌,生怕这么好的专栏结束了🤪
编辑回复: 哈哈别慌哦,咱们后续还有专题加餐,等更新的时间里,你还可以复习已有内容哦。
2020-12-2837 - 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-113 - Sportsselinux是不是实际上就是限制cap权限的操作
作者回复: selinux 是通过对object, 例如进程\文件, 打上label来控制这些object的相互作用。
2021-08-021 - Tony老师你好。请问在Linux中(比如centos),在允许普通用户使用docker以后,如何如何限制用户不能读取,宿主机上非该普通用户的文件?
作者回复: 我想你问的问题是关于rootless container的?普通用户可以启动容器,但是用户权限并没有提高,非该用户的文件还是不能读写。
2020-12-2821 - 老酒馆getcap /usr/bin/ping 查看ping进程当前cap setcap cap_net_admin,cap_net_raw+p /usr/bin/ping 设置ping进程cap2020-12-285
- heyhd9475老师想问一下文件的capabilities是保存在什么地方呢,getcap应该也是从什么地方读取的这些信息吧,是inode,file,dentry?2021-10-111
- 王皓月老师您好,我想要在容器中使用systemctl,除了启用特权模式还有别的办法吗?看到过大牛在docker run的时候加了/sys/fs/cgroup:/sys/fs/cgroup就可以在容器内使用systemctl,这个和特权模式有什么区别?2021-01-251
- 进击的Lancelot李老师,请教一个问题:“因为安全方面的考虑,容器缺省启动的时候,哪怕是容器中 root 用户的进程,系统也只允许了 15 个 capabilities。这个你可以查看runC spec 文档中的 security 部分,你也可以查看容器 init 进程 status 里的 Cap 参数,看一下容器中缺省的 capabilities。” 在这个例子当中,为什么容器中启动的 1 号进程的 CapPrm 是 00000000a80425fb?00000000a80425fb 只有 14 个 1,剩下的一个 1 哪里去了?2023-12-19归属地:广东
- 段殷澄我ubuntu的root用户怎么默认只赋予了15个capabilities2022-11-07归属地:陕西
收起评论