Docker容器安全性分析( 五 )

此外,在默认情况下,容器可以使用主机上的所有内存 。可以使用内存限制机制来防止一个容器消耗所有主机资源的拒绝服务攻击,具体可使用使用-m或-memory参数运行容器 。

  1. (命令示例: docker run [运行参数] - memory [内存大小] [容器镜像名或 ID ] [命令])
容器能力限制
Linux内核能力表示进程所拥有的系统调用权限,决定了程序的系统调用能力 。
容器的默认能力包括CHOWN、DAC_OVERRIDE、FSETID、SETGID、SETUID、SETFCAP、NET_RAW、MKNOD、SYS_REBOOT、SYS_CHROOT、KILL、NET_BIND_SERVICE、AUDIT_WRITE等等,具体功能如表3所示 。
容器默认能力作用CHOWN允许任意更改文件UID以及GIDDAC_OVERRIDE允许忽略文件的读、写、执行访问权限检查FSETID允许文件修改后保留setuid/setgid标志位SETGID允许改变进程组IDSETUID允许改变进程用户IDSETFCAP允许向其他进程转移或删除能力NET_RAW允许创建RAW和PACKET套接字MKNOD允许使用mknod创建指定文件SYS_REBOOT允许使用reboot或者kexec_loadSYS_CHROOT允许使用chrootKILL允许发送信号NET_BIND_SERVICE允许绑定常用端口号(端口号小于1024)AUDIT_WRITE允许审计日志写入 表3:容器默认能力
如果对容器能力不加以适当限制,可能会存在以下安全隐患:
  • 内部因素:在运行Docker容器时,如果采用默认的内核功能配置可能会产生容器的隔离问题 。
  • 外部因素:不必要的内核功能可能导致攻击者通过容器实现对宿主机内核的攻击 。
因此,不当的容器能力配置可能会扩大攻击面,增加容器与宿主机面临的安全风险,在执行docker run命令运行Docker容器时可根据实际需求通过–cap-add或–cap-drop配置接口对容器的能力进行增删 。
  1. (命令示例: docker run -- cap - drop ALL -- cap - add SYS_TIME ntpd / bin / sh )
强制访问控制
强制访问控制(Mandatory Access Control,MAC)是指每一个主体(包括用户和程序)和客体都拥有固定的安全标记,主体能否对客体进行相关操作,取决于主体和客体所拥有安全标记的关系 。在Docker容器应用环境下,可通过强制访问控制机制限制容器的访问资源 。Linux内核的强制访问控制机制包括SELinux、AppArmor等 。
1、SELinux机制
SELinux(Security-Enhanced Linux)是Linux内核的强制访问控制实现,由美国国家安全局(NSA)发起,用以限制进程的资源访问,即进程仅能访问其任务所需的文件资源 。因此,可通过SELinux对Docker容器的资源访问进行控制 。
在启动Docker daemon守护进程时,可通过将–selinux-enabled参数设为true,从而在Docker容器中使用SELinux 。SELinux可以使经典的shocker.c程序失效,使其无法逃逸出Docker容器实现对宿主机资源的访问 。
  1. (命令示例: docker daemon -- selinux - enabled = true )
2、AppArmor机制
与SELinux类似,AppArmor(Application Armor,应用程序防护)也是Linux的一种强制访问控制机制,其作用是对可执行程序进行目录和文件读写、网络端口访问和读写等权限的控制 。
在Docker daemon启动后会在/etc/apparmor.d/docker自动创建AppArmor的默认配置文件docker-default,可通过在该默认配置文件中新增访问控制规则的方式对容器进行权限控制,同时可在启动容器时通过–security-opt指定其他配置文件 。例如,在配置文件中加入一行deny /etc/hosts rwklx限制对/etc/hosts的获取,同样可使shocker.c容器逃逸攻击失效 。
  1. (命令示例: docker run -- rm - ti -- cap - add = all -- security - opt apparmor : docker - default shocker bash )
Seccomp机制
Seccomp(Secure Computing Mode)是Linux内核提供的安全特性,可实现应用程序的沙盒机制构建,以白名单或黑名单的方式限制进程能够进行的系统调用范围 。
在Docker中,可通过为每个容器编写json格式的seccomp profile实现对容器中进程系统调用的限制 。在seccomp profile中,可定义以下行为对进程的系统调用做出响应:
  • SCMP_ACT_KILL:当进程进行对应的系统调用时,内核发出SIGSYS信号终止该进程,该进程不会接受到这个信号;
  • SCMP_ACT_TRAP:当进程进行对应的系统调用时,该进程会接收到SIGSYS信号,并改变自身行为;
  • SCMP_ACT_ERRNO:当进程进行对应的系统调用时,系统调用失败,进程会接收到errno返回值;
  • SCMP_ACT_TRACE: 当进程进行对应的系统调用时,进程会被跟踪;
  • SCMP_ACT_ALLOW:允许进程进行对应的系统调用行为 。
默认情况下,在Docker容器的启动过程中会使用默认的seccomp profile,可使用security-opt seccomp选项使用特定的seccomp profile 。


推荐阅读