docker_practice/container_security/kernel_capability.md

18 lines
1.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

##Linux Kernel Capabilities
默认情况下docker启动的容器只严格使用一部分内核capabilities。这代表什么呢
这是一个root或非root 二分法粒度管理的访问控制系统。比如web服务进程只需要绑定一个低于1024的端口不需要用root来允许那么它只需要给它授权net_bind_service功能就可以了。还有很多其他的capabilities几乎所有需要root权限的仅需要指定一个部分capabilities就可以了。
这对容器的安全有很多好处通常的服务器需要允许一大堆root进程通常有ssh cron syslogd模块和网络配置工具等等。容器则不同因为大部分这种人物都被容器外面的基础设施处理了
* ssh可以被主机上ssh服务替代
* 硬件管理也无关紧要容器中也就无需执行udevd或则其他类似的服务
* 网络管理也都在主机上设置除非特殊需求ifconfig、route、ip也不需要了。
这意味这大部分情况下容器完全不需要“真正的”root权限。因此容器可以运行一个减少的capabilities集容器中的root也比“真正的root"拥有更少的capabilities,比如:
* 完全禁止任何mount操作
* 禁止直接访问宿主主机的socket
* 禁止访问一些文件系统的操作比如创建新的设备node等等
* 禁止模块加载
* 还有一些其他的
就算攻击者在容器中取得了root权限他能做的破坏也少了也不能获得主机的更高权限。
然而这不会影响普通的web apps恶意的用户会想各种办法来对你默认情况下docker丢弃了它需要的功能之外的其余部分。这里有一个白名单和黑名单在 Linux manpages可以看到完整的清单列表。当然你还可以启用你需要的额外capabilities。默认docker容器仅使用白名单的内capabilities。