信步拾遗之 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-server、redis-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 |
| 连接被拒绝 | 检查 bind 和 protected-mode,并确认防火墙开放端口 |
| 认证失败 | 确保密码无多余空格,且哈希值以 # 开头 |
命令被拒绝(NOPERM) |
检查 ACL 规则中的命令权限,如 +@all 是否遗漏 |

浙公网安备 33010602011771号