Docker开启并配置远程安全访问

这篇具有很好参考价值的文章主要介绍了Docker开启并配置远程安全访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在工作学习中,为了提高项目部署效率,一般会在Idea中直接使用Docker插件连接服务器Docker容器,然后将项目打包与DockerFile一起build成Docker镜像部署运行。但是不可能服务器总是跟着主机的,因此呢时常会面临的一个问题就是从A端访问B端服务器上的Docker从而引发的Docker的远程访问问题。

由于在默认情况下,Docker的守护进程会生成一个socket文件来进行本地进程通信,而不会监听任何端口,因此大多数情况下我们只能在本地使用docker客户端或者使用Docker API进行操作。如果想在其他主机上操作Docker主机,就需要让Docker守护进程监听一个端口,这样才能实现远程通信。

但需要注意的是不要将此方式用在外部网络环境,以免带来安全问题,因为在外部网络环境下暴露端口是很危险的事,别人随时能攻击甚至窃取你的数据。因此官方也给出了详细警告及处理信息:

Docker开启并配置远程安全访问 因此我们不能仅仅去配置远程访问就完事了,还要用安全证书进行配置才行。对此官网也给出了相应的解决方式:配置CA证书密钥

Docker开启并配置远程安全访问

 下面,我们一步一步来~

开启远程访问(不安全)

根据官网方法,进入docker.service文件,编辑并在ExecStart上添加配置 -H tcp://127.0.0.1:2375

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 fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

这里相当于开放了2375端口,因此除了配置文件以外还要在防火墙开放端口,云服务器还需要开放端口策略等等。

[root@VM-12-4-centos ~]# firewall-cmd --query-port=2375/tcp
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'docker' (see --get-active-zones)
You most likely need to use --zone=docker option.
​
no #没开启
#开启端口号
[root@VM-12-4-centos ~]# firewall-cmd --add-port=2375/tcp --permanent
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'docker' (see --get-active-zones)
You most likely need to use --zone=docker option.
​
success
#重启防火墙
[root@VM-12-4-centos ~]# firewall-cmd --reload
success

重启服务使得更改后的配置生效,并查看docker启动状态

[root@VM-12-4-centos server]# systemctl daemon-reload
[root@VM-12-4-centos server]# systemctl restart docker 
[root@VM-12-4-centos server]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-04-10 09:00:30 CST; 15s ago
     Docs: https://docs.docker.com
 Main PID: 6425 (dockerd)
    Tasks: 51
   Memory: 56.1M
   CGroup: /system.slice/docker.service
           ├─6425 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
           ├─6741 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3303 -container-ip 172.18.1.30 -container-port 3306
           ├─6747 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 3303 -container-ip 172.18.1.30 -container-port 3306
           ├─6855 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
           ├─6861 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
           ├─6967 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8848 -container-ip 172.18.1.48 -container-port 8848
           └─6983 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8848 -container-ip 172.18.1.48 -container-port 8848

安全访问配置流程

1,在指定文件夹新建一个存放CA密钥的文件夹,笔者这里再docker文件下存放。

[root@VM-12-4-centos server]# cd docker
[root@VM-12-4-centos docker]# ll
total 0
[root@VM-12-4-centos docker]# mkdir ca_key
[root@VM-12-4-centos docker]# ll
total 4
drwxr-xr-x 2 root root 4096 Apr 10 10:27 ca_key
[root@VM-12-4-centos docker]# cd ca_key

2,在Docker主机上通过命令生成CA私钥和公钥

执行命令:openssl genrsa -aes256 -out ca-key.pem 4096

[root@VM-12-4-centos ca_key]# openssl genrsa -aes256 -out ca-key.pem 4096
Generating RSA private key, 4096 bit long modulus
.....................................................................................................................................................................................................................................................++
................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:
Verifying - Enter pass phrase for ca-key.pem:
Verify failure
User interface error
139698349328272:error:0906906F:PEM routines:PEM_ASN1_write_bio:read key:pem_lib.c:385:
[root@VM-12-4-centos ca_key]# openssl genrsa -aes256 -out ca-key.pem 4096
Generating RSA private key, 4096 bit long modulus
............++
.............................................................................................................................................................................................................................++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:
Verifying - Enter pass phrase for ca-key.pem:

这里需要输入密码并确认,只要两次输入一致就行,否则会像重置密码数据两次新密码一样报验证错误。需要注意的是:Linux上并不会显示输入的密码信息,因此要格外注意别输错了。

如果成功,该文件下就有了pem证书文件生成:

[root@VM-12-4-centos ca_key]# ll
total 4
-rw-r--r-- 1 root root 3326 Apr 10 10:29 ca-key.pem

3,补全CA信息

执行命令:openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem根据要求依次输入访问密码、国家、省、市、组织名称、单位名称、随便一个名字、邮箱等,需要这些信息作为证书申请。

[root@VM-12-4-centos ca_key]# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
Enter pass phrase for ca-key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HUBei
Locality Name (eg, city) [Default City]:WuHan
Organization Name (eg, company) [Default Company Ltd]:ZC
Organizational Unit Name (eg, section) []:QA
Common Name (eg, your name or your server's hostname) []:192.168.98.128(ip地址)
Email Address []:8888888888@qq.com

现在我们有了CA,就可以创建服务器密钥和证书签名请求(CSR)。

Tips:确保“Common Name”与用于连接Docker的主机名匹配,否则后续远程连接会失败!

4,生成service-key.pem

执行命令:openssl genrsa -out server-key.pem 4096

[root@VM-12-4-centos ca_key]# openssl genrsa -out server-key.pem 4096
Generating RSA private key, 4096 bit long modulus
...........................................................................................++
....++
e is 65537 (0x10001)
[root@VM-12-4-centos ca_key]# ll
total 12
-rw-r--r-- 1 root root 3326 Apr 10 10:29 ca-key.pem
-rw-r--r-- 1 root root 2082 Apr 10 10:56 ca.pem
-rw-r--r-- 1 root root 3247 Apr 10 11:45 server-key.pem

5,用CA签署公钥

由于TLS连接可以通过IP地址和DNS名称进行,因此在创建证书时需要指定IP地址或者域名。填写的IP或者域名,都是将来对外开放的地址,也就是用于连接的地址。例如,要允许使用127.0.0.1进行连接:

执行命令:openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

[root@VM-12-4-centos ca_key]# openssl req -subj "/CN=127.0.0.1" -sha256 -new -key server-key.pem -out server.csr

6,匹配白名单

设置允许哪些IP可以远程连接docker

  1. 允许指定IP可以远程连接docker

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

    $HOST是你的IP或者域名,使用时将$HOST替换为自己的IP或者域名。

    如:

    # 127.0.0.1 服务器上的 docker,只允许ip地址为225.225.225.0的客户连接
    echo subjectAltName = DNS:127.0.0.1,IP:225.225.225.0 >> extfile.cnf
    # ideaopen.cn 服务器上的 docker,只允许ip地址为225.225.225.0的客户连接
    echo subjectAltName = DNS:ideaopen.cn,IP:225.225.225.0 >> extfile.cnf
  2. 允许所有IP连接

    设置IP0.0.0.0即可。

    如:

    echo subjectAltName = DNS:127.0.0.1,IP:0.0.0.0 >> extfile.cnf

    注:只允许永久证书的才可以连接成功

然后需要将Docker守护进程密钥的扩展使用属性设置为仅用于服务器身份验证:

echo extendedKeyUsage = serverAuth >> extfile.cnf

7,生成已签名的证书(signed certificate)

这里执行命令后需要输入之前设置的密码

[root@VM-12-4-centos ca_key]# openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
>   -CAcreateserial -out server-cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=127.0.0.1
Getting CA Private Key
Enter pass phrase for ca-key.pem:

授权插件提供了更细粒度的控制,以补充来自双向TLS的身份验证。除了上述描述的其他信息外,在Docker守护进程上运行的授权插件还接收用于连接Docker客户端的证书信息。

如果第二次申请颁发证书,可能会出现ca.srl: No such file or directory的问题。

此时我们echo “01” > ca.srl 即可,这个文件影响到ca颁发的证书的序号,而证书序号应该是唯一的,所以这点需要控制好。

8,生成客户端key

对于客户端身份验证,我们还需要创建客户端密钥和证书签名请求:

注意:为了简化接下来的几个步骤,我们可以在Docker守护进程的主机上执行此步骤。

[root@VM-12-4-centos ca_key]# openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
......................................++
.................................++
e is 65537 (0x10001)
[root@VM-12-4-centos ca_key]# openssl req -subj '/CN=client' -new -key key.pem -out client.csr

此外为了使密钥适合客户端身份验证,还需要创建一个新的扩展配置文件:

[root@VM-12-4-centos ca_key]# echo extendedKeyUsage = clientAuth >> extfile.cnf
[root@VM-12-4-centos ca_key]# echo extendedKeyUsage = clientAuth > extfile-client.cnf

然后就可以生成已签名的客户端key了。

[root@VM-12-4-centos ca_key]# openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
>   -CAcreateserial -out cert.pem -extfile extfile-client.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:

此时可以看到我们当初创建的ca_key文件里已经有很多文件了。

[root@VM-12-4-centos ca_key]# ll
total 44
-rw-r--r-- 1 root root 3326 Apr 10 10:29 ca-key.pem
-rw-r--r-- 1 root root 2082 Apr 10 10:56 ca.pem
-rw-r--r-- 1 root root   17 Apr 10 13:45 ca.srl
-rw-r--r-- 1 root root 1854 Apr 10 13:45 cert.pem
-rw-r--r-- 1 root root 1582 Apr 10 13:40 client.csr
-rw-r--r-- 1 root root   30 Apr 10 13:43 extfile-client.cnf
-rw-r--r-- 1 root root  102 Apr 10 13:42 extfile.cnf
-rw-r--r-- 1 root root 3243 Apr 10 13:40 key.pem
-rw-r--r-- 1 root root 1895 Apr 10 13:36 server-cert.pem
-rw-r--r-- 1 root root 1586 Apr 10 13:26 server.csr
-rw-r--r-- 1 root root 3247 Apr 10 11:45 server-key.pem

但是有很多多余的配置文件,生成cert.pemserver-cert.pem后,一些签名请求和扩展配置文件可以安全删除了。

#删除多余文件
[root@VM-12-4-centos ca_key]# rm -v client.csr server.csr extfile.cnf extfile-client.cnf
rm: remove regular file ‘client.csr’? y
removed ‘client.csr’
rm: remove regular file ‘server.csr’? y
removed ‘server.csr’
rm: remove regular file ‘extfile.cnf’? y
removed ‘extfile.cnf’
rm: remove regular file ‘extfile-client.cnf’? y
removed ‘extfile-client.cnf’

9,修改权限

为了防止密钥文件被误删或者损坏,我们可以改变一下文件权限,让它只读就可以。

[root@VM-12-4-centos ca_key]# chmod -v 0400 ca-key.pem key.pem server-key.pem
mode of ‘ca-key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)
mode of ‘key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)
mode of ‘server-key.pem’ changed from 0644 (rw-r--r--) to 0400 (r--------)

为了防止证书损坏,我们也删除它的写入权限。

[root@VM-12-4-centos ca_key]# chmod -v 0444 ca.pem server-cert.pem cert.pem
mode of ‘ca.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)
mode of ‘server-cert.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)
mode of ‘cert.pem’ changed from 0644 (rw-r--r--) to 0444 (r--r--r--)

归集服务器证书

将证书存放在docker配置文件夹下

[root@VM-12-4-centos ca_key]# cp server-*.pem /etc/docker/
[root@VM-12-4-centos ca_key]# cp ca.pem /etc/docker/

10,修改Docker配置

这里需要设置Docker的守护程序,让它仅接收来自提供了CA信任证书的客户端连接。

#vim
vim /lib/systemd/system/docker.service
# 也可以vi
vi /lib/systemd/system/docker.service

ExecStart 属性值进行修改:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket containerd.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 fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375     修改为下面的->
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/www/server/docker/ca_key/ca.pem --tlscert=/www/server/docker/ca_key/server-cert.pem --tlskey=/www/server/docker/ca_key/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0

重载配置并启动Docker

[root@VM-12-4-centos ca_key]# systemctl daemon-reload
[root@VM-12-4-centos ca_key]# systemctl restart docker
[root@VM-12-4-centos ca_key]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-04-10 14:07:15 CST; 9s ago
     Docs: https://docs.docker.com
 Main PID: 5392 (dockerd)
    Tasks: 50
   Memory: 43.2M
   CGroup: /system.slice/docker.service
           ├─5392 /usr/bin/dockerd --tlsverify --tlscacert=/www/server/docker/ca_key/ca.pem --tlscert=/www/server/docker/ca_key/server-cert.pem --tlskey=/www/server/docker/ca_key/server-key...
           ├─5585 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3303 -container-ip 172.18.1.30 -container-port 3306
           ├─5591 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 3303 -container-ip 172.18.1.30 -container-port 3306
           ├─5603 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
           ├─5608 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9000 -container-ip 172.17.0.2 -container-port 9000
           ├─5713 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8848 -container-ip 172.18.1.48 -container-port 8848
           └─5718 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8848 -container-ip 172.18.1.48 -container-port 8848

IDEA远程连接测试

将服务器中的如下四个证书文件下载到本地,并创建文件夹存放。

Docker开启并配置远程安全访问

 然后在IDEA中配置docker证书地址与远程连接配置。证书文件夹就是本地存放那四个证书文件的本地目录。

Docker开启并配置远程安全访问

Docker开启并配置远程安全访问

看到下面的连接成功就证明IDEA已经与远程Docker连接成功,就可以在项目中用Docker进行协同操作了。

后记

看了这么一大串配置流程,一步一步来操作显然非常麻烦,而且大多操作其实完全可以进行封装使用,因此将创建证书的操作用脚本封装起来用才能事半功倍。具体的脚本和使用方法已经放到笔者资源里了。有需求自取即可~文章来源地址https://www.toymoban.com/news/detail-485794.html

到了这里,关于Docker开启并配置远程安全访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker搭建mysql并开启远程访问

    一、搭建mysql 1、拉取 MySQL 镜像 这里我们拉取官方的最新版本的镜像: $ docker pull mysql:latest 查看是否已安装了 mysql: $ docker images 二、运行 MySQL 容器 1、创建挂载文件: 2、运行容器 docker run -d --name mysql -v /opt/datas/docker/mysqllog:/var/log/mysql -v /opt/datas/docker/mysql:/var/lib/mysql -v /op

    2024年01月17日
    浏览(28)
  • Mac下Docker Desktop安装命令行工具、开启本地远程访问

    Mac系统下,为了方便在terminal和idea里使用docker,需要安装docker命令行工具,和开启Docker Desktop本地远程访问。 具体方法是在 设置-高级 下, 1.将勾选的User调整为System,这样不用手动配置PATH即可使用docker命令 2.勾选“Allow the default Docker socket to be used (requires password)”,开启Do

    2024年02月03日
    浏览(33)
  • SpringBoot配置SSL证书,开启HTTPS安全访问!!!

    一、前言 二、SpringBoot中配置SSL 1、环境 2、客户端单向认证服务端代码实战-PFX格式的证书 3、HTTP 转HTTPS 通过HTTP协议传输数据,并不会对数据进行加密,所以存在着一定的风险,容易被抓包破解数据,而且现在各种浏览器对使用HTTP协议的网站也会提示不安全。通过将HTTP协议

    2024年02月11日
    浏览(32)
  • centos7 docker开启认证的远程端口2376配置

    docker开启2375会存在安全漏洞 暴露了2375端口的Docker主机。因为没有任何加密和认证过程,知道了主机IP以后,,任何人都可以管理这台主机上的容器和镜像,以前贪图方便,只开启了没有认证的docker2375端口,后来被黑客通过这个端口推送了一个挖矿木马病毒的镜像并运行,所

    2024年02月03日
    浏览(28)
  • Docker安全开放远程访问连接权限

    Docker服务完全开放对外访问权限操作如下: 出现如下信息则代表修改Docker服务设置远程访问成功。 特别注意的点: 完全开放Docker对外访问权限有可能会遭到别人攻击,这是很不安全的,只要别人知道你的服务器地址就能够随意连接你的Docker服务,而不需要任何认证,因此,

    2024年02月12日
    浏览(32)
  • 如何在Ubuntu系统中使用Docker搭建Jupyter Notebook并实现远程访问工作台

    本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook,并结合cpolar内网穿透工具实现任意浏览器公网远程访问Jupyter登录界面。 Jupyter Notebook是一个交互式笔记本,支持运行40多种编程语言。可以使用它来创建和共享程序文档,支持实时代码,数学方程,可视化和 ma

    2024年02月01日
    浏览(26)
  • Docker 配置远程访问

    Docker客户端通常通过Unix套接字在本地与守护程序通信 /var/run/docker.sock ,或通过网络通过TCP套接字。 以下是启动时提供给Docker守护程序的选项的典型示例: Docker的客户端和服务端通信有三种方式 -H unix:// 指的是Docker使用本地的unix套接字 /var/run/docker.sock 进行通信 -H tcp://0.0.0

    2024年01月19日
    浏览(24)
  • 配置Docker远程访问并启用HTTPS

    要配置Docker远程访问并启用HTTPS,您可以按照以下步骤进行操作: 生成证书和密钥: 在Docker主机上生成自签名证书和私钥,可以使用以下命令: 输入证书信息(如国家、省/州、城市、组织等),并生成证书和私钥文件。 配置Docker守护进程: 打开Docker配置文件,通常是 /et

    2024年01月19日
    浏览(29)
  • 轻量级虚拟桌面基础架构(VDI) 从任何地方和任何设备进行安全快速访问,为混合云环境启用远程工作

    轻量级虚拟桌面基础架构(VDI) 从任何地方和任何设备进行安全快速访问,为混合云环境启用远程工作 交付具有成本效益且可扩展的 VDI 保证安全快速的虚拟应用程序和虚拟桌面 保护知识产权 支持全球合作 许多企业拥有混合计算基础架构,其中某些应用程序已迁移到云中,而

    2024年02月03日
    浏览(22)
  • 远程访问VPN配置与验证实验:构建安全的远程连接

    远程访问VPN配置与验证实验:构建安全的远程连接 【实验目的】 理解远程访问 VPN的含义。 掌握远程访问 VPN的含义。 掌握VPN Client软件的使用。 验证配置。 【实验拓扑】 实验拓扑如下图所示。 实验拓扑 设备参数表如下表所示。 设备参数表 设备 接口 IP地址 子网掩码 默认

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包