diff --git a/security/kernel_capability.md b/security/kernel_capability.md index c46e564..ba4d6db 100644 --- a/security/kernel_capability.md +++ b/security/kernel_capability.md @@ -1,21 +1,24 @@ ##内核权限 -默认情况下,Docker启动的容器只严格使用一部分内核capabilities。这代表什么呢? +默认情况下,Docker启动的容器被严格限制只允许使用内核的一部分权限(capability),包括如下几个方面。 -这是一个root或非root二分法粒度管理的访问控制系统。比如web服务进程只需要绑定一个低于1024的端口,不需要用root来允许:那么它只需要给它授权net_bind_service功能就可以了。还有很多其他的capabilities,几乎所有需要root权限的仅需要指定一个部分capabilities就可以了。 +Linux系统支持细粒度的权限访问控制系统。比如一个Web服务进程只需要绑定一个低于1024的端口,并不需要特权权限。那么它只需要被授权`net_bind_service`功能就可以了。此外,还有很多其他的类似功能,避免获取特权权限。 -这对容器的安全有很多好处,通常的服务器需要允许一大堆root进程,通常有ssh cron syslogd;模块和网络配置工具等等。容器则不同,因为大部分这种人物都被容器外面的基础设施处理了: -* ssh可以被主机上ssh服务替代 -* 硬件管理也无关紧要,容器中也就无需执行udevd或则其他类似的服务 -* 网络管理也都在主机上设置,除非特殊需求,ifconfig、route、ip也不需要了。 +这对加强Docker容器的安全有很多好处。通常,在服务器上会运行一堆需要特权权限的进程,包括有ssh、cron、syslogd;硬件管理工具模块(例如负载模块)、网络配置工具等等。容器跟这些进程是很不同的,因为大部分进程都可由容器外的支持系统来提供管理。 -这意味这大部分情况下,容器完全不需要“真正的”root权限。因此,容器可以运行一个减少的capabilities集,容器中的root也比“真正的root"拥有更少的capabilities,比如: -* 完全禁止任何mount操作 -* 禁止直接访问宿主主机的socket -* 禁止访问一些文件系统的操作,比如创建新的设备node等等 -* 禁止模块加载 -* 还有一些其他的 +* ssh访问可被主机上ssh服务来管理; +* cron应该作为用户进程执行; +* 日志系统可由Docker或第三方服务管理; +* 硬件管理无关紧要,容器中也就无需执行udevd以及类似服务; +* 网络管理也都在主机上设置,除非特殊需求,容器不需要对网络进行配置。 -就算攻击者在容器中取得了root权限,他能做的破坏也少了,也不能获得主机的更高权限。 -然而这不会影响普通的web apps,恶意的用户会想各种办法来对你! +从上面的例子可以看出,大部分情况下,容器并不需要“真正的”root权,容器只需要少数的权限即可。为了加强安全,容器可以禁用一些没必要的权限。 +* 完全禁止任何mount操作; +* 禁止直接访问本地主机的套接字; +* 禁止访问一些文件系统的操作,比如创建新的设备、修改文件属性等; +* 禁止模块加载。 -默认情况下,docker丢弃了它需要的功能之外的其余部分。这里有一个白名单和黑名单,在 Linux manpages可以看到完整的清单列表。当然,你还可以启用你需要的额外权限。默认Docker容器仅使用白名单的内capabilities。 +这样,就算攻击者在容器中取得了root权限,也不能获得本地主机的较高权限,能进行的破坏也有限。 + + +默认情况下,Docker采用白名单机制,禁用必需功能之外的所有权限。 +当然,用户可以根据需求来启用额外的权限。