如何在 CoreOS 上使用 TLS 安全设置 Shipyard 2.0.10

介绍

Docker 是集装箱化软件的热门选项,CoreOS 专门用于集群环境,这使得两者成为集装箱化应用的绝佳匹配,但保持所有集装箱的组织可能很复杂,特别是如果它们仅通过 Docker 命令行接口进行管理,或者如果您有多个 CoreOS 实例。

幸运的是,有一个有用的 Docker 管理工具,名为 Shipyard。它为您提供了通过有用的 GUI 重新启动、破坏和创建容器的能力。它还允许您管理特定容器的资源分配,并在多个 Docker 主机上管理容器。

在本指南中,我们将在单一的 CoreOS 服务器上设置 Shipyard 2.0.10 并通过 TLS 证书保护 Docker,以确保只有授权的客户端可以连接到它。

前提条件

要遵循本教程,您将需要:

  • 至少有 512 MB 的内存,但建议使用 1 GB 或更多。 请确保您选择的是最新的稳定版本的 CoreOS,而不是一个 Alpha 或 Beta 版本。 所有 CoreOS 服务器都需要一个 SSH 密钥,所以如果您还没有一个,您可以通过以下步骤 1 - 3 添加一个 如何使用 SSH 密钥与 DigitalOcean Droplets
  • 一个完全合格的域名(FQDN)或子域名为您的 Docker 主机。 如果您还没有一个域名,您可以从任何不同的域名注册商中购买一个。 一旦您有一个域名使用, How to Point to DigitalOcean Names From Common Domain Registrars work

第一步:创建服务器证书

我们需要做的第一件事是创建一个证书权限,我们可以使用它来签署服务器和客户端证书。

首先,创建并移动到一个名为dockertls的目录,所以很容易记住文件的位置。

1mkdir ~/dockertls && cd ~/dockertls

接下来,创建一个RSA私钥,这个命令会提示你为你的密钥创建一个密码。

1openssl genrsa -aes256 -out private-key.pem 4096

让我们分解上面的命令。 genrsa 意味着命令将生成一个私有 RSA 私钥。 -out private-key.pem 指定了我们想要生成的文件的名称,即 private-key.pem

接下来,生成一个新的证书,并使用我们刚刚创建的私钥签名,您需要输入您创建密钥时选择的密码。

1openssl req -new -x509 -sha512 -days 365 -key private-key.pem -out myca.pem

OpenSSL 还会询问一些必要的信息,例如您的服务器的 FQDN 和您的组织所在的县。 尽可能准确地回答这些问题。

现在我们有 CA,我们实际上可以创建一些服务器证书用于使用 Docker 命令. 以下两个命令会生成签名请求. 请确保用您正在使用的域或子域代替 `example.com。

1openssl genrsa -out docker-1-key.pem 4096
2openssl req -subj "/CN=example.com" -sha512 -new -key docker-1-key.pem -out docker.csr

最后,用CA的私钥签名,您需要再次输入密钥密码。

1openssl x509 -req -days 365 -sha256 -in docker.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out final-server-cert.pem

这将在当前目录中创建一个名为final-server-cert.pem的文件,即将在 Docker 主机上使用的服务器证书。

步骤二:创建客户证书

现在我们有一个服务器证书,我们需要创建一个客户端证书,每次我们尝试连接到 Docker 主机时都会使用此证书。

首先,为客户端创建另一个签名请求。

1openssl genrsa -out client-key.pem 4096
2openssl req -subj '/CN=client' -new -key client-key.pem -out docker-client.csr

我们需要创建一个配置文件,说明结果的证书实际上可以用于客户端身份验证。

1echo extendedKeyUsage = clientAuth > client.cnf

上面的命令会创建一个名为client.cnf的文件,内容为extendedKeyUsage = clientAuth,而无需使用文本编辑器。

接下来,用CA密钥签名客户端。

1openssl x509 -req -days 365 -sha512 -in docker-client.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out client.pem -extfile client.cnf

现在我们有CA,服务器证书和客户端证书。

第三步:配置Docker和CoreOS

在此步骤中,我们将配置Docker DAEMON来使用我们的证书。

我们需要修改 Docker 的启动选项。CoreOS 使用systemd来管理服务. 如果您想阅读systemd并了解更多信息,您可以阅读 如何使用 Systemctl 来管理 Systemd 服务和单位

首先,让我们从编辑Docker单元文件开始。有一个systemctl命令的选项,可以帮助我们复制实际单元文件,而不是直接修改原始文件。

打开 Docker 单元文件以使用systemctl进行编辑。

1sudo systemctl edit --full docker

这将打开文件以使用vim进行编辑,您可以通过阅读我们的 vim 教程来学习如何使用它。

查找以 ExecStart=/usr/lib/coreos/dockerd 开头的行,在该行后附上下面的突出选项,以便该文件看起来像这样:

1EnvironmentFile=-/run/flannel_docker_opts.env
2MountFlags=slave
3LimitNOFILE=1048576
4LimitNPROC=1048576
5ExecStart=/usr/lib/coreos/dockerd --daemon --host=fd:// --tlsverify --tlscacert=/home/core/dockertls/myca.pem --tlscert=/home/core/dockertls/final-server-cert.pem --tlskey=/home/core/dockertls/docker-1-key.pem -H=0.0.0.0:2376 $DOCKER_OPTS $DOCKER_OPT_BIP $DOCKER_OPT_MTU $DOCKER_OPT_IPMASQ

让我们看看我们刚刚添加的选项:

  • --tlsverify 只是打开 TLS 验证,以便只有授权的客户端可以连接。
  • --tlscacert 指定我们的 CA 证书的位置.
  • --tlscert 指定服务器证书的位置.
  • --tlskey 指定服务器密钥的位置.
  • -H=0.0.0.0:2376 意味着 Docker 将从任何地方听取连接,但它仍然不会允许任何没有授权的客户端密钥或证书的连接。

保存并关闭该文件,然后重新加载Docker DAEMON,以便它使用我们的新配置。

1sudo systemctl restart docker

您可以通过检查 Docker 的状态来确保一切正常工作。

1systemctl status docker

寻找以 **Active:**开始的行,如果它说除了 **active(运行)**以外的任何东西,请双重检查您的单元文件编辑,并确保所有所需的密钥和证书被生成。

最后,我们可以测试我们的TLS验证。

1docker --tlsverify --tlscacert=myca.pem --tlscert=client.pem --tlskey=client-key.pem -H=example.com:2376 info

如果一切顺利,您应该收到有关 Docker 主机的一些基本系统信息;这意味着您刚刚用 TLS 保护了 Docker 主机。

您现在可以从任何地方访问 Docker 主机,只要使用有效的证书和客户端密钥连接,您可以生成和签署尽可能多的客户端证书,以便在集群中使用。

第四步:安装造船厂

设置造船厂是一个相当简单的过程,所有部件都具有自己的Docker容器,因此Docker会自动抽取所需的图像。

首先,我们需要设置一个数据量,在那里将存储造船厂的数据库。

1docker create --name shipyard-rethinkdb-data shipyard/rethinkdb

现在我们实际上可以拉下并生成一个新的容器为 RethinkDB.这是Shipyard 使用的数据库引擎来跟踪来自 Docker 的实时数据。

1docker run -it -d --name shipyard-rethinkdb --restart=always --volumes-from shipyard-rethinkdb-data -p 127.0.0.1:49153:8080 -p 127.0.0.1:49154:28015 -p 127.0.0.1:29015:29015 shipyard/rethinkdb

这个命令还确保RethinkDB只会听本地托管这个数据库,这是一个很好的方法来保护这个数据库,因为这意味着没有人可以从服务器之外访问它。

我们将使用 Shipyard 版本 2.0.10 因为它是最容易配置的 Docker TLS. 下面的命令将启动一个运行 Shipyard 的新容器,并将其连接到 RethinkDB 容器,允许它们进行通信。

1docker run -it -p 8080:8080 -d --restart=always --name shipyard --link shipyard-rethinkdb:rethinkdb shipyard/shipyard:2.0.10

完成 Shipyard 设置后,请访问 http://example.com:8080http://your_server_ip:8080 以访问 Shipyard 控制面板。您可以使用默认用户名 admin 和密码 shipyard 登录。

船厂将提示您将新发动机添加到集群中. 点击绿色 + 添加按钮,您将收到这样的表格:

Shipyard Add

如下填写信息:

  • 名称可以是你想要的任何东西。这将是引擎的名称。
  • 标签也可以是你想要的任何东西。只需把它缩短,这样你就可以把你的容器组织起来。
  • CPUs是你的服务器有多少CPU。
  • Memory是你的服务器有多少RAM。
  • 地址必须是 https://your_server_ip:2376才能使用TLS。

基本选项下方有三大文本区域,您将粘贴证书和密钥,以便 Shipyard 可以安全连接到您的 Docker 主机。

第一个字段, ** SSL 证书**,需要客户端证书. 打印证书的内容。

1cat ~/dockertls/client.pem

然后复制输出并粘贴到 **SSL 证书 ** 框中。

接下来,打印客户端密钥的内容。

1cat ~/dockertls/client-key.pem

将输出插入到 SSL 密钥 文本区域。

最后,打印CA证书的内容。

1cat ~/dockertls/myca.pem

将该内容粘贴到 **CA 证书 ** 框中。

点击页面底部的蓝色 ** 添加 ** 按钮. 如果一切都配置正确,船厂应该为您提供这个屏幕:

Shipyard Engine List

结论

您现在有安全的 Docker 主机在您的 CoreOS 服务器上运行!

Shipyard 可以帮助您安全地管理您的集装箱和主机集群,您还可以将客户端密钥和证书添加到本地机器中,以便您可以从任何地方远程管理 Docker 集群。

对于额外的安全步骤,您可以使用 Nginx 来逆转您的 Shipyard 服务器的代理服务器。这允许您使用 HTTPS 以便从本地计算机连接到 Shipyard 更安全。您可以在文章中了解更多有关此事的信息 Docker 解释:如何容器化和使用 Nginx 作为代理.您也可以 旋转更多 CoreOS 服务器并尝试一个 Docker 集群。

Published At
Categories with 技术
comments powered by Disqus