linux - --cap-add=NET_ADMIN 和在 .yml 中添加功能之间的区别
问题描述
我有一个关于能力的问题。
为什么我的程序在我运行时工作docker run --cap-add=NET_ADMIN ...
?
如果我使用 .yml 文件运行我的程序,它是行不通的:
containers:
- name: snake
image: docker.io/kelysa/snake:lastest
imagePullPolicy: Always
securityContext:
privileged: true
capabilities:
add: ["NET_ADMIN","NET_RAW"]
使用 --cap-add 运行 docker 和运行具有相同功能的 pod 有什么区别?
解决方案
正如David Maze和根据 docker docs 所述:运行时特权和 Linux 功能
默认情况下,Docker 容器是“无特权的”,例如,不能在 Docker 容器内运行 Docker 守护程序。这是因为默认情况下不允许容器访问任何设备,但“特权”容器被授予访问所有设备的权限(请参阅 cgroups 设备上的文档)。
--cap-add: Add Linux capabilities, --cap-drop: Drop Linux capabilities, --privileged=false: Give extended privileges to this container --device=[]: Allows you to run devices inside the container without the --privileged flag.
当操作者执行
docker run --privileged
时,Docker 将启用对主机上所有设备的访问,并在 AppArmor 或 SELinux 中设置一些配置,以允许容器几乎与在主机上容器外部运行的进程一样访问主机。除了 --privileged 之外,操作员还可以使用 --cap-add 和 --cap-drop 对功能进行细粒度控制。
您可以找到两种功能:
- 具有保留的默认功能列表的 Docker。
- 默认情况下未授予但可以添加的功能。
此命令docker run --cap-add=NET_ADMIN
将应用额外的 linux 功能。
根据文档:
为了与网络堆栈交互,而不是使用 --privileged 他们应该使用 --cap-add=NET_ADMIN 来修改网络接口。
注意:
为了减少系统调用攻击,最好只为容器提供所需的权限。另请参阅启用 Pod 安全策略。
从容器可以通过使用来实现:
securityContext:
capabilities:
drop: ["all"]
add: ["NET_BIND"]
要查看容器内应用的功能,您可以使用:
getpcaps process_id or $(pgrep your-proces_name)
列出和探索您使用的 linux 功能capsh --print
资源:
希望这有帮助。
推荐阅读
- c++ - 不断降低内存分配效率。代码示例
- angular - 如何为购物车应用程序的角度和引导应用程序加载移动和桌面的不同视图
- xml - 在 XPATH 1.0 查询中准确获取下一个兄弟姐妹
- ios - 如何以编程方式使用 UIGraphicsImageRenderer 获取高质量的屏幕截图?
- arrays - Julia - 如何将 DataFrame 转换为数组?
- python - Python html浏览本地url路径问题
- angular - 在 chrome 最新版本 87 中发布视频文件流时出错
- go - 如何在 OpenGL (Go) 中正确创建数组纹理?
- unity3d - 使用 OnCollisionEnter 偶尔会应用两次强制
- flutter - 如何更新 TimePicker 标签的文本