• 【云原生 | 44】Docker搭建Registry私有仓库之管理访问权限


    🍁博主简介
            🏅云计算领域优质创作者
            🏅2022年CSDN新星计划python赛道第一名

            🏅2022年CSDN原力计划优质作者
            🏅阿里云ACE认证高级工程师
            🏅阿里云开发者社区专家博主

    💊交流社区CSDN云计算交流社区欢迎您的加入!

    目录

    1. Docker Registry v2的认证模式

    2.配置Nginx代理 

    3.添加用户认证 

    4.用Compose启动Registry 

     👑👑👑结束语👑👑👑


    Docker搭建Registry私有仓库请看上一篇文章 《【云原生 | 43】快速搭建Docker Registry私有仓库》
    通常在生产场景中,对私有仓库还需要进行访问代理,以及提供认证和用户管理。

    1. Docker Registry v2的认证模式

    Docker Registry v2的认证模式和v1有了较大的变化,降低了系统的复杂度、减少了服务之间的交互次数,其基本工作模式如图

    具体交互过程包括如下步骤:
    1)Docker Daemon或者其他客户端尝试访问Registry服务器,比如pull、push或者访问manifiest文件;
    2)在Registry服务器开启了认证服务模式时,就会直接返回401Unauthorized错误,并通知调用方如何获得授权;
    3)调用方按照要求,向Authorization Service发送请求,并携带Authorization Service需要的信息,比如用户名、密码;
    4)如果授权成功,则可以拿到合法的Bearer token,来标识该请求方可以获得的权限;
    5)请求方将拿到Bearer token加到请求的Authorization header中,再次尝试步骤1中的请求;
    6)Registry服务通过验证Bearer token以及JWT格式的授权数据,来决定用户是否有权限进行请求的操作。

    当启用认证服务时,需要注意以下两个地方:

    ·对于Authentication Service,Docker官方目前并没有放出对应的实现方案,需要自行实现对应的服务接口;
    ·Registry服务和Authentication服务之间通过证书进行Bearer token的生成和认证,所以要保证两个服务之间证书的匹配。
    除了使用第三方实现的认证服务(如docker_auth、SUSE Portus等)外,还可以通过Nginx代理方式来配置基于用户名密码的认证。

    2.配置Nginx代理 

    使用Nginx来代理Registry服务的原理十分简单,在上一节中,我们让 Registry服务监听在127.0.0.1:5000,这意味着只允许本机才能通过5000端口访问到,其他主机是无法访问到的。
    为了让其他主机访问到,可以通过Nginx监听在对外地址的15000端口,当外部访问请求到达15000端口时,内部再将请求转发到本地的5000端口。

    首先,安装Nginx:

    $ sudo apt-get -y install nginx
    在/etc/nginx/sites-available/目录下,创建新的站点配置文 件/etc/nginx/sites-available/docker-registry.conf,代理本地的15000端口转发到5000端口。

    配置文件内容如下:

    1. #本地的registry服务监听在15000端口
    2. upstream docker-registry {
    3. server localhost:5000;
    4. }
    5. #代理服务器监听在15000端口
    6. server {
    7. listen 15000;
    8. server_name private-registry-server.com;
    9. add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
    10. # If you have SSL certification files, then can enable this section.
    11. ssl on;
    12. ssl_certificate /etc/ssl/certs/myrepo.crt;
    13. ssl_certificate_key /etc/ssl/private/myrepo.key;
    14. proxy_pass http://docker-registry;
    15. proxy_set_header Host \$http_host; # required for docker client's sake
    16. proxy_set_header X-Real-IP \$remote_addr; # pass on real client's IP
    17. proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
    18. proxy_set_header X-Forwarded-Proto \$scheme;
    19. proxy_read_timeout 600;
    20. client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads
    21. # required to avoid HTTP 411: see Issue #1486 (https://github.com/dotcloud/docker/issues/1486)
    22. chunked_transfer_encoding on;
    23. location /v2/ {
    24. #禁止旧版本Docker访问
    25. if (\$http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*\$" ) {
    26. return 404;
    27. }
    28. #配置转发访问请求到registry服务
    29. proxy_pass http://docker-registry;
    30. }
    31. }
    建立配置文件软连接,放到/etc/nginx/sites-enabled/下面,让Nginx启用它,最后重启Nginx服务:
    1. $ sudo ln -s /etc/nginx/sites-available/docker-registry.conf /etc/nginx/sitesenabled/docker-registry.conf
    2. $ service nginx restart
    之后,可以通过上传镜像来测试服务是否正常。测试上传本地的ubuntu:latest镜像:
    1. $ docker tag ubuntu:14.04 127.0.0.1:15000/ubuntu:latest
    2. $ docker push 127.0.0.1:15000/ubuntu:latest

    3.添加用户认证 

    公共仓库Docker Hub是通过注册索引(index)服务来实现的。由于Index服务并没有完善的开源实现,在这里介绍基于Nginx代理的用户访问管理方案。
    Nginx支持基于用户名和密码的访问管理。
    首先,在配置文件的location/字段中添加两行:
    1. ...
    2. location / {
    3. # let Nginx know about our auth file
    4. auth_basic "Please Input username/password";
    5. auth_basic_user_file docker-registry-htpasswd;
    6. proxy_pass http://docker-registry;
    7. }
    8. ...

    其中,auth_basic行说明启用认证服务,不通过的请求将无法转发。auth_basic_user_file行则指定了验证的用户名密码存储文件为本地(/etc/nginx/下)的docker-registry-htpasswd文件。

    docker-registry-htpasswd文件中存储用户名密码的格式为每行放一个用户名、密码对。例如:
    1. ...
    2. user1:password1
    3. user2:password2
    4. ...
    需要注意的是,密码字段存储的并不是明文,而是使用crypt函数加密过的字符串。
    要生成加密后的字符串,可以使用htpasswd工具,首先安装apache2-utils:
    $ sudo aptitude install apache2-utils -y
    创建用户user1,并添加密码。
    例如,如下的操作会创建/etc/nginx/docker-registry-htpasswd文件来
    保存用户名和加密后的密码信息,并创建user1和对应的密码:
    1. $ sudo htpasswd -c /etc/nginx/docker-registry-htpasswd user1
    2. $ New password:
    3. $ Re-type new password:
    4. $ Adding password for user user1
    添加更多用户,可以重复上面的命令(密码文件存在后,不需要再使用-c选项来新创建)。

    最后,重新启动Nginx服务:

    $ sudo service nginx restart
    此时,通过浏览器访问本地的服务 http://127.0.0.1:15000/v2/ ,会弹出对话框,提示需要输入用户名和密码。

    通过命令行访问,需要在地址前面带上用户名和密码才能正常返回:

    $ curl USERNAME:PASSWORD@127.0.0.1:15000/v2/
    除了使用Nginx作为反向代理外,Registry自身也支持简单的基于用户名和密码的认证和基于token的认证,可以通过如下环境变量来指定:
    1. REGISTRY_AUTH: htpasswd
    2. REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    3. REGISTRY_AUTH_HTPASSWD_REALM: basic

    4.用Compose启动Registry 

    一般情况下,用户使用Registry需要的配置包括存储路径、TLS证书和用户认证。这里提供一个基于Docker Compose的快速启动Registry的模板:
    1. registry:
    2. restart: always
    3. image: registry:2.1
    4. ports:
    5. - 5000:5000
    6. environment:
    7. REGISTRY_HTTP_TLS_CERTIFICATE: /certs/myrepo.crt
    8. REGISTRY_HTTP_TLS_KEY: /certs/myrepo.key
    9. REGISTRY_AUTH: htpasswd
    10. REGISTRY_AUTH_HTPASSWD_PATH: /auth/docker-registry-htpasswd
    11. REGISTRY_AUTH_HTPASSWD_REALM: basic
    12. volumes:
    13. - /path/to/data:/var/lib/registry
    14. - /path/to/certs:/certs
    15. - /path/to/auth:/auth

     👑👑👑结束语👑👑👑

  • 相关阅读:
    1518_AURIX TC275 SRI总线错误处理以及总线的实现
    VR酒店专业情景教学演示
    骨传导耳机是怎么传声的?骨传导耳机会伤害耳朵吗?
    C++ STL中的Multimap概述
    扩散模型加持下,机器人模型DALL-E-Bot可以轻松完成自主重新排列任务
    Nginx核心要领十五:离线安装Nginx
    从零开始搭建后端信息管理系统(新手小白比如)
    FreeSWITCH的originate命令解析及示例
    E2. Divisible Numbers (hard version)(数论)
    PowerBuilder用ODBC方式连接数据库时,不用注册数据源
  • 原文地址:https://blog.csdn.net/qq_62294245/article/details/127898827