目录
1.Docker安全问题
2. Docker架构缺陷及安全机制
3. Docker 安全基线标准
4. 容器相关的常见安全配置方法
5. 限制交通流量
6.镜像安全
7. DockerClient与DockerDaemon之间的通信安全
https单向认证流程
https双向认证流程
8、Docker客户端与Nginx之间的通信安全
1)创建CA私钥和证书
2)创建服务器端证书的自签名请求文件
3)创建服务器证书
一、Docker 存在的安全问题
1.Docker本身的漏洞
作为一个应用程序,Docker 自己的实现存在代码缺陷。 CVE 官方记录在Docker 官方网站上可以找到Docker 过去版本中的20 多个漏洞。
黑客常用的攻击技术包括代码执行、权限提升、信息泄露和权限绕过。目前,Docker版本变化非常快,因此Docker用户可以将Docker升级到最新版本。
2.Docker源码问题
Docker提供了Docker Hub,您可以在其中上传您的镜像并让其他人下载以快速构建环境。但它也带来了安全问题。
例如有以下三种方法。
(1)黑客上传恶意图片
如果黑客在创建的镜像中嵌入了特洛伊木马、后门或其他恶意软件,那么环境从一开始就不安全,将来也根本不安全。
(2) 镜像使用有漏洞的软件
DockerHub 上可供下载的镜像中有75% 都安装了易受攻击的软件。因此,下载镜像后,应检查内部软件版本信息,检查对应版本是否存在漏洞,并及时更新和修补。
(3) 改变图像的中间人攻击
图像在传输过程中可能会被篡改。目前新版本的Docker提供了相应的验证机制来防止这个问题。
二、Docker 架构缺陷与安全机制
例如,Docker 的架构和机制本身就会引起问题。在攻击场景中,黑客可以控制主机上的某些容器,在公共云上建立容器,获取容器的访问权限,然后对容器发起攻击。攻击主机或其他容器。
1.容器之间的LAN攻击
主机上的容器可以组成一个局域网,因此可以在局域网上进行ARP欺骗、端口扫描、广播风暴等攻击。
因此,在主机上部署多个容器需要适当的网络安全配置,例如设置iptables 规则。
2、DDoS攻击耗尽资源
Cgroups 安全机制旨在防止此类攻击,并通过不向单个容器分配太多资源来帮助避免此类问题。
3. 易受攻击的系统调用
Docker 和虚拟机之间的主要区别在于Docker 和主机共享相同的操作系统内核。
如果主机内核中存在允许过多或提升权限的漏洞,即使Docker 以普通用户身份运行,如果容器遭到入侵,攻击者也可以利用该内核漏洞来获取对主机的访问权限。并执行附加操作。事物。
4.共享root用户权限
当您以root 用户权限运行容器时(docker run –privileged),容器内的root 用户也拥有主机上的root 权限。
三、Docker 安全基线标准
下面从内核、主机、网络、镜像、容器六个方面总结了Docker安全基线标准。
1. 内核级别
(1)及时更新内核。 (2) 用户命名空间(容器内的root 权限在容器外处于非提升状态)。 (3) 设置Cgroup(资源配额和计量)、CPU、内存、磁盘IO等资源限制。 (4)启用SELinux(文件权限控制)以适当加固系统并增加安全性。 (5)给容器分配指定CPU(权限划分)等功能。 (6)Seccomp(系统调用限制),限制不必要的系统调用。 (7) 禁止与宿主进程的命名空间共享容器的命名空间,例如在宿主网络模式下。
2. 主机级别
(1)为容器创建一个独立的分区,比如在分布式文件系统上。 (2) 仅运行您需要的服务,避免在容器内运行ssh 服务。 (3) 禁止将主机上的敏感目录映射到容器。使用-v 创建数据卷时要小心。 (4)审计Docker daemon进程、相关文件、目录,防止病毒、木马文件的产生。 (5)适当设置文件描述符的默认数量。 (6) root用户权限对Docker相关文件的访问权限必须在644以下。 (7)定期检查各主机上的容器列表,清理不需要的容器。
3、网络层面
(1)使用iptables设置规则来阻止或允许容器之间的网络流量。 (2)允许Docker修改iptables。 (3) 禁止将Docker 绑定到任何其他使用的IP/端口或Unix 套接字。 (4) 禁止将特权端口映射到容器。 (五)只对集装箱开放必要的口岸。 (6) 禁止在容器上使用主机网络模式。 (7) 如果主机有多个网卡,则将容器的传入流量绑定到特定的主机网卡。
docker 网络创建–subnet=172.18.0.0/16 –opt \’com.docker.network.bridge.name\’=\’docker1\’mynetwork
docker run -itd –net mynetwork –ip 172.18.0.100 centos:7 /bin/bash
iptables -t nat -A POSTROUTING -s 172.18.0.100 -o ens36 -j SNAT –to-source 192.168.80.10
4.镜面水平
(1) 创建本地私有镜像仓库服务器。 (2)镜像中的软件是最新版本。为了业务稳定性,建议使用对应版本。 (3) 使用可信镜像文件并通过安全渠道下载。 (4) 重建镜像而不是给容器和镜像打补丁,销毁并重建不健康的容器。 (5)请妥善管理图片标签,及时删除不再使用的图片。 (6)采用镜像扫描。 (7) 使用图像签名。
5. 集装箱水平
(1)最小化容器,最小化操作系统镜像集。 (2) 容器作为单个主进程运行。 (3) 禁用–privileged 标志以使用特权容器。 (4) 禁止通过在容器上运行ssh服务进入容器。 (5)以只读方式挂载容器根目录系统(-v主机目录:容器目录:ro)。 (6) 明确定义属于容器的数据的驱动器盘符。 (7)设置on-failure来限制容器重启尝试的次数(–restart=on-failure:3)。 (8) 使用docker run -m 限制容器中可用的进程数量并限制内存使用,以防止forkbomb。 (fork炸弹,快速增长的子进程,耗尽系统进程数量).(){.|.};
6.其他设置
(1)定期对主机系统和容器进行安全审计。 (2)以最少的资源和权限运行容器这是Docker容器安全的核心思想。 (3)避免在同一主机上部署大量容器并保持数量可控。 (4) 监控zabbix等Docker容器的使用情况、性能和其他指标。 (5)添加zabbix等实时威胁检测和事件报警支持功能。 (6)使用ELK等中央和远程日志收集服务;
安全是一项非常专业的技术,所以我们在这里不详细讨论它。请直接参考Docker的官方文档(https://docs.docker.com/engine/security/)。
使用Docker 容器时的安全注意事项:
不应该做什么:
避免使用–privileged 来运行容器(赋予容器的root 用户在主机上的root 权限)。 避免使用–network host 运行容器(容器共享主机的网络命名空间)。在容器内运行ssh 服务,并避免在容器中安装依赖于主机密钥的目录。
你应该尽可能做的事情:
尝试使用较小的映像运行容器。尝试将容器作为单个应用程序进程运行。确保容器中的应用程序是最新的稳定版本。然后,使用最新稳定版本的docker 程序,为docker 目录(默认为/var/lib/docker/)分配一个单独的文件系统,并尝试在资源上运行容器。受限方法-m –memory-swap –cpu-quota –cpuset-cpus –device-write-bps 将主机目录以只读方式挂载到容器数据卷上,除非您想要保留容器数据- v Host。目录: 容器数据卷目录:ro 尝试设置容器重启策略和次数–restart always|on-failure:N
总结:以最少的资源和权限运行容器是Docker容器安全的核心思想。
四、容器相关的常用安全配置方法
1. 最小化容器
如果您只在容器内运行所需的服务,则无法轻松打开SSH 等服务来连接到容器。将其放入容器中,通常采用以下方法:
docker exec -it a661258f6bfe bash
2.Docker远程API访问控制
Docker的远程调用API接口存在未授权访问漏洞,至少应该限制对外部网络的访问。我们推荐使用Socket方式进行访问。
//在Docker服务配置文件中指定监听的内网IP
vim /usr/lib/systemd/system/docker.service
–第13行–更正
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.80.10:2375
(2)重启Docker
重新加载systemctl 守护进程
systemctl 重新启动docker
2375 | netstat -natp 2375
(3) 对主机的防火墙进行IP访问控制。源地址指定客户端地址。
firewall-cmd –permanent –add-rich-rule=\’规则族=\’ipv4\’源地址=\’192.168.80.15\’端口协议=\’tcp\’端口=\’2375\’接受\’
防火墙-cmd –重新加载
或者
iptables -t 过滤器-A 输入-s 192.168.80.15 -p tcp –dport 2375 -j 接受
(4) 实现客户端远程授权访问
docker -H tcp: //192.168.80.10镜像
五、限制流量流向
//使用防火墙过滤器限制Docker容器的源IP地址范围与外部通信。
firewall-cmd –permanent –zone=public –add-rich-rule=\’规则族=\’ipv4\’源地址=\’192.168.80.0/24\’拒绝\’
iptables -t 过滤器-A 输入-s 192.168.80.0/24 -j 拒绝
//生产中的很多问题都是由于暴露Docker容器端口导致的漏洞造成的。除了操作系统账户权限控制问题外,Docker daemon进程管理也存在隐患。
目前常用的Docker 版本支持Docker 守护进程来管理主机iptables,当使用-p host_port:guest_port 的端口映射启动进程时,Docker 守护进程使用相应的FORWARD 链并直接使用-j ACCEPT 并且默认DROP 规则为on输入。由于它是在链中配置的,因此无法限制Docker,并且仍然存在重大安全风险。因此,建议如下:
(1)不要在有外网IP的机器上使用Docker服务。 (2)使用k8s等Docker编排系统管理Docker容器。 (3)在主机上的Docker daemon启动命令中添加–iptables=false,将常用的iptables规则写入文件,并使用iptables-restore重定向输入和更新规则。
六、镜像安全
一般来说,我们建议使用Harbor 的私有存储库,以确保仅从受信任的存储库检索图像。
如果您的公司没有使用自己的镜像源,您应该使用Docker镜像安全扫描工具Clair检查您下载的镜像。它与CVE 数据库同步,扫描映像,验证映像md5 等功能,检查完整性,然后在映像上进行构建。当发现漏洞时,要么通知用户解决该漏洞,要么直接阻止用户继续构建镜像。
避免Docker 容器内的信息泄露
近年来,Github 上发生了多起个人和企业账户密码泄露的事件,当出现此类问题时,建议使用dockerfiles 或docker-compose 文件来创建容器是很常见的。 如果这些文件中包含账户、密码等凭证,那么当Docker 容器暴露给外界时,这些主机上的敏感信息也会被暴露。
七、DockerClient 端与 DockerDaemon 的通信安全
为了防止Docker通信过程中出现链路劫持、会话劫持等导致中间人攻击的问题,C/S两端必须通过TLS加密进行通信。
通过在服务器上创建TLS 密钥证书并将其颁发给客户端,客户端通过私钥访问容器并保护Docker 通信。
https的单向认证流程
0) 服务器预先通过CA颁发服务器证书和私钥文件。 1)客户端向服务器发送https请求。 2) 服务器首先返回包含公钥、证书有效期的服务器证书。客户端3)收到服务器证书后,首先使用本地CA证书验证证书的有效性。如果证书有效,则继续下一步。如果禁用,将显示警报消息。 4) 客户端继续向服务器发送支持的对称加密方案。 5) 服务器选择加密程度最高的加密方案并发送给服务器。客户端以纯文本形式发送。 6) 客户端使用所选的加密方案生成随机会话密钥,并将其与服务器一起使用。 证书中的公钥对会话密钥进行加密并将其发送到服务器。 7) 服务器使用私钥并将其发送到服务器。解密获取客户端发送的会话密钥,并使用该会话密钥对返回给客户端的https响应消息进行加密。 8) 客户端还使用会话密钥对返回的加密数据进行解密并获得https 响应。信息。然后双方继续使用该会话密钥进行密文通信,直至会话结束。
https的双向认证流程
0) 服务器和客户端都事先通过CA颁发证书和私钥文件。 1)客户端向服务器发送https请求。 2) 服务器首先返回包含公钥和证书有效性的服务器证书。至客户端3)客户端收到服务器证书后,首先使用本地CA证书验证证书的有效性。如果证书有效,则继续下一步。如果证书无效,则会显示警告消息。 4) 客户端继续向服务器发送客户端证书,其中包含其可以支持的公钥和对称加密方案。验证通过后,服务器使用客户端证书的公钥选择加密方式并发送给客户端。解密私钥得到选定的加密方案,使用选定的加密方案生成随机会话密钥,并使用服务器证书的私钥对会话密钥进行加密,发送到服务器。 7) 服务器使用自己的私钥解密并检索客户端发送的会话密钥,并使用该会话密钥加密返回给客户端的https响应消息。 8) 客户端还使用会话密钥来解密返回的消息。获取加密数据并获取https响应消息。然后双方继续使用该会话密钥进行密文通信,直至会话结束。
首先,创建一个CA证书,这是官方认可的证书。接下来,为服务器和客户端节点创建证书。
目前创建证书分为三个步骤。
(1)设置私钥,实现安全加密
(2) 使用私钥签名确保身份真实且不可否认。
(3)使用ca证书创建证书
主控192.168.80.10 docker-ce-cli-20.10.5-3.el7.x86_64 docker-ce
客户端192.168.80.15 docker-ce-cli-20.10.5-3.el7.x86_64 docker-ce
注:20.10.9版本中docker客户端使用的go版本是go1.16.8,由于go1.15及以后版本不支持私有CA生成的证书,所以这里的docker客户端是继续使用docker-ce-cli- 20.10。 5-3.el7.x86_64安装版本。
//首先创建一个保存目录
mkdir /tls
cd /tls/
//生成CA证书
(1)创建ca私钥
openssl genrsa -aes256 -out ca-key.pem 4096 #输入123123
————————————————– ————————————————– ——
genrsa:使用RSA算法生成私钥
-aes256:使用256 位密钥的AES 算法对私钥进行加密。每次使用私钥文件时都会提示您输入密码,但这是可选的。
-out:输出文件路径。如果未指定输出文件,则使用标准输出。
4096:指定私钥长度。默认值为1024。此项必须是命令行的最后一个参数
————————————————– ————————————————– ——
(2) CA证书的创建
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj \’/CN=*\’ -out ca.pem #输入123123
————————————————– ————————————————– ——
req:执行证书颁发命令-new:新的证书颁发请求-x509:生成创建私有CA 时专门使用的x509 格式的证书-days:证书有效期,单位-key:指定私钥路径-sha256 :证书摘要使用sha256算法-subj:与证书相关的用户信息(主题缩写) -out:输出文件的路径
————————————————– ————————————————– ——
//使用ca证书对服务器端证书进行签名
(3)服务器私钥的创建
openssl genrsa -out serverkey.pem 4096
(4)生成证书签名请求文件(csr文件)
openssl req -new -key serverkey.pem -sha256 -subj \’/CN=*\’ -out server.csr
(5)使用CA证书和私钥证书颁发服务器签名证书并输入“123123”(需要签名请求文件、CA证书和CA密钥)
openssl x509 -req -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 1000 -out server-cert.pem
————————————————– ————————————————– ——
x509:生成x509格式的证书
-req:输入CSR文件
-in:要输入的csr文件
-CA:指定CA证书的路径。
-CAkey:指定CA证书的私钥路径。
-CAcreateserial:表示创建证书序列号文件。创建的序列号文件的默认名称是ca.srl。
————————————————– ————————————————– ——
//使用ca证书颁发客户端证书
(6) 客户端私钥的生成
openssl genrsa -out 客户端密钥.pem 4096
(7)生成证书签名请求文件
openssl req -new -key client-key.pem -subj \’/CN=client\’ -out client.csr
(8) 创建扩展配置文件,用于创建适合客户端认证的私钥
echo ExtendKeyUsage=clientAuth extfile.cnf
(9) 使用CA证书颁发客户端签名证书,输入“123123”(需要签名请求文件、CA证书和CA密钥)
openssl x509 -req -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -extfile extfile.cnf -days 1000 -out client-cert.pem
//删除两个证书签名请求文件和扩展配置文件
rm -rf ca.srl 客户端.csr extfile.cnf 服务器.csr
//设置Docker服务配置文件
vim /lib/systemd/system/docker.service
–第13行–更正
ExecStart=/usr/bin/dockerd –tlsverify –tlscacert=/tls/ca.pem –tlscert=/tls/server-cert.pem –tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
//重启docker服务
重新加载systemctl 守护进程
systemctl 重新启动docker
2376 | netstat -natp 2376
设置力0
//将/tls目录下的ca.pem、client-cert.pem、client-key.pem三个文件复制到另一台主机
scp ca.pem root@192.168.80.10:/etc/docker/
scp client-cert.pem root@192.168.80.10:/etc/docker/
scp client-key.pem root@192.168.80.10:/etc/docker/
//本地验证。使用证书访问时,Docker 必须使用IP 连接到证书访问。
hostnamectl set – 主机名主机
醋
vim /etc/主机
127.0.0.1 大师
docker –tlsverify –tlscacert=ca.pem –tlscert=server-cert.pem –tlskey=server-key.pem -H tcp: //master:2376 镜像
//客户端操作
hostnamectl set – 主机名客户端
醋
vim /等
c/hosts
192.168.80.10 master
cd /etc/docker/
docker –tlsverify –tlscacert=ca.pem –tlscert=client-cert.pem –tlskey=client-key.pem -H tcp://master:2376 images
八、DockerClient 端与Nginx的通信安全
如何获取证书?
1)从证书颁发机构(CA)如 Let\’s Encrypt、DigiCert 或云服务商购买或者申请免费证书(免费证书的有限期一般为一年以内)2)在本地使用 openssl、mkcert、cfssl 等工具生成自签名证书
openssl创建证书的步骤:证书文件和私钥文件
1)创建CA私钥和证书
openssl genrsa -out ca.key 2048 #创建CA私钥文件(通常是 .crt 或 .pem 扩展名)
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem #基于CA私钥创建CA证书文件(通常是 .key 扩展名)
2)创建服务端证书自签名请求文件
openssl genrsa -out server.key 2048 #创建服务端私钥文件
openssl req -new -key server.key -out server.csr #基于服务端私钥创建服务端证书自签名请求文件
3)创建服务端证书
openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.pem #基于CA私钥、CA证书和服务端证书自签名请求文件签发服务端证书文件
配置nginx支持https
1)安装时需要添加 –with-http_ssl_module 模块(启用SSL功能)
2)修改配置文件,添加ssl配置
server {
listen 443 ssl; #设置ssl访问端口为 443
server_name www.xy101.com; #设置绑定证书的域名
ssl_certificate /etc/nginx/ssl/server.pem; #设置服务端证书文件路径
ssl_certificate_key /etc/nginx/ssl/server.key; #设置服务端私钥文件路径
#其它ssl配置参数
ssl_session_cache shared:SSL:1m; #设置ssl缓存
ssl_session_timeout 5m; #设置客户端连接可复用ssl缓存的有效时间
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #设置支持的ssl协议版本
ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL; #设置支持的加密套件
ssl_prefer_server_ciphers on; #设置优先使用服务端的加密套件
….
}
#以上关于Docker 安全及日志管理的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93800.html