首页 yabo88狗亚app 服务器 大yabo88狗亚app--任意三数字加yabo.com直达官网 存储 IT 安全 物联网 软件 案例库

云计算

云趋势频道旗下栏目: 亚搏娱乐 亚博电子游戏app 云开发 云趋势

Docker安全部署的17条建议,在不同环境下实现容器安全

来源:dockerone ??发布时间:2019-05-03
摘要:在当前不断增长的基于云计算的IT市场,对虚拟化技术有大量的需求。遗憾的是大多数的虚拟化解决方案不足以去满足研发需求,全虚拟化解决方案产生的费用会变成可扩展的基础设施的隐含负担。 Docker允许开发人员和系统管理员为解决服务实际业务需求所需的应用

在当前不断增长的基于云计算的IT市场,对虚拟化技术有大量的需求。遗憾的是大多数的虚拟化解决方案不足以去满足研发需求,全虚拟化解决方案产生的费用会变成可扩展的基础设施的隐含负担。

Docker允许开发人员和系统管理员为解决服务实际业务需求所需的应用和服务能够无缝部署容器以减少开销。无论怎样,因为Docker利用同一内核作为主系统以减少所需资源,容器如果没有进行充分配置则会明显的暴露安全问题。

下面逐项表明的强化措施可以保证在各自环境中提高容器的安全性。需要注意本提出方案仅适用去Linux Docker容器的部署在基于Linux的主机上,在编写本文时使用Docker最新的Release版本 (1.4.0, commit 4595d4f, dating 11/12/14)。

以下内容摘自Jér?me Petazzoni [1]和 Daniel J Walsh [2]发布的ppt和视频。本文的目标是如何具体地在Docker中实施。

注:大多数建议的命令行选项可以在一个类似于Dockerfile中存储并用于自动化镜像的构建。

(译者按:原文17项措施以表格形式呈现,由于编辑器原因,这里将改为列表形式表述)

1.Docker镜像

Docker 1.3 现在支持数字签名[3]来确认官方仓库镜像的起源和完整性。因该功能仍在开发中所以Docker将抛出警告但不会阻止镜像的实际运行。

通常确保镜像只从受信库中检索并且不使用—insecure-registry=[]命令项。

2.网络命名空间

在默认情况下,Docker REST API用来控制容器通过系统Docker守护进程是唯一能够通过Unix域套接字的方式暴露出来。在Docker上开启一个TCP端口(即 当引导Docker守护进程时必须使用 -H 选项绑定地址)将允许任何人通过该端口访问容器,有可能获得主机上的root访问权限以及在某些场景下本地用户所属的Docker组。

3.日志和审核

收集和归档与Docker相关的安全日志来达到审核和监督的目的。从host[8],可以使用下面的命令来访问容器外的日志文件:

  1. docker?run?-v?/dev/log:/dev/log??/bin/sh?

使用Docker命令内置:

  1. docker?logs?...?(-f?to?follow?log?output)?

日志文件也可以从持续存储导出到一个使用压缩包里面:

  1. docker?export?...?

4.SELinux 或 AppArmor

Linux的内部安全模块,例如通过访问控制的安全策略来配置安全增强型Linux(SELinux)和AppArmor,从而实现强制性的访问控制(MAC)一套有限的系统资源的限制进程,如果先前已经安装和配置过SELinux,那么它可以使用setenforce 1在容器中被激活。Docker程序的SELinux支持是默认无效的,并且需要使用—selinux功能来被激活。通过使用新增的—security-opt来加载SELinux或者AppArmor的策略对容器的标签限制进行配置。该功能已经在Docker版本1.3[9]中介绍过。例如:

  1. docker?run?--security-opt=secdriver:name:value?-i?-t?centos?bash?

5.守护特权

不要使用--privileged命令行选项。这本来允许容器来访问主机上的所有设备,并为容器提供一个特定的LSM配置(例如SELinux或AppArmor),而这将给予如主机上运行的程序同样水平的访问。避免使用--privileged有助于减少主机泄露的攻击面和潜力。然而,这并不意味着程序将没有优先权的运行,当然这些优先权在最新的版本中还是必须的。发布新程序和容器的能力只能被赋予到值得信任的用户上。通过利用-u选项尽量减少容器内强制执行的权限。例如:

  1. docker?run?-u??-it??/bin/bash?

Docker组的任何用户部分可能最终从容器中的主机上获得根源。

6.cgroups

为了防止通过系统资源耗尽的DDoS攻击,可以使用特定的命令行参数被来进行一些资源限制。

CPU使用率:

  1. docker?run?-it?--rm?--cpuset=0,1?-c?2?...?

内存使用:

  1. docker?run?-it?--rm?-m?128m?...?

存储使用:

  1. docker?-d?--storage-opt?dm.basesize=5G?

磁盘I/O:

目前不支持Docker。BlockIO*属性可以通过systemd暴露,并且在支持操作系统中被用来控制磁盘的使用配额。

7.二进制SUID/GUID

SUID和GUID二进制文件不稳定的时候容易受到攻击,而这个时候是很危险的,,导致任意代码执行(如缓冲区溢出),因为它们会进程的文件所有者或组的上下文中运行。如果可能的话,禁止SUID和SGID使用特定的命令行参数来降低容器的功能。

  1. docker?run?-it?--rm?--cap-drop?SETUID?--cap-drop?SETGID?...?

另一选择,可以考虑运用通过安装有nosuid属性的文件系统来移除掉SUID能力。

最后一个选择是从系统中彻底删除不需要的SUID和GUID二进制文件。这些类型的二进制文件可以在Linux系统中运行以下命令而找到:

  1. find?/?-perm?-4000?-exec?ls?-l?{}?\;?2>/dev/null?
  2. ?
  3. find?/?-perm?-2000?-exec?ls?-l?{}?\;?2>/dev/null?