如何安全地设置Shipyard2.0.10使用TLS上CoreOS

在本指南中,我们将建立Shipyard2.0.10,Docker管理工具,一个CoreOS服务器上,并用TLS证书固定Docker,以确保只有授权的客户端可以连接到它。 TLS代表*传输层安全*。它的使用,因为它是从客户机传送到服务器,然后再返回到的数据进行加密。在我们的例子中,我们将用它来我们对Docker主机连接,以及DockerShipyard连接进行加密。

介绍

Docker是容器化软件的受欢迎选项,CoreOS专用于集群环境,使得这两个集群化应用程序非常契合。然而,保持所有容器的组织是复杂的,特别是如果他们只是通过Docker命令行界面或如果您有多个CoreOS实例管理。 幸运的是,有一个名为一个有用的Docker管理工具Shipyard 。它使您能够通过有用的GUI重新启动,销毁和创建容器。它还允许您管理对特定容器的资源分配,并在多个Docker主机上管理容器。但是,确保Docker服务器和Shipyard系统安全是很重要的,尤其是如果他们在生产中使用。 在本指南中,我们将在单个CoreOS服务器上设置Shipyard 2.0.10,并使用TLS证书保护Docker,以确保只有授权的客户端可以连接到它。 TLS代表传输层安全性 。它用于在数据从客户端传输到服务器并再次传回时对数据进行加密。在我们的例子中,我们将使用它来加密我们与Docker主机的连接,以及Docker与Shipyard的连接。

先决条件

要遵循本教程,您需要:
  • 建议使用一个CoreOS Droplet至少512 MB的RAM,但建议使用1 GB或更多。确保您选择最新的稳定版本的CoreOS,而不是alpha或beta版本。 所有CoreOS服务器需要一个SSH密钥,所以如果你不已经有一个,你可以通过以下第1步添加一个- 3 如何使用DigitalOceanDropletSSH密钥
  • Docker主机的完全限定域名(FQDN)或子域。 如果您还没有域名,您可以从任何域名注册商处购买。一旦你有一个域使用, 如何点DigitalOcean域名服务器从常见的域名注册商对如何设置它下DigitalOcean DNS说明。 您可以通过在描述中添加A记录指向您的域名到您的飞沫如何建立与DigitalOcean主机名
  • 设置Docker使用证书进行身份验证是一个相当高级的主题,所以通过阅读本教程的OpenSSL的SSL证书是如何工作的解释。

第一步 - 创建服务器证书

我们需要做的第一件事是创建一个证书颁发机构,我们可以用来签署服务器和客户端证书。 CoreOS附带了OpenSSL,这是一个可用于生成和签署证书的实用程序。 首先,我们将创建一个RSA私钥。 首先,创建并移动到一个名为dockertls ,所以很容易记住的文件。
mkdir ~/dockertls && cd ~/dockertls
接下来,创建RSA私钥。此命令将提示您为键创建密码。
openssl genrsa -aes256 -out private-key.pem 4096
让我们打破上面的命令。 genrsa意味着该命令将产生一个私人的RSA私钥。 -out private-key.pem指定我们想要生成的文件,这是名private-key.pem 。 的最后一位, 4096 ,是位的密钥长度。它建议保持在一个高数字,如4096。 接下来,生成一个新证书,并使用我们刚刚创建的私钥进行签名。您需要输入创建密钥时选择的密码。
openssl req -new -x509 -sha512 -days 365 -key private-key.pem -out myca.pem
OpenSSL还会要求一些必需的信息,例如您的服务器的FQDN和您的组织所在的县。尝试尽可能准确地回答这些问题。这是创建自签名证书颁发机构(CA)的最后一步。 现在我们有了CA,我们实际上可以创建一些服务器证书用于Docker守护进程。以下两个命令生成签名请求。请务必将example.com的域或子域您正在使用Docker。
openssl genrsa -out docker-1-key.pem 4096
openssl req -subj "/CN=example.com" -sha512 -new -key docker-1-key.pem -out docker.csr
最后,使用CA的私钥进行签名。您需要再次输入密钥密码。
openssl 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主机时使用。它将验证客户端连接已经由我们的个人CA实际验证和签名。因此,只有授权的客户端才能被允许连接和发送命令到Docker。 首先,为客户端创建另一个签名请求。
openssl genrsa -out client-key.pem 4096
openssl req -subj '/CN=client' -new -key client-key.pem -out docker-client.csr
有一个小的额外步骤需要做这个客户端请求。我们需要创建一个配置文件,指定生成的证书实际上可以用于客户端身份验证。
echo extendedKeyUsage = clientAuth > client.cnf
上述命令创建一个名为client.cnf与内容extendedKeyUsage = clientAuth ,而不需要使用文本编辑器。 接下来,使用CA密钥对客户端进行签名。
openssl 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守护程序以使用我们的证书。 我们需要修改Docker的启动选项。 CoreOS使用systemd管理服务。 如果您想在读了systemd并学习一些更多关于它,你可以阅读如何使用Systemctl来管理Systemd服务和单位 。 首先,让我们开始编辑Docker单元文件。还有的一个选项systemctl命令,将帮助我们通过复制本单位实际的文件,而不是直接修改原始。你可以认为它像一个重写的Docker配置。 打开Docker单元文件使用编辑systemctl
sudo systemctl edit --full docker
这将打开该文件,使用编辑vim ,你可以学习如何通过阅读我们的使用vim的教程 。 查找开头的行ExecStart=/usr/lib/coreos/dockerd 。 下面附加后,高亮选择--host=fd://在该行,以使文件看起来像这样:
EnvironmentFile=-/run/flannel_docker_opts.env
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
ExecStart=/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守护程序,以便它将使用我们的新配置。
sudo systemctl restart docker
你可以通过检查Docker的状态来确保一切正常。
systemctl status docker
寻找与Active开头的行 如果说比任何活动(正在运行)等,仔细检查你的单位的文件编辑,并确保生成所有必需的密钥和证书。 最后,我们可以测试我们的TLS验证。
docker --tlsverify --tlscacert=myca.pem --tlscert=client.pem --tlskey=client-key.pem -H=example.com:2376 info
如果一切顺利,您应该收到一些关于您的Docker主机的基本系统信息;这意味着你刚刚用TLS保护你的Docker主机。如果你得到一个错误,请检查使用日志systemctl status docker 。 现在,只要使用有效的证书和客户端密钥连接,就可以从任何地方访问Docker主机。您可以生成和签署任意数量的客户端证书,以便在集群中使用。

第四步 - 安装Shipyard

设置Shipyard是一个相当简单的过程。所有的部分都是自包含自己的Docker容器,所以Docker会自动提取所需的图像。 首先,我们需要设置一个数据卷,Shipyard的数据库将被存储。
docker create --name shipyard-rethinkdb-data shipyard/rethinkdb
现在,我们实际上可以拉下来,并催生了一个新的容器RethinkDB 。这是Shipyard用来跟踪Docker实时数据的数据库引擎。
docker 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只会在听取localhost 。这是保护此数据库的好方法,因为这意味着没有人能够从服务器外部访问它。 我们将使用Shipyard版本2.0.10,因为它是最容易配置的Docker TLS。以下命令将启动运行Shipyard的新容器,并将其链接到RethinkDB容器,以允许它们进行通信。
docker 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将提示您向群集添加新引擎。点击绿色的+添加按钮,你会这样的形式呈现: Shipyard地址: 填写信息如下:
  • 名称可以是你希望它是什么。这将是引擎的名称。
  • 标签也可以是任何你想要的。只是使它短,所以你可以保持你的容器组织。
  • 处理器是服务器有多个CPU了。
  • 内存是你的服务器有多少内存了。
  • 地址必须是https:// your_server_ip :2376使用TLS。
基本选项下方有三个大文本区域。在这里您将粘贴证书和密钥,以便Shipyard可以安全地连接到您的Docker主机。 第一场,SSL证书 ,需要客户端证书。打印证书的内容。
cat ~/dockertls/client.pem
然后复制输出并将其粘贴到SSL证书框。 接下来,打印客户端密钥的内容。
cat ~/dockertls/client-key.pem
粘贴输出到SSL密钥文本区域。 最后,打印CA证书的内容。
cat ~/dockertls/myca.pem
内容到CA证书糊盒。 点击页面底部的淡蓝色的添加按钮。如果一切都正确配置,Shipyard应该给你这个屏幕: Shipyard发动机列表

结论

您现在有一个安全的Docker主机在您的CoreOS服务器上运行! Shipyard可以帮助管理您的容器和主机群安全和安全。您还可以将客户端密钥和证书添加到本地计算机,以便您可以从任何地方远程管理Docker集群。 对于其他安全步骤,您可以使用Nginx逆向代理您的Shipyard服务器。这允许您使用HTTPS从本地计算机到Shipyard的更安全的连接。您可以了解更多有关的文章Docker解释:如何Containerize和Nginx的使用作为代理 。 您还可以旋转起来更加CoreOS服务器 ,并尝试了Docker集群。您可以使用Shipyard管理数百个引擎。