关于利用IDEA的docker插件,采用TLS加密,实现对docker的远程操控

提前准备
IDEA
Docker

本文适用于对于docker操作不太熟悉的同学

原理

docker官方原话:

By default, Docker runs through a non-networked UNIX socket. It can also optionally communicate using SSH or a TLS (HTTPS) socket.
------------------------
默认情况下,Docker 通过非联网的 UNIX 套接字运行。它还可以选择使用 SSH 或 TLS (HTTPS) 套接字进行通信。

​ 因此我们可以利用IDEA的docker插件,选择TLS的方式连接Docker

一、TLS加密

Q:为什么要加密
A:因为远程连接docker需要暴露2375或2376端口(端口可以自定义,一般是这两个),
不加密的话,只要是知道你服务器IP和端口的,都可以远程操控你的docker,
十分容易被注入恶意脚本,比如挖矿脚本,甚至被黑。所以,想要实现此功能,
一定要做好加密。
  1. 生成TLS证书

    创建证书生成脚本 cert.sh ,放置在/script 目录下

    mkdir -p /script /data/cert/docker
    touch /script/cert.sh
    vim /script/cert.sh
    

    cert.sh 内容如下:

    #!/bin/bash
    set -e
    if [ -z $1 ];then
            echo "xbox12138.cn" #!!!!! 引号里填能解析到服务器的域名;纯IP地址,暂时还没尝试成功
            exit 0
    fi
    HOST=$1
    mkdir -p /data/cert/docker
    cd /data/cert/docker
    
    # 生成 CA 私钥和公钥:
    openssl genrsa -aes256 -out ca-key.pem 4096
    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
    
    # 创建服务器密钥和证书签名请求 (CSR)
    openssl genrsa -out server-key.pem 4096
    openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
    
    # 例如,允许使用10.10.10.20and进行连接127.0.0.1
    echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf
    
    # Docker 守护程序密钥的扩展使用属性设置为仅用于服务器身份验证
    # echo extendedKeyUsage = serverAuth >> extfile.cnf
    
    # 生成签名证书:
    openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
      -CAcreateserial -out server-cert.pem  -extfile extfile.cnf
    
    # 对于客户端身份验证,创建客户端密钥和证书签名请求:
    openssl genrsa -out key.pem 4096
    openssl req -subj '/CN=client' -new -key key.pem -out client.csr
    
    # 要使密钥适合客户端身份验证,请创建一个新的扩展配置文件:
    echo extendedKeyUsage = clientAuth > extfile-client.cnf
    
    # 生成签名证书:
    openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
      -CAcreateserial -out cert.pem -extfile extfile-client.cnf
    
    # 生成后cert.pem,server-cert.pem您可以安全地删除两个证书签名请求和扩展配置文件:
    rm -v client.csr server.csr extfile.cnf extfile-client.cnf ca.srl
    
    # 为保护您的密钥免受意外损坏,请移除其写入权限。要使它们只能由您读取,请按如下方式更改文件模式:
    chmod -v 0400 ca-key.pem key.pem server-key.pem
    
    # 证书可以是全世界可读的,但您可能希望删除写入权限以防止意外损坏:
    chmod -v 0444 ca.pem server-cert.pem cert.pem
    

    执行 cert.sh 脚本,生成证书放置 /data/cert/docker 目录中

    # 这里xbox12138.cn是 服务器域名,替换成自己的就好
    sh /script/cert.sh xbox12138.cn
    

    按照提示输入相关信息,密码一致就行,其他信息可留空,等脚本指定完成之后,可在 /data/cert/docker 目录查看到生成的证书。

  2. 配置Docker启用TLS

    vim /usr/lib/systemd/system/docker.service
    

    在ExecStart属性后追加

    --tlsverify --tlscacert=/data/cert/docker/ca.pem  \
    --tlscert=/data/cert/docker/server-cert.pem \
    --tlskey=/data/cert/docker/server-key.pem \
    -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock 
    

    这里我设的是2376端口,可以自定义其他端口,后面将不在赘述;

    重新加载docker配置后重启

    systemctl daemon-reload 
    systemctl restart docker
    

    如果担心docker没起来

    docker ps
    

    若有问题 检查上面 属性追加那一步 是否有问题(比如少个空格之类的);

    查看2376端口是否启动

    netstat -nltp | grep 2376
    

    是docker监听的就ok;

    服务器上连接测试Docker API是否可用

    • 没有证书访问

      curl https://xbox12138.cn:2376/version
      

      正常的话,结果如下:

      关于利用IDEA的docker插件,采用TLS加密,实现对docker的远程操控_第1张图片

    • 有证书访问

      curl https://xbox12138.cn:2376/version \
        --cert /data/cert/docker/cert.pem \
        --key /data/cert/docker/key.pem \
        --cacert /data/cert/docker/ca.pem
      

      关于利用IDEA的docker插件,采用TLS加密,实现对docker的远程操控_第2张图片

    这里服务器上 测试连接成功后,最好在本地测试一遍,若连接超时,最好查查是否是防火墙以及阿里云安全组未开放对应端口,也可以去到IDEA中直接进行连接测试

二、IDEA配置

将客户端所需的ca.pem、cert.pem、key.pem3个密钥文件从服务器下载到本地

关于利用IDEA的docker插件,采用TLS加密,实现对docker的远程操控_第3张图片

打开IDEA设置

关于利用IDEA的docker插件,采用TLS加密,实现对docker的远程操控_第4张图片

后话

连接成功后就可以在IDEA内操控容器,镜像了,十分方便。

关于利用IDEA的docker插件,采用TLS加密,实现对docker的远程操控_第5张图片

参考链接:

https://www.cnblogs.com/haoxianrui/p/14095306.html

https://docs.docker.com/engine/security/protect-access/

你可能感兴趣的:(docker,intellij-idea,容器,运维,centos)