Docker(十四)Docker开启远程安全访问

前言:之前配置了任何人都可以连接,被黑了,下决心要研究下docker客户端远程安全连接

一   证书的一些故事

(0)证书介绍

开发'https功能'的web server必须用到签名证书,证书都是由'证书签发机构签发',当然也可以'自己给自己签发'即自签名证书。

要签发证书,首先要'有一个根证书',然后用'根证书来签发'用户证书

(1)用户进行证书申请

一般先生成一个'私钥文件(Key)',然后用私钥生成'证书签名请求'(csr:certificate signing request),再用'证书服务器的根证书'来签发证书,生成'证书文件'(crt: certificate)。

理解: '英文单词'的含义

(2)自签名证书

一般用于'顶级证书、根证书,证书的名称'和'认证机构'的名称相同.

(3)根证书

根证书是'CA认证中心给自己颁发的证书',是'信任链的起始点',安装根证书'意味着'对这个CA认证中心的信任

交互图

二    开始配置

(1)准备工作

A客户端'CLient' :   理论上只需要安装docker客户端 'yum install docker-ce-cli -y' --> 保险 --> 'yum install docker-ce -y'

B服务端'Server' :   --> 'yum install docker-ce -y'  -->也即docker-daemon需要开启

(2)服务器开始配置

说明:以下Docker守护程序的主机上

生成CA私钥和公钥

openssl genrsa -aes256 -out ca-key.pem 4096

'不想交互--> -subj "/CN=$HOST"' --> '没有尝试'

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

注意: 执行完如上指令后,会要求我们'输入密码'才能进行下一步

核心:  Common Name (e.g. server FQDN or YOUR name) []:'$HOST' -->公网ip

补图

通过CA创建'服务器密钥和证书签名请求'(CSR)

openssl genrsa -out server-key.pem 4096

openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

注意: 以'-out'对应的文件

用CA签署公钥

由于可以通过'IP地址'和'DNS名称建立TLS连接',因此在创建证书时需要'指定IP地址' --> IP是'必须的'

echo subjectAltName = DNS:114.114.114.114,IP:$HOST,IP:127.0.0.1 >> 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

注意: 'server-cert.pem'

三   客户端身份验证的配置

创建客户端密钥和证书签名请求

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

四   扫尾工作

安全地删除两个证书签名请求扩展配置文件

chmod -v 0400 ca-key.pem key.pem server-key.pem

访问权限设置

 chmod -v 0444 ca.pem server-cert.pem cert.pem

五    服务器进行配置

(1) 修改配置文件

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

(2)将相应的文件移动到对应的位置

cp server-cert.pem server-key.pem ca.pem /etc/docker/

(3)重启服务

systemctl daemon-reload

systemctl restart docker

六    客户端测试

(1)复制

 将服务器/etc/docker目录下的'ca.pem、cert.pem、key.pem'三个文件复制到客户端

scp root@${REMOTE_IP}:/root/docker/{ca.pem,cert.pem,key.pem} .

(2)测试

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://${REMOTE_IP}:2375 network ls

-- 后面的 'network ls'是命令

七    总结一个交互的脚本

openssl genrsa -aes256 -out ca-key.pem 4096
# Common Name (eg, your name or your server's hostname) []:x.x.x.x
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=x.x.x.x" -sha256 -new -key server-key.pem -out server.csr
echo 'subjectAltName = DNS:114.114.114.114,IP:x.x.x.x,IP:127.0.0.1' >> extfile.cnf
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.cnf
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

very good

八   简化

问题:是不是每次都要输入一场串很不方便

mkdir -pv ~/.docker

cp -v {ca,cert,key}.pem ~/.docker

--> '~/.bashrc'  <--

export DOCKER_HOST=tcp://$HOST:2376 

export DOCKER_TLS_VERIFY=1  

九    curl测试

说明: 自签名一定要加一个'--insecure'参数 --> DOcker Daemon 的'API调用'

curl --insecure  https://$HOST:2376/images/json \
  --cert ~/.docker/cert.pem \
  --key ~/.docker/key.pem \
  --cacert ~/.docker/ca.pem

补充:报错

x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs

十  后续

IDEA集成docker

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值