猿创征文|docker本地私人仓库快速搭建后的安全优化(用户鉴权和简易的web界面开启)

简介: 猿创征文|docker本地私人仓库快速搭建后的安全优化(用户鉴权和简易的web界面开启)

前言

docker的本地仓库其实要说随便一用,也确实简单,两三条命令就搞定了。但,如果想有一定的安全性,那么,还是比较复杂的一个事情。比如,用户权限,鉴权和web可视化管理界面的开启。

上一个博文大略的讲了一下如何搭建一个简单的本地私人docker仓库,并有两种方式,一个是最为简单的无任何安全性的本地仓库,人人都可随意上传下载的,一个是有证书的,使用https验证的本地私人docker仓库。博文地址是:猿创征文|docker本地仓库的搭建(简易可快速使用的本地仓库)_zsk_john的博客-CSDN博客

现在就接着上面的博文,继续优化这个本地docker仓库。

一,

前情回顾+安全验证配置

HTTP类型的本地仓库,容器启动命令:

docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry -v /opt/data/config.yml:/etc/docker/registry/config.yml  --name registry registry.cn-beijing.aliyuncs.com/google_registry/registry:2.4.1

此时的开启web界面的容器启动命令:

docker run -it -d --name registry-web -e REGISTRY_URL=http://192.168.217.17:5000/v2 -e REGISTRY_NAME=192.168.217.17 -p 9055:8080 registry.cn-beijing.aliyuncs.com/google_registry/docker-registry-web

登录地址

这个时候启动的本地仓库是可以随意的push的,只要知道本地仓库的地址,这是很危险的,如果是有别有用心的人,那么,指不定push上传到服务器里什么文件呢,对吧,非常危险。那么,设置一个密码,在push操作之前我们对push的人做一个密码验证就可以大大提高本地仓库的安全性了。

(1)建立目录存放密码文件

先建立一个目录,mkdir /opt/auth/

(2)生成密码 文件,下面这个命令是生成的用户名是linkcm,密码是123456

docker run --entrypoint htpasswd \
registry.cn-beijing.aliyuncs.com/google_registry/registry:2.4.1  \
-Bbn linkcm 123456 \
>>/opt/auth/htpasswd

添加第二个用户,用户名是zsk,密码是qwerasdf:

 

docker run --entrypoint htpasswd \
registry.cn-beijing.aliyuncs.com/google_registry/registry:2.4.1  \
-Bbn zsk qwerasdf \
>>/opt/auth/htpasswd

(3)查看文件内容,确定是加密的

[root@slave1 ~]# cat /opt/auth/htpasswd 
linkcm:$2y$05$ImH24JuZ0NnsOHnwjUF9oeDO/F.t6JF3FHEYKaoomDa5327v/7YSC

(4) 启动本地开启了5000端口的http仓库,此时的私有仓库不管是推送还是拉取动作都需要登录才可以进行

docker run -d -p 5000:5000 \
-v /opt/registry/data:/var/lib/registry \
-v /opt/registry/conf/config.yml:/etc/docker/registry/config.yml \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm \
-v /opt/auth:/auth \
--name localregistry registry.cn-beijing.aliyuncs.com/google_registry/registry:2.4.1

主要是启动镜像命令增加了以下这些内容:

-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
-e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm
-v /opt/auth:/auth

(5)验证:

第一次没有登录的push,结果失败:

[root@slave1 auth]# docker push 192.168.217.17:5000/pause
The push refers to repository [192.168.217.17:5000/pause]
ba0dae6243cc: Preparing 
unauthorized: authentication required

登录后的push,结果成功(账号是linkcm,密码是123456):

[root@slave1 auth]# docker login 192.168.217.17:5000
Authenticating with existing credentials...
Login did not succeed, error: Error response from daemon: login attempt to http://192.168.217.17:5000/v2/ failed with status: 401 Unauthorized
Username (test): linkcm
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@slave1 auth]# docker push 192.168.217.17:5000/pause
The push refers to repository [192.168.217.17:5000/pause]
ba0dae6243cc: Layer already exists 
3.2: digest: sha256:4a1c4b21597c1b4415bdbecb28a3296c6b5e23ca4f9feeb599860a1dac6a0108 size: 526

https容器启动(在16服务器上启动,这个端口是443的):

docker run -d --restart=always --name registry \
-v /opt/ssl:/certs \
-v /opt/registry/data:/var/lib/registry \
-v /opt/registry/conf/config.yml:/etc/docker/registry/config.yml \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myssl.pem \
-e REGISTRY_HTTP_TLS_KEY=/certs/myssl.key \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm \
-v /opt/auth:/auth \
-p 443:443 \
 registry.cn-beijing.aliyuncs.com/google_registry/registry:2.4.1

在18服务器上登录私服:

[root@k8s-node1 ~]# docker login master.com.cn
Username: linkcm
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

退出私服登录:

[root@k8s-node2 ~]# docker logout master.com.cn
Removing login credentials for master.com.cn

此时的docker私服不管是上传还是下载都需要先登录才可以下一步了。

以上仅仅是本地仓库的用户安全加固,也就是必须登录私有仓库后才可以进行推拉操作,还没有开启web界面。




配合web端的全面安全加固,web端和命令行都有登录验证,上传,下载都有密码登录验证。

本地仓库的容器启动(这个本地仓库是没有密码验证的):

docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry -v /opt/data/config.yml:/etc/docker/registry/config.yml  --name registry registry.cn-beijing.aliyuncs.com/google_registry/registry:2.4.1

此时的web界面开启(web端也是没有密码验证的,两个容器是一对的哦):

docker run -it -d --name registry-web -e REGISTRY_URL=http://192.168.217.17:5000/v2 -e REGISTRY_NAME=192.168.217.17:5000 -p 9055:8080 registry.cn-beijing.aliyuncs.com/google_registry/docker-registry-web

登录地址是:http://192.168.217.17:9055/

以上是没有用户认证的,那么,下面开启强制用户认证,也就是说web端,必须要输入密码验证后才可以上传镜像。




证书生成的命令:

openssl req  -newkey rsa:4096 -nodes -sha256 -keyout /opt/ssl/myssl.key -x509 -days 365 -out /opt/ssl/myssl.pem

相关证书的存放路径:

[root@master conf]# ll /opt/ssl/
total 8
-rw------- 1 root root 3272 Sep  2 20:59 myssl.key
-rw-r--r-- 1 root root 2009 Sep  2 21:00 myssl.pem

建立证书另一个存放路径并拷贝证书到相应路径:

mkdir -p /etc/docker/registry
cp /opt/ssl/myssl.pem /etc/docker/registry

 

私有仓库的配置文件:

[root@master conf]# cat /opt/registry/conf/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        blobdescriptor: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
http:
    addr: 0.0.0.0:5000
    headers:
        X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 4
auth:
  token:
    realm: http://192.168.217.16:9055/api/auth
    service: 192.168.217.16:5000
    issuer: 'my issuer'
    rootcertbundle: /etc/docker/registry/myssl.pem

启动本地仓库容器的命令:

docker run -v /opt/registry/conf/config.yml:/etc/docker/registry/config.yml:ro \
-v /opt/registry/data:/var/lib/registry  \
-v /opt/ssl/myssl.pem:/etc/docker/registry/myssl.pem:ro \
-p 5000:5000  \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm \
-v /opt/auth:/auth \
--name registry-srv \
-d  registry.cn-beijing.aliyuncs.com/google_registry/registry:2.4.1

建立私有仓库web界面的配置文件存放路径,并编写配置文件:

mkdir -p /opt/registry-web/conf/

 

registry-web的配置文件内容:

[root@master conf]# cat /opt/registry-web/conf/config.yml 
registry:
  url: http://192.168.217.16:5000/v2
  name: 192.168.217.16:5000
  readonly: false
  auth:
    enabled: true
    issuer: 'my issuer'
    key: /conf/myssl.key

启动web界面容器的命令:

docker run -it -d -v /opt/registry-web/conf/config.yml:/conf/config.yml:ro \
-v /opt/ssl/myssl.key:/conf/myssl.key   \
-p 9055:8080 \
--name registry-web \
registry.cn-beijing.aliyuncs.com/google_registry/docker-registry-web

web端登录地址和界面(192.168.217.16:9055):

 

用户鉴权这些都在web端操作了,初始登录账户和密码是admin/admin

测试拉取镜像,可以看到,如果没有登录,将会报错:

[root@slave2 ~]# docker pull 192.168.217.16:5000/nginx:1.8
Error response from daemon: Head http://192.168.217.16:5000/v2/nginx/manifests/1.8: unauthorized: authentication required

当然,上传文件如果不登录也是会报错的,就不演示了。用户登录是这样的:

[root@slave2 ~]# docker login 192.168.217.16:5000
Username: zsk
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

输入正确的密码后,zsk用户登录成功,并且上传和下载镜像都正常了,例如上传:

[root@slave2 ~]# docker push 192.168.217.16:5000/registry-web
Using default tag: latest
The push refers to repository [192.168.217.16:5000/registry-web]
8779b4998d0c: Layer already exists 
9eb22ef427e2: Layer already exists 
64d1c65ea33e: Layer already exists 
d6c3b0e63834: Layer already exists 
1315f14832fa: Layer already exists 
d16096ccf0bb: Layer already exists 
463a4bd8f8c1: Layer already exists 
be44224e76b9: Layer already exists 
d96a8038b794: Layer already exists 
f469fc28e82e: Layer already exists 
8418a42306ef: Layer already exists 
03457c5158e2: Layer already exists 
7ef05f1204ee: Layer already exists 
f7049feabf0b: Layer already exists 
5ee52271b8b7: Layer already exists 
8b1153b14d3a: Layer already exists 
367b9c52c931: Layer already exists 
3567b2f05514: Layer already exists 
292a66992f77: Layer already exists 
641fcd2417bc: Layer already exists 
78ff13900d61: Layer already exists 
latest: digest: sha256:2c4f88572e1626792d3ceba6a5ee3ea99f1c3baee2a0e8aad56f0e7c3a6bf481 size: 4695

命令行退出登录;

[root@slave2 ~]# docker logout 192.168.217.16:5000
Removing login credentials for 192.168.217.16:5000

完美达到预期,用户鉴权功能非常好,如果没有登录,push镜像会是这样的,(pull也是一样的):

[root@master conf]# docker push 192.168.217.16:5000/registry-web
The push refers to repository [192.168.217.16:5000/registry-web]
8779b4998d0c: Preparing 
9eb22ef427e2: Preparing 
64d1c65ea33e: Preparing 
d6c3b0e63834: Preparing 
1315f14832fa: Preparing 
d16096ccf0bb: Waiting 
463a4bd8f8c1: Waiting 
be44224e76b9: Waiting 
d96a8038b794: Waiting 
f469fc28e82e: Waiting 
8418a42306ef: Waiting 
03457c5158e2: Waiting 
7ef05f1204ee: Waiting 
f7049feabf0b: Waiting 
5ee52271b8b7: Waiting 
8b1153b14d3a: Waiting 
367b9c52c931: Waiting 
3567b2f05514: Waiting 
292a66992f77: Waiting 
641fcd2417bc: Waiting 
78ff13900d61: Waiting 
unauthorized: authentication required


目录
相关文章
|
7月前
|
移动开发 开发者 HTML5
构建响应式Web界面:Flexbox与Grid的实战应用
【10月更文挑战第22天】随着互联网的普及,用户对Web界面的要求越来越高,不仅需要美观,还要具备良好的响应性和兼容性。为了满足这些需求,Web开发者需要掌握一些高级的布局技术。Flexbox和Grid是现代Web布局的两大法宝,它们分别由CSS3和HTML5引入,能够帮助开发者构建出更加灵活和易于维护的响应式Web界面。本文将深入探讨Flexbox和Grid的实战应用,并通过具体实例来展示它们在构建响应式Web界面中的强大能力。
104 3
|
8月前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
366 5
|
4月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
122 19
|
3月前
|
运维 网络安全 文件存储
找不到类似 Docker Desktop 的 Web 管理界面?试试这些开源方案
Docker Desktop 是本地容器化开发的利器,但存在无法通过 Web 远程管理、跨平台体验不一致等问题。为此,推荐几款轻量级、可 Web 化管理的 Docker 工具:Portainer 功能全面,适合企业级运维;CasaOS 集成应用商店和 NAS 功能,适合家庭/个人开发环境;Websoft9 提供预集成环境,新手友好。这些工具能有效提升容器管理效率,满足不同场景需求。
163 3
|
7月前
|
缓存 5G 开发者
【提效】docker镜像构建优化-提速10倍
本文主要记录了自己通过查阅相关资料,一步步排查问题,最后通过优化Docerfile文件将docker镜像构建从十几分钟降低到1分钟左右,效率提高了10倍左右。
787 122
|
4月前
|
存储 JSON JavaScript
WEB CAD插件通过上下文对象MxPluginContext修改UI界面的方法
本文介绍了如何使用MxPluginContext动态控制MxCAD项目的UI界面。通过该上下文对象,开发者可以灵活设置UI配置,如控制操作栏显隐、编辑按钮、添加侧边栏等。具体方法包括调用`getUiConfig()`获取并修改`mxUiConfig.json`中的属性,实现界面的定制化。此外,还提供了控制命令行聚焦的功能,解决输入框焦点锁定问题。详细代码示例和效果对比图展示了具体实现步骤,帮助开发者更好地适配项目需求。
|
6月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
603 7
|
7月前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
287 4
|
7月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
7月前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。