Redis는 기본 설치 상태에서 인증 없이 누구나 접속할 수 있습니다. 인터넷에 노출된 Redis는 데이터 탈취는 물론 서버 전체가 침해될 수 있습니다. 2016년부터 이어지는 Redis 랜섬웨어 피해가 그 증거입니다.

보안 취약 여부 확인

# 외부에서 접속 테스트 (서버 IP 사용)
redis-cli -h 서버IP ping
# PONG이 반환되면 외부 노출 상태

# 현재 설정 확인
redis-cli CONFIG GET bind
redis-cli CONFIG GET requirepass

1. bind 설정으로 인터페이스 제한

/etc/redis/redis.conf (또는 /etc/redis.conf):

# 로컬호스트에서만 접속 허용
bind 127.0.0.1 -::1

# 특정 IP에서도 허용할 경우
# bind 127.0.0.1 192.168.1.100

2. requirepass로 인증 설정

# 강력한 비밀번호 설정 (최소 32자 권장)
requirepass 랜덤하고강력한비밀번호

# 비밀번호 생성 예시
# openssl rand -base64 32
# 인증 후 명령 실행
redis-cli -a 비밀번호 ping

# 또는 접속 후 인증
redis-cli
> AUTH 비밀번호
> PING

3. 위험 명령어 비활성화

다음 명령어들은 공격자가 악용할 수 있어 비활성화 또는 이름 변경이 필요합니다:

# redis.conf에서 위험 명령어 비활성화
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
rename-command KEYS "*"    # 프로덕션에서 성능 문제도 있음
rename-command SHUTDOWN SHUTDOWN_SAFE_NAME

# 또는 다른 이름으로 변경 (관리자만 알게)
rename-command CONFIG "SECRET_CONFIG_CMD_abc123"

4. 방화벽으로 포트 차단

# Redis 포트(6379)를 로컬 및 특정 IP에서만 허용
sudo ufw deny 6379
sudo ufw allow from 127.0.0.1 to any port 6379

# 애플리케이션 서버가 별도 서버인 경우
sudo ufw allow from 10.0.0.5 to any port 6379

5. protected-mode 확인

Redis 3.2 이상에서 외부 접속 시 보호 모드가 기본 활성화되어 있습니다:

# bind 설정이나 requirepass 없이 외부에서 접근하면 오류 반환
protected-mode yes

6. TLS 암호화 연결 (Redis 6 이상)

# redis.conf
port 0          # 일반 포트 비활성화
tls-port 6380   # TLS 포트 활성화

tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt

tls-auth-clients yes
# TLS로 접속
redis-cli -h 127.0.0.1 -p 6380 \
    --tls \
    --cert /etc/redis/tls/client.crt \
    --key /etc/redis/tls/client.key \
    --cacert /etc/redis/tls/ca.crt

7. 로그 설정

# redis.conf
loglevel notice
logfile /var/log/redis/redis-server.log
# 접속 시도 모니터링
sudo tail -f /var/log/redis/redis-server.log

8. 실행 사용자 제한

# Redis를 redis 전용 계정으로 실행 (기본값이지만 확인)
cat /etc/systemd/system/redis.service | grep User
# User=redis

# redis 사용자는 /data 이외의 디렉터리 접근 불가하게

9. 설정 적용 및 검증

# 설정 파일 문법 검사
redis-server /etc/redis/redis.conf --test-memory 1

# Redis 재시작
sudo systemctl restart redis

# 외부에서 접속 테스트 (차단 확인)
redis-cli -h 서버IP ping
# Could not connect to Redis at 서버IP:6379: Connection refused

보안 점검 체크리스트

# 외부 인터페이스에 바인드되어 있는지 확인
redis-cli CONFIG GET bind

# 인증 설정 확인
redis-cli -a 비밀번호 CONFIG GET requirepass

# 리슨 중인 포트 확인
sudo ss -tlnp | grep redis
# 127.0.0.1:6379만 표시되어야 함

# 방화벽 규칙 확인
sudo ufw status | grep 6379

Redis는 캐시, 세션, 큐 등 핵심 역할을 하는 경우가 많습니다. 외부 노출만 차단해도 대부분의 공격을 예방할 수 있으므로, 기본 보안 설정을 반드시 적용하세요.