Docker实现TLS和CA认证的方法步骤
作者:为什么要做囚徒
1. 引言
我们日常工作当中会遇到这些需求:
- 监控Docker容器
- 在idea开发工具中连接Docker,直接发布至服务器
- Jenkins连接Docker
为了更便捷地连接Docker服务器,Docker服务器需要开放2375端口才能连接docker,但如果开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵、挖矿、CPU飙升这些情况都有发生,任何知道你IP的人,都可以管理这台主机上的容器和镜像,非常不安全,这个时候TLS和CA就闪亮登场。。。
2. 初识TLS和CA
Docker TLS(Transport Layer Security)和 CA(Certificate Authority)是用于加密和认证 Docker 守护进程与客户端之间通信的一种机制。
TLS(Transport Layer Security):
- TLS 是一种加密通信协议,用于确保通信过程中的数据传输安全。
- 在 Docker 中,TLS 可以用于加密 Docker 守护进程与客户端(如 Docker CLI、Docker Compose 等)之间的通信,以防止数据在传输过程中被窃取或篡改。
CA(Certificate Authority):
- CA 是证书颁发机构的缩写,负责签发和管理数字证书。
- 在使用 TLS 加密通信时,CA 用于签发和管理用于认证通信双方身份的数字证书。
- 在 Docker 中,CA 通常会签发 Docker 守护进程和客户端之间通信所需的数字证书,用于认证双方的身份,确保通信的安全性。
在配置 Docker TLS 时,通常会生成一组证书和私钥,并使用 CA 签名这些证书,然后将这些证书分发给 Docker 守护进程和客户端。客户端使用证书与私钥来进行身份验证,而 Docker 守护进程使用 CA 颁发的证书验证客户端的身份。这样就建立了一种安全的通信机制,确保 Docker 守护进程与客户端之间的通信是加密的、受信任的。
3. 开启TLS和CA认证
3.1 生成证书
- 生成CA证书的shell脚本
创建证书存放目录
# /mydata/cert/docker这个目录改了下面相关都得改 自己替换 mkdir -p /mydata/cert/script /mydata/cert/docker #cert文件目录
查看服务器主机名
hostname
创建脚本文件
vim /mydata/cert/script/auto-cert.sh #编辑脚本
脚本命令如下:
#!/bin/bash # 一键生成TLS和CA证书 # Create : 2024-03-27 # Update : 2024-03-27 # @Autor : xiaomuchong # 服务器主机名 SERVER="Docker110" # 密码 PASSWORD="xmc@2011" # 国家 COUNTRY="CN" # 省份 STATE="四川省" # 城市 CITY="成都市" # 机构名称 ORGANIZATION="佳缘科技" # 机构单位 ORGANIZATIONAL_UNIT="医疗事业部" # 邮箱 EMAIL="17501123@qq.com" # 创建ca证书目录 mkdir -p /mydata/cert/docker # 进入ca证书目录 cd /mydata/cert/docker # 生成CA密钥 openssl genrsa -aes256 -passout pass:$PASSWORD -out ca.pem 2048 # 生成CA证书 openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca.pem -sha256 -out ca-cert.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL" # 生成服务端密钥 openssl genrsa -out server-key.pem 2048 # 生成服务端证书签名的请求文件 openssl req -subj "/CN=$SERVER" -new -key server-key.pem -out server-req.csr # 生成服务端证书 openssl x509 -req -days 3650 -in server-req.csr -CA ca-cert.pem -CAkey ca.pem -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem # 生成客户端密钥 openssl genrsa -out key.pem 2048 # 生成客户端证书签名的请求文件 openssl req -subj '/CN=client' -new -key key.pem -out client-req.csr # 生成客户端证书 sh -c 'echo "extendedKeyUsage=clientAuth" >> extfile.cnf' openssl x509 -req -days 3650 -in client-req.csr -CA ca-cert.pem -CAkey ca.pem -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf # 更改密钥权限 chmod 0400 ca.pem server-key.pem key.pem # 更改证书权限 chmod 0444 ca-cert.pem server-cert.pem cert.pem # 删除无用文件 rm ca-cert.srl client-req.csr server-req.csr extfile.cnf
加入脚本命令保存
- 赋予执行权限
chmod +x auto-cert.sh
- 执行
./auto-cert.sh
- 生成的文件说明
ca.srl:CA签发证书的序列号记录文件 ca-key.pem:CA密钥 ca.pem:CA证书 server-req.csr:服务端证书签名请求文件 server-key.pem:服务端密钥 server-cert.pem:服务端证书 client-req.csr:客户端证书签名请求文件 extfile.cnf:客户端证书扩展配置文件 key.pem:客户端密钥 cert.pem:客户端证书
- 另外还可以采用交互式shell脚本生成证书(上述两种方式任选其一),脚本如下:
#!/bin/bash if [ -z $1 ];then echo '请输入服务器ip' exit 0 fi HOST=$1 # 创建证书存放目录 mkdir -p /mydata/cert/docker cd /mydata/cert/docker # 生成CA密钥 openssl genrsa -aes256 -out ca-key.pem 4096 # 生成CA证书 openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem # 生成服务端密钥 openssl genrsa -out server-key.pem 4096 # 生成服务端证书签名的请求文件 openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr # 配置白名单,推荐配置0.0.0.0,允许所有IP连接但只有证书才可以连接成功 echo subjectAltName = DNS:$HOST,IP:$HOST,IP:0.0.0.0,IP:127.0.0.1 > extfile.cnf # 生成服务端证书 openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf # 生成客户端密钥 openssl genrsa -out key.pem 4096 # 生成客户端证书签名的请求文件 openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo extendedKeyUsage = clientAuth > extfile.cnf # 生成客户端证书 openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf # 更改密钥权限 chmod -v 0400 ca-key.pem key.pem server-key.pem # 更改证书权限 chmod -v 0444 ca.pem server-cert.pem cert.pem # 删除无用文件 rm -v client.csr server.csr
3.2 配置TLS
# 编辑文件(有的在这个位置:/usr/lib/systemd/system/docker.service) vim /etc/systemd/system/docker.service # 修改内容,注意证书的指定位置 ExecStart=/usr/bin/dockerd \ --tlsverify \ --tlscacert=/mydata/cert/docker/ca-cert.pem \ --tlscert=/mydata/cert/docker/server-cert.pem \ --tlskey=/mydata/cert/docker/server-key.pem \ -H unix:///var/run/docker.sock \ -H tcp://0.0.0.0:2375 # 重启服务 systemctl daemon-reload && systemctl restart docker
/etc/systemd/system/docker.service
和 /usr/lib/systemd/system/docker.service
都是 Docker 服务的 systemd 单元文件,但它们的作用和使用方式略有不同:
/etc/systemd/system/docker.service:
- 这个路径下的文件是系统管理员或用户自定义的 systemd 单元文件,通常用于覆盖默认的 Docker 服务配置。
- 系统管理员或用户可以在此文件中定义自己的 Docker 服务配置,如修改默认的启动参数、环境变量等。
- 当存在
/etc/systemd/system/docker.service
文件时,系统会优先使用该文件中定义的配置启动 Docker 服务,而不是使用默认的/usr/lib/systemd/system/docker.service
文件。 - 这种方式允许用户在不修改系统提供的默认配置的情况下,自定义 Docker 服务的行为。
/usr/lib/systemd/system/docker.service:
- 这个路径下的文件是 Docker 软件包提供的默认 systemd 单元文件,用于定义 Docker 服务的启动参数、环境变量等默认配置。
- 这个文件通常由 Docker 软件包安装程序提供,并且在安装 Docker 软件包时会自动创建。
- 如果系统中不存在
/etc/systemd/system/docker.service
文件,那么 Docker 服务会使用这个默认的 systemd 单元文件进行启动。 - 一般情况下,不建议直接修改这个文件,因为它可能会在 Docker 软件包的升级过程中被覆盖或修改。
总体来说,/etc/systemd/system/docker.service
文件用于用户自定义 Docker 服务的配置,而 /usr/lib/systemd/system/docker.service
文件是 Docker 软件包提供的默认配置文件。
4. 参考和感谢
Docker开启TLS和CA认证, 解决暴露2375端口引发的安全漏洞, 并使用idea连接并推送镜像
到此这篇关于Docker实现TLS和CA认证的方法步骤的文章就介绍到这了,更多相关Docker TLS和CA认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!