前言
最近,公司在做渗透测试,要求redis使用加密传输。经过比较redis各版本,发现redis6.0开始正式支持TLS 通道加密,更加安全。redis6.0以下版本只支持数据加密,最新版本为redis7.0。考虑到redis7.0刚出不久,新的功能项目也暂时用不上。故此决定选用redis6.2.11(6.0的最新稳定版)。
先决条件
安装了 Docker。
Docker Compose 已安装。
Redis 容器镜像获取
访问docker官网:
https://hub.docker.com/_/redis/tags?page=2
点击Tags:
找到我们想要的版本,获取下载命令:docker pull redis:6.2.11
在服务器上分别运行:
docker pull redis:6.2.11
docker images
看到上图结果,说明redis 容器镜像下载成功。
注:redis官网上会看到 make BUILD_TLS=yes ,需要修改配置,重新编译才支持TLS,默认是不支持的。这个是针对平常的安装包,docker 容器版是默认开启支持TLS的,不需要重新编译。
运行Redis容器
让我们先在没有 TLS 的情况下运行 Redis 容器
创建一个文件compose.yml并粘贴下面的内容。
services:
redis:
image: redis:6.2.11
network_mode: "host"
volumes:
#/home/10config/redis/redis.conf 是宿主机路径,必须存在
#/usr/local/etc/redis/redis.conf 是redis容器路径
- /home/10config/redis/redis.conf:/usr/local/etc/redis/redis.conf
restart: always
container_name: legrand_redis6.2.11_v1
privileged: true
command: redis-server /usr/local/etc/redis/redis.conf
redis.conf 可以在redis的安装包获取。
redis.conf 百度网盘下载路径 提取码:ju3h
运行容器:
docker-compose up -d #启动容器
docker exec -it legrand_redis6.2.11_v1 /bin/bash #进入容器
运行docker exec -it legrand_redis6.2.11_v1 /bin/bash,出现如下图,说明容器运行成功。
生成证书
为了使用 TLS 运行 Redis,我们需要提供自己的 SSL 证书。您可以购买一个,或者对于这个我们不需要购买的用例,但为我们的 Redis 实例和连接到它的客户端生成我们自己的自签名证书。
运行脚本
#!/bin/sh
mkdir -p tests/tls
openssl genrsa -out tests/tls/ca.key 2048
openssl req \
-x509 -new -nodes -sha256 \
-key tests/tls/ca.key \
-days 36500 \
-subj '/O=Redis Test/CN=Certificate Authority' \
-out tests/tls/ca.crt
openssl genrsa -out tests/tls/redis.key 2048
openssl req \
-new -sha256 \
-key tests/tls/redis.key \
-subj '/O=Redis Test/CN=Server' | \
openssl x509 \
-req -sha256 \
-CA tests/tls/ca.crt \
-CAkey tests/tls/ca.key \
-CAserial tests/tls/ca.txt \
-CAcreateserial \
-days 36500 \
-out tests/tls/redis.crt
openssl dhparam -out tests/tls/redis.dh 2048
注意:证书默认有效期为1年 ,-days 可以设置证书有效期 ,单位天
得到以下文件:
其中:
ca.crt : CA根证书,用于验证证书是否合法
ca.key: CA根证书私钥
redis.crt: ca.crt根证书签发的证书
redis.key:ca.crt根证书签发的证书私钥
配置TLS
services:
redis:
image: redis:6.2.11
network_mode: "host" #和宿主机共用网卡
volumes:
#/home/10config/redis/redis.conf 是宿主机路径,必须存在
#/usr/local/etc/redis/redis.conf 是redis容器路径
- /home/10config/redis/redis.conf:/usr/local/etc/redis/redis.conf
#挂载到宿主机的证书路径,使容器能访问到证书
- /home/3redis/tests/tls:/tls
restart: always
container_name: legrand_redis6.2.11_v1
#使用该参数,container内的root拥有真正的root权限。
#否则,container内的root只是外部的一个普通用户权限。
privileged: true
command: redis-server /usr/local/etc/redis/redis.conf
redis.conf 增加以下配置
# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 0 #关闭非tls端口
tls-port 6379
################################## TLS 配置 ###################################
tls-cert-file /tls/redis.crt #用于指定redis服务端证书文件
tls-key-file /tls/redis.key #用于指定redis服务端私钥文件
#上述二者都是服务端的,用于客户端使用CA根证书去验证服务端。
tls-ca-cert-file /tls/ca.crt #CA根证书,用于服务端验证客户端
#设置密钥交换协议文件
#迪菲-赫尔曼密钥交换(英语:Diffie–Hellman key exchange,缩写为DH)
#使用DH后TLS握手中的第三个随机数不在网络上传输(原来是加密传输),加强了安全性。
tls-dh-params-file /tls/redis.dh
tls-auth-clients yes # yes 开启双向认证
启动TLS容器
docker-compose up -d #启动容器
docker exec -it legrand_redis6.2.11_v1 /bin/bash #进入容器
# 以tls方式连接redis客户端,因为开启了双向认证,所有redis客户端也要指定证书。
# 现在和redis服务端使用同一份证书,也可以为redis客户端重新生成证书,只要是同一个CA根证书签发的就可以
redis-cli --tls \
--cert /tls/redis.crt \
--key /tls/redis.key \
--cacert /tls/ca.crt
至此Redis TLS Docker容器配置成功。
参考文档
https://devpress.csdn.net/redis/62ed1a027e668234661807b8.html