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

81 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 确保即使被连上也无法被设置为从节点。
## 重新部署步骤
```bash
# 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 入侵