Docker开启安全的TLS远程连接访问方式

目录
  • 1.1 不安全的远程访问方式
    • 1.1.1 编辑docker.service文件:
    • 1.1.2 重新加载Docker配置生效
    • 1.1.3 警告!
  • 2.1 建立基于TLS数字签名的安全连接

1.1 不安全的远程访问方式

1.1.1 编辑docker.service文件:

vi /usr/lib/systemd/system/docker.service

找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

这样相当于对外开放的是 2375 端口,当然也可以根据自己情况修改成其他的。

1.1.2 重新加载Docker配置生效

systemctl daemon-reload
systemctl restart docker 

我们通过浏览器访问 2375 测试一下,格式为:http://ip:2375/version

如果无法访问的话,可以尝试一下开放防火墙2375端口,具体命令如下:

firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload

如果还是不能访问,如果使用的机器是云服务器,比如阿里云、腾讯云等等,需要到服务器安全组规则中看看是否开放2375端口,如未配置,增加该端口配置即可。

这样我们就可以直接在Idea中的Docker插件中直接连接测试了:

1.1.3 警告!

以上方法切勿在生产环境中使用,鄙人亲身经历。这种方法就跟你Redis对外开放6379还不设置密码一样。
我上次这么干,就被黑了。
想黑你的机器很简单,因为2375端口被暴露在了公网那么任意人员都可访问你宿主机上的docker。就可以用你的docker创建一个ubuntu,并且创建volume数据卷通道,挂载到你宿主机的/etc目录在。
这样你的主机root密码就会被窥探了。然后别人就可以以root权限利用你的docker在你的机器上挖矿了。

2.1 建立基于TLS数字签名的安全连接

1、创建CA私钥和CA公钥
首先创建一个ca文件夹用来存放私钥跟公钥

mkdir -p /usr/local/ca
cd /usr/local/ca

然后在Docker守护程序的主机上,生成CA私钥和公钥:

openssl genrsa -aes256 -out ca-key.pem 4096

执行完如上指令后,会要求我们输入密码才能进行下一步,在这我将密码设置为:niceyoo

2、补全CA证书信息
执行如下指令:

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

然后依次输入:访问密码、国家、省、市、组织名称、单位名称、随便一个名字、邮箱等。为了省事,组织、单位之类的我都用 niceyoo 代替了。

niceyoo cn beijing  beijing niceyoo niceyoo niceyoo apkdream@163.com

至此,CA证书就创建完成了,有了CA之后,就可以创建服务器密钥和证书签名请求(CSR)了,确保“通用名称”与你连接Docker时使用的主机名相匹配。

3、生成server-key.pem

openssl genrsa -out server-key.pem 4096

4、用CA签署公钥

这一步相当重要以往的教程在这一步都是这样但是注意有坑!!!下面的命令先别急着敲!
下面有两种方式一种是写你宿主机IP或者域名的方式,但是我试了好多遍用IP的方式始终报错。一定要用域名的方式!!
可能有同学疑惑我的主机没有绑定域名呀?这里的域名可以自己随便写比如我写的就是
openssl req -subj "/CN=docker-deamo" -sha256 -new -key server-key.pem -out server.csr
然后比如我的腾讯云上的机器IP是123.456.789
我在本地用IDEA远程连接的时候地址就应该是https://docker-deamo:2375
注意这样写还是无法解析这个域名的毕竟是自定义的,你需要在本地hosts文件中定义。如果你不是windows下,linux的hosts文件再etc目录下:

这样就OK了!

由于可以通过IP地址和DNS名称建立TLS连接,因此在创建证书时需要指定IP地址。例如,允许使用10.211.55.4进行连接:

openssl req -subj "/CN=10.211.55.4" -sha256 -new -key server-key.pem -out server.csr

如果你是用的网址(比如:www.sscai.club)则替换一下即可:

openssl req -subj "/CN=www.sscai.club" -sha256 -new -key server-key.pem -out server.csr

注意:这里指的ip或者是域名,都是指的将来用于对外的地址。

5、匹配白名单

这里同样建议只用域名的方式也就是说在DNS后面只填写域名不要用IP。

echo subjectAltName = DNS:$HOST,IP:XX.XX.XX.XX,IP:XX.XX.XX.XX >> extfile.cnf

使用时将$HOST替换为自己的ip地址或者网址,这取决于你对外暴漏的docker链接是ip还是网址。

docker-deamo 服务器上的 docker,只允许ip地址为221.217.177.151的客户连接

echo subjectAltName = DNS:docker-deamo,IP:221.217.177.151 >> extfile.cnf

6、执行命令
将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证:

echo extendedKeyUsage = serverAuth >> extfile.cnf

7、生成签名整数

openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

执行后需要输入上方设置的密码

8、生成客户端的key.pem

openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

9、要使秘钥适合客户端身份验证
创建扩展配置文件:

echo extendedKeyUsage = clientAuth >> extfile.cnf
echo extendedKeyUsage = clientAuth > extfile-client.cnf

10、生成签名整数

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile-client.cnf

生成cert.pem,需要再次输入之前设置的密码:niceyoo

11、删除不需要的文件,两个整数签名请求
生成后cert.pem,server-cert.pem您可以安全地删除两个证书签名请求和扩展配置文件:

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

12、可修改权限
为了保护您的密钥免于意外损坏,请删除其写入权限。要使它们仅供您阅读,请按以下方式更改文件模式:

chmod -v 0400 ca-key.pem key.pem server-key.pem

证书可以使对外可读的,删除写入权限以防止意外损坏:

chmod -v 0444 ca.pem server-cert.pem cert.pem

13、归集服务器证书

cp server-*.pem /etc/docker/
cp ca.pem /etc/docker/

14、修改Docker配置
使Docker守护程序仅接收来自提供CA信任的证书的客户端的链接

vim /lib/systemd/system/docker.service

将 ExecStart 属性值进行替换:

ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/usr/local/ca/ca.pem --tlscert=/usr/local/ca/server-cert.pem --tlskey=/usr/local/ca/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

15、重新加载daemon并重启docker

systemctl daemon-reload
systemctl restart docker

我们去IDEA中的docker模块验证一下,先看一下之前的连接:

显然是无法连接了,此时我们需要去拿到docker宿主机创建的证书,使用证书才可以进行连接:

拉取这四个证书文件至本地文件夹,这个文件夹将用于在idea指定,需要说的是,TCP 里的链接需要改成 Https 格式,具体内容如下图所示:

到此这篇关于Docker开启安全的TLS远程连接访问方式的文章就介绍到这了,更多相关Docker开启TLS远程连接内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用TLS加密通讯远程连接Docker的示例详解

    默认情况下,Docker 通过非联网 UNIX 套接字运行.它还可以使用 HTTP 套接字进行可选通信. 如果需要以安全的方式通过网络访问 Docker,可以通过指定标志将 Docker 标志指向受信任的 CA 证书来启用 TLS. 在守护程序模式下,它只允许来自由该 CA 签名的证书验证的客户端的连接.在客户端模式下,它仅连接到具有该 CA 签名的证书的服务器. # 创建CA证书目录 [root@localhost ~]# mkdir tls [root@localhost ~]# cd tl

  • Docker开启TLS和CA认证的方法步骤

    目录 一.生成证书 二.开启远程 三.远程连接 3.1 Jenkins连接 3.2 Portainer连接 前言:Docker直接开启2375端口是不安全的,别人只要连上之后就可以任意操作,下面是开启Docker的TLS和CA认证方法,并使用Jenkins和Portainer连接. 一.生成证书 查看服务器主机名 hostname auto-generate-docker-tls-ca.sh # !/bin/bash # 一键生成TLS和CA证书 # Create : 2021-08-25 #

  • docker remote api一键TLS加密的实现

    目录 1.修改docker的2375端口为另外的端口,这只是权宜之计. 2.给docker进行tls加密 最近公司服务器被挖矿了,最后原因定位到docker的2375端口. 让我们来理一下,最开始发现docker中莫名其妙多了几个镜像和正在运行的容器,而且很吃CPU,且2375端口未设置ip访问规则,意思就是所有人都可以通过你的2375端口操作你的docekr,且用启动容器挂载宿主机文件夹,因为docker使用root权限启动的,所以所有人都可以通过你的2375端口以root用户控制你的宿主机.

  • Docker部署mysql远程连接 解决2003的问题

    连接MySQL 这里我使用navicat远程连接,连接MySQL前需要防火墙开放端口或者关闭防火墙. 开放端口 firewall-cmd --add-port=3306/tcp --permanent // --permanent 永久生效,没有此参数重启后失效 firewall-cmd --reload // 重新载入 关闭防火墙 systemctl stop firewalld systemctl enable iptables // 设置开机启动 firewall-cmd --reload

  • Docker开启安全的TLS远程连接访问方式

    目录 1.1 不安全的远程访问方式 1.1.1 编辑docker.service文件: 1.1.2 重新加载Docker配置生效 1.1.3 警告! 2.1 建立基于TLS数字签名的安全连接 1.1 不安全的远程访问方式 1.1.1 编辑docker.service文件: vi /usr/lib/systemd/system/docker.service 找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375 ExecStart=/usr

  • Docker 安装 MySQL 并实现远程连接教程

    拉取镜像 docker pull mysql 查看拉取完成的镜像 docker images 通过镜像创建并启动一个MySQL容器 docker run --name mysql_dev -e MYSQL_ROOT_PASSWORD=123456 -p 3333:3306 -d mysql –name:给新创建的容器命名,此处命名为 mysql_dev -e:配置信息,此处配置mysql的root用户的登陆密码 -p:端口映射,此处映射主机3333端口到容器mysql_dev的3306端口 -d

  • Linux下docker安装mysql8并配置远程连接

    目录 第一步:下载mysql镜像镜像 第二步:启动mysql镜像 第三步:查询启动的镜像 第四步:进入容器 第五步:登录mysql 第六步:设置远程访问 第七步:navicat链接时报 2059 错误 第一步:下载mysql镜像镜像 docker pull mysql 默认是下载最新稳定版 第二步:启动mysql镜像 docker run --name dockermysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysqlpassword -d mysql -

  • Sql Server数据库远程连接访问设置详情

    目录 步骤一:设置sql server数据库 1.登录sql server数据库 2.点击根目录右键,选择属性 3.设置服务器的方面选项 4.设置sql server 配置管理器 步骤二:设置防火墙入站规则 步骤三:华为云服务器安装sql server并设置远程访问 1.登录华为云,点击安全组(主要是对安全组进行设置端口) 2.创建安全组 步骤一:设置sql server数据库 1.登录sql server数据库 以新建一个新用户名test作为远程连接登录名.在本地登录sql server数据库

  • MySQL8.0无法远程连接访问的解决方法

    问题:MySQL  8.0 无法远程连接访问 原因:可能是mysql数据库user表中,用户的 host 字段配置是不允许当前host访问或者是访问的加密方式不对,旧版的MySQL和新版的密码加密方式不一致,但是很多企业和个人都习惯使用旧版的加密方式 解决: 先使用mysql数据库 use mysql; mysql数据库user表中,用户的 host 字段配置是不允许当前host访问 查看所允许的访问地址 select host, user plugin from user; 修改所允许的访问地

  • CentOS7安装GUI界面及远程连接的实现

    用基于浏览器(webdriver)的selenium技术爬取数据,所以程序需运行在GUI环境下.本文分三个部分简要介绍安装GUI界面及远程连接的步骤. 安装GUI界面 大多数云服务器厂商提供的镜像都无GUI界面,所以要先安装图形环境.本文使用GNOME桌面环境: yum -y groups install "GNOME Desktop" 这条命令将安装GNOME桌面的必要软件包,执行完后配置X系统使用GNOME: echo "exec gnome-session"

  • Docker开启远程安全访问的图文教程详解

    一.编辑docker.service文件 vi /usr/lib/systemd/system/docker.service 找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 这样相当于对外开放的是 2375 端口,当然也可以根据

  • docker daemon远程连接设置详解

    Docker为C/S架构,服务端为docker daemon,客户端为docker.service.支持本地unix socket域套接字通信与远程socket通信.默认为本地unix socket通信,要支持远程客户端访问需要做如下设置(仅用于测试,生产环境开启会极大增加不安全性:由于开了监听端口,任何人可以通过远程连接到docker daemon服务器进行操作): 1.设置daemon监听连接: 添加本地默认监听端口,模式为IP:port Ubuntu: 修改daemon配置:/etc/do

随机推荐