docker_practice/security/kernel_capability.md

27 lines
2.3 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.

##内核能力机制
能力机制Capability是Linux内核一个强大的特性可以提供细粒度的权限访问控制。
Linux内核自2.1版本起就支持能力机制,它将权限划分为更加细粒度的操作能力,既可以作用在进程上,也可以作用在文件上。
例如一个Web服务进程只需要绑定一个低于1024的端口的权限并不需要root权限。那么它只需要被授权`net_bind_service`能力即可。此外还有很多其他的类似能力来避免进程获取root权限。
默认情况下Docker启动的容器被严格限制只允许使用内核的一部分能力。
使用能力机制对加强Docker容器的安全有很多好处。通常在服务器上会运行一堆需要特权权限的进程包括有ssh、cron、syslogd、硬件管理工具模块例如负载模块、网络配置工具等等。容器跟这些进程是不同的因为几乎所有的特权进程都由容器以外的支持系统来进行管理。
* ssh访问被主机上ssh服务来管理
* cron通常应该作为用户进程执行权限交给使用它服务的应用来处理
* 日志系统可由Docker或第三方服务管理
* 硬件管理无关紧要容器中也就无需执行udevd以及类似服务
* 网络管理也都在主机上设置,除非特殊需求,容器不需要对网络进行配置。
从上面的例子可以看出大部分情况下容器并不需要“真正的”root权容器只需要少数的能力即可。为了加强安全容器可以禁用一些没必要的权限。
* 完全禁止任何mount操作
* 禁止直接访问本地主机的套接字;
* 禁止访问一些文件系统的操作,比如创建新的设备、修改文件属性等;
* 禁止模块加载。
这样就算攻击者在容器中取得了root权限也不能获得本地主机的较高权限能进行的破坏也有限。
默认情况下Docker采用[白名单](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go)机制,禁用[必需功能](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go)之外的其它权限。
当然用户也可以根据自身需求来为Docker容器启用额外的权限。