对 Docker Remote API 进行认证

  自 Docker 的 0.9 版本开始 Docker Remote API 开始提供了认证机制,这种认证机制采用了 TLS/SSL 证书来确保用户与 API 之间连接的安全性。

  提示:

           该认证不仅仅适用于 API ,通过这个认证,还需要配置 Docker 客户端来支持 TLS 认证。

  有几种方法可以对我们的连接进行认证,包括可以使用一个完整的 PKI 基础设施,也可以选择创建自己的证书授权中心(Certificate Authority,CA),或者使用已有的 CA。在这里,我将给大家建立自己的证书授权中心,因为这是一个简单、快速的开始。

  警告:

           这依赖于运行在 Docker 宿主机上的本地 CA,它不像使用一个完整的证书授权中心那样安全。

 

 

 

 

 

 

 

第一步:建立证书授权中心

  我们将快速了解一下创建所需 CA 证书和密钥(key)的方法,在大多数平台上这都是一个非常标准的过程。在这之前,我们需要确保系统已经安装好了 openssl,如下图所示。
  
  让我们在 Docker 宿主机上创建一个目录来保存我们的 CA 和相关资料,如下图所示。
  
  现在就来创建一个 CA,在之前,我们先生成一个私钥(private key),如下图所示。 
对 Docker Remote API 进行认证_第1张图片

  在创建私钥的过程中,我们需要为 CA 密钥设置一个密码,需要牢记这个密码,并确保安全性。在新 CA 中,我们需要用这个密码来创建并对证书签名。

  上面的操作将创建一个名为 ca-key.pem 的新文件,这个文件就是我们的 CA 的密钥,一定不能将这个文件透露给别人,也不能弄丢这个文件,因为此文件关系到我们的整个解决方案的安全性。

  现在,就让我们来创建一个 CA 的证书,如下图所示。

对 Docker Remote API 进行认证_第2张图片
  这将会创建一个名为 ca.pem 的文件,这也是我们的 CA 证书了,我们之后也会用到这个文件来验证连接的安全性。现在,让我们用它为我们的 Docker 服务器创建证书和密钥。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第二步:创建服务器的证书签名请求和密钥

  我们可以用新的 CA 来为 Docker 服务器进行证书签名请求(certificate signing request,CSR)和密钥的签名和验证。我们先从创建 Docker 服务器密钥开始,如下图所示。
对 Docker Remote API 进行认证_第3张图片
  这将为我们的服务器创建一个密钥 server-key.pem,我们也要确保此密钥的安全性,这是保证 Docker 服务器安全的基础。

  注意:

           请在这一步设置一个密码,但是我们在正式使用之前会清除这个密码,我们只需要在后面几步中使用该密码而已。

  接着,我们就可以创建服务器的证书签名请求(CSR)了,如下图所示。
对 Docker Remote API 进行认证_第4张图片

  这将创建一个名为 server.csr 的文件,这也是一个请求,这个请求将为我们的服务器证书进行签名。在这些选项中最重要的是 Common Name,该值要么为 Docker 服务器 FQDN(fully qualified domain name,完全限定的域名)形式(即从 DNS 中解析后得到的结果,比如 docker.example.com),要么为 *,这将允许在任何服务器上使用该服务器证书。

  现在,让我们来对 CSR 进行签名并生成服务器证书,如下图所示。

  在这里,我们需要输入 CA 密钥文件的密码,该命令会生成一个名为 server-cert.pem 的文件,这个文件就是我们的服务器证书了。

  因为我们不想在 Docker 守护进程启动的时候再输入一次密码,因此,现在让我们来清除服务器密钥的密码,如下图所示。

  现在,我们可以为这些文件添加一些更为严格的权限来更好地保护它们,如下图所示。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第三步:配置 Docker 守护进程

  现在我们已经得到了我们的证书和密钥了,让我们配置 Docker 守护进程来使用它们。

  在配置之前,我们需要将 Docker 守护进程绑定到一个网络接口上去。

  我的系统是 Ubuntu,接下来就是已 Ubuntu 来演示。
  首先,我们需要开启 TCP 管理端口,如下图所示。
  在这个目录下创建 tcp.conf 文件,并增加以下内容,如下图所示。
  接着,我们需要 重新启动 Docker 守护进程,如下图所示。

  最后,查看通过网络接口来于 Docker 守护进程通信,如下图所示。
对 Docker Remote API 进行认证_第5张图片

  这样,我们就会在 Docker 守护进程中对外提供了网络套接字服务了。接下来,我们就开始继续编辑配置来使用我们的证书和密钥了。

  这里,我们仍然是编辑 tcp.conf 文件,如下图所示。

  注意:

           可以看到,这里我们使用了 2376 端口,其实,这是 Docker 中 TSL/SSL 的默认端口号。并且对于非认证的连接,我们也是只能使用 2375 这个端口号。

  如上图所示,我们通过使用 --tlsverify 标志来启用 TLS,我们还使用了 --tlscacert、--tlscert 和 --tlskey 这三个参数来指定了 CA 证书、证书和密钥的位置。

  提示:

           我们可以使用 --tls 标志来只启用 TLS,而不启用客户端认证功能。

  然后,我们还是需要重新加载并启动 Docker 守护进程,如下图所示。
  至此,我们的 Docker 服务器就配置好了,下面我们需要对 Docker 客户端进行相关配置,由于目前,我的 Docker 服务器和客户端在同一台机器上,所以接下来的客户端配置无法进行,但是主要过程还是一样的,也是需要创建客户端的证书和密钥,创建客户端 CSR和对客户端 CSR 进行签名,最后只要配置 Docker 客户端开启认证功能即可。

你可能感兴趣的:(Docker)