目录
1.Docker安全问题
1 Docker本身的漏洞
2Docker源码问题
2. Docker架构缺陷及安全机制
3. Docker 安全基线标准
4. 容器相关的常见安全配置方法
5. 限制交通流量
6.镜像安全
7.避免Docker容器中的信息泄露
8. DockerClient与DockerDaemon之间的通信安全
使用mkcert 一键生成证书和私钥文件
openssl 创建证书和私钥文件
一、Docker 存在的安全问题
1 Docker 自身漏洞
作为一个应用程序,Docker 自己的实现存在代码缺陷。 CVE 官方记录在Docker 官方网站上可以找到Docker 过去版本中的20 多个漏洞。
黑客常用的攻击技术包括代码执行、权限提升、信息泄露和权限绕过。目前,Docker版本变化非常快,因此Docker用户可以将Docker升级到最新版本。
2Docker 源码问题
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 安全基线标准
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等中央和远程日志收集服务;
四、容器相关的常用安全配置方法
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 通信。
使用证书访问的工作流程:
(1)客户端发起HTTPS请求,连接服务器的443端口。
(2)服务器首先要申请一套数字证书(证书内容包括公钥、证书颁发机构、有效期等)。
(3)服务器将自己的数字证书发送给客户端(公钥在证书中,私钥由服务器持有)。
(4)客户端收到数字证书后,首先验证证书的有效性。如果证书通过验证,则会使用伪随机数生成器(/dev/random) 随机生成对称密钥,并使用证书的公钥对对称密钥进行加密。
(5) 客户端将用公钥加密的【对称密钥】发送给服务器。
(6) 服务器收到客户端发来的密文密钥后,使用之前保留的私钥进行非对称解密,得到客户端的对称密钥,并使用客户端的对称密钥进行处理。对返回的数据进行加密,使发送的所有数据都是密文。
(7)服务器将加密后的密文数据返回给客户端。
(8) 客户端收到后,使用自己的对称密钥对称解密并检索服务器返回的数据。
首先,创建一个CA证书,这是官方认可的证书。接下来,为服务器和客户端节点创建证书。
目前创建证书分为三个步骤。
(1)设置私钥,实现安全加密
(2) 使用私钥签名确保身份真实且不可否认。
(3)使用ca证书创建证书
使用mkcert一键生成证书和私钥文件
光盘/选择
上传mkcert-v1.4.4-linux-amd64
mv mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert
chmod +x !$
mkcert www.xy101.com #指定域名并生成私钥文件和证书
openssl创建证书和私钥文件
安装openssl
创建CA私钥和证书
mkdir openssl
cd openssl/
openssl genrsa -out ca.key 2048 #创建CA私钥文件(通常为.crt或.pem扩展名)
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem #根据CA私钥创建CA证书文件(通常为.key扩展名)
为服务器证书创建自签名请求文件
openssl genrsa -out server.key 2048 #创建服务器私钥文件
openssl req -new -keyserver.key -outserver.csr #根据服务器私钥创建服务器证书的自签名请求文件
创建服务器证书
openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.pem #根据CA私钥、CA证书、自签名服务器证书对服务器证书文件进行签名请求文件
cd /etc/nginx
mkdir SSL
cd /opt/openssl
mv server.pem server.key /etc/nginx/ssl
配置nginx支持https
cd /etc/nginx
vim nginx.conf
添加配置
服务器{
443 监听SSL。
服务器名称www.xy101.com;
字符集utf-8;
ssl_certificate /etc/nginx/ssl/server.pem;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_cache 共享:SSL:1m;
ssl_session_timeout 5 分钟;
ssl_协议TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:ADH:EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers 已打开。
位置/{
根/usr/share/nginx/html;
索引index.phpindex.html;
}
}
nginx-t
systemctl 重新启动nginx
浏览器访问
以上#大鲸鱼-Docker安全及日志管理相关内容来源仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93751.html