Files
as-daycard-openapi/Redis安全防护备忘.md
zhaogd f55eb001ae 修复Redis安全漏洞并新增日志查询接口
- docker-compose.yml: Redis去掉端口公网映射,加密码和强制单机模式,修复未授权访问被攻击为从节点的问题
- 新增 ApiJstCallLogController(/manage/jst/call-log/list)橘视厅调用日志查询接口
- 新增 AuditLogController(/manage/audit-log/list)审计日志查询接口
- 新增 Redis安全防护备忘.md 文档
2026-07-31 17:49:17 +08:00

2.7 KiB
Raw Permalink Blame History

Redis 安全防护备忘

事件回顾

2026-07-31,生产环境第三方接口报 "Redis服务异常",排查发现:

  1. Redis 容器(daycard-redis)被外部设置为 replicaof 109.244.159.27 29846(从节点)
  2. master 不可达,Redis 进入只读状态,写入操作全部失败
  3. PartnerSignFilter 的 nonce 防重放(setIfAbsent)写入被拒,导致所有第三方接口不可用

根因

Redis 未授权访问被攻击:

  • 端口暴露公网:docker-compose.yml 中 ports: "6379:6379" 将 Redis 暴露到 0.0.0.0:6379
  • 无密码:REDIS_PASSWORD 为空,任何人可直连 Redis
  • 攻击者扫描公网 6379 端口,未授权连接后执行 CONFIG SET replicaof 109.244.159.27 29846,将 Redis 变为从节点

防护措施(已落实到 docker-compose.yml)

1. 不暴露端口到公网

去掉 Redis 的 ports 映射,仅在 docker 内网访问。应用容器通过 redis:6379 访问,无需宿主机端口映射。

2. 加密码

command: redis-server --requirepass AsRedis2026!Safe

应用环境变量同步配置 REDIS_PASSWORD=AsRedis2026!Safe。

3. 强制单机模式

command: redis-server --requirepass AsRedis2026!Safe --replicaof no one

--replicaof no one 确保即使被连上也无法被设置为从节点。

重新部署步骤

# 1. 拉取最新代码(含修改后的 docker-compose.yml)
cd /path/to/as-daycard-openapi
git pull

# 2. 重建 Redis 容器(彻底清除被篡改的配置)
docker rm -f daycard-redis

# 3. 启动新的 Redis 容器
docker-compose up -d redis

# 4. 验证:replicaof 应为空
docker exec daycard-redis redis-cli -a 'AsRedis2026!Safe' config get replicaof
# 预期输出:
# 1) "replicaof"
# 2) ""

# 5. 验证:密码生效(无密码连接应失败)
docker exec daycard-redis redis-cli config get replicaof
# 预期输出:NOAUTH Authentication required.

# 6. 重启应用容器(加载新密码)
docker-compose up -d daycard-openapi

# 7. 验证应用正常
curl http://localhost:8084/openapi/partner/media/package \
  -H "appKey: 你的appKey" \
  -H "timestamp: $(date +%s%3N)" \
  -H "nonce: test123" \
  -H "sign: 签名"

日常运维注意事项

  • 不要恢复 6379 端口映射:如需宿主机调试 Redis,用 docker exec -it daycard-redis redis-cli -a 'AsRedis2026!Safe' 进入
  • 密码保密:AsRedis2026!Safe 已写在 docker-compose.yml 中,如需修改请同步更新 Redis command 和应用 REDIS_PASSWORD 环境变量
  • 定期检查:docker exec daycard-redis redis-cli -a 'AsRedis2026!Safe' config get replicaof 确认未被篡改
  • 服务器安全:检查 /root/.ssh/authorized_keys 是否有陌生 key,确认未被 SSH 入侵