大鲸鱼—Docker 安全及日志管理,大鲸公司

大鲸鱼—Docker 安全及日志管理目录 一、Docker 存在的安全问题
1 Docker 自身漏洞
2 Docker 源码问题
二、Docker 架构缺陷与安全机制
三、Docker 安全基线标准
四、容器相关的常用安全配置方

目录

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

(0)
CSDN's avatarCSDN
上一篇 2024年7月26日 下午1:38
下一篇 2024年7月26日 下午1:38

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注