安全文章

配置一个安全的docker宿主机

2020-02-06 北京小佑科技有限公司

为了安全的运行容器,必须经过许多步骤:

--设置正确和合理的主机操作系统 ;

--镜像和容器以稳定的方式进行配置;

--系统与组件的必要集成企业目录,SIEM系统等。

本文以CentOS为例,重点介绍如何配置一个符合安全要求的docker运行宿主机。

如使用Linux默认安装来运行Docker守护进程和容器,会使你的主机出现安全和性能问题。 在本文中,我们将使用CentOS7的最小安装作为示例来说明如何配置来一个安全的docker运行宿主机。 CentOS已经大规模的应用到生产系统中,已被证明是一个稳定而安全的Linux版本。

如果选择使用不同的Linux发行版,本文中的做法仍然值得参考,只需要将相关的示例命令转换为你的目标环境的命令。

配置需要重点关注三个方面:

§  一个不需要任何额外服务和软件的操作系统,只运行Docker所需的工具。

§  安装并配置Docker守护程序以运行容器。 这包括性能和安全的设置,配置Docker更适合于生产环境而不是开发测试环境。

§  设置访问控制的安全策略,将防火墙配置为仅允许SSH和用于外部通信的容器必要端口。

 安装操作系统

§  最小安装

从官方镜像中最小安装CentOS 7, 如果以前安装过CentOS,还有一些步骤需要考虑:

o   删除所有开发工具(编译器等)

o   删除所有监听的服务,只保留22端口以进行SSH访问。 防火墙配置阻止其他正在运行的服务和删除多余服务。

§  更新系统源

更新系统源确保所有库和程序都运行最新的版本。

sudo yum update –y

1.jpg

§  创建一个新用户

不能使用root用户运行容器,所以必须添加一个新的用户。

   例如:添加用户名为dockeruser的新用户

   1、向主机添加新用户。

      adduser dockeruser

   2 、为新用户设置密码

      passwd dockeruser

   3 、将用户添加到wheel组以提供sudo访问权限

      usermod -a -G wheel dockeruser

2.png

§  生成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

3.png

在这种情况下,我们有两个打开和侦听的TCP端口。 41022端口是可以运行的ssh侦听端口 。25端口是SMTP服务,为系统默认安装,我们需要停止。

 2、停止和删除postfix

      a.  停止postfix服务

          sudo systemctl stop postfix

      b.  检查postfix是否还在监听端口25

          sudo nmap -sU -sS -p 1-65535 localhost

4.png

     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

5.png

  3、启动docker

       sudo service docker start

       Alternate: systemctl start docker

   4、验证docker是否正常运行

       sudo docker run hello-world


6.jpg

  

   5 、配置Docker守护进程在开机时启动

       sudo chkconfig docker on

        Alternate: sudo systemctl enable docker

7.png

§  配置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 

8.png

设置访问策略

    在安全性较高的系统中,防火墙配置应启用白名单策略,默认禁用所有入站和出站流量。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

   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

你应该在浏览器中看到以下内容:

  

9.jpg

 

总结

本文介绍了如何通过安全配置来生成一个相对安全的docker运行宿主机,除此之外,还需通过安装最新的安全补丁并保持系统更新,定期安全巡检等来保证docker运行环境的安全性。

 



前期文章

《docker容器的全面安全防护》

后续预告

《docker镜像安全扫描器的实现》

《利用docker插件实现细粒度权限控制》

《docker最佳安全实践详解》

《docker内容信任详解》

《docker安全管理平台的架构设计》

 欢迎订阅关注我们!!!



0.png