# 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 入侵