TLS加密远程连接Docker

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 学习Docker官方推荐的安全的远程连接方式:TLS加密连接

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本篇概览

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

官方文档

环境信息

  • 本次实战的环境信息如下:
  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机器)

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

此时生成的ca.pem文件就是CA证书;

  • 创建服务端私钥:
openssl genrsa -out server-key.pem 4096
  • 此时生成的server-key.pem文件就是服务端私钥;
  • 生成服务端证书签名请求(csr即certificate signing request,里面包含公钥与服务端信息)
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
  • 此时生成的server.csr文件就是服务端证书;
  • 生成签名过的服务端证书(期间会要求输入密码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文件就是已盖章生效的服务端证书;
  • 生成客户私钥:
openssl genrsa -out key.pem 4096
  • 此时生成的key.pem文件就是客户私钥;
  • 生成客户端证书签名请求:
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
  • 此时生成的client.csr文件就是客户端证书签名请求;
  • 生成名为extfile.cnf的配置文件:
echo extendedKeyUsage=clientAuth > extfile.cnf
  • 生成签名过的客户端证书(期间会要求输入密码1234):
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
  • 将多余的文件删除:
rm -rf ca.srl client.csr extfile.cnf server.csr
  • 此时还剩以下文件:
文件名 作用
ca.pem CA机构证书
ca-key.pem 根证书RSA私钥
cert.pem 客户端证书
key.pem 客户私钥
server-cert.pem 服务端证书
server-key.pem 服务端私钥
  • 至此,所有证书文件制作完成,接下来对Docker做TLS安全配置;

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

  • 打开文件/lib/systemd/system/docker.service,找到下图红框中的内容:

在这里插入图片描述

  • 将上图红框中的一整行内容替换为以下内容:
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 \
  • 加载上述配置,再重启docker服务:
systemctl daemon-reload && systemctl restart docker
  • 配置完成,接下来验证远程TLS连接。

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

  • 假设前面我们操作的电脑为A,IP地址是192.168.121.138
  • 现在再准备一台电脑B,IP地址是192.168.121.132,用来验证TLS加密远程连接A上的Docker;
  • 在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
  • 在制作证书时没有允许通过IP访问服务端,所以B在连接A的Docker时不能直接用A的IP,所以要用host来访问A,给B电脑增加一个host配置(如果B电脑是Linux,就在/etc/hosts文件上配置):
192.168.121.138 docker-daemon
  • 在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.1
 API version:     1.26
 Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      b2f74b2/1.13.1
 Built:           Wed May  1 14:55:20 2019
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-102.git7f2769b.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      7f2769b/1.13.1
 Built:           Mon Aug  5 15:09:42 2019
 OS/Arch:         linux/amd64
 Experimental:    false
  • 不用证书连接试试,各种尝试都失败了:
[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远程连接是,本文能给您提供参考。

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关文章
|
6月前
|
存储 测试技术 数据安全/隐私保护
【Docker项目实战】使用Docker部署DailyTxT加密日记网络应用程序
【4月更文挑战第6天】使用Docker部署DailyTxT加密日记网络应用程序
138 2
|
算法 安全 搜索推荐
TLS 协议-对称加密原理
TLS 协议-对称加密原理
188 0
|
6月前
|
关系型数据库 MySQL Linux
Linux 本地 Docker Registry本地镜像仓库远程连接
Linux 本地 Docker Registry本地镜像仓库远程连接
186 0
|
网络安全 Docker 容器
安装docker并配置远程连接和阿里镜像
安装docker并配置远程连接和阿里镜像
546 0
|
3月前
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。
|
4月前
|
缓存 网络协议 算法
(二)Java网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称加密原理!
作为一名程序员,尤其是Java程序员,那必须得了解并掌握HTTP/HTTPS相关知识。因为在如今计算机网络通信中,HTTP协议的作用功不可没,无论是日常上网追剧、冲���、亦或是接口开发、调用等,必然存在HTTP的“影子”在内。尤其对于WEB开发者而言,HTTP几乎是每天会打交道的东西。
91 10
|
算法 网络安全 开发工具
TLS/SSL 协议-非对称加密(RSA)原理
TLS/SSL 协议-非对称加密(RSA)原理
267 0
|
SQL 网络协议 Ubuntu
Docker安装MS SQL Server并使用Navicat远程连接
Docker安装MS SQL Server并使用Navicat远程连接
227 0
|
安全 Java Shell
Docker实战 | 第四篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结
Docker实战 | 第四篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结
|
安全 网络协议 Unix
为 Docker 配置 TLS
Docker 默认通过 `Unix Socket` 对外提供接口,也支持 `HTTP` 的方式,后者允许我们能够在本地控制远程服务器中的 Docker。如果你想让远程服务器中的 Docker 以安全的方式被访问,可为其配置 TLS,做到服务端和客户端的双向验证。本文总结了配置 Docker TLS 过程中的实践经验。
下一篇
无影云桌面