1

本系列教程翻译自 Flux7 Docker Tutorial Series,系列共有九篇,本文译自第五篇 Part 5: Docker Security
该系列所有文章将参考其他学习资料翻译,也会加入自己的学习作为部分注解。如有错误,欢迎指正。

clipboard.png

题外话:本文所讲的是传统意义上的 Docker 安全,关于未来 Docker 的安全可以 参考这篇文章

Docker 安全

安全问题必须要被高度重视,无论是开发环境还是生产环境。如今 Docker 已经被部署在越来越多的地方,Docker 作为项目和平台的安全性也越来越要被重视。

因此,本系列教程关键的第五章用来讨论 Docker 可能面临的安全问题以及它们是如何影响到 Docker 整体的安全性的。但并不是说 Docker 本身不安全:Docker 是建立在 LXC 的基础上的,因此 Docker 继承了 LXC 绝大部分安全优势。

前文中提到 docker run 是用来运行容器的,那么 docker run 之后到底发生了什么?

  1. docker run 命令初始化

  2. Docker 调用 lxc-start 命令。

  3. lxc-start 创建一系列的 namespaces 和 CGroups 进行资源限制。

namespace 是虚拟化的第一层,用于容器以及容器内之间互相隔离。所有的容器都有独立的网络栈、一个容器也无法访问到另一个容器的 Socket 端口。如果你希望容器之间通过网络互访的话,就要开启 Docker 的端口映射功能,或者为容器指定公网 IP。

CGroup 有如下的特点:

  1. 资源计数和资源控制。

  2. 限制内存、CPU、IO 和网络使用。

  3. 试图解决 Dos 攻击问题。

  4. 更适用于多用户、多进程的系统。

对于 namespace 和 CGroups 不熟悉的童鞋可以参考这么几篇文章:
Docker 基础技术:Linux Namespace(上)
Docker 基础技术:Linux Namespace(下)
Docker 基础技术:Linux CGroup

Docker Daemon 的攻击层面

Docker daemon 使用 root 权限运行,肯定需要有许多地方需要特别注意,例如:

  1. 如果 Docker 容器有权限访问宿主机的话,那么要特别小心,Docker 进程的控制权只能给授权用户。举个极端的例子:容器内部的 UID=0 如果对容器外部某个不明程序执行了 chmod +s

  2. REST API 也支持 UNIX socket,从而避免了 XSS 攻击。

  3. REST API 的 HTTP 端口(如果有的话)只能对可信的网络、VPN、IP 开放。

  4. 在服务器上运行 Docker 时需要与其他服务隔离。

一些必要的安全措施包括:

  1. 使用非特权用户运行容器。

  2. Apparmor,SELinux,grsec 都可以当成是一层额外的安全加固。

  3. 可以使用其他容器系统的安全功能。

Docker.io API

本图中列举了几个用于维护和授权的安全性 Docker API。

clipboard.png

本专栏将会在以后的文章中慢慢介绍现在的 Docker API。


大舒
7k 声望815 粉丝

define TRUE FALSE