Docker daemon通信与安全客户端.docx
- 文档编号:9674529
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:13
- 大小:96.08KB
Docker daemon通信与安全客户端.docx
《Docker daemon通信与安全客户端.docx》由会员分享,可在线阅读,更多相关《Docker daemon通信与安全客户端.docx(13页珍藏版)》请在冰点文库上搜索。
Dockerdaemon通信与安全客户端
Dockerdaemon通信与安全客户端
Docker 使用了客户端—服务端模型。
客户端使用CLI,同时服务端(daemon)实现功能,并对外提供RESTAPI。
客户端叫作docker(在Windows上是docker.exe),daemon叫作dockerd(在Windows上是dockerd.exe)。
默认安装方式将客户端和服务端安装在同一台主机上,并且配置通过本地安全PICSocket进行通信。
∙Linux:
/var/run/docker.sock。
∙Windows:
//./pipe/docker_engine。
不过,也可以配置客户端和服务端通过网络进行通信。
但是daemon默认网络配置使用不安全的HTTPSocket,端口是2375/tcp,如下图所示
默认使用2375作为客户端和服务端之间未加密通信方式的端口,而2376则用于加密通信。
在实验室这样还可以,但是生产环境却是不能接受的。
TLS就是解决之道!
Docker允许用户配置客户端和daemon间只接收安全的TLS方式连接。
生产环境中推荐这种配置,即使在可信内部网络中,也建议如此配置!
Docker为客户端与daemon间使用基于TLS的安全通信提供了两种模式。
∙daemon模式:
Dockerdaemon只接收认证客户端的链接。
∙客户端模式:
Docker客户端只接收拥有证书的Dockerdaemon发起的链接,其中证书需要由可信CA签发。
同时使用两种模式能提供最高的安全等级。
下面会使用简单的实验环境来完成Docker的daemon模式和客户端模式TLS的配置过程。
实验环境准备
在接下来的讲解中会使用一个简单实验环境。
环境中包括3个Linux节点,分别为CA、Docker客户端以及Dockerdaemon。
很关键的一点是,3个主机之间可以互相通过名称解析。
node1会配置为Docker客户端,node3会配置为Docker安全daemon,node2会配置为CA。
小伙伴可以按照下面内容在自己的环境进行实验,但是在下面示例中用到的名称和IP如下图所示。
总体来说步骤如下。
配置CA和证书。
∙创建CA(自签名)。
∙创建并为daemon签发密钥。
∙创建并为客户端签发密钥。
∙分发密钥。
配置Docker使用TLS。
∙配置daemon模式。
∙配置客户端模式。
1)创建CA(自签名)
如果在实验环境操作,只需要完成下面的步骤,来搭建签名证书所需的CA。
当然,这也只是构建一个简单的CA,方便演示如何配置Docker,并不会尝试构建生产环境级别PKI。
在实验环境CA节点运行下面的命令。
①为CA创建新的私钥。
在操作过程中需要设置密码。
$opensslgenrsa-aes256-outca-key.pem4096
GeneratingRSAprivatekey,4096bitlongmodulus
...............................................++
..++
eis65537(0x10001)
Enterpassphraseforca-key.pem:
Verifying-Enterpassphraseforca-key.pem:
在当前目录下会生成一个名为ca-key.pem的新文件,这就是CA私钥。
②使用CA私钥来生成公钥(证书)。
需要输入前面过程中设置的密码。
$opensslreq-new-x509-days730-keyca-key.pem-sha256-outca.pem
工作目录下又出现第二个文件,名为ca.pem,这是CA的公钥,或者说“证书”。
现在当前目录下有了两个文件:
ca-key.pem和ca.pem,这就是CA的私钥和公钥,也是CA的身份凭证。
2)为daemon创建密钥对
在本步骤中,会为node3生成新的密钥对。
该节点准备运行Docker安全daemon。
一共分4步,创建私钥->创建签名请求->添加IP地址->并设置为服务端认证有效、生成证书。
在CA节点(node2)运行全部命令。
①为daemon创建私钥。
$opensslgenrsa-outdaemon-key.pem4096
在当前工作目录下已经创建了名为daemon-key.pem的新文件,这就是daemon节点的私钥。
②创建证书签名请求(CSR)并发送到CA,这样就可以完成daemon证书的创建和签名。
要确保使用正确的DNS名称来指代想要运行Docker安全daemon的节点。
示例中使用了node3。
$opensslreq-subj"/CN=node3"\
-sha256-new-keydaemon-key.pem-outdaemon.csr
现在工作目录下有了第四个文件。
该文件是CSR,名称为daemon.csr。
③为证书添加属性。
需要创建一个文件,其中包含了CA签发证书时需要加入到daemon证书的扩展属性。
这些属性包括daemon的DNS名称和IP地址,同时配置证书使用服务端认证。
创建的新文件名为f,包含下面列举的值。
示例中使用了上图中daemon节点的DNS名称和IP。
subjectAltName=DNS:
node3,IP:
10.0.0.12
extendedKeyUsage=serverAuth
④生成证书。
使用CSR文件、CA密钥、f文件完成签名以及daemon证书配置。
命令输出中包含daemon的公钥(证书)和一个名为daemon-cert.perm的文件。
$opensslx509-req-days730-sha256\
-indaemon.csr-CAca.pem-CAkeyca-key.pem\
-CAcreateserial-outdaemon-cert.pem-extfilef
此时,已经拥有了一个可用的CA,同时运行Docker安全daemon的node3节点也有了自己的一对密钥。
继续下面内容之前,删除CSR和f。
$rmdaemon.csrf
3)为客户端创建密钥对
在本节中,会将前面对于node3的操作在Docker客户端节点node1上重复一遍。
在CA(node2)上运行全部命令。
①为node1创建密钥。
这会在工作目录下创建名为client-key.pem的新文件。
$opensslgenrsa-outclient-key.pem4096
②创建CSR。
确保所使用的节点DNS名称是正确的,该节点对应Docker安全客户端。
示例中使用node1。
$opensslreq-subj'/CN=node1'-new-keyclient-key.pem-outclient.csr
该命令会在当前目录下创建名为client.csr的新文件。
③创建名为f的文件,并用下面的值填充。
这样会将证书设置为客户端认证可用。
extendedKeyUsage=clientAuth
④使用CSR、CA公钥、私钥和f为node1创建证书。
该步骤会在当前目录下创建名为client-cert.pem的客户端公钥。
$opensslx509-req-days730-sha256\
-inclient.csr-CAca.pem-CAkeyca-key.pem\
-CAcreateserial-outclient-cert.pem-extfilef
删除CSR和f文件,因为不会再用到它们了。
$rmclient.csrf
此时,在工作目录下应该有如下7个文件。
∙ca-key.pem< ∙ca.pem< ∙ca.srl< ∙client-cert.pem< ∙client-key.pem< ∙daemon-cert.pem< ∙daemon-key.pem< 在继续之前,需要移除密钥文件的写权限,将密钥文件对自己以及其他属于当前组的用户变为只读。 $chmod0400ca-key.pemclient-key.pemdaemon-key.pem 4)分发密钥 现在已经有了全部的密钥和证书,是时候将他们分发到客户端和daemon节点上了。 复制如下文件。 ∙从CA复制ca.pem、daemon-cert.pem,以及daemon-key.pem到node3(daemon节点) ∙从CA复制ca.pem、client-cert.pem,以及client-key.pem到deno1(客户端节点) 下面会介绍如何使用scp完成复制操作,也可随意选择其他工具使用。 在node2(CA节点)密钥所在目录下运行下面的命令。 //Daemonfiles $scp./ca.pemubuntu@daemon: /home/ubuntu/.docker/ca.pem $scp./daemon-cert.pemubuntu@daemon: /home/ubuntu/.docker/cert.pem $scp./daemon-key.pemubuntu@daemon: /home/ubuntu/.docker/key.pem //Clientfiles $scp./ca.pemubuntu@client: /home/ubuntu/.docker/ca.pem $scp./client-cert.pemubuntu@client: /home/ubuntu/.docker/cert.pem $scp./client-key.pemubuntu@client: /home/ubuntu/.docker/key.pem 关于命令需要注意以下几点。 ∙第2、3、5以及第6条命令在复制过程中对文件进行了重命名。 重命名非常重要,因为Docker对文件的命名规范有规定。 ∙命令假设使用的环境是UbuntuLinux,并且使用ubuntu作为用户账户。 ∙在执行命令前,需要分别在daemon和客户端所在节点上提前创建/home/ubuntu/.docker这个隐藏目录。 此外还需要修改.docker目录的权限,允许复制操作执行。 可以使用chmod777.docker,但这种方式并不安全。 切记,当前只是为了快速创建一个CA和证书,才可以这么做。 在安全的PKI构建中该操作决不允许。 ∙如果当前环境是AWS,需要在每条命令之后通过-i 当前环境如下图所示。 node1和node3节点只会信任由其CA公钥签名的CA以及证书。 配置了正确的证书后,就可以开始配置Docker的客户端和daemon使用TLS了。 配置Docker使用TLS 前文提到,Docker支持两种TLS模式。 daemon模式、客户端模式。 daemon模式保证daemon只处理来自拥有有效证书的客户端发起的连接,客户端模式使得客户端只能连接到拥有有效证书的daemon。 下面会将node1上的daemon配置为daemon模式并进行验证,然后会将node2节点上的客户端进程配置为客户端模式并进行验证。 1)为Dockerdaemon配置TLS 启动daemon安全模式,只需在daemon.json配置文件中增加几个守护参数即可。 ∙tlsverify: 开启TLS认证。 ∙tlscacert: 指定daemon可信任的CA。 ∙tlscert: 向Docker指定daemon证书的位置。 ∙tlskey: 向Docker指定daemon私钥的位置。 ∙hosts: 向Docker指定需要绑定daemon的具体Socket。 上述内容配置在与平台无关的daemon.json配置文件当中。 在Linux上位于/etc/docker,在Windows上位于C: \ProgramData\Docker\config\。 在Docker安全daemon节点上执行下面的全部操作(在示例环境中是node3)。 编辑daemon.json文件,并添加如下行。 { "hosts": ["tcp: //node3: 2376"], "tls": true, "tlsverify": true, "tlscacert": "/home/ubuntu/.docker/ca.pem", "tlscert": "/home/ubuntu/.docker/cert.pem", "tlskey": "/home/ubuntu/.docker/key.pem" } 运行systemd的Linux系统不允许在daemon.json中使用“hosts”选项。 替换方案是在systemd配置文件中进行重写。 最简单的方式是通过 sudosystemdctleditdocker 命令进行修改。 该命令会在编辑器中打开名为/etc/systemd/system/docker.service.d/override.conf的新文件。 在其中加入下列3行内容,然后保存。 现在TLS和主机选型都设置完成,是时候重启Docker了。 一旦Docker重启完成,可以使用ps命令,根据其输出内容检查新的hosts值是否生效。 $ps-elf|grepdockerd 4Sroot.../usr/bin/dockerd-Htcp: //node3: 2376 输出内容中如果有“-Htcp: //node3: 2376”,则可以证明daemon正在监听网络。 端口2376是DockerTLS使用的标准端口。 2375默认是非安全端口。 如果运行的是普通命令,会出现无法工作的情况,如dockerversion。 这是因为刚才配置了daemon监听网络,但是Docker客户端仍尝试使用本地IPCSocket。 加上-Htcp: //node3: 2376参数后再次运行该命令。 $docker-Htcp: //node3: 2376version Client: Version: 18.01.0-ce APIversion: 1.35 Gethttp: //daemon: 2376/v1.35/version: net/http: HTTP/1.xtransportconnectio\ nbroken: malformedHTTPresponse"\x15\x03\x01\x00\x02\x02". *AreyoutryingtoconnecttoaTLS-enableddaemonwithoutTLS? 命令看起来没什么问题,但是仍然不工作。 这是因为daemon拒绝了来自未认证客户端的连接。 Dockerdaemon已经配置为监听网络,并且拒绝了来自未认证客户端的连接。 接下来配置node1节点上的Dockerclient使用TLS。 2)为Docker客户端配置TLS 本节将从以下两方面配置node1节点上的Docker客户端。 ∙通过网络连接某个远程daemon。 ∙为所有docker命令进行签名。 在将要运行Docker安全客户端的节点上(示例环境中为node1)执行下面的全部命令。 配置下列环境变量,使客户端可以通过网络连接到远端daemon。 exportDOCKER_HOST=tcp: //node3: 2376 尝试下面的命令。 $dockerversion Client: Version: 18.01.0-ce Gethttp: //daemon: 2376/v1.35/version: net/http: HTTP/1.xtransportconnectio\ nbroken: malformedHTTPresponse"\x15\x03\x01\x00\x02\x02". *AreyoutryingtoconnecttoaTLS-enableddaemonwithoutTLS? Docker客户端通过网络发送命令到远端daemon,但是daemon只接收受认证的连接。 设置另外一个环境变量,告知Docker客户端使用自己证书对全部命令进行签名。 exportDOCKER_TLS_VERIFY=1 再次运行dockerversion命令。 $dockerversion Client: Version: 18.01.0-ce Server: Engine: Version: 18.01.0-ce APIversion: 1.35(minimumversion1.12) Goversion: go1.9.2 Gitcommit: 03596f5 Built: WedJan1020: 09: 372018 OS/Arch: linux/amd64 Experimental: false 至此,客户端成功通过安全连接与远程daemon完成通信。 最终配置如下图所示。 在进行快速回顾前,有几点需要说明一下。 ∙最后的示例可以成功,是因为将客户端TLS密钥复制到了Docker期望的目录下。 该目录位于用户home目录下,名为.docker。 同时密钥也修改为Docker期望的名称(ca.pem、cert.pem,以及key.pem)。 可以通过配置环境变量DOCKER_CERT_PATH来指定其他的目录。 ∙可能希望持久化环境中的变量(DOCKER_HOST和DOCKER_TLS_VERIFY)。 DockerTLS回顾 daemon模式会拒绝那些没有有效签名的客户端命令,客户端模式下客户端不会连接没有有效证书的远端daemon。 通过Dockerdaemon配置文件完成daemon的TLS配置。 文件名为daemon.json,是跨平台的。 下面的daemon.json可以在大部分操作系统中使用。 { "hosts": ["tcp: //node3: 2376"], "tls": true, "tlsverify": true, "tlscacert": "/home/ubuntu/.docker/ca.pem", "tlscert": "/home/ubuntu/.docker/cert.pem", "tlskey": "/home/ubuntu/.docker/key.pem" } hosts告诉Dockerdaemon需要绑定的Socket。 示例中将其绑定到了某个网络的2376端口上。 用户可以选择任意空闲端口,但按惯例Docker安全连接都使用2376端口。 使用systemd的Linux系统不能配置该参数,需要使用systemd重写文件来实现。 tls和tlsverify强制daemon只使用加密和认证连接。 tlscacert告诉Docker可以信任的CA。 配置后Docker会信任由该CA签发的全部证书。 tlscert告诉Dockerdaemon证书的位置。 tlskey告诉Dockerdaemon私钥的位置。 修改上述任意配置,都需要重启Docker后才能生效。 只需设置两个环境变量,就可以完成Docker客户端TLS配置。 DOCKER_HOST。 DOCKER_TLS_VERIFY。 DOCKER_HOST为客户端指定如何查找daemon。 exportDOCKER_HOST=tcp: //node3: 2376让Docker客户端通过主机node3的2376端口连接到daemon。 exportDOCKER_TLS_VERIFY=1使Docker客户端对其发出的全部命令都进行签名。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Docker daemon通信与安全客户端 daemon 通信 安全 客户端