Docker远程安全连接


配置Docker远程连接,我们可以配合Docker插件在本地打包就自动上传并创建容器,不用我们再去服务器中手动创建。网上的讲解大多都是直接开放一个端口就直接完事,这样自己玩玩可以,用于正式项目的话不出几个小时就会被扫描到进而被攻击,这次我们说说通过证书来访问Docker。

先看看不用安全证书的远程连接配置:

  • docker.service文件添加-H tcp://0.0.0.0:2375
vim /usr/lib/systemd/system/docker.service

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd \
        -H tcp://0.0.0.0:2375 \
        -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
  • 重启Docker
systemctl daemon-reload 
systemctl restart docker 

1. 手动生成证书

最后生成的证书文件总览

├── ca-key.pem       # 妥善保管,连接时用不到
├── ca.pem           # clent & server
├── ca.srl           # 用不到
├── cert.pem         # client
├── client.csr       # 请求文件
├── extfile.cnf      # 配置文件
├── extfile-client.cnf      # 配置文件
├── key.pem          # client
├── server-cert.pem  # server
├── server.csr       # 请求文件
└── server-key.pem   # server

创建证书文件夹mkdir -p /usr/local/ca cd /usr/local/ca

1. 生成CA私钥和CA公钥

# 生成 CA 私钥
openssl genrsa -aes256 -out ca-key.pem 4096
# 需要输入两次密码(自定义)
# 生成 CA 公钥
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
# 输入上一步中设置的密码,然后需要填写一些信息

2. 生成服务器证书

# 生成服务器私钥
openssl genrsa -out server-key.pem 4096
# 用私钥生成证书请求文件
$ openssl req -subj "/CN=localhost" -sha256 -new -key server-key.pem -out server.csr
# localhost替换成自己服务器的IP地址,网址也可以 例如:"/CN=www.baidu.com"
# 匹配白名单 使用时将 $HOST 替换成自己服务器的IP地址(这里我们直接配置0.0.0.0就行,允许所有IP可以连接,但是只有证书才能连接成功)
echo subjectAltName = DNS:$HOST,IP:$HOST,IP:0.0.0.0,IP:127.0.0.1 >> extfile.cnf
# 将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证
echo extendedKeyUsage = serverAuth >> extfile.cnf
# 用 CA 来签署证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out server-cert.pem -extfile extfile.cnf
# 再次输入第一步设置的密码

3. 生成客户端证书

# 生成客户端私钥
openssl genrsa -out key.pem 4096
# 用私钥生成证书请求文件  
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth >> extfile-client.cnf
# 用 CA 来签署证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile.cnf
# 再次输入第一步设置的密码

最后可以删除不用的文件以及修改权限,避免误操作:

# 删除文件,更改文件权限
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
# 避免意外损坏,删除写入权限
chmod -v 0400 ca-key.pem key.pem server-key.pem
# 证书可以使对外可读的,删除写入权限以防止意外损坏
chmod -v 0444 ca.pem server-cert.pem cert.pem
# 把 ca.pem server-cert.pem server-key.pem 三个文件移动到 /etc/docker/ 文件夹中。
cp server-*.pem /etc/docker/
cp ca.pem /etc/docker/

2. 使用脚本生成证书

Docker-Auto-Setup-TLS.sh

3. 修改安全配置

  • 修改docker.service文件,非安全连接使用的是 2375 端口,安全连接使用的是 2376 端口。当然这是推荐的端口配置,你可以配置任何端口!
vim /usr/lib/systemd/system/docker.service

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd \
        -H tcp://0.0.0.0:2376 \
        --tlsverify --tlscacert=/usr/local/ca/ca.pem \
        --tlscert=/usr/local/ca/server-cert.pem \
        --tlskey=/usr/local/ca/server-key.pem \
        -H unix://var/run/docker.sock
        -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID

最后重启Docker即可,本地连接需要拿到服务器中的几个证书,将以下几个证书下载到本地:

  • ca-key.pem
  • ca.pem
  • cert.pem
  • key.pem

IDEA中Docker连接链接改为https://服务器IP:配置的端口

Certificates folder选择本地证书存放的路径就可以了


文章作者: Cody_
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cody_ !
评论
 上一篇
@Autowired注解自动注入的原理 @Autowired注解自动注入的原理
@Autowired自动注入是由AutowiredAnnotationBeanPostProcessor实现的,这个类实现了MergedBeanDefinitionPostProcessor接口,进而实现了postProcessMerged
2021-01-15
下一篇 
Security前后端分离多种认证方式 Security前后端分离多种认证方式
Security在现阶段的开发中使用频率非常高,用于权限认证;项目前后端分离的认证,前端登录也不仅仅是单一的账号密码登录,常常会有验证码登录以及各种第三方登录等等,下面我们就一一讲解Security的实现方式。 源码地址:戳我查看 1. 认
2021-01-03
  目录