Docker 开启远程安全访问

说明

如果你的服务器是公网IP,并且开放了docker的远程访问,如果没有进行保护是非常危险的,任何人都可以向你的docker中推送镜像、运行实例。我曾开放过阿里云服务器中docker的远程访问权限,在没有开启保护的状态下,几小时内就被植入了挖矿程序,导致CPU的占用率一直在100%,最终只能将服务器重置。

接下来我们介绍一下如何利用CA证书,安全的开启Docker的远程,通过TLS进行加密访问。

本文适用于部署在公网的服务器(包括云服务器),安全的开启docker远程访问。本文并不适用于局域网或虚拟机的加密。

详细步骤

下面我们介绍一个如何配置CA证书

1、先创建一个目录存放ca私钥和公钥

复制代码
mkdir -p /usr/local/ca

2、进入此目录 准备生成密钥

复制代码
cd /usr/local/ca

3、生成RSA私钥

运行下面命令时,会提示输入密码,输入两次一致即可。

复制代码
openssl genrsa -aes256 -out ca-key.pem 4096

4、以上面生成的RSA密钥创建证书

运行此命令后,会提示输入国家、省、市、组织名称、单位、邮箱等资料。

国家只能是两位,例如:CN,其他的随便填写即可。

复制代码
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem

5、生服务端的RSA私钥

复制代码
openssl genrsa -out server-key.pem 4096

6、生成服务端的证书签名

/CN=服务器IP 此处配置你的服务器IP,这里只能是公网IP或域名!

复制代码
openssl req -subj "/CN=服务器IP" -sha256 -new -key server-key.pem -out server.csr

7、配置白名单

DNS: 此处配置你的服务器IP,这里只能是公网IP或域名!

IP: 此处配置允许访问的IP,可以配置多个,以逗号间隔即可。此处也同样是支支持公网IP。如果允许任何携带证书的人访问,直接修改为0.0.0.0即可

复制代码
echo subjectAltName = DNS:服务器域名,IP:0.0.0.0 >> extfile.cnf

注意这里如果用服务器ip,则要将DNS改为IP,既:

复制代码
echo subjectAltName = IP:服务器IP,IP:0.0.0.0 >> extfile.cnf

8、为extfile.cnf追加属性

此属性用于服务器身份验证

复制代码
echo extendedKeyUsage = serverAuth >> extfile.cnf

9、生成签名过的客户端证书

期间会要求输入密码,输入和上面一致即可

复制代码
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf

10、生成客户端的RSA私钥

复制代码
openssl genrsa -out key.pem 4096

11、生成client.csr

复制代码
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

12、为extfile.cnf添加认证参数

复制代码
echo extendedKeyUsage = clientAuth >> extfile.cnf

13、为extfile-client.cnf添加认证参数

复制代码
echo extendedKeyUsage = clientAuth > extfile-client.cnf

14、生成签名证书

复制代码
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile-client.cnf

15、删除无用的配置文件

复制代码
rm -v client.csr server.csr extfile.cnf extfile-client.cnf

16、将服务端证书放到docker的目录

复制代码
cp server-*.pem /etc/docker/

17、将服务端证书放到docker的目录

复制代码
cp ca.pem /etc/docker/

18、修改docker配置文件

复制代码
vi /lib/systemd/system/docker.service

19、替换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

20、更新配置文件并重启docker

复制代码
systemctl daemon-reload && systemctl restart docker

21、对docker端口2375放行 如果是云服务器 需要在其管理页面中对应开启端口访问

复制代码
firewall-cmd --zone=public --add-port=2375/tcp

22、测试

访问https://ip:2375/version,如果提示需要证书即标识配置成功

23、使用IDEA连接

将ca-key.pem、ca.pem、cert.pem、key.pem四个文件拷贝到要访问docker的客户端。

在IDEA中,将Engine API URL中的TCP协议修改为https

在IDEA的Certificates folder中配置拷贝了四个文件的目录 点击apply,出现Connection successful即为成功!

相关推荐
努力搬砖的咸鱼2 小时前
容器之间怎么通信?Docker 网络全解析
网络·docker·云原生·容器
liming4954 小时前
Ubuntu18.04部署k8s
云原生·容器·kubernetes
数安3000天5 小时前
政务数据治理构建可知可管可控的API安全网关体系建设实践
安全·政务
元直数字电路验证6 小时前
ASP.NET Core Web APP(MVC)开发中无法全局配置 NuGet 包,该怎么解?
前端·javascript·ui·docker·asp.net·.net
YC运维6 小时前
Kubernetes资源管理全解析
java·容器·kubernetes
KKKlucifer7 小时前
当UAF漏洞敲响提权警钟:技术剖析与应对之道
网络·安全
chinesegf8 小时前
Docker篇6-项目app.py和flask_app.service配置和映射到docker中
docker·容器·flask
退役小学生呀8 小时前
二十二、DevOps:基于Tekton的云原生平台落地(三)
linux·云原生·容器·kubernetes·k8s·devops·tekton
-曾牛8 小时前
深入理解XXE外部实体注入漏洞:原理、利用与防护
网络·安全·网络安全·渗透测试·xxe·漏洞原理·owaspf
维尔切8 小时前
搭建 k8s
云原生·容器·kubernetes