Docker安全开放远程访问连接权限

1、Docker完全开放远程访问

Docker服务完全开放对外访问权限操作如下:

# 开启端口命令  (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=2375/tcp --permanent
# 重新载入
firewall-cmd --reload

# 使用 vim 编辑docker服务配置文件
vim /lib/systemd/system/docker.service
# 找到如下配置行
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 将其注释掉或者直接删除,替换成下面的配置行.然后保存退出
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

# 重新加载docker配置并重启服务
systemctl daemon-reload && systemctl restart docker

# 然后直接在命令行客户端输入如下命令,IP地址改为自己的
curl http://192.168.56.20:2375/version
# 或者在浏览器直接访问,IP地址改为自己的
http://192.168.56.20:2375/version

出现如下信息则代表修改Docker服务设置远程访问成功。
在这里插入图片描述
特别注意的点: 完全开放Docker对外访问权限有可能会遭到别人攻击,这是很不安全的,只要别人知道你的服务器地址就能够随意连接你的Docker服务,而不需要任何认证,因此,完全开放只推荐自己在内网使用,不推荐在云服务器上直接完全开放。

2、Docker开放远程访问并开启认证和通信加密

为了解决上面Docker完全开放远程访问所带来的安全隐患,我们需要对Docker服务进行通信认证和加密,操作如下:
首先创建一个文件目录,用于存放证书和私钥

mkdir -p /data/certificate/linux-ca && cd /data/certificate/linux-ca

然后在 linux-ca 文件夹下进行以下操作:

  1. 生成自签名的根证书和私钥:
    执行以下命令生成根证书私钥文件(例如 ca-key.pem):
    openssl genrsa -aes256 -passout pass:123456 -out ca-key.pem 4096
    
    b. 执行以下命令生成根证书文件(例如 ca.pem)并使用私钥进行签名。在生成证书时,你需要为其分配一个有效期,通常为几年。
    # 直接指定证书的主题信息
    openssl req -x509 -new -key ca-key.pem -sha256 -days 365 -passin pass:123456 -out ca.pem
    
  2. 生成自签名的服务端证书和私钥:
    a. 执行以下命令生成私钥文件(例如 server-key.pem):
    openssl genrsa -out server-key.pem 4096
    
    b. 执行以下命令生成证书签名请求文件(例如 server.csr)。
    在生成 CSR 文件时,你需要提供一些信息,如组织名称、组织单位、所在国家等。
    # 直接指定证书的主题信息
    openssl req -new -key server-key.pem -out server.csr
    
    c. 执行以下命令生成自签名的服务器证书(例如 server-cert.pem),并使用 CSR 文件和私钥进行签名。
    echo extendedKeyUsage = serverAuth >> extfile-server.cnf
    
    openssl x509 -req -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 365 -sha256 -passin pass:123456 -out server-cert.pem -extfile extfile-server.cnf
    
  3. 生成自签名的客户端证书和私钥:
    a. 执行以下命令生成客户端私钥文件(例如 key.pem):
    openssl genrsa -out key.pem 4096
    
    b. 执行以下命令生成客户端证书签名请求文件(例如 client.csr)。在生成 CSR 文件时,你需要提供一些信息,如组织名称、组织单位、所在国家等。
    openssl req -new -key key.pem -out client.csr
    
    c. 执行以下命令生成自签名的客户端证书(例如 cert.pem),并使用 CSR 文件和私钥进行签名。在生成证书时,你需要为其分配一个有效期,通常为几年。
    echo extendedKeyUsage = clientAuth > extfile-client.cnf
    
    openssl x509 -req -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 365 -sha256 -passin pass:123456 -out cert.pem -extfile extfile-client.cnf
    

删除多余的四个请求文件:

rm -f server.csr client.csr extfile-server.cnf extfile-client.cnf

完成了上述步骤后,你将获得以下文件:

  • 根证书文件:ca.pem
  • 根证书私钥文件:ca-key.pem
  • 服务器端证书文件:server-cert.pem
  • 服务器端私钥文件:server-key.pem
  • 客户端证书文件:cert.pem
  • 客户端私钥文件:key.pem

特别要注意的是以下四点:
4. 根证书名称必须为 ca.pem
5. 客户端证书必须为 cert.pem
6. 客户端私钥必须为 key.pem
7. 在输入 commonName 信息时必须添加服务器的IP地址,否则Docker可能启动失败
8. 服务端和客户端创建私钥是不能额外添加加密密码,不然会导致服务端、客户端无法解析。

然后是配置Docker守护进程配置文件 daemon.json 具体操作如下:

# 先查看 /etc/docker/daemon.json 是否存在,如果不存在则创建,存在则直接修改
cat /etc/docker/daemon.json
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
    "tls": true,
    "tlsverify": true,
    "tlscacert": "/data/certificate/linux-ca/ca.pem",
    "tlscert": "/data/certificate/linux-ca/server-cert.pem",
    "tlskey": "/data/certificate/linux-ca/server-key.pem",
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://ung2thfc.mirror.aliyuncs.com",
        "https://mirror.ccs.tencentyun.com",
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.baidubce.com"
    ]
}
EOF
systemctl daemon-reload && systemctl restart docker

在以上操作中,我们需要填写正确的证书和私钥存放地址,如果你是按照我上面的步骤来,那没有问题,你什么都不用改。如果你的证书和私钥的存放地址是自己定义的地址,那么,你需要将 daemon.json 中的地址也相应的修改一下。
完成以上内容后,此时我们在浏览器使用 https://192.168.56.10:2375/version 就无法获取信息了,提示需要身份认证
在这里插入图片描述

3、快速完成Docker服务开启认证和通信加密

为了解决第二步流程比较繁琐的问题,我编写了两个自动化配置Shell脚本并且我将其上传到了公网,它们能够帮助我们非常快速的完成第二步的所有流程,
你们可以直接选择使用我创建好的脚本,操作如下:

# 证书脚本
curl -O https://backup-1305596318.cos.ap-guangzhou.myqcloud.com/shell/cert.sh
chmod +x cert.sh
source cert.sh

# Docker守护进程脚本
curl -O https://backup-1305596318.cos.ap-guangzhou.myqcloud.com/shell/daemon.sh
chmod +x daemon.sh
source daemon.sh

如果自己创建然后使用,可以参考下面的步骤,具体操作如下:

3.1首先是创建证书和私钥的Shell脚本

我们只需要创建一个 cert.sh 脚本文件,名称可以任取,然后填入如下内容:

#!/bin/bash

# 从控制台读取必要输入信息
read -p "please input the cert store path: " certDir
echo your cert store path is: "$certDir"
read -p "please input the ca-key's password: " password
echo your password is: "$password"
read -p "please input the IP of your server: " ip
echo your server IP is: "$ip"

# 检查输入的证书路径是否已经存在
# 如果不存在,则创建;如果存在则删除后创建
if [ ! -d "$certDir" ]; then
	echo ""
	echo "$certDir , not exist, it will be create"
	echo ""
	mkdir -p $certDir
else
	echo ""
	echo "$certDir , already exist , it will be delete then create"
	echo ""
	rm -rf $certDir
	mkdir -p $certDir
fi
 
cd $certDir

# 定义服务端证书扩展配置
server_conf="[req]
prompt = no
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = CN
stateOrProvinceName = JX
localityName = SR
organizationName = PY
organizationalUnitName = XS
commonName = $ip
emailAddress = 2320391937@qq.com

[v3_req]
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
IP.1 = 0.0.0.0"

# 将服务端证书的扩展配置写入extfile-server.cnf文件
echo "$server_conf" > extfile-server.cnf

# 定义客户端证书扩展配置
client_conf="[req]
prompt = no
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = CN
stateOrProvinceName = JX
localityName = SR
organizationName = PY
organizationalUnitName = XS
commonName = $ip
emailAddress = 2320391937@qq.com

[v3_req]
extendedKeyUsage = clientAuth"

# 将客户端证书的扩展配置写入extfile-client.cnf文件
echo "$client_conf" > extfile-client.cnf


# 创建根证书RSA私钥
openssl genrsa -aes256 -passout pass:$password -out ca-key.pem 4096
# 创建CA证书
openssl req -new -x509 -days 365 -key ca-key.pem -passin pass:$password -sha256 -out ca.pem -subj "/C=CN/CN=$ip"

# 创建服务端私钥
openssl genrsa -out server-key.pem 4096
# 创建服务端签名请求证书文件
openssl req -subj "/CN=$ip" -sha256 -new -key server-key.pem -out server.csr
# 创建签名生效的服务端证书文件 
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out server-cert.pem -extfile extfile-server.cnf

# 创建客户端私钥
openssl genrsa -out key.pem 4096
# 创建客户端签名请求证书文件
openssl req -subj "/CN=$ip" -new -key key.pem -out client.csr
# 创建签名生效的客户端证书文件
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$password" -CAcreateserial -out cert.pem -extfile extfile-client.cnf

# 删除多余文件
# 使用了 -v 参数,rm 命令将会显示每个被删除的文件或目录的名称,以便您能够看到操作的进展和结果。
rm -f -v client.csr server.csr extfile-server.cnf extfile-client.cnf
# 为所有用户设置对这些文件的读取权限
chmod -v 444 ca-key.pem key.pem server-key.pem
chmod -v 444 ca.pem server-cert.pem cert.pem

该脚本只需要我们在控制台输入证书和私钥的存放地址、根私钥密码以及服务器IP地址三个参数即可,其他的什么都不用做。
如果你按照上面的步骤创建好了 cert.sh 脚本文件并填入了脚本内容,那么接下来我们就可以通过如下命令来执行脚本了

source /xxx/cert.sh

使用 source 命令后接脚本的绝对地址或者相对地址即可执行脚本。

3.2 创建Docker守护进程配置脚本

我们创建一个 daemon.sh 脚本文件,名称可以任取,然后填入如下内容:

#!/bin/bash

# 读取控制台输入,需要输入一个目录
read -p "please input the cert store path: " certDir
echo your cert store path is: "$certDir"
# 检查输入的证书路径是否已经存在
# 如果不存在,则直接退出
if [ ! -d "$certDir" ]; then
	echo ""
	echo "$certDir , not exist, please input a correct cert path"
	exit
fi

json_content='{
    "tls": true,
    "tlsverify": true,
    "tlscacert": "$certDir/ca.pem",
    "tlscert": "$certDir/server-cert.pem",
    "tlskey": "$certDir/server-key.pem",
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://ung2thfc.mirror.aliyuncs.com",
        "https://mirror.ccs.tencentyun.com",
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.baidubce.com"
    ]
}'

# 替换变量
json_content=$(echo "$json_content" | sed "s|\$certDir|$certDir|g")

daemonDir='/etc/docker'
# 如果docker配置目录不存在则创建;存在则删除后创建
if [ ! -d "$daemonDir" ]; then
	echo ""
	echo "$daemonDir not exist, it will be create"
	mkdir -p "$daemonDir" && cd "$daemonDir"
	# 将替换后的内容保存到新的 JSON 文件
	echo "$json_content" > "$daemonDir/daemon.json"
else
	echo ""
	echo "$daemonDir already exist, it will be delete then create"
	rm -rf "$daemonDir"
	mkdir -p "$daemonDir" && cd "$daemonDir"
	# 将替换后的内容保存到新的 JSON 文件
	echo "$json_content" > "$daemonDir/daemon.json"
fi

systemctl daemon-reload && systemctl restart docker

然后我们可以通过 source 命令后接脚本的绝对地址或者相对地址即可执行脚本。

source /xxx/daemon.sh

这个脚本主要是对Docker服务进行通信加密、服务认证、镜像加速配置这三个设置,使用方式和上一个脚本一样。在执行脚本的过程中,会提示我们输入之前创建的证书和私钥的存放地址,我们必须填写正确的地址,否则会导致Docker服务无法读取证书和私钥。

4、IDEA连接Docker服务

下载证书文件夹到Windows本地,
只需要这三个文件即可:ca.pem、cert.pem、key.pem 将他们下载到本地并装入一个文件夹中
在这里插入图片描述
在具体的 IDEA 配置中,可以按照以下步骤进行设置:

  1. 打开 IDEA,进入 Settings 。
  2. 导航到 Docker 部分(一般是 Build, Execution, Deployment 下的 Docker)。
  3. 找到 Connect to Docker daemon with 配置下面的 TCP socket 配置选项
  4. 在 Engine API URL 中填入Docker服务连接地址,例如:https://192.168.56.10:2375
  5. 在 Certificates folder 中选择装有三个证书文件的文件夹,用以客户端向服务端的身份认证
  6. 保存设置并尝试连接到 Docker 服务。
    在这里插入图片描述
    需要注意的是,具体的设置步骤可能因 IDEA 版本而异,请根据你使用的版本进行适当调整。

5、Maven连接Docker服务

有时候我们需要让自己的项目配置Docker服务的连接配置,以方便快速进行项目打包并部署在Docker中,因此,我们需要如下配置:

        <!-- 项目maven插件统一管理 -->
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven-compiler.version}</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <encoding>${project.build.sourceEncoding}</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                </plugin>
                <!-- docker插件,用于制作镜像 -->
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>${docker-maven.version}</version>
                    <!-- docker配置 -->
                    <configuration>
                        <!-- docker远程地址 -->
                        <dockerHost>${docker.host}</dockerHost>
                        <!-- docker打包镜像名称 -->
                        <imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
                        <!-- DockerFile的存放位置 -->
                        <dockerDirectory>${project.basedir}</dockerDirectory>
                        <!-- 由于docker服务使用加密通信,开启了认证,因此需要提供通信证书 -->
                        <dockerCertPath>C:\Users\23203\Desktop\linux-ca</dockerCertPath>
                        <!-- 配置制作镜像时需要依赖的资源,此处依赖项目jar包 -->
                        <resources>
                            <resource>
                                <targetPath>/</targetPath>
                                <directory>${project.build.directory}</directory>
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

因为配置过长,我只选取关键的部分展示,如果想要全量配置,可以给我的留言或者私信我。
如果觉得我的博客还不错的话,不要忘记点赞、收藏哦,如果还能评论交流就更好了!!!

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

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

相关文章

2.Vue3中Cesium地图初始化及地图控件配置

前言 本文中&#xff0c;我们主要介绍 Cesium 在 Vue 3运行环境的配置&#xff0c;以及 Cesium 实例中控件的显隐设置&#xff0c;本文是后续文章内容的基础&#xff0c;项目代码在此查看&#xff1b;通过本文&#xff0c;我们可以得到一个纯净的 cesium 项目&#xff0c;后续的…

字符设备驱动开发(最初方式)

目录&#xff1a; 1.字符设备驱动简介2.字符设备驱动开发步骤2.1. 驱动模块的加载与卸载2.2. Makefile的编写2.3.字符设备的注册与注销2.3.1.设备号的组成2.3.2.设备号的分配 2.4.具体操作函数的实现2.4.1.进行打开和关闭操作2.4.2.对chrdev进行读写操作 3.具体程序的实现3.1.驱…

huggingface datasets map时出现KeyError: ‘output‘的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Spring MVC相关注解运用 —— 上篇

目录 一、Controller、RequestMapping 1.1 示例程序 1.2 测试结果 二、RequestParam 2.1 示例程序 2.2 测试结果 三、RequestHeader、CookieValue 3.1 示例程序 3.2 测试结果 四、SessionAttributes 4.1 示例程序 4.2 测试结果 五、ModelAttribute 5.1 示例程序 …

IDEA+springboot+mybatis+shiro+bootstrap+Mysql WMS仓库管理系统

IDEAspringbootmybatisshirobootstrapMysql WMS仓库管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.系统日志4. 登陆日志5. 库存查询6. 出入库记录7.货物入库8.货物出库9.仓库管理员管理10.供应商信息管理11.客户信息管理12.货物信息管理13. 仓库信息管…

Prometheus学习

Prometheus学习 promethueus exporter就是以 后台进程的方式运行在系统当中&#xff0c;不断去采集数据 1、红框框中是 prometheus基于数学算法输入的一个查询输入框 2.监控项的分类 3.数据采集的形式分类&#xff08;promethueus exporter就是以 后台进程的方式运行在系统当…

最新2023水果编曲软件FL Studio Producer Edition 21.0.3 Build 3517中文版下载安装激活图文教程

各位&#xff0c;大家好&#xff0c;今天兔八哥给大家带来最新最新2023水果编曲软件FL Studio Producer Edition 21.0.3 Build 3517中文版下载安装激活图文教程。我们一起先了解一些FL Studio 。FL Studio21是目前流行广泛使用人数最多音乐编曲宿主制作DAW软件&#xff0c;这款…

17.OpenCV中的GFTTDetector类

文章目录 GFTTDetector功能OpenCV中GFTTDetector类reference 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 这是使用imgproc.hpp中的goodFeaturesToTrack函数封装的类&#xff0c;其使用和goodFeaturesToTrack函数基本相似。 GFTTDetec…

Hyperledger Fabric测试网络的准备和基本使用

文章目录 相关安装启动测试网络创建channel打包链码安装链码包通过链码定义链码定义提交给通道调用链码关闭网络遇到的问题1.docker保持启动状态2.忘起测试网络了3.Java版本过高&#xff0c;推荐1.8 相关安装 npm、node、git、docker、docker-compose。docker保证一直运行 serv…

[Error] invalid preprocessing directive #inclued问题解决

错误代码 报错内容 [Error] invalid preprocessing directive #inclued 错误原因 #inclued写错了应该写成#include

flutter页面添加透明遮罩

路由工具 import package:test/main.dart; import package:flutter/material.dart;import circle_page_route.dart;class NavigatorUtil {static push(Widget page, {BuildContext context}) {return Navigator.push(context ?? navigatorKey.currentContext,MaterialPageRo…

HTTP以及Servlet的学习

HTTP和Servlet 联系&#xff1a; HTTP是一个通信协议&#xff0c;而Servlet是服务器端程序&#xff0c;用于处理HTTP请求。Servlet通常用于处理HTTP请求&#xff0c;在服务器上生成动态内容&#xff0c;并生成HTTP响应。HTTP协议就是Servlet处理的基础。 区别&#xff1a; …

Matlab数学建模实战——(Lokta-Volterra掠食者-猎物方程)

1.题目 问题1 该数学建模的第一问和第二问主要是用Matlab求解微分方程组&#xff0c;直接编程即可。 求解 Step1改写 y(1)ry(2)f Step2得y的导数 y(1).2y(1)-ay(1)*y(2)y(2).-y(2)a*y(1)*y(2) Step3编程 clear; a0.01; F(t,y)[2*y(1)-a*y(1)*y(2);-y(2)a*y(1)*y(2)]; […

MySQL的数据备份与还原--练习题

MySQLdump MySQLdump是MySQL提供的一个非常有用的数据库备份工具。MySQLdump命令执行时&#xff0c;可以将数据库备份成一个文本文件&#xff0c;该文件中实际上包含了多个CREATE 和 INSERT语句&#xff0c;使用这些语句可以重新创建表和插入数据。 看题&#xff1a; 第一题&a…

【新手上路】如何在Web3时代成为XR创建者

目录 0 XR在Web3里的作用 1 XR的概念、特征、技术、设备、平台、应用和工具 1.1 VR的概念、特征和技术 1.2 AR的概念、特征和技术 1.2 XR的设备、平台、应用和工具 2 选择XR的方法 2.1 何时使用VR 2.2 何时使用AR 3 开发XR作品的4个步骤 4 成为XR构建者的路径 4.1 三…

Win10使用gdc-client下载TCGA数据集【安装使用教程】成功解决闪退问题!

做实验需要下载TCGA数据集&#xff0c;数据量比较大的时候&#xff0c;直接从网页下载速度非常慢&#xff0c;容易出现下载不全等情况。 调研后选择在Win10端使用gdc-client来帮助下载Cart文件。 一、下载软件、配置环境 下载软件 下载网站链接&#xff1a;https://gdc.can…

解决dotnet调用https请求被中止未能创建SSL/TLS安全通道

环境:dotnet4.7.2/winserver2012 问题描述: 调用https出现请求被中止,未能创建SSL/TLS安全通道 第一试 自定义SetCertificatePolicy 函数&#xff0c;在建立http连接之前调用 SetCertificatePolicy 函数。 public static void SetCertificatePolicy() {ServicePointManage…

实战攻防之积极防御体系建设 | 中睿天下受邀参与诸子云沙龙

7月8日&#xff0c;中睿天下受邀参与由诸子云举办的“网络与数据安全”主题沙龙&#xff0c;中睿天下技术经理徐丹丹就《实战攻防之积极防御体系建设》这一主题进行了分享交流。 本次沙龙由南京分会会长宋士明主持&#xff0c;活动邀请到BASF、江苏省联社、华泰证券、宁证期货、…

工作日志2 input 的事件优先级 字符串.trim() this.$set()的应用 获取jq的自定义属性

input 的事件优先级 1.input输入框的事件 字符串.trim() 除去前后空格的方法 undefind不可以使用 this.$set()的应用

记录jeecg-boot及a-table前端问题

标签页重复 原因&#xff1a; 在TabLayout中它有监听$route&#xff0c;是根据route.fullpath去判断的。这就会出现一种情况&#xff0c;我是同一个path比如/detail,但是我带了个参数/detail?id132165151651和/detail?id256151561651这两个fullpath明显不同&#xff0c;所以…