为 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

相关文章
|
6月前
|
Kubernetes 关系型数据库 文件存储
手把手教你完成极空间 NAS Docker 镜像加速配置
本教程详细介绍了如何在极空间NAS上配置轩辕镜像加速器,以提升Docker镜像的下载速度与稳定性。内容涵盖账号注册、网络确认、加速器设置及验证方法,并提供常见问题解决方案,帮助用户高效完成容器化应用部署。
2422 1
|
9月前
|
Prometheus 监控 Cloud Native
Prometheus配置docker采集器
本文介绍了如何使用 Prometheus 监控 Docker 容器,涵盖环境准备、配置文件编写及服务启动等步骤。首先确保安装 Docker 和 Docker Compose,接着通过 `docker-compose.yml` 配置 Prometheus 和示例应用。创建 `prometheus.yml` 指定数据采集目标,最后用 `docker-compose up -d` 启动服务。文章还展示了甘特图和类图,帮助理解服务状态与关系,助力提升系统可靠性和可维护性。
364 11
|
6月前
|
文件存储 数据安全/隐私保护 开发者
群晖NAS Docker镜像源加速配置教程
本教程介绍了群晖NAS用户如何通过配置轩辕镜像加速服务提升Docker镜像拉取速度。内容包括配置前准备、详细设置步骤及日常使用说明,帮助用户快速完成配置并享受高效稳定的镜像下载体验。
4212 60
|
Docker 容器 文件存储
飞牛fnOS Docker镜像加速配置全攻略
本文介绍了如何在飞牛fnOS中配置Docker镜像加速服务,通过设置轩辕镜像仓库加速器,提升镜像拉取速度与稳定性。内容涵盖配置前准备、加速源设置、首选加速源调整及使用指南,帮助用户高效完成镜像操作。
3929 56
|
6月前
|
Java 分布式数据库 Docker
使用Docker配置并连接HBase的Java API
本流程概要的解释了如何在Docker上配置并启动HBase服务,并通过Java API进行连接和操作表,不涉及具体的业务逻辑处理和数据模型设计,这些因应用而异需由开发者根据实际需求进行实现。
315 13
|
7月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
894 4
|
10月前
|
数据安全/隐私保护 Docker 容器
docker pull 相关配置
通过本文的介绍,您已经了解了如何通过镜像源配置、登录私有仓库、设置网络代理以及其他优化策略来提升 `docker pull`命令的效率和可靠性。这些配置不仅能够显著加快镜像下载速度,还能确保在不同网络环境下的稳定性。通过合理使用这些配置,您可以更好地管理和优化Docker环境中的镜像拉取操作。
1292 18
|
10月前
|
弹性计算 运维 Ubuntu
在阿里云ECS云服务器上安装、配置及高效使用Docker与Docker Compose
本文介绍了在阿里云ECS上使用Ubuntu系统安装和配置Docker及Docker Compose的详细步骤。通过这些工具,可以快速部署、弹性扩展和高效管理容器化应用,满足开发和运维需求。内容涵盖Docker的安装、镜像源配置、创建Web程序镜像以及使用Docker Compose部署WordPress等实际操作,并分享了使用体验,展示了阿里云实例的高性能和稳定性。
1821 4
|
存储 安全 数据安全/隐私保护
Docker中配置TLS加密的步骤
我们可以在 Docker 中成功配置 TLS 加密,增强 Docker 环境的安全性,保护容器之间以及与外界的通信安全。需要注意的是,在实际应用中,应根据具体情况进行更细致的配置和调整,确保符合安全要求。同时,定期更新证书和私钥,以保障安全性。
900 60