Redis / Valkey 보안 강화 (ACL, TLS, 위험 명령)
Redis난이도: 고급소요 시간: 5분(점검) – 90분(전체 강화)설치나 일상 운영 가이드가 아닙니다. 실행 중인 Redis 또는 Valkey(단일 서버, replica + Sentinel, Cluster)를 서비스 중단 없이 강화하기 위한 시나리오별 runbook입니다. 읽기 전용 보안 점검, ACL 사용자와 default 사용자 비활성화, requirepass/masterauth, bind와 protected-mode, CONFIG/DEBUG/MODULE 악용에 대비한 protected config, 운영 중 TLS 전환(클라이언트, 복제, Sentinel, cluster bus), 파일 권한을 다룹니다. 마지막에 점검을 다시 실행해 위험이 해소되었음을 보여 줍니다. DBAtlas 설치 가이드로 구축한 시스템에는 이미 비밀번호와 좁은 방화벽이 있으므로, 점검부터 시작해 RISK 또는 WARN이 나온 시나리오만 적용하십시오. 백업과 일상 운영은 별도의 Redis 가이드에 있습니다.
구성: 단일 서버, master + replica + Sentinel 또는 Redis Cluster
시나리오
- 보안 상태 점검 (읽기 전용) — 아무것도 변경하지 않습니다. 비밀번호 없는 접근, default 사용자, 수신 주소, protected-mode, 위험 명령, TLS, Sentinel 비밀번호, 파일 권한을 OK / WARN / RISK로 보고합니다. 어디서부터 시작할지 모르겠다면 이것을 선택하십시오.
- 전체 강화 (모두 순서대로) — 점검 → ACL 사용자(관리자, 애플리케이션, 복제, Sentinel)와 default 사용자 비활성화 → bind/protected-mode/방화벽 → 위험 명령과 protected config → TLS → 파일 권한 → 최종 점검. replica/Sentinel에서는 rolling으로 적용하며, 위험한 단계는 확인을 요청합니다.
- ACL 사용자 및 default 사용자 비활성화 (Redis 6+) — 모두가 하나의 비밀번호로(또는 비밀번호 없이) default 사용자로 접속하고 있습니다. 관리자, 애플리케이션(자신의 key만, 위험 명령 없음), 복제, Sentinel용 사용자를 따로 만들어 aclfile에 기록하고, 애플리케이션 전환이 끝나면 default를 비활성화합니다.
- 비밀번호 없는 Redis: requirepass / masterauth (긴급 조치) — 비밀번호가 전혀 없고 ACL로 전환할 시간도 없습니다. 모든 node에 공통 비밀번호(requirepass + 복제용 masterauth, Sentinel에는 auth-pass)를 운영 중에 설정합니다. 이후 애플리케이션은 비밀번호 없이 접속할 수 없습니다.
- 네트워크 접근 제한 (bind 0.0.0.0, protected-mode, 방화벽) — Redis가 모든 인터페이스에서 수신하고 있거나 protected-mode no입니다. bind를 localhost + 내부 IP로 줄이고 protected-mode를 켜며, 방화벽은 node와 애플리케이션 네트워크만 허용합니다. 운영 중에 적용하며 기존 연결은 끊기지 않습니다. 위험을 가장 빨리 줄이는 단계입니다.
- 위험 명령과 CONFIG 악용 (FLUSHALL, CONFIG, DEBUG, MODULE) — CONFIG SET dir/dbfilename으로 서버에 파일을 쓰는 악용(SSH 키, cron)과 FLUSHALL/DEBUG/MODULE LOAD에 대비해 enable-protected-configs, enable-debug-command, enable-module-command를 비활성 상태로 유지하고 애플리케이션에서 @dangerous를 제거합니다. 이전 버전에서는 rename-command를 사용합니다.
- 연결 암호화: TLS (클라이언트, 복제, Sentinel, cluster bus) — 트래픽이 암호화되지 않았습니다. 기존 포트 옆에 TLS 포트를 운영 중에 열고, 복제와 Sentinel을 TLS로 옮기며, 애플리케이션 전환이 끝나면 평문 포트를 닫습니다(port 0).
- 파일 권한 및 실행 사용자 — redis.conf(비밀번호 포함), ACL 파일, RDB/AOF, 로그 파일을 다른 사용자가 읽을 수 있거나 Redis가 root로 실행되고 있습니다. 권한을 640/750으로 조이고 소유자를 서비스 사용자로 지정합니다.
시작하기 전에
- 모든 node에서 root/sudo, 첫 번째 node에서 다른 node로 SSH(비밀번호 파일과 인증서 복사).
- Redis 6.2+ 또는 Valkey 7.2+ (ACL은 6.0+, protected config는 7.0+).
- 복제…와 Sentinel…이 정상입니다. 비정상 토폴로지에서는 rolling 작업을 하지 않습니다.
- 애플리케이션 목록과 클라이언트 라이브러리 버전: ACL에는 사용자 이름 + 비밀번호(Redis 6+ 클라이언트), TLS에는 rediss:// 지원, Sentinel을 사용하는 클라이언트는 Sentinel 비밀번호와 TLS 지원.
- openssl이 설치되어 있습니다(비밀번호 및 인증서 생성).
가이드 단계
- 사전 준비: 안전장치와 보조 도구 — 구성 및 ACL 백업 · 보조 도구 작성 (dbatlas-rconf, dbatlas-rcli, dbatlas-redis-restart) · 관리자 비밀번호를 임시 파일에 기록
- 상태 점검 (읽기 전용) — 보안 보고서: … · Sentinel 보고서: … · 점검 결과를 시나리오에 매핑
- 비밀번호: requirepass 및 masterauth (운영 중) — 공통 비밀번호 설정: … · masterauth: … · Sentinel auth-pass: … · requirepass: … · Sentinel 비밀번호: … · 복제와 Sentinel이 정상인지 확인 …
- ACL: 진단 및 사용자 비밀번호 — 진단: 누가 어떤 사용자로 접속해 있는가? · 내부 사용자 비밀번호 생성 · 비밀번호 파일을 다른 node로 복사
- ACL: default 사용자 비활성화 — default로 접속한 클라이언트가 남아 있는가: … · default 사용자 비활성화: … · 검증: 인증 없는 접근, 애플리케이션 권한, 복제 · Sentinel 비밀번호: …
- 네트워크 접근: 방화벽 — 방화벽 규칙
- 위험 명령: 진단 — Protected config 및 debug/module 명령: …
- 위험 명령: 검증 — CONFIG SET dir과 DEBUG가 거부되는가: …
- TLS: 인증서 — TLS 지원: … · 내부 CA 및 서버 인증서 생성 · 인증서 배포 · 인증서 권한: …
- TLS · Cluster bus 및 복제 (유지보수 시간대, 모든 node 동시) — bus 포트 고정, tls-cluster와 tls-replication을 파일에 기록: … · 중지: … · 시작: … · cluster와 복제가 TLS 위에 있는지 확인
- TLS: 검증 및 평문 포트 닫기 — 복제…와 Sentinel…이 TLS 위에 있는지 확인 · 평문 포트 닫기: … · 암호화하지 않은 연결이 거부되는가: …
- 파일 권한 및 실행 사용자 — 권한 수정: …
- 최종 점검 (강화 후) — 보안 보고서: … (최종 상태) · Sentinel 보고서: … (최종 상태)
- 정리 및 후속 작업 — 임시 비밀번호 파일 삭제 · 후속 작업: 모니터링 및 주기적 작업