docker安全及日志管理

docker安全

docker容器使用安全注意点:

尽量别做的事:

尽量不用 --privileged 运行容器(授权容器root用户拥有宿主机的root权限)
尽量不用 --network host 运行容器(使用host网络模式共享宿主机的网络命名空间)
尽量不在容器中运行 ssh 服务
尽量不把宿主机系统的关键敏感目录挂载到容器中

尽量要做的事:

尽量使用较小体积的镜像
尽量以单一应用进程运行容器
尽量在容器中使用最新稳定版本的应用
尽量安装使用最新稳定版本的docker
尽量以最低权限运行容器
尽量使用官方提供的镜像或自己构建的镜像
尽量给docker目录(默认/var/lib/docker/)分配独立的文件系统
尽量以资源限制的方式运行容器 -m  --memory-swap  --cpu-quota   --cpu-shares --cpuset-cpus   --device-write-bps
尽量以只读的方式挂载数据卷,持久化容器数据到宿主机的除外     -v 宿主机目录:容器数据卷目录:ro
尽量设置容器的重启策略和次数   --restart always|on-failure:N
尽量对镜像进行漏洞扫描

http与https的区别

加密与安全性:HTTP是明文传输,数据在传输过程中容易被篡改和窃取;HTTPS通过SSL或TLS协议对数据进行加密传输,保证数据传输的安全性。
数据完整性:HTTP没有提供数据完整性的保护机制,容易受到中间人攻击;HTTPS使用消息摘要算法来确保数据的完整性。
身份验证:HTTP没有提供身份验证机制;HTTPS使用数字证书来验证服务器的身份。
端口号:HTTP使用的是80端口;HTTPS使用的是443端口。

为什么要使用 SSL 证书?

HTTP协议无法加密数据,数据传输可能产生泄露、篡改或钓鱼攻击等问题,而启用HTTPS后,可帮助Web服务器和网站间建立可信的HTTPS协议加密链接,为网站安全加锁,保证数据安全传输。

https证书认证的过程

https单向认证的访问流程

docker安全及日志管理_第1张图片

https的单向认证流程:
0)服务端会事先通过CA签发证书和私钥文件
1)客户端发送https请求到服务端的443端口
2)服务端会先返回一个包含公钥、证书有效期、CA机构等信息的证书给客户端
3)客户端受到服务端发来的证书后,会先用本地的CA证书校验服务端证书的有效性,如果证书有效,则继续,否则告警
4)客户端发送自己可支持的对称加密方案给服务端
5)服务端会选择加密程度最高的方案,并通过明文方式发送给客户端(与双向认证的核心区别)
6)客户端使用选择的加密方案生成随机会话密钥并通过证书中的公钥进行加密,再发送给服务端
7)服务端会用私钥进行解密获取客户端发来的随机会话密钥,并使用这个会话密钥加密要返回的报文,再发送给客户端
8)客户端也是这个会话密钥进行解密获取服务端返回的数据,之后双方可继续这个会话密钥进行加密和解密来实现密文通信。

https双向认证的访问流程

https的双向认证流程:

0)服务端和客户端会事先通过CA签发服务端证书和私钥文件
1)客户端发送https请求到服务端的443端口
2)服务端会先返回一个包含公钥、证书有效期、CA机构等信息的证书给客户端
3)客户端收到服务端发来的证书后,会先用本地的CA证书校验服务端证书的有效性,如果证书有效,再将包含公钥的客户端证书发送给服务端
4)服务端收到客户端证书后也会校验证书的有效性,客户端还会发送自己可支持的对称加密方案给服务端
5)服务端会选择加密程度最高的方案,并通过客户端证书里的公钥加密后发送给客户端
6)客户端使用私钥解密获取选择的加密方案,并使用此加密方案生成随机会话密钥,再通过服务端证书中的公钥进行加密,再发送给服务端
7)服务端会用私钥进行解密获取客户端发来的随机会话密钥,并使用这个会话密钥加密要返回的报文,再发送给客户端
8)客户端也是这个会话密钥进行解密获取服务端返回的数据,之后双方可继续这个会话密钥进行加密和解密来实现密文通信。

如何获取证书?

1)在阿里云、华为云、腾讯云等云服务商那里申请一年有效期的免费证书或者购买证书
2)在本地使用 openssl、mkcert、cfssl、certbot(Let's Encrypt)的工具生成本地私钥证书

通过mkcert获取证书

docker安全及日志管理_第2张图片

[root@localhost ~]#mkdir mkcert_list
[root@localhost ~]#cd mkcert_list/
[root@localhost ~/mkcert_list]#mkcert www.lele.com
 
[root@localhost ~/mkcert_list]#ls
www.lele.com-key.pem  www.lele.com.pem

docker安全及日志管理_第3张图片

 

  server {
        listen       443 ssl; #SSL访问端口号为 443
        server_name  www.lele.com; #指定绑定证书的域名
        root         /usr/share/nginx/html;
        ssl_certificate /root/mkcert_list/www.lele.com.pem; #指定服务端证书文件路径
        ssl_certificate_key /root/mkcert_list/www.lele.com-key.pem; #指定服务端私钥文件路径
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL服务器端支持的协议版本
        ssl_prefer_server_ciphers  on;
...
}

使用 ca 证书签发客户端签名证书

openssl x509 -req -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -extfile extfile.cnf -days 1000 -out client-cert.pem 
//删除两个证书签名请求文件和扩展配置文件
rm -rf ca.srl client.csr extfile.cnf server.csr
 
//配置docker服务配置文件
vim /lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
 
//重启docker服务
systemctl daemon-reload
systemctl restart docker
netstat -natp | grep 2376
setenforce 0
 
//将 /tls 目录中的 ca.pem、client-cert.pem、client-key.pem 三个文件复制到另一台主机
scp ca.pem [email protected]:/etc/docker/
scp client-cert.pem [email protected]:/etc/docker/
scp client-key.pem [email protected]:/etc/docker/
 
 
//本地验证,使用证书访问时要用主机名连接,docker 不支持使用 IP 进行证书访问
hostnamectl set-hostname master
su
 
vim /etc/hosts	
127.0.0.1   master
 
docker --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H tcp://master:2376 images
 
 
//在客户端上操作
hostnamectl set-hostname client
su
 
vim /etc/hosts
192.168.66.66   master
 
cd /etc/docker/
docker --tlsverify --tlscacert=ca.pem --tlscert=client-cert.pem --tlskey=client-key.pem -H tcp://master:2376 images

你可能感兴趣的:(docker,安全,容器)