Ubuntu下使用Stunnel加密Redis通信

参考链接:https://redislabs.com/blog/using-stunnel-to-secure-redis#.V8Ju2Kh95aM

Redis为了高效,仅提供了最基础的密码验证。当你想把redis-server暴露在公网上面时,仅依靠这个密码验证是远远不够的,就算你把密码设得再长再复杂,加大了暴破的难度,但由于通讯过程不加密,你的“正版”客户端在连接时,还是会有密码泄露的风险。

上面那篇链接使用Stunnel4为Redis的通讯建立了SSL隧道,可以有效保护密码不被窃取。该文虽好,但内容冗长,不方便快速实践。本文旨在最大化简化配置流程,在原文基础上进行了优化和修改,虽然做不到“一键配置”,但用起来还是非常方便的。

服务端准备工作

  1. 安装redis-server,这里不再赘述
  2. 修改/etc/redis/redis.conf,找到requirepass,取消注释,加上密码
  3. 重启redis-server:sudo service redis-server restart

服务端配置

# 安装stunnel4
sudo apt-get update
sudo apt-get install stunnel4 -y

# 启用stunnel4
sudo sed -i '6s/.*/ENABLED=1/' /etc/default/stunnel4

# 静默生成SSL证书,最终生成的文件是/etc/stunnel/private.pem
sudo openssl genrsa -out /etc/stunnel/key.pem 2048  #如果你需要更高强度,可以设成4096
sudo openssl req -new -x509 -key /etc/stunnel/key.pem -out /etc/stunnel/cert.pem -days 9125 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"  # 证书有效期25年
sudo cat /etc/stunnel/key.pem /etc/stunnel/cert.pem > /etc/stunnel/private.pem
sudo chmod 640 /etc/stunnel/key.pem /etc/stunnel/cert.pem /etc/stunnel/private.pem

# 创建一个stunnel的配置文件,公网ip:6379 <--> 127.0.0.1:6379
MY_IP_V4=`curl -4 -s icanhazip.com`
sudo echo "cert = /etc/stunnel/private.pem" > /etc/stunnel/redis-server.conf
sudo echo "pid = /var/run/stunnel.pid" >> /etc/stunnel/redis-server.conf
sudo echo "[redis]" >> /etc/stunnel/redis-server.conf
sudo echo "accept = $MY_IP_V4:6379" >> /etc/stunnel/redis-server.conf
sudo echo "connect = 127.0.0.1:6379" >> /etc/stunnel/redis-server.conf

# 启动stunnel4,stunnel4安装后可能会自动启动,所以这里用了restart
sudo /etc/init.d/stunnel4 restart

以上命令我已经做成无需手动干预的版本了,所以可以贴到终端执行,或者直接用下面的懒人版本代替(首先要确保你服务器上安装了openssl):

sudo su -c "wget https://laoyur.com/dl/blog/2016/stunnel4-redis-server-setup.sh -O- | bash"

客户端准备工作

客户端你可以装全套:

sudo apt-get install redis-server

当你仅需要作client用时(redis-cli),可以仅安装redis-tools

sudo apt-get install redis-tools

或者你只需要其他版本的client实现,比如Python版时,完全可以不用装redis-tools,只装个redis-py即可:

pip install redis

客户端配置

客户端配置需要用到服务器生成的证书,所以没办法做成一键脚本,┑( ̄Д  ̄)┍
首先也是安装Stunnel4:

sudo apt-get update
sudo apt-get install stunnel4 -y
sudo sed -i '6s/.*/ENABLED=1/' /etc/default/stunnel4

然后把服务端生成的private.pem拷贝一份到客户端的/etc/stunnel/private.pem
在/etc/stunnel/创建一个stunnel的配置文件,必须要以.conf结尾,比如/etc/stunnel/redis-client.conf,内容如下:

cert = /etc/stunnel/private.pem
client = yes
pid = /var/run/stunnel.pid
[redis]
accept = 127.0.0.1:6379
connect = xxx.xxx.xxx.xxx:6379

accept是本机监听的端口,一般也用6379端口,但如果你本机也有一个redis-server在运行,那建议你还是改成其他端口;
connect是你服务端的ip和端口,基本上就是服务端配置里的acceptconnect对调一下。
client = yes这行,是客户端独有的。

接下来重启stunnel4:

sudo /etc/init.d/stunnel4 restart

测试

pi@pi:~ $ redis-cli -p 6380  # 我的树莓派上本身已经跑了个redis-server,所以我把stunnel监听端口改成了6380
127.0.0.1:6380> ping
(error) NOAUTH Authentication required.  # 连上了,提示需要密码
127.0.0.1:6380> auth what_is_the_fucking_password  # 认证
OK  # 认证成功
127.0.0.1:6380> ping  # ping一下服务器
PONG  # 一切OK
127.0.0.1:6380> 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.