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认证

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】Wordpress saveconfiguration接口处存在任意文件上传漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

String Encryptor custom Bean not found with name ‘jasyptStringEncryptor‘...

项目采用 spring boot 2.6.13 jasypt-spring-boot-starter 3.0.5 apollo-client 1.6.0 自定义jasyptStringEncryptor,服务器上启动死活报找不到bean jasyptStringEncryptor,采用默认的,密文配置项自然解密失败导致服务无法启动。 经过一…

计算机网络——33多点访问协议

多点访问协议 多路访问链路和协议 两种类型的链路(一个子网内部链路连接形式) 点对点 拨号访问的PPP以太网交换机和主机之间的点对点链路 广播 传统以太网HFC上行链路802.11无线局域网 多路访问协议 单个共享的广播型链路 2个过更多结点同时传送&am…

【C语言】联合和枚举

个人主页点这里~ 联合和枚举 一、联合体1、联合体类型的声明2、联合体成员的特点3、与结构体对比4、计算联合体大小 二、枚举1、枚举的声明2、枚举的优点3、枚举类型的使用 一、联合体 1、联合体类型的声明 联合体的定义与结构体相似,但是联合体往往会节省更多的空…

软考 - 系统架构设计师 - 数据流图案例题

阅读以下关于系统数据分析与建模的叙述,在答题纸上回答问题1至问题3。 【说明】 某公司正在研发一套新的库存管理系统。系统中一个关键事件是接收供应商供货。项目组系统分析员小王花了大量时间在仓库观察了整个事件的处理过程,并开发出该过程所执行活动…

VTK中polydata的属性数据结构表示和用法

vtk中通过vtkDataArray进行数据的存储,通过vtkDataObject进行可视化数据的表达,在vtkDataObject内部有一个vtkFieldData的实例,负责对数据的表达: vtkFieldData存储数据的属性数据,该数据是对拓扑结构和几何结构信息的…

局域网与城域网(练习题)

局域网与城域网 ⭐️⭐️⭐️⭐️ 红色标记为答案⭐️⭐️⭐️⭐️ ⭐️⭐️⭐️ 蓝色标记为要点解析⭐️⭐️⭐️ 1.以下关于VLAN标记的说法中,错误的是()。 A.交换机根据目标地址和VLAN标记进行转发决策 B.进入目的网段时,交换机…

C语言-atoi函数的模拟

模拟术语讲解 首先,需要定义一个标志位变量sign,用于表示转换结果的合法性1。定义一个函数My_atoi,用于实现atoi的功能1。在My_atoi函数中,首先遍历字符串,直到遇到第一个非空格字符1。如果第一个字符不是数字或正负号…

通讯录改造———文件版本

上一篇文章我们详细讲了文件操作,这时候我们就可以把通讯录保存到文件中,这样即使程序退出了,联系人的信息也还是保存着,下一次启动程序时我们就可以把文件中的数据读取到程序中来使用。 保存 首先我们要在退出通讯录之前把联系人…

Spring Boot 介绍

1、SpringBoot 介绍 用通俗的话讲,SpringBoot 在Spring生态基础上发展而来,它的发现不是取代Spring,是为了让人们更容易使用Spring。 2、相关依赖关系 Spring IOC/AOP > Spring > Spring Boot > Spring Cloud 3、 SpringBoot工作原…

R语言,数据类型转换

原文链接:R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天,再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢? 我们在使用R语言做数据分析时,会一直对数据进行不同类型的转换,有时候…

IP地址与子网掩码

1 IP地址 1.1 IPv4与IPv6 1.2 IPv4地址详解 IPv4地址分4段,每段8位,共32位二进制数组成。 1.2.1 地址分类 这32位又被分为网络号和主机号两部分,根据网络号占用位数的不同,又可分为以下几类: A类地址:…

Higress 基于自定义插件访问 Redis

作者:钰诚 简介 基于 wasm 机制,Higress 提供了优秀的可扩展性,用户可以基于 Go/C/Rust 编写 wasm 插件,自定义请求处理逻辑,满足用户的个性化需求,目前插件已经支持 redis 调用,使得用户能够…

Windows提权—数据库提权-mysql提权mssql提权Oracle数据库提权

目录 Windows 提权—数据库提权一、mysql提权1.1 udf提权1.1.2 操作方法一 、MSF自动化--UDF提权--漏洞利用1.1.3 操作方法二、 手工导出sqlmap中的dll1.1.4 操作方法三、 moon.php大马利用 1.2 mof提权1.3 启动项提权1.4 反弹shell 二、MSSQL提权MSSQL提权方法1.使用xp_cmdshe…

Ps:阈值

阈值 Threshold命令可将灰度图像或彩色图像转换为仅包含黑色和白色的二值图像。 Ps菜单:图像/调整/阈值 Adjustments/Threshold Ps菜单:图层/新建调整图层/阈值 New Adjustment Layer/Threshold 阈值命令通过设置一个特定的亮度阈值(阈值色阶…

深度解析:Elasticsearch检索请求原理

在上一篇文章中,我们学习了 Elasticsearch 的写入流程,今天我们来学习一下 Elasticsearch 的读取流程,当一个检索请求到达 Elasticsearch 之后是如何进行检索的呢? 下面先说一下一个总的检索流程。 1、客户端发送请求到任意一个…

企业能耗数据分析有哪些优势?怎样进行分析?

随着互联网技术的发展,企业在运营中会出现大量的用能数据,但却做不了精准的用能数据分析,导致数据没有得到有效利用,以及产生能源浪费现象。 为什么企业用能分析总是难? 一、用能分析过程复杂 由于用能分析过于复杂…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

读所罗门的密码笔记07_共生思想(中)

1. 在人工智能系统中建立信任 1.1. 人类的大脑容易被个人倾向、干扰因素和确认偏误所影响 1.2. 古莱说,然而,从不同的角度去思考事实、花更长时间来做决策的能力,可能会让人类拥有“密探”一般的智慧 1.3. 我们可以对决策进行批判性思考&a…

c语言----自定义类型---结构体(声明、重命名、对齐规则、传参、位段...详解)

目录 一、结构体类型的声明二、结构体的特殊声明三、结构体的重命名四、结构体的自引用五、结构体的内存对齐5.1对齐规则5.1.1练习 5.2为什么存在内存对齐?5.3 修改默认对齐数 六、结构体传参七、结构体实现位段7.1什么是位段7.2 位段的内存分配7.3 位段的跨平台问题7.4 位段的…