docker registry 仓库加密
1、背景
公司一直用的镜像仓库是docker registry,但是有个安全问题,就是仓库从web ui的浏览到镜像的拉取都是可以直接使用的,还是放到了公网上,只需要知道你的域名那就是畅通无阻了,可以怎么方便怎么来但是这也太方便了,项目是docker跑的微服务,镜像一拉代码直接拿到手 ,前两天还看到个黑客推了个镜像上去,不能在耽误了,赶紧收拾一下。
2、问题解决
在网上看了一些帖子是在仓库容器运行时加一些参数,刚测试的时候是可以的,后面重启了两次容器之后就突然不行了,这里就把配置贴一下,有需求可以搞一下,用的docker-compose
bash
version: '3.1'
services:
registry:
image: registry:2
restart: always
container_name: registry-srv
ports:
- 5000:5000
volumes:
- /new_mount/docker/registry:/var/lib/registry
- /home/app/registry/auth:/auth
environment:
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm"
networks:
- docker_default
registry-ui:
image: joxit/docker-registry-ui:static
restart: always
container_name: registry-ui
ports:
- 18080:80
environment:
- REGISTRY_URL=http://registry-srv:5000
- DELETE_IMAGES=true
networks:
- docker_default
networks:
docker_default:
external: true
registry-ui镜像默认是跑的80,改了一下映射端口,前端使用nginx代理的也是跑的容器,请求头主机配置注释掉了,一打开就报错无法验证sha,这个可以试试怎么回事,我感觉是因为换过仓库的事,htpasswd文件生成可以去网上找一下很多,下面是前端代理的配置。
nash
server {
listen 80;
listen 8054;
server_name registry.xxx.com;
return 301 https://$server_name$request_uri;
}
server {
server_name registry.xxx.com;
include /etc/nginx/conf.d/include/ssl/oa-ssl;
location / {
proxy_pass http://172.26.28.122:18080/;
add_header Access-Control-Allow-Origin *;
#proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /v2/ {
proxy_pass http://172.26.28.122:5000;
add_header Access-Control-Allow-Origin *;
#proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
按我的理解来说上面的配置是可以实现仓库加密的,但还是无法验证通过,我觉的是nginx代理的问题,加上容器是走了两层代理,可能是无法携带验证信息了,有空在研究。
天无绝人之路,找到个其他的方法,直接在前端代理添加验证配置,如果是在'/'匹配规则添加的话他只能验证web ui的访问,对镜像的推拉控制是没有用的,必须要把配置放到/v2/这个匹配规则里面,控制后端接口的访问规则才行,具体原理还不知道怎么回事,先实现了再说。这里放了之后compose文件的加密就不用加。
bash
environment:
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm"
#上面这几行删掉就行
bash
location /v2/ {
stub_status;
auth_basic "Auth access Blog Input your Passwd!";
auth_basic_user_file /etc/nginx/conf.d/htpasswd/docker.conf/htpasswd;
proxy_pass http://172.26.28.122:5000;
add_header Access-Control-Allow-Origin *;
#proxy_set_header Host $host;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
这个破问题还搞了三天