信步拾遗之 Redis 密码安全配置(ACL)


环境说明

  • 操作系统:CentOS 8
  • Redis 版本:6.0.20
  • 目标:源码编译安装,并配置 ACL 用户密码(SHA‑256 哈希)

1. 安装依赖组件

Redis 6.x 需要 GCC 编译器、make 工具以及 TCL 测试套件(用于 make test)。执行:

yum install -y gcc make tcl tcl-devel

注意:CentOS 8 默认仓库可能已下线,若提示无包,请先配置有效的 yum 源(如阿里云 Vault)。

2. 下载并解压源码包

使用 wget 从官方下载指定版本(若已下载可跳过):

cd /usr/local/src
wget https://download.redis.io/releases/redis-6.0.20.tar.gz

解压并进入目录:

tar -zxvf redis-6.0.20.tar.gz
cd redis-6.0.20

3. 编译与安装

执行编译(可指定多核加速):

make -j $(nproc)

安装到系统目录(默认 /usr/local/bin):

make install

安装后,redis-serverredis-cli 等命令即可直接使用。

4. 生成用户密码的 SHA‑256 哈希

Redis 6.0 引入了 ACL(访问控制列表),支持将密码以 SHA‑256 哈希形式存储(不推荐明文)。
本例创建用户 default,密码为 admin,生成哈希值:

echo -n 'admin' | sha256sum | awk '{print $1}'

输出:

8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

提示:你也可以使用 Redis 自带的 ACL GENPASS 命令生成随机哈希(见后文),更为便捷。

5. 修改配置文件(redis.conf)

复制默认配置文件到工作目录(例如 /etc/redis/):

mkdir -p /etc/redis
cp redis.conf /etc/redis/redis.conf

编辑 /etc/redis/redis.conf,在文件末尾添加以下 ACL 规则:

user default on #8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 +@all ~*

各字段含义

字段 说明
user default 定义名为 default 的用户(默认用户,若未定义则无密码)
on 启用该用户(off 表示禁用)
#8c6976... 密码的 SHA‑256 哈希值(前缀 # 告诉 Redis 此为哈希)
+@all 授予所有命令权限(也可按需指定,如 +get +set
~* 允许访问所有键(Key)
提示:只读场景可限制命令集(例如 +@read 只读)。

6. 启动 Redis 服务

方式一:前台启动(调试用)

redis-server /etc/redis/redis.conf

方式二:后台启动(推荐)

redis-server /etc/redis/redis.conf --daemonize yes

方式三:使用 systemd(生产建议)

创建 /etc/systemd/system/redis.service

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf --daemonize no
ExecStop=/usr/local/bin/redis-cli shutdown
User=redis
Group=redis
Restart=always

[Install]
WantedBy=multi-user.target

然后:

useradd -r -s /sbin/nologin redis
chown -R redis:redis /etc/redis
systemctl daemon-reload
systemctl enable --now redis

7. 验证密码生效

使用 redis-cli 连接并认证:

redis-cli -h 127.0.0.1 -p 6379

进入后执行:

AUTH admin

若返回 OK,则认证成功。接着测试基本操作:

SET foo bar
GET foo

如果都能正常返回,说明 ACL 配置正确。

8. 动态管理 ACL 用户(常用命令)

Redis 6.0 支持在运行时通过 ACL 命令管理用户,无需重启服务。以下为最常用的命令及示例。

ACL SETUSER

创建或修改用户。语法:

ACL SETUSER <username> [rule [rule ...]]

常用规则包括:

  • on / off:启用/禁用用户。
  • #<hash>><plaintext>:设置密码(# 表示哈希,> 表示明文,Redis 会自动将明文转为哈希存储)。
  • +<command> / -<command>:允许/禁止某命令。
  • +@<category> / -@<category>:允许/禁止某类命令(如 @all@read@write)。
  • ~<pattern>:允许访问的键模式(如 ~* 表示所有键)。
    示例:创建用户 appuser,密码为 app123,只允许读命令,且只能访问以 app: 开头的键:
ACL SETUSER appuser on >app123 +@read ~app:*

ACL GETUSER

查看指定用户的详细信息(包括状态、密码哈希、权限列表等):

ACL GETUSER <username>

ACL GENPASS

生成一个符合 Redis ACL 格式的 SHA‑256 密码哈希(随机生成),可用于设置密码。若不指定 bits,默认生成 256 位(64 个十六进制字符):

ACL GENPASS [bits]

其他实用命令

  • ACL LIST:列出所有用户及其规则。
  • ACL DELUSER <username>:删除用户。
  • ACL LOAD:从 redis.conf 重新加载 ACL 规则(更新静态配置)。
  • ACL SAVE:将当前内存中的 ACL 规则保存到配置文件(需配置文件可写)。

9. 常见问题排查

问题 解决办法
make 报错 jemalloc 执行 make distclean 后重新 make
连接被拒绝 检查 bindprotected-mode,并确认防火墙开放端口
认证失败 确保密码无多余空格,且哈希值以 # 开头
命令被拒绝(NOPERM 检查 ACL 规则中的命令权限,如 +@all 是否遗漏
posted @ 2026-07-06 16:29  临渊启明  阅读(92)  评论(0)    收藏  举报