目录
1.Docker安全问题
1.Docker本身的漏洞
2.Docker源码问题
黑客上传恶意图片
图像使用易受攻击的软件
改变图像的中间人攻击
2. Docker架构缺陷及安全机制
1.容器之间的LAN攻击
2、DDoS攻击耗尽资源
3. 易受攻击的系统调用
4.共享root用户权限
3. Docker 安全基线标准
1. 内核级别
2. 主机级别
3、网络层面
4.镜面水平
5. 集装箱水平
6.其他设置
4. 使用Docker容器时的安全注意事项
1. 不该做什么
2. 你应该尽可能做什么?
5. 容器相关的常见安全配置方法
1. 最小化容器
2.Docker远程API访问控制
2.1. 在Docker服务配置文件中指定监听内网IP
2.2. 重启Docker
2.3. 在主机防火墙上实施IP 访问控制。源地址指定客户端地址。
2.4. 实现客户端远程授权访问
6. 限制交通流量
7. DockerClient与DockerDaemon之间的通信安全
1. https的单向认证流程
2.https双向认证流程
3. 如何获得证书
3.1.首先创建一个存储目录。
3.2. 生成CA证书
3.3. 使用ca证书签署服务器端证书
3.4. 使用ca证书颁发客户端证书
3.5. 删除两个证书签名请求文件和扩展配置文件。
3.6. 配置Docker 服务配置文件
3.7. 重启Docker服务
3.8. 将/tls目录下的三个文件ca.pem、client-cert.pem和client-key.pem复制到另一台主机上。
3.9. 本地验证。使用证书访问时,Docker不支持使用IP进行证书访问。
3.10. 客户端操作
8、Docker客户端与Nginx之间的通信安全
1. 如何获得证书
2.使用openssl创建证书的步骤:证书文件和私钥文件
2.1.创建CA私钥和证书
2.2. 为服务器证书创建自签名请求文件
2.3. 创建服务器证书
3.配置nginx支持https
3.1. 安装时需要添加–with-http_ssl_module模块(启用SSL功能)
3.2. 修改配置文件并添加SSL设置
3.3. 浏览器访问
一.Docker 存在的安全问题
1.Docker 自身漏洞
作为一个应用程序,Docker 自己的实现存在代码缺陷。 Docker 过去版本的20 多个官方CVE 记录
有关漏洞的信息请参考Docker官网。
黑客常用的攻击技术包括代码执行、权限提升、信息泄露和权限绕过。当前Docker 版本的变化
Docker用户可以非常快速地将Docker升级到最新版本。
2.Docker 源码问题
Docker提供了Docker Hub,您可以在其中上传您的镜像并让其他人下载以快速构建环境。但
安全问题也随之出现
例如以下三种方法
黑客上传恶意镜像
如果黑客将特洛伊木马或后门等恶意软件嵌入到生成的映像中,那么环境从一开始就不安全。
根本没有安全感。
镜像使用有漏洞的软件
DockerHub 上可供下载的镜像中有75% 都安装了易受攻击的软件。下载镜像后需要确认
内置软件版本信息,对应版本是否存在漏洞,并及时提供更新和补丁
中间人攻击篡改镜像
图像在传输过程中可能会被篡改。目前新版本的Docker提供了相应的验证机制来防止这个问题。
问题
二.Docker 架构缺陷与安全机制
例如,在这种攻击场景中,如果黑客获得了主机的控制权,Docker 的架构和机制本身就会带来问题。
在公有云上构建并获取一些容器或容器,并对主机或其他容器发起攻击
1. 容器之间的局域网攻击
主机上的容器可以组成一个局域网,ARP欺骗、端口扫描、广播风暴等攻击都会针对该局域网。
可用于
因此,在主机上部署多个容器需要适当的网络安全配置,例如设置iptables 规则。
2. DDoS 攻击耗尽资源
Cgroups 安全机制旨在防止此类攻击,并通过不向单个容器分配太多资源来帮助避免此类问题。
3. 有漏洞的系统调用
Docker 和虚拟机之间的主要区别在于Docker 和主机共享相同的操作系统内核。
主机内核中存在允许权限被超越或升级的漏洞,一旦容器受到威胁,即使容器以普通用户身份运行,Docker 也会被利用。
攻击者还可以利用内核漏洞跳转到主机并执行更多操作。
4. 共享root用户权限
当您使用root 用户权限运行容器时(docker run –privileged),容器内的root 用户也拥有主机。
根权限
三.Docker 安全基线标准
下面从内核、主机、网络、镜像、容器六个方面总结了Docker安全基线标准。
1. 内核级别
请立即更新您的内核。用户命名空间(容器内的root 权限在容器外为非高权限)。设置资源限制,例如cgroup(资源配额和计量)、CPU、内存和磁盘IO。启用SELinux(受控文件访问)以正确强化您的系统并增加安全性。将指定CPU分配给容器的功能(权限分割)。 Seccomp(系统调用限制),限制不必要的系统调用。禁止与宿主进程的命名空间(例如宿主网络模式)共享容器的命名空间。
2. 主机级别
为容器创建单独的分区,例如在分布式文件系统上。仅运行您需要的服务,并注意不要在容器内运行ssh 服务。禁止将主机上的敏感目录映射到容器。使用-v 创建数据卷时要小心。审计Docker daemon进程、相关文件和目录,防止病毒、木马文件的产生。设置默认的适当数量的文件描述符。 root用户对Docker相关文件的访问权限不能超过644。定期检查各主机上的容器库存,清理不需要的容器。
3. 网络级别
使用iptables 设置规则以阻止或允许容器之间的网络流量。允许Docker 修改iptables。禁用Docker 绑定到其他使用的IP/端口或Unix 套接字。禁用容器上的特权端口映射。仅在容器上打开所需的端口。禁止在容器中使用主机网络模式。如果主机有多个网卡,则将容器的传入流量绑定到特定的主机网卡。
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.101
4. 镜像级别
您本地私有镜像仓库服务器镜像中的软件必须是最新版本。为了业务稳定性,建议使用对应版本。请使用可信的图像文件并通过安全渠道下载。不要修补容器和镜像,而是重建镜像,销毁并重建不健康的容器。请妥善管理图片标签,并及时删除不再使用的图片。使用镜像扫描。使用图像签名。
5. 容器级别
容器被最小化,操作系统镜像被设置为最小。容器作为单个主进程运行。使用–privileged 标志禁用特权容器。禁止在容器上运行ssh 服务。确保使用docker exec 进入容器。以只读模式挂载容器的根目录系统(-v 主机目录: 容器目录:ro)。显式定义属于容器的数据驱动器号。设置on-failure 以限制尝试重新启动容器的次数( –restart=on-failure:3 )。限制容器内可用的进程数量,并且docker run -m 限制内存使用以防止forkbomb。 (fork炸弹,快速增长的子进程,耗尽系统进程数量).(){.|.};
6. 其他设置
对主机系统和容器进行定期安全审核。以最少的资源和权限运行容器是Docker 容器安全的核心原则。避免在同一主机上部署多个容器并保持数量可控。监控Docker 容器的使用情况、性能和其他指标(例如zabbix)。添加zabbix等实时威胁检测和事件报警响应能力。使用中央和远程日志收集服务,例如ELK。
四.Docker容器使用的安全注意点
1.尽量别做的事
避免使用–privileged 来运行容器(赋予容器的root 用户在主机上的root 权限)。 避免使用–network host 运行容器(容器共享主机的网络命名空间)。在容器内运行ssh 服务,并避免在容器中安装依赖于主机密钥的目录。
2.尽量要做的事
尝试使用较小的映像运行容器。尝试将容器作为单个应用程序进程运行。确保容器中的应用程序是最新的稳定版本。然后,使用最新稳定版本的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方式访问
听
2.1.在 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.101:2375
2.2.重启 Docker
重新加载systemctl 守护进程
systemctl 重新启动docker
2375 | netstat -natp 2375
2.3.在宿主机的 firewalld 上做 IP 访问控制,source address 指定的是客户端地址
firewall-cmd –permanent –add-rich-rule=\’规则族=\’ipv4\’源地址=\’192.168.80.102\’端口协议=\’tcp\’端口=\’2375\’接受\’
防火墙-cmd –重新加载
或者
iptables -t 过滤器-A 输入-s 192.168.80.102 -p tcp –dport 2375 -j 接受
2.4.在客户端上实现远程授权访问
docker -H tcp: //192.168.80.101镜像
六.限制流量流向
使用防火墙过滤器来限制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 在INPUT 链上创建默认的DROP 规则。这并没有限制docker,并且留下了很大的安全风险。因此,我们推荐
不要在具有外部IP 地址的计算机上使用Docker 服务。使用Docker 编排系统(例如k8s)管理Docker 容器。在主机上的Docker守护进程启动命令中添加–iptables=false,将常用的iptables规则写入文件,并使用iptables-restore重定向输入并更新规则。
七.DockerClient 端与 DockerDaemon 的通信安全
为了防止Docker通信过程中出现链路劫持、会话劫持等导致中间人攻击的问题,C/S两端必须通过TLS连接。
保密通讯
通过在服务器上创建TLS密钥证书并发送给客户端,客户端可以通过私钥访问容器并
Docker通信安全
1.https的单向认证流程
服务器预先通过CA颁发服务器证书和私钥文件。客户端首先向服务器发送服务器证书,包括公钥、证书有效期、CA组织信息等。服务器证书颁发后,客户端用于验证证书的有效性。如果证书无效,请继续执行下一步。如果是这样,将显示警报消息。客户端继续向服务器服务发送自己能够支持的对称加密方案,选择加密级别最高的加密方案,以明文形式发送给客户端。客户端使用所选的加密方案生成随机会话密钥,使用服务器证书的公钥加密会话密钥,然后发送它。 服务器使用私钥解密并检索客户端发送的会话密钥。使用此会话密钥对返回给客户端的https响应消息进行加密。客户端还使用它来解密返回的加密数据并检索https 响应消息。然后双方继续使用该会话密钥进行密文通信,直至会话结束。
2.https的双向认证流程
服务器和客户端之前都通过CA颁发证书和私钥文件。客户端首先将服务器证书发送给服务器,包括公钥、证书有效期和CA组织信息。客户端收到服务器证书后,用于检查证书的有效性。如果证书无效,请继续执行下一步。将显示警报消息。客户端继续向服务器发送包含公钥及其自身支持的对称加密方案的客户端证书。服务器首先检查证书的有效性。如果验证通过,服务器会选择加密程度最高的加密方案,并使用客户端证书的公钥进行解密,得到所选的加密方案。使用加密方案生成随机会话密钥,使用服务器证书的公钥加密会话密钥,并将其发送到服务器服务。客户端使用私钥解密并检索客户端发送的会话密钥。客户端使用该会话密钥对返回给客户端的https响应消息进行加密,并对返回的加密数据进行解密,并检索https响应消息。然后双方继续使用该会话密钥进行密文通信,直至会话结束。
3.如何获取证书
首先,创建一个CA证书,这是官方认可的证书。接下来,为服务器和客户端节点创建证书。
目前创建证书分为三个步骤
设置私钥以确保安全加密。使用私钥进行签名,以确保身份的真实性和不可否认性。使用CA证书创建证书。
主控192.168.80.101 docker-ce-cli-20.10.5-3.el7.x86_64 docker-ce
客户端192.168.80.102 docker-ce-cli-20.10.5-3.el7.x86_64 docker-ce
注意:20.10.9版本中Docker客户端使用的go版本是go1.16.8,所以go1.15之后的版本不支持私有
这里的Docker 客户端将继续使用docker-ce-cli-20.10.5-3.el7.x86_64 安装的版本,因为它具有CA 生成的证书。
书
3.1.首先创建一个存放目录
mkdir /tls
cd /tls/
3.2.生成ca证书
创建CA私钥
openssl genrsa -aes256 -out ca-key.pem 4096 #输入123123
genrsa:使用RSA算法生成私钥。 -aes256:使用256 位密钥的AES 算法对私钥进行加密。每次使用私钥文件时都会提示您输入密码,但这是可选的。 -out:如果未指定,则输出文件的路径。输出文件是标准输出。 4096:指定私钥长度。默认值为1024。此项必须是命令行的最后一个参数
创建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:输出文件的路径
3.3.用 ca 证书签发 server 端证书
创建服务器私钥
openssl genrsa -out serverkey.pem 4096
生成证书签名请求文件(csr 文件)
openssl req -new -key serverkey.pem -sha256 -subj \’/CN=*\’ -out server.csr
使用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。
3.4.用ca证书签发client端证书
生成客户端私钥
openssl genrsa -out 客户端密钥.pem 4096
生成证书签名请求文件
openssl req -new -key client-key.pem -subj \’/CN=client\’ -out client.csr
创建扩展配置文件以创建适合客户端身份验证的密钥
echo ExtendKeyUsage=clientAuth extfile.cnf
使用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
3.5.删除两个证书签名请求文件和扩展配置文件
rm -rf ca.srl 客户端.csr extfile.cnf 服务器.csr
3.6.配置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
3.7.重启docker服务
重新加载systemctl 守护进程
systemctl 重新启动docker
2376 | netstat -natp 2376
设置力0
3.8.将 /tls 目录中的 ca.pem、client-cert.pem、client-key.pem 三个文件复制到另一台主机
scp ca.pem root@192.168.80.101:/etc/docker/
scp client-cert.pem root@192.168.80.101:/etc/docker/
scp client-key.pem root@192.168.80.101:/etc/docker/
3.9.本地验证,使用证书访问时要用主机名连接,docker 不支持使用 IP 进行证书访问
hostnamectl set – 主机名主机
醋
vim /etc/hosts
127.0.0.1 大师
docker –tlsverify –tlscacert=ca.pem –tlscert=server-cert.pem –tlskey=server-key.pem -H tcp: //master:2376 镜像
3.10.在客户端上操作
hostnamectl set – 主机名客户端
醋
vim /etc/主机
192.168.80.101 大师
cd /etc/docker/
docker –tlsverify –tlscacert=ca.pem –tlscert=client-cert.pem –tlskey=client-key.p
em -H tcp://master:2376 images
八.DockerClient 端与Nginx的通信安全
1.如何获取证书
从证书颁发机构(CA)如 Let\’s Encrypt、DigiCert 或云服务商购买或者申请免费证书(免费证书的有限期一般为一年以内)在本地使用 openssl、mkcert、cfssl 等工具生成自签名证书
2.openssl创建证书的步骤:证书文件和私钥文件
2.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.2.创建服务端证书自签名请求文件
openssl genrsa -out server.key 2048 #创建服务端私钥文件
openssl req -new -key server.key -out server.csr #基于服务端私钥创建服务端证书自签名请求文件
2.3.创建服务端证书
openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.pem #基于CA私钥、CA证书和服务端证书自签名请求文件签发服务端证书文件
3.配置nginx支持https
3.1.安装时需要添加 –with-http_ssl_module 模块(启用SSL功能)
3.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; #设置优先使用服务端的加密套件
….
}
3.3.浏览器访问
#以上关于【Docker】Docker 安全及日志管理的相关内容来源网络仅供参考,相关信息请以官方公告为准!
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93872.html