配置一个安全的docker宿主机

有运维或运维开发方面的需求,可以联系博主QQ 452336092或Email:admin#centos.bz(收费)

文章目录
[隐藏]

如使用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

生成SSHD密钥

     安全最佳做法是禁用使用密码的身份验证。我们可使密钥,并将其复制到服务器作为认证密钥。 以下步骤将是如何为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

SSH禁用root登录和使用密码的身份验证

禁用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

停止SSHD以外的任何服务

出于安全考虑,宿主机是用于运行容器,因此,不应该运行任何多余的服务。建议更改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

安装和配置Docker

安装Docker

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来增加安全性,用于生产环境限制容器资源消耗。我们通过给docker守护进程传递命令行参数来执行操作。 我们将要使用的命令行总结如下

–icc=false

禁止容器之间通信。

  • 如果了解应用环境的网络拓扑,可以启用某几个容器与容器之间来进行通信使用—link参数

(–link=CONTAINER_NAME_or_ID:ALIAS)

  • 如果需要所有容器之间相互通信,可以将其设置为true,但这种情况在某种程度上是不安全的,它允许所有容器之间的完全网络通信。

–log-level“info”

将日志级别设置为info。 日志记录有多个级别,但有时记录内容非常多,会导致磁盘耗尽。日志级别的设置是为了获取需要的日志信息,而不是获取所有记录信息,而且有些日志信息无用且占用大量磁盘空间。

–iptables=true

启用iptables规则。

–default-ulimit

为容器设置默认的ulimits。这个参数将设置限制进程和文件的数量有关。这会确保容器不会占用过多的主机资源而造成主机宕机。

  • –default-ulimit nproc=1024:2048 –default-ulimit nofile=1020:2048

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规则(在最后的规则中,将替换为你的服务器ip-address)

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进行测试

让我们通过下载并运行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运行环境的安全性。

原文出处:freebuf -> http://www.freebuf.com/column/153346.html

打赏

如果此文对你有所帮助,请随意打赏鼓励作者^_^