如使用Linux默认安装来运行Docker守护进程和容器,会使你的主机出现安全和性能问题。 在本文中,我们将使用CentOS7的最小安装作为示例来说明如何配置来一个安全的docker运行宿主机。
本文以CentOS为例,介绍如何配置一个符合安全要求的docker运行宿主机。如使用默认安装来运行Docker守护进程和容器,会使你的主机出现安全和性能问题。 在本文中,我们将使用CentOS7的最小安装作为示例来说明如何配置来一个安全的docker运行宿主机。 CentOS已经大规模的应用到生产系统中,已被证明是一个稳定而安全的Linux版本。如果选择使用不同的Linux发行版,本文中的做法仍然值得参考,只需要将相关的示例命令转换为你的目标环境的命令。配置需要重点关注三个方面:
1、一个不需要任何额外服务和软件的操作系统,只运行Docker所需的工具。
2、安装并配置Docker守护程序以运行容器。 这包括性能和安全的设置,配置Docker更适合于生产环境而不是开发测试环境。
3、设置访问控制的安全策略,将防火墙配置为仅允许SSH和用于外部通信的容器必要端口。
从官方镜像中最小安装CentOS 7, 如果以前安装过CentOS,还有一些步骤需要考虑:
删除所有监听的服务,只保留22端口以进行SSH访问。 防火墙配置阻止其他正在运行的服务和删除多余服务
更新系统源确保所有库和程序都运行最新的版本。
sudo yum update –y
不能使用root用户运行容器,所以必须添加一个新的用户。
例如:添加用户名为dockeruser的新用户
1、向主机添加新用户。
adduser dockeruser
2、为新用户设置密码
passwd dockeruser
3、将用户添加到wheel组以提供sudo访问权限
usermod -a -G wheel dockeruser
安全最佳做法是禁用使用密码的身份验证。我们可使密钥,并将其复制到服务器作为认证密钥。 以下步骤将是如何为linux或OSX主机生成密钥。
1、 在的客户端上生成ssh密钥
ssh-keygen –t rsa
2、运行此命令将在你的主目录的.ssh目录中创建两个文件
a. id_rsa –私钥
b. id_rsa.pub –公钥
3、使用新建用户dockeruser登录到Docker主机
mkdir ~/.ssh
sudo chmod 700 ~/.ssh
4 、 将公钥复制到Docker主机。 例如
scp ~/.ssh/id_rsa.pub dockeruser@10.0.0.37:~/.ssh/authorized_keys
5、现在可以不使用密码登录到主机
ssh dockeruser@10.0.0.37
禁用root用户登录到主机系统。 另外不允许使用密码登录。这是为了防止使用暴力破解主机系统的账号 ,在上面介绍中,向系统添加了一个新用户,并将其密钥复制到服务器。 使用该用户配置主机。
1、使用新添加的用户登录到主机
2、编辑SSH程序的配置文件禁用root登录
sudo vi /etc/ssh/sshd_config
3、找到以下文本:
#PermitRootLogin yes
4、更改内容为如下
PermitRootLogin no
5、找到以下文本的行
#PasswordAuthentication yes
6、更改内容为如下
PasswordAuthentication no
7、重启SSH服务
sudo systemctl restart sshd.service
出于安全考虑,宿主机是用于运行容器,因此,不应该运行任何多余的服务。建议更改ssh监听端口以进一步增强安全性。 对于本文中,已经更改SSH监听端口41022。
1、列出任何开放和侦听端口
sudo nmap -sU -sS -p 1-65535 localhost
在这种情况下,我们有两个打开和侦听的TCP端口。 41022端口是可以运行的ssh侦听端口 。25端口是SMTP服务,为系统默认安装,我们需要停止。
2、停止和删除postfix
a. 停止postfix服务
sudo systemctl stop postfix
b. 检查postfix是否还在监听端口25
sudo nmap -sU -sS -p 1-65535 localhost
c. 从主机中删除postfix
sudo yum remove postfix
1、配置yum以查找Docker存储库
a. 创建一个新文件来保存Docker存储库的信息
sudo vi /etc/yum.repos.d/docker-ce.repo
b. 将以下内容添加到文件中:
[docker-ce-stable]
name=Docker CE Stable – $basearch
baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
c. 保存文件
2、安装Docker软件包
sudo yum install docker-ce –y
3、启动docker
sudo service docker start
Alternate: systemctl start docker
4、验证docker是否正常运行
sudo docker run hello-world
5 、配置Docker守护进程在开机时启动
sudo chkconfig docker on
Alternate: sudo systemctl enable docker
通过配置Docker来增加安全性,用于生产环境限制容器资源消耗。我们通过给docker守护进程传递命令行参数来执行操作。 我们将要使用的命令行总结如下
–icc=false
禁止容器之间通信。
(–link=CONTAINER_NAME_or_ID:ALIAS)
–log-level“info”
将日志级别设置为info。 日志记录有多个级别,但有时记录内容非常多,会导致磁盘耗尽。日志级别的设置是为了获取需要的日志信息,而不是获取所有记录信息,而且有些日志信息无用且占用大量磁盘空间。
–iptables=true
启用iptables规则。
–default-ulimit
为容器设置默认的ulimits。这个参数将设置限制进程和文件的数量有关。这会确保容器不会占用过多的主机资源而造成主机宕机。
Docker进程启动参数非常多,本文中只说明配置方法,更多进程启动参数请参阅docker官网。下面是进程启动参数的配置方法:
1 、编辑docker.service文件
sudo vi /usr/lib/systemd/system/docker.service
2 、找到以下文本行
ExecStart=/usr/bin/dockerd
3 、修改为如下
ExecStart=/usr/bin/dockerd –icc=false –log-level “info” –iptables=true –default-ulimit nproc=1024:2408–default-ulimit nofile=1024:2048
4、重新加载
sudo systemctl daemon-reload
5、重新启动Docker服务
sudo service docker restart
6、验证命令行操作现在被传递给Docker
sudo ps -eaf | grep docker
在安全性较高的系统中,防火墙配置应启用白名单策略,默认禁用所有入站和出站流量。CentOS 7的防火墙默认使用firewalld,为了方便和docker容器访问控制集成,这里将禁用firewalld并使用iptables服务用于访问控制。
1 、禁用firewalld
sudo systemctl disable firewalld
2 、安装iptables-services
sudo yum install iptables-services –y
3 、启用iptables服务
sudo systemctl enable iptables
4、配置iptables规则(在最后的规则中,将
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -A INPUT -p tcp -s 0/0 -d<serverip> –sport 513:65535 –dport 22 -mstate –state NEW,ESTABLISHED -j ACCEPT
5、保存iptables规则
sudo service iptables save
6 、验证iptables规则
sudo iptables –L
让我们通过下载并运行nginx来测试Docker的安装。
1、下载images
sudo docker pull nginx (alpine /nginx:latest)
2 、启动nginx容器
sudo docker run –name docker-nginx -p 80:80 nginx
注意:-p 80:80将容器的端口80映射到主机外部端口80。
这条命令会修改iptables的规则,以允许流量通过端口80
3 、连接到端口80上主机的IP地址
http://serverip:80
你应该在浏览器中看到以下内容:
本文介绍了如何通过安全配置来生成一个相对安全的docker运行宿主机,除此之外,还需通过安装最新的安全补丁并保持系统更新,定期安全巡检等来保证docker运行环境的安全性。