Docker基础系列之TLS和CA认证

Docker基础系列之TLS和CA认证

文章目录

  • Docker基础系列之TLS和CA认证
    • 1. 引言
    • 2. 初识TLS和CA
    • 3. 开启TLS和CA认证
      • 3.1 生成证书
      • 3.2 配置TLS
    • 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认证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/593659.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RMSNorm】Root Mean Square Layer Normalization

【RMSNorm】Root Mean Square Layer Normalization 论文信息 阅读评价 Abstract Introduction Related Work Background RMSNorm Experiments 论文信息 名称内容论文标题Root Mean Square Layer Normalization论文地址https://arxiv.org/abs/1910.07467发表时间2019-…

随手集☞Spring知识盘点

概述 定义 Spring框架的提出者是程序员Rod Johnson,他在2002年最早提出了这个框架的概念,随后创建了这个框架。Spring框架的目标是简化企业级Java应用程序的开发,通过提供一套全面的工具和功能,使开发者能够更加高效地构建高质量…

JVM参数调优

JVM参数调优 文章目录 JVM参数调优前言JVM参数类型查看运行的Java程序,JVM参数是否开启,具体值为多少?题外话(坑题)查看JVM默认参数工作中常用的JVM基本配置参数查看堆内存打印JVM默认参数生活常用调优参数GC垃圾收集参…

【测开求职】校招生在面测开前需要了解的信息

博主在2021年拿到了字节测开实习的offer,实习时长4个月,并于2023年秋招拿到了字节测开的校招offer,仅以本专栏记录对该岗位的所思所想。 目录 1. 测试开发需要做什么工作2. 为什么选择测试开发3. 测试开发不如开发吗4. 如何准备测试开发 1. …

华为“天才少年”4万字演讲:现在的AI技术要么无趣,要么无用

华为“天才少年”4万字演讲:现在的AI技术要么无趣,要么无用|钛媒体AGI© AI科技组 (图片来源:unsplash) 近期,一篇4万字的演讲风靡于国内人工智能(AI)学术圈。 原…

基于 Rust 标准库 API 使用 200 行代码实现 Http 1.1 协议简易服务

1. 背景 早在之前学过一波 Rust,但是由于没用武之地,没过多久又荒废了,最近想捡起来下。刚好看见有群里小伙伴说学习 Http 网络协议太难怎么办?其实很多技术都是相通的,只要你理解了技术的本质就可以自己实现它&#…

Midjourney艺术家分享|By Moebius

Moebius,本名让吉拉德(Jean Giraud),是一位极具影响力的法国漫画家和插画师,以其独特的科幻和幻想风格而闻名于世。他的艺术作品不仅在漫画领域内受到高度评价,也为电影、时尚和广告等多个领域提供了灵感。…

备考ICA----Istio实验16---HTTP流量授权

备考ICA----Istio实验16—HTTP流量授权 1. 环境准备 kubectl apply -f istio/samples/bookinfo/platform/kube/bookinfo.yaml kubectl apply -f istio/samples/bookinfo/networking/bookinfo-gateway.yaml访问测试 curl -I http://192.168.126.220/productpage2. 开启mtls m…

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes(简称K8s)是一个开源的容器编排平台,旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案,帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…

Linux:Centos9:配置固定ip

centos9的网卡位置移动到了 /etc/NetworkManager/system-connections/ 下面 查看网卡 ifconfig 当前有两块网卡,我要去配置ens160的一个固定的ip,让其ip为192.168.6.20/24,网关为192.168.6.254.dns为:1.1.1.1 vim /etc/Netwo…

GPT3, llama2, InternLM2技术报告对比

GPT3(September 22, 2020)是大语言应用的一个milestone级别的作品,Llama2(February 2023)则是目前开源大模型中最有影响力的作品,InternLM2(2023.09.20)则是中文比较有影响力的作品。…

基于jsp+Spring boot+mybatis的图书管理系统设计和实现

基于jspSpring bootmybatis的图书管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获…