本文将为大家介绍docker守护进程的相关安全配置项目。
一、测试环境
1.1 安装 CentOS 7
CentOS Linux release 7.7.1908 (Core) 升级内核,重启 # yum update kernel [root@localhost docker]# uname -a Linux localhost 3.10.0-1062.12.1.el7.x86_64 #1 SMP Tue Feb 4 23:02:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux [root@localhost docker]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core)
1.2 安装 docker ce 19.03
# yum install -y yum-utils device-mapper-persistent-data lvm2# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# yum install -y docker-ce[root@localhost docker]# docker --versionDocker version 19.03.8, build afacb8b
二、 守护进程安全配置
默认没有配置文件,需要单独创建/etc/docker/daemon.json ,下面配置都是在该文件上进行配置,本地的测试示例。 { "icc": false, "log-level": "info", "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file":"5", "labels": "somelabel", "env": "os,customer" }, "iptables": true, "userns-remap": "default", "userland-proxy": false, "experimental": false, "selinux-enabled": true, "live-restore": true, "no-new-privileges": true, "cgroup-parent": "/foobar", "seccomp-profile": "/etc/docker/seccomp/default-no-chmod.json", "tls": true, "tlsverify": true, "tlscacert": "/etc/docker/CA/ca.pem", "tlscert": "/etc/docker/CA/server-cert.pem", "tlskey": "/etc/docker/CA/server-key.pem"}
2.1 配置通过 HTTPS 和证书认证访问 Docker 守护进程
服务器证书 创建 HOST,定义域(IP 也可以),会根据域来生成对应的证书,一般用于注册证书当中的 CN: 创建证书目录: $ mkdir -p /etc/docker/dockerd/CA && cd /etc/docker/dockerd/CA
生成 key 证书,并填写两次 key 证书密码: $ openssl genrsa -aes256 -out ca-key.pem 4096
生成 ca 证书,需要输入注册证书基础信息: $ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
创建 server 证书: $ openssl genrsa -out server-key.pem 4096$ openssl req -subj "/CN=localhsot" -sha256 -new -key server-key.pem -out server.csr 设定证书指定的 IP 地址: $ echo subjectAltName = DNS:localhost,IP:127.0.0.1 >> extfile.cnf
将 Docker 守护程序密钥的扩展使用属性设置为仅用于服务器身份验证: $ echo extendedKeyUsage = serverAuth >> extfile.cnf
生成 server cert 证书: $ openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
客户端证书 创建客户端证书:(还是当前目录) $ openssl genrsa -out key.pem 4096$ openssl req -subj '/CN=localhost' -new -key key.pem -out client.csr 要使密钥适合客户端身份验证,请创建扩展配置文件: $ echo extendedKeyUsage = clientAuth >> extfile.cnf
生成 client cert 证书: $ openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
使用 对证书赋予相应的权限: $ chmod -v 0400 ca-key.pem key.pem server-key.pem$ chmod -v 0444 ca.pem server-cert.pem cert.pem[root@localhost CA]# lsca-key.pem ca.pem ca.srl cert.pem client.csr extfile.cnf key.pem server-cert.pem server.csr server-key.pem 服务端配置 /etc/docker/daemon.json "tls": true,"tlsverify": true,"tlscacert": "/etc/docker/CA/ca.pem","tlscert": "/etc/docker/CA/server-cert.pem","tlskey": "/etc/docker/CA/server-key.pem" 客户端配置 设置客户端证书到当服务器上,并放置到相应的位置: $ cp -v {ca,cert,key}.pem ~/.docker$ export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1 通过如下方式模拟测试: $ curl https://$HOST:2376/images/json / --cert ~/.docker/cert.pem / --key ~/.docker/key.pem / --cacert ~/.docker/ca.pem [{"Containers":-1,"Created":1540777343,"Id":"sha256:55e7b305dc477345434ce3bd3941940481f982eea31c8f28c0670d59c63d544b","Labels":nu
2.2 使用namespace隔离技术
namespace是一种隔离技术,docker就是使用隔离技术开启特定的namespace创建出一些特殊的进程,不过使用namespace是有条件的。系统会创建dockremap,通过/etc/subuid和/etc/subuid对应的id值,映射到容器中去;实际情况还是使用的是dockremap普通权限,达到自动隔离的效果。 首先修改 /etc/sysctl.conf # echo "user.max_user_namespaces=15076" >> /etc/sysctl.conf
在 /etc/docker/daemon.json 增加配置项 "userns-remap": "default" 修改此项配置需要慎重,如果是已经部署了一套docker环境,启用此选项后,会切换到隔离环境,以前的docker容器将无法使用! [root@localhost docker]# cat /etc/subuiddockremap:100000:65536
2.3 设置 docker 的分区
为容器创建单独的分区,默认分区在/var/lib/docker/ ,包含本地镜像、容器、网络等相关的东西。 [root@localhost docker]# ls /var/lib/docker
100000.100000 builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes 可以使用 "data-root": "" 配置默认的分区位置。
2.4 限制默认网桥容器之间的流量
当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 链上。策略为通过( ACCEPT )还是禁止( DROP ),取决于配置 --icc=true (缺省值)还是 --icc=false 。如果手动指定 --iptables=false 则不会添加 iptables 规则。 默认情况下,默认网桥上同一主机上的容器之间允许所有网络通信,如果不需要,限制所有容器间的通信。 将需要通信的特定容器链接在一起,或者创建自定义网络,并且仅加入需要与该自定义网络进行通信的容器。 配置限制默认网桥上容器之间的流量 "icc":false
2.5 配置日志
配置集中的远程日志,设置日志进程 --log-level 级别为 info ,日志记录格式 json,本地日志记录 "log-level": "info","log-driver": "json-file","log-opts": { "max-size": "10m", "max-file":"5", "labels": "somelabel", "env": "os,customer"}, 配置远程日志
Docker 日志记录驱动程序接收容器日志并将其转发到远程目标或文件。 默认的日志记录驱动程序是json-file 。 它将容器日志以JSON格式存储在本地磁盘上。 Docker具有用于记录日志的插件体系结构,因此有用于开源工具和商业工具的插件: Journald 下载地址: nginx-ingress-controller日志持久化方案的解决 CentOS7中使用shell脚本安装python3.8环境(推荐) |