Redis 6.0 Docker容器使用TLS加密

前言

最近,公司在做渗透测试,要求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

Spring-Data-Redis和Redisson TLS连接方式

请参考:Spring-Data-Redis 和 Redisson TLS加密 连接

安装 Redis 6.0 可以 Docker 进行安装,以下是在三台机器上分别安装 Redis 6.0 的命令: 1. 在 192.168.119.158 机器执行以下命令: ``` for port in $(seq 6375 6376); do \ docker run -di --restart always --name redis-${port} --net host \ -v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -v /usr/local/docker-redis/redis-cluster/${port}/data:/data \ redis:6.0 redis-server /usr/local/etc/redis/redis.conf; \ done ``` 2. 在 192.168.119.157 机器执行以下命令: ``` for port in $(seq 6373 6374); do \ docker run -di --restart always --name redis-${port} --net host \ -v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -v /usr/local/docker-redis/redis-cluster/${port}/data:/data \ redis:6.0 redis-server /usr/local/etc/redis/redis.conf; \ done ``` 3. 在 192.168.119.156 机器执行以下命令: ``` for port in $(seq 6371 6372); do \ docker run -di --restart always --name redis-${port} --net host \ -v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -v /usr/local/docker-redis/redis-cluster/${port}/data:/data \ redis:6.0 redis-server /usr/local/etc/redis/redis.conf; \ done ``` 以上命令会在每台机器上启动两个 Redis 实例,分别监听不同的端口。其中,`-v` 参数用于挂载配置文件和数据目录,`redis:6.0` 表示使用 Redis 6.0 镜像,`redis-server /usr/local/etc/redis/redis.conf` 表示启动 Redis 服务并指定配置文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值