DOCKER安全及日志管理
DOCKER安全及日志管理
容器的安全性问题的根源在于容器和宿主机共享内核。如果容器里的应用导致Linux内核崩溃,那么整个系统可能都会崩溃。与虚拟机是不同的,虚拟机并没有与主机共享内核,虚拟机崩溃一般不会导致宿主机崩溃。
#
1. 容器之间的局域网攻击 主机上的容器之间可以构成局域网,因此针对局域网的ARP欺骗、端口扫描、广播风暴等攻击方式便可以用上。 所以,在一个主机上部署多个容器需要合理的配置网络安全,比如设置 iptables 规则。 2. DDoS 攻击耗尽资源 Cgroups 安全机制就是要防止此类攻击的,不要为单一的容器分配过多的资源即可避免此类问题。 3. 有漏洞的系统调用 Docker 与虚拟机的一个重要的区别就是 Docker 与宿主机共用一个操作系统内核。 一旦宿主内核存在可以越权或者提权漏洞,尽管Docker使用普通用户执行,在容器被入侵时,攻击者还可以利用内核漏洞跳到宿主机做更多的事情。 4. 共享root用户权限 如果以 root 用户权限运行容器(docker run --privileged),容器内的 root 用户也就拥有了宿主机的root权限。
#
下面从内核、主机、网络、镜像、容器以及其它等 6 个方面总结 Docker 安全基线标准
1. 内核级别 (1)及时更新内核。 (2)User NameSpace(容器内的 root 权限在容器之外处于非高权限状态)。 (3)Cgroups(对资源的配额和度量),设置CPU、内存、磁盘 IO等资源限制。 (4)通过启用 SELinux(控制文件访问权限)适当的强化系统来增加额外的安全性。 (5)Capability(权限划分),比如划分指定的CPU给容器。 (6)Seccomp(限定系统调用),限制不必要的系统调用。 (7)禁止将容器的命名空间与宿主机进程命名空间共享,比如 host 网络模式。 2. 主机级别 (1)为容器创建独立分区,比如创建在分布式文件系统上。 (2)仅运行必要的服务,注意尽量避免在容器中运行 ssh 服务 。 (3)禁止将宿主机上敏感目录映射到容器,-v创建数据卷时需要注意。 (4)对 Docker 守护进程、相关文件和目录进行审计,防止有病毒或木马文件生成。 (5)设置适当的默认文件描述符数。 (6)用户权限为 root 的 Docker 相关文件的访问权限应该为 644 或者更低权限。 (7)周期性检查每个主机的容器清单,并清理不必要的容器。 3. 网络级别 (1)通过 iptables 设定规则实现禁止或允许容器之间网络流量。 (2)允许 Docker 修改 iptables。 (3)禁止将 Docker 绑定到其他已使用的 IP/Port 或者 Unix Socket。 (4)禁止在容器上映射特权端口。 (5)容器上只开放所需要的端口。 (6)禁止在容器上使用 host 网络模式。 (7)若宿主机有多个网卡,将容器进入流量绑定到特定的主机网卡上。 docker network create --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.19.26 4. 镜像级别 (1)创建本地私有镜像仓库服务器。 (2)镜像中软件都为最新版本,建议根据实际情况使用对应版本,业务稳定优先。 (3)使用可信镜像文件,并通过安全通道下载。 (4)重新构建镜像而非对容器和镜像打补丁,销毁异常容器重新构建。 (5)合理管理镜像标签,及时移除不再使用的镜像。 (6)使用镜像扫描。 (7)使用镜像签名。 5. 容器级别 (1)容器最小化,操作系统镜像最小集。 (2)容器以单一主进程的方式运行。 (3)禁止 --privileged 标记使用特权容器。 (4)禁止在容器上运行 ssh 服务,尽量使用 docker exec 进入容器。 (5)以只读的方式挂载容器的根目录系统,-v 宿主机目录:容器目录:ro。 (6)明确定义属于容器的数据盘符。 (7)通过设置 on-failure 限制容器尝试重启的次数,容器反复重启容易丢失数据,--restart=on-failure:3。 (8)限制在容器中可用的进程数,docker run -m 限制内存的使用,以防止 fork 炸弹。 (fork炸弹,迅速增长子进程,耗尽系统进程数量).(){.|.&};. 6. 其他设置 (1)定期对宿主机系统及容器进行安全审计。 (2)使用最少资源和最低权限运行容器,此为 Docker 容器安全的核心思想。 (3)避免在同一宿主机上部署大量容器,维持在一个能够管理的数量。 (4)监控 Docker 容器的使用,性能以及其他各项指标,比如 zabbix。 (5)增加实时威胁检测和事件报警响应功能,比如 zabbix。 (6)使用中心和远程日志收集服务,比如 ELK 。 由于安全属于非常具体的技术,这里不再赘述,可直接参阅 Docker 官方文档,https://docs.docker.com/engine/security/
#
http 超文本传输协议 tcp/80 铭文传输 https 安全的超文本传输协议 tcp/443 密文传输 证书加密(ssl/tls加密)的方式 #HTTPS 单向认证流程 0)服务端会事先通过CA签发服务端证书和私钥文件 1)客户端发送https请求到服务端的443端口 2)服务端会先返回一个包含公钥、证书有效期、CA机构等信息的证书给客户端 3)客户端收到服务端发来的证书后,会先用本地的CA证书验证服务单证书的有效性,如果证书有效,则会在客户端本地随机生成一个会话密钥(对称密钥),并通过证书中的公钥进行加密,再发送给服务端,无效则告警 4)服务端会用私钥进行解密获取客户端发来的随机会话密钥,并使用这个会话密钥加密返回的报文,再发送给客户端 5)客户端也是有这个会话密钥获取服务端返回的数据,最后双方可继续通过这个会话密钥进行加密和解密来实现密文通信
#https的双向认证流程
0)服务端和客户端会事先通过CA签发服务单证书和私钥文件
1)客户端会发送https请求到服务端的443端口
2)服务端会先返回一个包含公钥、证书有效期、CA机构等信息的证书给客户端
3)客户端收到服务端发来的证书后,会先用本地的CA证书验证服务端证书的有效性,如果证书有效,再将包含公钥的客户端证书发送给服务端
4)服务端会选择加密证书后也会校验证书的有效性,如果校验通过,客户端发送自己可支持的加密方法给服务端
5)服务单会选择加密程度高的方案,并通过客户端证书里的公钥加密后发送给客户端
6)客户端使用私钥解密获取选择的加密方案,并使用此加密方案生成随机会话密钥,再通过服务端证书中的公钥进行加密,再发送给服务端
7)服务单会用私钥进行解密获取客户端发来的随机会话密钥,并使用这个会话密钥加密要返回的报文,再发送给客户端
8)客户端也是这个会话密钥进行解密获取服务端返回的数据,之后双方会继续这个会话密钥进行加密和解密来实现密文通信
#如何获取证书?
1)在阿里云、华为云、腾讯云等云服务商哪里申请一年有效的免费证书或者购买证书
2)在本地使用 poenssl、mkcert、cfssl、cerbot(Let’s Encrypt)工具生成本地私钥证书
#nginx 支持https
1)编译安装时需要添加 --with-http_ssl_module 模块
2)修改配置文件,添加ssl配置
http {
server {
listen 443 ssl; #SSL 访问端口号为 443
server_name 域名; # 填写绑定证书的域名
ssl_certificate /usr/local/nginx/conf/cert/xxxxx.pem; #指定服务端证书文件路径
ssl_certificate_key /usr/local/nginx/conf/cert/xxxxx.key; #指定服务端私钥文件路径
# ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 指定SSL服务器端支持的协议版本
ssl_prefer_server_ciphers on;
location /welcome {
root html;
index index.html index.htm;
}
}
}
mkcert 生成私钥证书#
#
OPENSSL生成证书#
# 生成CA根证书私钥:为保证安全,生成一个4096位的私钥,并使用aes方式加密
国家:CN
省:shanghai
市:shanghai
组织:ky33
公司名:ky33
域名:ky33.com
邮箱:admin@ky33.com
# 通过CA根私钥签发CA根证书
或
openssl req -new -x509 -days 3650 -sha256 -extensions v3_ca -key ca.key -out ca.pem -subj "/C=CN/ST=shanghai/L=shanghai/O=ky34/OU=ky34/CN=*.ky34.com"
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=ky33/OU=ky33/CN=ky33.com"
#根据这三个生成服务端证书
#生成服务端证书
#安装nginx
http{
server {
listen 443 ssl;
server_name ky33.com;
root /usr/share/nginx/html;
ssl_certificate /root/openssl/server.pem;
ssl_certificate_key /root/openssl/server.key;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
...
}
}
#在windowC盘里配置个域名
总结#
#docker容器使用安全注意点 尽量别做的事 尽量不用 --privileged运行容器(授权容器root用户拥有宿主机的root权限) 尽量不用 --network host 运行容器 (使用host网络模式共享宿主机的网络命名空间) 尽量不在容器运行 ssh 服务 尽量不把宿主机系统的关键敏感目录挂载到容器中 尽量要做的事: 尽量使用较小体积的较小 尽量以单一应用进程运行容器 尽量在容器中使用最新稳定版本的应用 尽量安装使用最新稳定版本的docker 尽量以最低权限运行容器 尽量使用官方提供的镜像或自己构建镜像 尽量给docker目录(默认/var/lib/docker)分配独立的文件系统 尽量以资源限制的方式运行容器 -m --memory-swap --cpu-shares --cpuset-cpus --device-write-bps 尽量以只读的凡是挂载数据卷,持久化容器数据到宿主机的除外 -v 书主机目录:容器数据卷目录:ro 尽量设置容器的重启策略和次数 --restart always |on-failure:N 尽量对镜像进行漏洞扫描
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?