为 Docker 配置 TLS

简介: Docker 默认通过 `Unix Socket` 对外提供接口,也支持 `HTTP` 的方式,后者允许我们能够在本地控制远程服务器中的 Docker。如果你想让远程服务器中的 Docker 以安全的方式被访问,可为其配置 TLS,做到服务端和客户端的双向验证。本文总结了配置 Docker TLS 过程中的实践经验。

引言

Docker 默认通过 Unix Socket 对外提供接口,也支持 HTTP 的方式,后者允许我们能够在本地控制远程服务器中的 Docker。如果你想让远程服务器中的 Docker 以安全的方式被访问,可为其配置 TLS,做到服务端和客户端的双向验证。本文由我的同事 @like 投稿,其中总结了他在配置 Docker TLS 过程中的实践经验。

安装 cfssl

这里我们使用 CloudFlare 的 PKI 工具集 cfssl 来创建证书。

安装 cfsslcfssljson 以及 cfssl-certinfo(假设已有GoLang环境):

go get -u github.com/cloudflare/cfssl/cmd/cfssl
go get -u github.com/cloudflare/cfssl/cmd/cfssljson
go get -u github.com/cloudflare/cfssl/cmd/cfssl-certinfo

另外也可以直接下载二进制包:

curl -o cfssl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64

该网站上的 cfssl 好久没更新啦,建议通过 GO 方式安装。

创建证书

根证书(CA)

首先我们需要创建一个 CA 证书,后续利用它去生成其他证书。

配置文件

cat > ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "docker": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}
EOF
  • profiles: 可以定义多个 profile,分别指定不同的过期时间、使用场景等参数,在签名证书时使用某个 profile;
  • server auth: 服务端证书,表示 client 可以用该 CA 对 server 提供的证书进行验证;
  • client auth: 客户端证书,表示 server 可以用该 CA 对 client 提供的证书进行验证

生成根证书

证书请求文件(CSR):

cat > ca-csr.json << EOF
{
  "CN": "LiKe Personal CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "LiaoNing",
      "L": "DaLian",
      "O": "My Org",
      "OU": "My Org Unit"
    }
  ],
  "ca": {
    "expiry": "87600h"
 }
}
EOF

生成根证书和私钥:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

得到:

ca-key.pem
ca.pem

服务端证书

CSR 配置:

cat > server-csr.json << EOF
{
  "CN": "Docker Server",
  "hosts": [
    "127.0.0.1",
    "x.x.x.x",
    "my.docker.server",
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "LiaoNing",
      "L": "DaLian",
      "O": "My Org",
      "OU": "My Org Unit"
    }
  ]
}
EOF
  • CN: Common Name,通常为域名或服务器的 FQDN(完全限定域名)
  • hosts: 如果该证书能被多域名使用,可在这里添加 DNSIP

生成服务端证书和私钥:

cfssl gencert -ca ca.pem -ca-key ca-key.pem -config ca-config.json -profile docker server-csr.json | cfssljson -bare server

得到:

server-key.pem
server.pem

客户端证书

客户端证书的配置中除了没有 hosts 字段,其他与生成服务端证书一样。

cat > client-csr.json << EOF
{
  "CN": "Docker Client",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "LiaoNing",
      "L": "DaLian",
      "O": "My Org",
      "OU": "My Org Unit"
    }
  ]
}
EOF

生成客户端证书和私钥:

cfssl gencert -ca ca.pem -ca-key ca-key.pem -config ca-config.json -profile docker client-csr.json | cfssljson -bare client

得到:

client-key.pem
client.pem

最后为了保护 key 文件,需要移除其写权限,并保证只有自己可读:

chmod -v 0400 ca-key.pem server-key.pem client-key.pem

另外证书是任何人都可以访问的:

chmod -v 0444 ca.pem server.pem client.pem

配置docker

修改 dockerd 的启动命令:

dockerd --tlsverify --tlscacert=ca.pem --tlscert=server.pem --tlskey=server-key.pem -H=0.0.0.0:2376

为了连接远端 Docker 并验证服务端证书,需要提供客户端 key、客户端证书以及信任的 CA:

docker --tlsverify --tlscacert=ca.pem --tlscert=client.pem --tlskey=client-key.pem -H=$HOST:2376 version

每次执行 docker 命令时都提供证书是很麻烦的,我们可以把证书和密钥放在 ~/.docker 目录下,并设置 DOCKER_HOSTDOCKER_TLS_VERIFY 环境变量,这样默认就走 TLS 的方式。

mkdir -p ~/.docker
cp -v {ca,cert,key}.pem ~/.docker
export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1

docker ps

注意: .docker目录下的证书文件名必须为 ca.pem, cert.pem, key.pem

另外还可以利用 curl 来发送 Docker 请求:

curl https://$HOST:2376/images/json \
  --cert ~/.docker/cert.pem \
  --key ~/.docker/key.pem \
  --cacert ~/.docker/ca.pem

文章说明

更多有价值的文章均收录于贝贝猫的文章目录

stun

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

创作声明: 本文基于下列所有参考内容进行创作,其中可能涉及复制、修改或者转换,图片均来自网络,如有侵权请联系我,我会第一时间进行删除。

参考内容

[1] generate-self-signed-certificates
[2] Docker security

相关文章
|
10天前
|
Docker 容器
Docker 镜像加速器配置指南
dockerhub加速器失败,使用第三方加速器
|
22天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
30 5
|
29天前
|
存储 安全 数据安全/隐私保护
Docker中配置TLS加密的步骤
我们可以在 Docker 中成功配置 TLS 加密,增强 Docker 环境的安全性,保护容器之间以及与外界的通信安全。需要注意的是,在实际应用中,应根据具体情况进行更细致的配置和调整,确保符合安全要求。同时,定期更新证书和私钥,以保障安全性。
53 1
|
3月前
|
应用服务中间件 Docker 容器
docker应用部署---Tomcat的部署配置
这篇文章介绍了如何使用Docker部署Tomcat服务器,包括搜索和拉取Tomcat镜像、创建容器并设置端口映射和目录映射,以及如何创建一个HTML页面并使用外部机器访问Tomcat服务器。
docker应用部署---Tomcat的部署配置
|
2月前
|
Java jenkins 持续交付
Centos7下docker的jenkins下载并配置jdk与maven
通过上述步骤,您将成功在CentOS 7上的Docker容器中部署了Jenkins,并配置好了JDK与Maven,为持续集成和自动化构建打下了坚实基础。
136 1
|
3月前
|
关系型数据库 MySQL 数据安全/隐私保护
docker应用部署---MySQL的部署配置
这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
docker应用部署---MySQL的部署配置
|
2月前
|
网络协议 Docker 容器
docker中的DNS配置
【10月更文挑战第5天】
476 1
|
2月前
|
存储 Ubuntu JavaScript
如何使用Docker优化你的开发环境配置
如何使用Docker优化你的开发环境配置
|
2月前
|
Docker 容器
利用Docker Compose优化开发环境的配置
在现代软件开发中,环境一致性至关重要。开发人员常需在不同机器间复制环境配置,而Docker Compose提供了一种简便有效的方法来定义和运行多容器Docker应用程序,确保开发、测试和生产环境一致,简化团队协作,提高开发效率。通过YAML文件配置服务、网络和卷,使用简单命令即可启动和停止服务。本文将介绍Docker Compose的核心优势、基本使用方法及高级功能,帮助你更好地管理和优化开发环境。