基于Docker Distribution的本地Registry安全加固咨询(RHEL7)
针对你在RHEL7上维护本地Docker Registry(进程为/usr/bin/registry serve /etc/docker-distribution/registry/config.yml)的安全加固需求,我来一步步帮你实现指定的两项功能,再补充一些实用的额外安全建议:
Docker Registry支持HTTP基本认证,我们可以用htpasswd工具快速搭建用户密码认证体系:
安装依赖工具:
yum install -y httpd-tools创建认证信息存储目录和初始密码文件(这里以
/etc/docker-distribution/auth为例):mkdir -p /etc/docker-distribution/auth htpasswd -Bc /etc/docker-distribution/auth/htpasswd <你的用户名>执行后会提示你输入密码,
-B参数表示用更安全的bcrypt加密算法,-c表示创建新文件;后续添加新用户时去掉-c即可。修改Registry配置文件
/etc/docker-distribution/registry/config.yml,添加认证规则:
在http配置块下插入auth节点:http: addr: :5000 auth: htpasswd: realm: Registry Realm path: /etc/docker-distribution/auth/htpasswd如果原有
http块已有内容,直接追加auth部分即可。重启Registry服务使配置生效:
systemctl restart docker-distribution客户端验证:
现在拉取/推送镜像前必须先登录,执行以下命令输入用户名密码即可:docker login <你的Registry地址,比如localhost:5000>
为了避免明文传输敏感数据,我们需要给Registry配置SSL证书,分两种场景实现:
场景1:使用自签证书(适合内部私有环境)
创建证书存储目录:
mkdir -p /etc/docker-distribution/certs生成自签SSL证书(替换
<registry-domain>为你的Registry域名或IP,比如registry.internal.com或192.168.3.10):openssl req -newkey rsa:4096 -nodes -sha256 -keyout /etc/docker-distribution/certs/domain.key -x509 -days 365 -out /etc/docker-distribution/certs/domain.crt执行过程中填写证书信息时,
Common Name必须和Registry的访问地址完全一致(域名或IP)。修改Registry配置文件启用SSL:
更新http配置块为:http: addr: :443 tls: certificate: /etc/docker-distribution/certs/domain.crt key: /etc/docker-distribution/certs/domain.key这里用了标准HTTPS端口443,如果你想保留原5000端口,把
addr改成:5000即可,客户端访问时需要带上端口号。调整证书权限确保Registry进程可读取:
chown -R root:root /etc/docker-distribution/certs chmod 600 /etc/docker-distribution/certs/domain.key重启Registry服务:
systemctl restart docker-distribution客户端信任自签证书:
在需要访问Registry的客户端机器(RHEL7)上,创建证书目录并复制Registry的证书:mkdir -p /etc/docker/certs.d/<registry-domain>:<port> cp /path/to/registry/domain.crt /etc/docker/certs.d/<registry-domain>:<port>/ca.crt然后重启Docker服务:
systemctl restart docker之后客户端就能通过HTTPS正常访问Registry了。
场景2:使用正式CA签发的证书(适合生产环境)
如果你有可信CA机构签发的证书,只需将证书文件(.crt)和私钥文件(.key)放到/etc/docker-distribution/certs目录,再按照上面步骤3-5配置并重启服务即可,客户端无需额外配置信任(因为CA是全球可信的)。
除了上述两项核心需求,这些措施能进一步提升Registry的安全性:
限制访问IP范围:用RHEL7的
firewalld只允许指定IP段访问Registry端口:# 允许192.168.3.0/24段访问443端口 firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.3.0/24" port port="443" protocol="tcp" accept' --permanent firewall-cmd --reload加固存储目录权限:确保Registry镜像存储目录(默认
/var/lib/registry)权限严格:chown -R root:root /var/lib/registry chmod 700 /var/lib/registry定期清理无用镜像:避免存储资源浪费,同时减少攻击面:
使用Registry自带的垃圾回收命令:registry garbage-collect /etc/docker-distribution/registry/config.yml建议通过
crontab -e添加定时任务,定期执行清理。启用审计日志:在
config.yml中添加日志配置,便于追踪操作行为:logging: level: info formatter: text fields: service: registry可以通过
journalctl -u docker-distribution查看Registry的详细操作日志。及时更新Registry版本:定期修复已知漏洞:
yum update docker-distribution使用专用用户运行(可选):如果安全要求极高,可以创建专用用户运行Registry进程,修改
/usr/lib/systemd/system/docker-distribution.service中的User和Group字段,再调整相关目录权限。
内容的提问来源于stack exchange,提问作者Zama Ques

