Docker 容器安全注意点
尽量别做的事
尽量不用 --privileged 运行容器(授权容器root用户拥有宿主机的root权限)
尽量不用 --network host 运行容器(使用 host 网络模式共享宿主机的网络命名空间)
尽量不在容器中运行 ssh 服务
尽量要做的事
尽量使用最小化的镜像
尽量以单一进程运行容器
尽量使用最新版本的应用做镜像主进程
尽量使用最新版本的docker
尽量以最低权限运行容器
尽量下载使用官方的镜像或自己构建镜像从私有仓库下载镜像
尽量使用只读的方式挂载数据卷 -v 宿主机目录:容器目录:ro
尽量设置容器重启次数 --restart on-failure:N
尽量以资源限制的方式运行容器 -m --cpu-quota --device-write-bps
HTTPS请求过程与证书获取
http 超文本传输协议 tcp/80 明文传输
https 安全的超文本传输协议 tcp/443 密文传输 证书加密
HTTPS请求访问过程【重中之重重中之重】
0)服务端会事先通过 CA 签发证书和私钥
1)客户端发送 https 请求到服务端的 443 端口
2)服务端发送包含公钥、证书有效期及 CA 机构等信息的证书给客户端
3)客户端会先通过 CA 验证证书的有效性
4)若证书有效,客户端会在本地随机生成会话密码并通过服务端发来的公钥加密后返回给服务端
5)服务器用私钥解密获取会话密钥,之后双方即可使用会话密钥加密/解密来实现密文通信
如何获取 ssl 证书?【重要】
云服务商免费申请 或是本地openssl等生成
- 在 阿里云、腾讯云、华为云 等云服务商 申请一年前的免费证书
- 在服务器本地使用 openssl、mkcert、cfssl、certbot(Let's Encrypt)等工具 生成 SSL 证书
ssl/tls 加密 通常代表 证书认证加密
服务器本地 openssl 创建证书
ca 证书和私钥 -> 服务器/客户端证书 和 私钥
yum install -y openssl
1)创建 CA 私钥和证书
bashopenssl genrsa -out ca.key 2048 #生成 ca 私钥 私钥长度2048、4096 只要是1024倍数 #genrsa:使用RSA算法产生私钥 #-aes256:使用256位密钥的AES算法对私钥进行加密,这样每次使用私钥文件都将输入密码,可省略 #-out:输出文件的路径,若未指定输出文件,则为标准输出 #4096:指定私钥长度,默认为1024。该项必须为命令行的最后一项参数 openssl req -new -key ca.key -out ca.csr #生成 ca 证书自签名请求文件 openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.pem #生成 ca 证书 #req:执行证书签发命令 #-new:新证书签发请求 #-x509:生成x509格式证书,专用于创建私有CA时使用 #-days:证书的有效时长,单位是天 #-key:指定私钥路径 #-sha256:证书摘要采用sha256算法 #-subj:证书相关的用户信息(subject的缩写) #-out:输出文件的路径
2)创建服务端自签名请求文件
openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr
3)使用CA签发服务端证书(需要签名请求文件,ca 证书,ca 密钥)
bashopenssl x509 -req -days 3650 -in server.csr -signkey ca.key -out server.pem x509:生成x509格式证书 -req:输入csr文件 -in:要输入的csr文件 -CA:指定ca证书的路径 -CAkey:指定ca证书的私钥路径 -CAcreateserial:表示创建证书序列号文件,创建的序列号文件默认名称为ca.srl
完成CA证书 server证书创建后,客户端就可以进行认证【双向认证还需要按照server证书生成方式再生成client证书传送给client端,并且将ca.pam(ca证书)一并传送给客户端,客户端据此判断server.pam的有效性。】
另外对于不同的服务,还需要按照官方文档说明修改相应的配置,使其能够使用https协议并且正确使用了证书。