Docker基础系列之TLS和CA认证

Docker基础系列之TLS和CA认证

文章目录

  • Docker基础系列之TLS和CA认证
    • [1. 引言](#1. 引言)
    • [2. 初识TLS和CA](#2. 初识TLS和CA)
    • [3. 开启TLS和CA认证](#3. 开启TLS和CA认证)
      • [3.1 生成证书](#3.1 生成证书)
      • [3.2 配置TLS](#3.2 配置TLS)
    • [4. 参考和感谢](#4. 参考和感谢)

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 守护进程与客户端之间通信的一种机制。

  1. TLS(Transport Layer Security)

    • TLS 是一种加密通信协议,用于确保通信过程中的数据传输安全。
    • 在 Docker 中,TLS 可以用于加密 Docker 守护进程与客户端(如 Docker CLI、Docker Compose 等)之间的通信,以防止数据在传输过程中被窃取或篡改。
  2. 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 单元文件,但它们的作用和使用方式略有不同:

  1. /etc/systemd/system/docker.service:

    • 这个路径下的文件是系统管理员或用户自定义的 systemd 单元文件,通常用于覆盖默认的 Docker 服务配置。
    • 系统管理员或用户可以在此文件中定义自己的 Docker 服务配置,如修改默认的启动参数、环境变量等。
    • 当存在 /etc/systemd/system/docker.service 文件时,系统会优先使用该文件中定义的配置启动 Docker 服务,而不是使用默认的 /usr/lib/systemd/system/docker.service 文件。
    • 这种方式允许用户在不修改系统提供的默认配置的情况下,自定义 Docker 服务的行为。
  2. /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认证

相关推荐
zyu677 小时前
03-Docker存储和网络
网络·docker·容器
牛奔8 小时前
Docker Compose 两种安装与使用方式详解(适用于 Docker 19.03 版本)
运维·docker·云原生·容器·eureka
青州从事52113 小时前
20260108【mac】【brew】【docker】安装
macos·docker·eureka
菜鸟思维15 小时前
优化NextJs 项目的Docker 镜像 从3.62G 优化到 296.85M
docker
怣疯knight15 小时前
Docker Desktop 4.55.0版本安装成功教程
windows·docker
东方佑16 小时前
使用Docker Compose一键部署OnlyOffice:完整指南与配置解析
运维·docker·容器
赵文宇(温玉)16 小时前
Docker的价值、特点、创新与关键技术
运维·docker·容器
Coder码匠18 小时前
Docker Compose 部署 Spring Boot 应用完全指南
spring boot·docker·容器
可爱又迷人的反派角色“yang”18 小时前
k8s(二)
linux·运维·docker·云原生·容器·kubernetes·云计算
计算机小手19 小时前
内网穿透系列十六:使用 wg-easy 快速搭建基于 wireguard 的虚拟局域网,支持Docker部署
经验分享·网络协议·docker·开源软件