资讯专栏INFORMATION COLUMN

Docker 私有注册中心身份认证

klinson / 3111人阅读

摘要:考虑到这一点,我们花费了一些时间审查了我们维护的多种系统,并在这星期,我给我们的私人注册中心设置了添加身份认证的目标。你也许知道,注册没有提供身份认证的方法。授权响应触发客户端回应一组使用基本身份验证的凭据。

  

注:原文作者是 Alex Ianchici,原文地址是 Docker private registry authentication

安全已经融入了我们的生活。我们锁门,使用密码保护我们的银行信息,但是通常密码如此复杂以至于造成我们很容易忘记它。用常识来保护系统的安全是良好的实践。这真的很容易呈现,因为它是一个内部的系统,没有必要启用身份认证以及安全传输,但在我们当前的远程工作时代,内部网络可能十分广泛。

考虑到这一点,我们花费了一些时间审查了我们维护的多种系统,并在这星期,我给我们的私人 Docker 注册中心设置了添加身份认证的目标。你也许知道,Docker 注册没有提供身份认证的方法。因此我们决定早期的方案就是在我们的镜像仓库前面加一个身份认证的代理。在我们的案例中,我们决定通过 SSL 使用 Nginx 并加上一个内部身份认证 API。

该解决方案的几个优势:

允许我们使用我们内部的身份验证 API

可以给其他系统重复使用身份认证

可以通过 Docker 容器实现(我们使用的容器数量小于 3 个)

我把一个简单的身份认证服务和一个 Nginx 容器放在一起,我们可以在 github 上获取可用的版本(https://registry.hub.docker.com/u/opendns)。

简单的基础身份认证服务

作为 Nginx 代理容器的一个参考,我们使用 NodeJS 构建了一个身份认证 API,非常容易的创建了一个基础身份认证服务。所有我们所需要做的就是创建一个真正简单的 server.js,使用 htpasswd utility 生成一个资格证书文件,并且在一个 Docker 容器中封装,我们可以创建如下 Dockerfile:

FROM google/nodejs 
ADD . /app 
WORKDIR /app 
RUN npm install http-auth 
EXPOSE 8000 
ENV NODE_PATH /data/node_modules/ 
CMD ["node", "server.js"]

然后我们测试并部署我们的服务:

ubuntu@trusty-64:/basic-auth# docker build -t opendns/basic-auth-service . 

ubuntu@trusty-64:/basic-auth# docker run --name simple-auth opendns/basic-auth-service 

ubuntu@trusty-64:/basic-auth# docker inspect --format "{{ .NetworkSettings.IPAddress }}" simple-auth 
172.17.0.40 

ubuntu@trusty-64:/basic-auth# curl 172.17.0.40:8000 
401 Unauthorized 

ubuntu@trusty-64:/basic-auth# curl -u testuser:testpassword 172.17.0.40:8000 
User authenticated successfully

你可以在这里找到基础身份认证服务的所有示例代码,可用的容器在这里。

Nginx 身份认证代理

Nginx 代理的关键部分是配置文件:

# define an /auth section to send the request to an authentication service 

location = /auth { 
    proxy_pass {{auth_backend}}; 
    proxy_pass_request_body off; 
    proxy_set_header Content-Length ""; 
    proxy_set_header X-Original-URI $request_uri;
    proxy_set_header X-Docker-Token ""; 
} 

# use the auth_request directive to redirect all requests to the /auth section above 

location / { 
    proxy_pass {{backend}}; 
    auth_request /auth; 
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 
    proxy_buffering off; 
}

使用了 http_auth_request 模块发送用户,使用 proxy_pass 指令转发请求到我们简单身份认证服务处理,返回 200 或是 401。 401 授权响应触发 Docker 客户端回应一组使用基本身份验证的凭据。一旦证书被接受,API 将返回 200。Nginx 可以发送请求到私有注册中心,把这两个容器放在一起:

ubuntu@trusty-64:/nginx-auth-proxy# docker run -d --name hello-world hello-world  # run a simple web server that prints out “Hello world” 

ubuntu@trusty-64:/nginx-auth-proxy# docker inspect --format "{{ .NetworkSettings.IPAddress }}" hello-world 
172.17.0.41 

ubuntu@trusty-64:/nginx-auth-proxy# docker run -d -e AUTH_BACKEND=http://172.17.0.40:8000 -e BACKEND=http://172.17.0.41:8081 -p 0.0.0.0:8080:80 nginx-auth 

ubuntu@trusty-64:/nginx-auth-proxy# curl 0.0.0.0:8080 
 
401 Authorization Required 
 

401 Authorization Required


nginx/1.6.1
ubuntu@trusty-64:/nginx-auth-proxy# curl -u testuser:testpassword 0.0.0.0:8080 Hello world

唯一剩下的事情是给这些容器添加 SSL 证书,然后你就可以好好的玩耍了。你可以在这里找到 Nginx 身份认证代理的代码,在这里是可用的容器。使用这个方案需要注意几件事:

使用基础认证意味着每个请求都将访问身份认证 API

基础认证意味着你的证书不受阻碍的发送,除非你使用 SSL 加密了你的连接。注意:永远不要在没有 SSL 的情况下发送基础认证证书。Docker 的客户端和注册中心不会接受 HTTP 方式的基础认证

访问私有注册中心需要对到身份认证代理的请求做一定限制

该解决方案另外一个有趣的附带影响就是,在私有注册中心启用 SSL 已经降低了每个 pull 请求花费的时间,比如,除非在注册中心的 URL 上指定了端口,否则在连接 80 端口之前,客户端首先初始化尝试连接 443 端口。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39093.html

相关文章

  • Docker 私有注册中心身份认证

    摘要:考虑到这一点,我们花费了一些时间审查了我们维护的多种系统,并在这星期,我给我们的私人注册中心设置了添加身份认证的目标。你也许知道,注册没有提供身份认证的方法。授权响应触发客户端回应一组使用基本身份验证的凭据。 注:原文作者是 Alex Ianchici,原文地址是 Docker private registry authentication 安全已经融入了我们的生活。我们锁门...

    Cc_2011 评论0 收藏0
  • 宜信开源|详解PaaS平台LAIN的功能和架构

    摘要:是宜信公司大数据创新中心开发的开源平台。为宜信大数据创新中心各个团队提供了统一的测试和生产环境,简化了服务的部署与上线流程,也降低了运维人员对系统管理的复杂度。基于容器技术,面向多样化的技术栈,并且天然隔离系统和应用的依赖。 LAIN是宜信公司大数据创新中心开发的开源PaaS平台。在金融的场景下,LAIN 是为解放各个团队和业务线的生产力而设计的一个云平台。LAIN 为宜信大数据创新中...

    mist14 评论0 收藏0
  • 视频私有云实战:基于 Docker 构建点播私有云平台

    摘要:本篇文章将会结合网易云信的实践经验,以全局概述的方式带大家认识点播私有化平台构建的整体架构面貌。基于构建点播私有云平台在具有以上优势的同时,还具备资源弹性管理监控完善部署简易自动化维护等特性。基于构建平台,能够自由管理创建云主机。 私有云是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序。其核心属...

    MadPecker 评论0 收藏0
  • 视频私有云实战:基于 Docker 构建点播私有云平台

    摘要:本篇文章将会结合网易云信的实践经验,以全局概述的方式带大家认识点播私有化平台构建的整体架构面貌。基于构建点播私有云平台在具有以上优势的同时,还具备资源弹性管理监控完善部署简易自动化维护等特性。基于构建平台,能够自由管理创建云主机。 私有云是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序。其核心属...

    jkyin 评论0 收藏0
  • [Docker 官方文档] 理解 Docker

    摘要:将一个轻量级的容器虚拟化平台和一组标准工作流程工具进行集成,来帮助你方便地管理和部署应用。主要包括哪些组件主要包括两个组件开源的容器虚拟化平台用于分享和管理容器的软件即服务平台。 【编者的话】本文来自 Docker 的官方文档,详细介绍了 Docker 的体系结构、重要概念、内部工作机理等内容,推荐不了解 Docker 内部原理的同学阅读。 什么是 Docker? Docker 是...

    cncoder 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<