Docker安全

好的安全性是基于分层隔离的,Docker有很多分层。Docker 支持所有主流 Linux 安全机制,同时 Docker 自身还提供了很多简单的并且易于配置的安全技术。

接下来主要介绍一些 Docker 中保障容器安全运行的一些技术。

安全本质就是分层!拥有更多的安全层,就能拥有更多的安全性。下图展示了一部分安全技术。

Linux Docker 利用了大部分 Linux 通用的安全技术。包括命名空间(Namespace)、控制组(CGroup)、系统权限(Capability),强制访问控制(MAC)系统以及安全计算(Seccomp)。

上述每种技术,Docker 都设置合理的默认值,实现了流畅的并且适度安全的开箱即用体验。同时,Docker 也允许用户根据特定需求自定义调整每项安全配置。

Docker 平台本身也提供了一些非常棒的原生安全技术。这些技术使用起来都很简单!

1) Docker Swarm 模式
默认是开启安全功能的。无须任何配置,就可以获得加密节点 ID、双向认证、自动化 CA 配置、自动证书更新、加密集群存储、加密网络等安全功能。
2) Docker 内容信任(Docker Content Trust, DCT)
允许用户对镜像签名,并且对拉取的镜像的完整度和发布者进行验证。
3) Docker 安全扫描(Docker Security Scanning)
分析 Docker 镜像,检查已知缺陷,并提供对应的详细报告。
4) Docker 密钥
使安全成为 Docker 生态系统中重要的一环。Docker 密钥存储在加密集群存储中,在容器传输过程中实时解密,使用时保存在内存文件系统,并运行了一个最小权限模型。

Docker 在使用主流 Linux 安全技术的同时,还提供了额外的扩展以及一些新的安全技术。Linux 安全技术看起来可能略为复杂,但是 Docker 平台的安全技术却非常简单。

在最初决定向平台中添加安全功能时,就选择了简单易用的方式。Docker 知道如果安全相关配置特别复杂,那么就没有人会去使用。Docker 平台提供的绝大部分安全功能使用起来都很简单。

大部分的安全设置都配有默认值,用户无须任何配置,就能得到一个相当安全的平台。默认配置不一定是最合适的,但至少在最开始能够保障一定的安全性。如果默认配置与用户需求不符,那么用户也可以进行自定义配置。

Linux安全技术简介

下面主要对 Docker 中用到的主要 Linux 技术进行简要介绍。
Namespace
内核命名空间属于容器中非常核心的一部分! 该技术能够将操作系统(OS)进行拆分,使一个操作系统看起来像多个互相独立的操作系统一样。

在相同的 OS 上运行多个 Web 服务,同时还不存在端口冲突的问题。该技术还允许多个应用运行在相同 OS 上并且不存在竞争,同时还能共享配置文件以及类库。

举两个简单的例子。

用户可以在相同的 OS 上运行多个 Web 服务,每个端口都是 443。为了实现该目的,可以将两个 Web 服务应用分别运行在自己的网络命名空间中。可以生效的原因是每个网络命名空间都拥有自己的 IP 地址以及对应的全部端口。也可能需要将每个 IP 映射到 Docker 主机的不同端口之上,但是使用 IP 上的哪个端口则无须其他额外配置。

用户还可以运行多个应用,应用间共享类库和配置文件,但是版本可能不同。为了实现该目标,需要在自己的挂载命名空间中运用每个应用程序。这样做能生效的原因,是每个挂载命名空间内都有系统上任意目录的独立副本。

下图展示了一个抽象的例子,两个应用运行在相同的主机上,并且同时使用 443 端口。每个 Web 服务应用都运行在自己的网络命名空间之内。

Linux Docker 利用了下列内核命名空间。

    进程ID(PID)。
    网络(NET)。
    文件系统/挂载(MNT)。
    进程内通信(IPC)。
    用户(USER)。
    UTS。
简要介绍每种技术都做了些什么。Docker 容器是由各种命名空间组合而成的。再次强调一遍,Docker 容器本质就是命名空间的有组织集合。例如,每个容器都由自己的 PID、NET、MNT、IPC、UTS 构成,还可能包括 USER 命名空间。这些命名空间有机的组合就是所谓的容器。下图展示了两个运行在相同 Linux 主机上的容器。

简要介绍一下 Docker 是如何使用每个命名空间的。
1) 进程 ID 命名空间
Docker 使用 PID 命名空间为每个容器提供互相独立的容器树。每个容器都拥有自己的进程树,意味着每个容器都有自己的 PID 为 1 的进程。PID 命名空间也意味着容器不能看到其他容器的进程树,或者其所在主机的进程树。
2) 网络命名空间
Docker 使用 NET 命名空间为每个容器提供互相隔离的网络栈。网络栈中包括接口、ID 地址、端口地址以及路由表。例如,每个容器都有自己的 eth0 网络接口,并且有自己独立的 IP 和端口地址。
3) 挂载点命名空间
每个容器都有互相隔离的根目录 /。这意味着每个容器都有自己的 /etc、/var、/dev 等目录。容器内的进程不能访问 Linux 主机上的目录,或者其他容器的目录,只能访问自己容器的独立挂载命名空间。
4) 进程内通信命名空间
Docker 使用 IPC 命名空间在容器内提供共享内存。IPC 提供的共享内存在不同容器间也是互相独立的。
5) 用户命名空间
Docker 允许用户使用 USER 命名空间将容器内用户映射到 Linux 主机不同的用户上。常见的例子就是将容器内的 root 用户映射到 Linux 主机的非 root 用户上。用户命名空间对于 Docker 来说还属于新生事物且非必选项。该部分内容在未来可能出现改变。
6) UTS 命名空间
Docker 使用 UTS 命名空间为每个容器提供自己的主机名称。

如下图所示,容器本质就是命名空间的有机组合!

Control Group
如果说命名空间用于隔离,那么控制组就是用于限额。

假设容器就是酒店中的房间。每个容器间都是互相独立的,但是每个房间都共享一部分公共资源,比如供应水电、共享游泳池、共享健身、共享早餐餐吧等。

CGroup 允许用户设置一些限制(以酒店作为类比)来保证不会存在单一容器占用全部的公共资源,如用光全部水或者吃光早餐餐吧的全部食物。

抛开酒店的例子,在 Docker 的世界中,容器之间是互相隔离的,但却共享 OS 资源,比如 CPU、RAM 以及硬盘 I/O。CGroup 允许用户设置限制,这样单个容器就不能占用主机全部的 CPU、RAM 或者存储 I/O 资源了。

Capability
以 root 身份运行容器不是什么好主意,root 拥有全部的权限,因此很危险。但是,如果以非 root 身份在后台运行容器的话,非 root 用户缺少权限,处处受限。所以用户需要一种技术,能选择容器运行所需的 root 用户权限。了解一下 Capability!

在底层,Linux root 用户是由许多能力组成的。其中一部分包括以下几点。

    CAP_CHOWN:允许用户修改文件所有权。
    CAP_NET_BIND_SERVICE:允许用户将socket绑定到系统端口号。
    CAP_SETUID:允许用户提升进程优先级。
    CAP_SYS_BOOT:允许用户重启系统。
Docker 采用 Capability 机制来实现用户在以 root 身份运行容器的同时,还能移除非必须的 root 能力。如果容器运行只需要 root 的绑定系统网络端口号的能力,则用户可以在启动容器的同时移除全部 root 能力,然后再将 CAP_NET_BIND_SERVICE 能力添加回来。

MAC
Docker 采用主流 Linux MAC 技术,例如 AppArmor 以及 SELinux。

基于用户的 Linux 发行版本,Docker 对新容器增加了默认的 AppArmor 配置文件。根据 Docker 文档的描述,默认配置文件提供了“适度的保护,同时还能兼容大部分应用”。

Docker 允许用户在启动容器的时候不设置相应策略,还允许用户根据需求自己配置合适的策略。

Seccomp
Docker 使用过滤模式下的 Seccomp 来限制容器对宿主机内核发起的系统调用。

按照 Docker 的安全理念,每个新容器都会设置默认的 Seccomp 配置,文件中设置了合理的默认值。这样做是为了在不影响应用兼容性的前提下,提供适度的安全保障。

用户同样可以自定义 Seccomp 配置,同时也可以通过向 Docker 传递指定参数,使 Docker 启动时不设置任何 Seccomp 配置。 

Linux 安全技术总结
Docker 基本支持所有的 Linux 重要安全技术,同时对其进行封装并赋予合理的默认值,这在保证了安全的同时也避免了过多的限制,如下图所示。

自定义设置某些安全技术会非常复杂,因为这需要用户深入理解安全技术的运作原理,同时还要了解 Linux 内核的工作机制。希望这些技术在未来能够简化配置的过程,但就现阶段而言,使用 Docker 在对安全技术的封装中提供的默认值是很不错的选择。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值