《Docker远程连接设置》一文讲述了开启Docker远程连接的方法,但那种方法不安全,因为任何客户端都可以通过Docker服务的IP地址连接上去,今天我们就来学习Docker官方推荐的安全的远程连接方式:TLS加密连接,通过证书来保证安全性。

官方文档

这里是官方的权威文档:https://docs.docker.com/engine/security/https/

环境信息

本次实战的环境信息如下:

  1. Docker服务所在机器(下面以A机器表示):CentOS Linux release 7.6.1810
  2. Docker服务版本:1.13.1
  3. 另一台验证远程连接的机器(下面以B机器表示)也是CentOS 7.6,其上安装了Docker client 1.13.1

操作步骤

本次实战的操作步骤如下:

  1. 制作证书,包括CA、服务端、客户端的;
  2. 设置机器A上的Docker服务的TLS连接;
  3. 从机器B远程连接机器A上的Docker服务;

制作证书(A机器)

  1. 在Linux服务器上建一个目录,进入此目录,我这里是/root/work
  2. 创建根证书RSA私钥:
openssl genrsa -aes256 -out ca-key.pem 4096
  1. 页面提示Enter pass phrase for ca-key.pem,此时输入秘钥的密码,我这里输入了1234,回车后会要求再输入一次,两次密码一致就会在当前目录生成CA秘钥文件ca-key.pem;
  2. 以此秘钥创建CA证书,自己给自己签发证书,自己就是CA机构,也可以交给第三方机构去签发:
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem

此时生成的ca.pem文件就是CA证书;
5. 创建服务端私钥:

openssl genrsa -out server-key.pem 4096

此时生成的server-key.pem文件就是服务端私钥;
6. 生成服务端证书签名请求(csr即certificate signing request,里面包含公钥与服务端信息)

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

此时生成的server.csr文件就是服务端证书;
7. 生成签名过的服务端证书(期间会要求输入密码1234):

openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

此时生成的server-cert.pem文件就是已盖章生效的服务端证书;
8. 生成客户私钥:

openssl genrsa -out key.pem 4096

此时生成的key.pem文件就是客户私钥;
9. 生成客户端证书签名请求:

openssl req -subj "/CN=client" -new -key key.pem -out client.csr

此时生成的client.csr文件就是客户端证书签名请求;
10. 生成名为extfile.cnf的配置文件:

echo extendedKeyUsage=clientAuth > extfile.cnf
  1. 生成签名过的客户端证书(期间会要求输入密码1234):
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
  1. 将多余的文件删除:
rm -rf ca.srl client.csr extfile.cnf server.csr
  1. 此时还剩以下文件:
文件名 作用
ca.pem CA机构证书
ca-key.pem 根证书RSA私钥
cert.pem 客户端证书
key.pem 客户私钥
server-cert.pem 服务端证书
server-key.pem 服务端私钥

至此,所有证书文件制作完成,接下来对Docker做TLS安全配置;

Docker的TLS连接设置(A机器)

  1. 打开文件/lib/systemd/system/docker.service,找到下图红框中的内容:
  2. 将上图红框中的一整行内容替换为以下内容:
ExecStart=/usr/bin/dockerd-current --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/server-cert.pem --tlskey=/root/work/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock \
  1. 加载上述配置,再重启docker服务:
systemctl daemon-reload && systemctl restart docker

配置完成,接下来验证远程TLS连接。

验证远程TLS连接(B机器)

  1. 假设前面我们操作的电脑为A,IP地址是192.168.121.138;
  2. 现在再准备一台电脑B,IP地址是192.168.121.132,用来验证TLS加密远程连接A上的Docker;
  3. 在A机器执行以下命令,将A上的ca.pem、cert.pem、key.pem这三个文件复制到B机器的/root/work目录(请提前建好此目录):
scp /root/work/ca.pem root@192.168.121.132:/root/work \
&& scp /root/work/cert.pem root@192.168.121.132:/root/work \
&& scp /root/work/key.pem root@192.168.121.132:/root/work
  1. 在制作证书时没有允许通过IP访问服务端,所以B在连接A的Docker时不能直接用A的IP,所以要用host来访问A,给B电脑增加一个host配置(如果B电脑是Linux,就在/etc/hosts文件上配置):
192.168.121.138 docker-daemon
  1. 在B上执行以下命令,即可连接A的Docker服务:
docker --tlsverify --tlscacert=/root/work/ca.pem --tlscert=/root/work/cert.pem --tlskey=/root/work/key.pem -H tcp://docker-daemon:2376 version

控制台显示以下信息,其中Server部分就是A机器的Docker信息:

Client:Version:         1.13.1API version:     1.26Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64Go version:      go1.10.3Git commit:      b2f74b2/1.13.1Built:           Wed May  1 14:55:20 2019OS/Arch:         linux/amd64Server:Version:         1.13.1API version:     1.26 (minimum version 1.12)Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64Go version:      go1.10.3Git commit:      7f2769b/1.13.1Built:           Mon Aug  5 15:09:42 2019OS/Arch:         linux/amd64Experimental:    false
  1. 不用证书连接试试,各种尝试都失败了:
[root@centos7 work]# docker -H tcp://192.168.121.138:2375 images
Cannot connect to the Docker daemon at tcp://192.168.121.138:2375. Is the docker daemon running?
[root@centos7 work]# docker -H tcp://docker-daemon:2375 images
Cannot connect to the Docker daemon at tcp://docker-daemon:2375. Is the docker daemon running?
[root@centos7 work]# docker -H tcp://192.168.121.138:2376 images
Get http://192.168.121.138:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS?
[root@centos7 work]# docker -H tcp://docker-daemon:2376 images
Get http://docker-daemon:2376/v1.26/images/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02".
* Are you trying to connect to a TLS-enabled daemon without TLS?

至此,TLS加密远程连接Docker的实战就完成了,希望您在设置安全的Docker远程连接是,本文能给您提供参考。

欢迎关注我的公众号:程序员欣宸

TLS加密远程连接Docker相关推荐

  1. 这就是你日日夜夜想要的docker!!!---------TLS加密远程连接Docker

    文章目录 一.Docker 存在的安全问题 1.Docker 自身漏洞 2.Docker 源码问题 3.Docker 架构缺陷与安全机制 二.TLS加密通讯协议 1.TLS介绍 2.CA证书 三.配置 ...

  2. 远程连接docker中的mysql容器_docker构建mysql容器及Navicat 远程连接

    1. MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像 docker images 1.2创建MySQL容器 首先建立所需要的 文件夹: docker run - ...

  3. Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法

    Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法 1).容器中登录my ...

  4. 远程连接docker中的SQL Server

    远程连接docker上的SQL_Server 参考: 官方文档https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect ...

  5. navicat 远程连接docker mysql提示:Authentication plugin ‘caching_sha2_password‘ cannot be loaded

    navicat 远程连接docker mysql提示:Authentication plugin 'caching_sha2_password' cannot be loaded 1.docker启动 ...

  6. 远程连接docker里的Linux容器

    远程连接docker里的Linux容器 安装容器的SSH服务 apt-get install openssh-server 安装vim编辑器 apt-get install vim 安装lrzsz a ...

  7. 远程桌面正在加密远程连接很久很慢连接不上解决方法

    当远程桌面一台电脑进行操作时,一直提示"正在远程加密连接".很久才可以连接上 但是用vpn连接时,很快就能连接, 经过上网搜索资料查询发现,在组策略里面有一个"自动关闭根 ...

  8. win8.1远程桌面连接2008显示正在加密远程连接

    这个过程要很久 在2008的远程终端服务配置里,连接名,属性,安全层选择RDP安全层 可以取消加密验证 转载于:https://blog.51cto.com/mcmvp/1383878

  9. centos 实现ssh远程连接docker

    为什么80%的码农都做不了架构师?>>>    一.查看当前镜像 [root@iZ25av9xi4hZ ~]# docker images REPOSITORY TAG IMAGE ...

最新文章

  1. 【S操作】轻松优雅库移植解决方案,arduino库移植应对方案
  2. 分层模型:OSI与TCP/IP
  3. 时尚的基因是创新 -- 旺旺平台产品线员工大会即兴发言提要
  4. 编写一个函数func(),将此函数的输入参数(int型)逆序输出显示,如54321 – 12345,要求使用递归,并且函数体代码不超过8行...
  5. 工厂好的html页面,jquery中被誉为工厂函数的是什么?
  6. 阿里云MySQL及Redis灵异断连现象:安全组静默丢包解决方法
  7. oracle 等待sql,oracle sql 锁,锁等待相关sql
  8. 修改apache 2.4.6的MPM模式
  9. android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...
  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_3_绝对路径和相对路径...
  11. 视差滚动效果原理解析和效果实现
  12. codeblocks下载安装及问题解决
  13. 手动决战3721和雅虎助手
  14. RPC调用方如何实现异步调用:CompletableFuture
  15. Comsol中引用matlab函数
  16. Hackthebox入门
  17. 三维管型ybc预览以及动态成型仿真控件
  18. 鸡兔同笼问题java解决
  19. 爬虫-东北林业大学校内-中国[哈尔滨]森林博物馆-爬取所有馆藏蝴蝶图片
  20. Line云端全自动加好友机器人

热门文章

  1. windbg调试命令汇总
  2. linear_model.Lass
  3. 【无人驾驶视觉系列之】3D障碍物检测(一)
  4. 华为历史的几次重大管理变革
  5. MySql数据类型转化-CAST与CONVERT 函数的用法
  6. 微信协议分析 pc端记录
  7. 转转图书对基于Drools引擎的DMN实践
  8. 解锁一个新技能,如何在Python代码中使用表情包...
  9. 请举一例分析GIS空间分析学科背景及意义,GIS空间分析的目标与归宿
  10. Django学习心得