콘텐츠로 이동

Redis 인증 및 TLS

Redis 인증 방식과 TLS 적용 기준을 정리함.


1. Redis 인증 설정

Redis 인증 방식은 크게 legacy requirepass 방식과 Redis 6 이상 ACL 방식으로 나눌 수 있음.

운영 환경에서는 가능하면 ACL 사용을 우선 검토함. 단순 내부 캐시 서버이고 client library가 ACL username/password를 지원하지 않는 경우에는 requirepass를 사용할 수 있음.

1.1 requirepass 방식

Redis 설정 파일에서 다음 항목을 설정함.

requirepass CHANGE_ME_TO_LONG_RANDOM_PASSWORD

비밀번호는 충분히 긴 랜덤 문자열을 사용함.

예시 생성:

openssl rand -base64 48

설정 후 Redis를 재시작함.

sudo systemctl restart redis

인증 없이 접근하면 다음과 같은 오류가 발생해야 함.

redis-cli ping

예상 출력:

NOAUTH Authentication required.

Redis CLI가 --askpass를 지원하는 경우 다음으로 확인함.

redis-cli --askpass ping

정상 출력:

PONG

주의 redis-cli --askpass는 Redis CLI 버전에 따라 지원되지 않을 수 있음. Rocky Linux 8 AppStream처럼 Redis 5.x 또는 일부 구버전 CLI를 사용하는 환경에서는 --askpass 대신 REDISCLI_AUTH, URI 방식, 대화형 AUTH를 사용함.

구버전 CLI 또는 자동화 환경에서는 다음 중 하나를 사용함.

export REDISCLI_AUTH='CHANGE_ME_TO_LONG_RANDOM_PASSWORD'
redis-cli ping
unset REDISCLI_AUTH

또는 대화형으로 접속 후 인증함.

redis-cli
AUTH CHANGE_ME_TO_LONG_RANDOM_PASSWORD
PING

주의 redis-cli -a 'password' 방식은 shell history나 process list에 비밀번호가 노출될 수 있으므로 운영 서버에서는 가급적 사용하지 않음. 자동화에서는 systemd EnvironmentFile, secret manager, root-only secret file, CI/CD secret variable 등을 통해 비밀번호를 주입함.

1.2 ACL 방식

Redis 6 이상에서는 ACL을 사용하여 사용자별 권한을 제어할 수 있음.

Redis 설정 파일에서 ACL 파일을 지정함.

aclfile /etc/redis/users.acl

ACL 파일을 생성함.

sudo install -o redis -g redis -m 0640 /dev/null /etc/redis/users.acl

예시 ACL 파일:

sudo tee /etc/redis/users.acl > /dev/null <<'EOF'
user default off
user app on >CHANGE_ME_TO_LONG_RANDOM_PASSWORD ~app:* +@read +@write -@dangerous
user ops on >CHANGE_ME_TO_LONG_RANDOM_PASSWORD ~* +@all
EOF

sudo chown redis:redis /etc/redis/users.acl
sudo chmod 0640 /etc/redis/users.acl

Redis를 재시작함.

sudo systemctl restart redis

수동 점검:

redis-cli --user app --askpass ping

정상 출력:

PONG

자동화 점검:

export REDISCLI_AUTH='CHANGE_ME_TO_LONG_RANDOM_PASSWORD'
redis-cli --user app ping
unset REDISCLI_AUTH

URI 방식:

redis-cli -u 'redis://app:CHANGE_ME_TO_LONG_RANDOM_PASSWORD@127.0.0.1:6379' ping

주의 URI 방식은 shell history, process list, 로그에 비밀번호가 남을 수 있으므로 운영 자동화에서는 secret injection 방식을 우선함.

ACL 상태를 확인함.

redis-cli --user ops --askpass ACL LIST

주의 위 ACL은 예시임. 실제 운영에서는 애플리케이션이 사용하는 command category, key prefix, Pub/Sub channel, stream 사용 여부를 기준으로 최소 권한을 설계해야 함. replica, Sentinel, Cluster 구성을 사용하는 경우에는 복제 및 Sentinel 동작에 필요한 별도 사용자 권한도 설계해야 함.

1.3 legacy 환경에서 위험 명령 비활성화

Redis 6 이상에서는 ACL로 위험 명령을 제한하는 것을 우선함. rename-command 방식은 구버전 Redis 또는 legacy requirepass 환경에서 제한적으로 검토함.

legacy 환경에서 다음 명령이 운영 사고를 유발할 수 있음.

  • FLUSHALL
  • FLUSHDB
  • KEYS
  • CONFIG
  • DEBUG
  • SHUTDOWN
  • MODULE
  • SAVE

예시:

rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""

주의 rename-command는 운영 도구, 백업 도구, 모니터링 도구, replication, 장애 대응 절차와 충돌할 수 있음. 무조건 적용하지 말고 애플리케이션 및 운영 도구 호환성을 확인한 뒤 적용함. Redis 6 이상에서는 ACL로 command category와 command name을 제한하는 방식을 우선함.


2. Redis TLS 설정

내부망이라도 Redis 트래픽이 평문으로 이동하면 내부 침해, lateral movement, 패킷 캡처, shared network 환경에서 데이터가 노출될 수 있음. 다음 환경에서는 TLS 적용을 우선 검토함.

  • 클라우드 VPC 또는 다중 subnet 환경
  • Redis와 애플리케이션 서버가 서로 다른 서버에 있는 환경
  • 민감 데이터가 Redis에 저장되는 환경
  • 협력사망, 사내 공용망, VPN 구간을 통과하는 환경
  • 보안 감사 또는 규정 준수가 필요한 환경

2.1 TLS 인증서 파일 배치

예시 경로:

/etc/redis/certs/ca.crt
/etc/redis/certs/redis.crt
/etc/redis/certs/redis.key
/etc/redis/certs/client.crt
/etc/redis/certs/client.key

디렉터리 권한을 설정함.

sudo mkdir -p /etc/redis/certs
sudo chown -R redis:redis /etc/redis/certs
sudo chmod 0750 /etc/redis/certs
sudo chmod 0640 /etc/redis/certs/*.crt
sudo chmod 0600 /etc/redis/certs/*.key

2.2 TLS 전용 Redis 설정 예시

Redis 설정 파일에 다음을 적용함.

port 0
tls-port 6379

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

tls-auth-clients yes

port 0은 non-TLS plain TCP 포트를 비활성화함. TLS와 plain TCP를 동시에 운영해야 하는 전환 기간이 아니라면 운영 서버에서는 TLS-only 구성을 우선함.

Redis를 재시작함.

sudo systemctl restart redis

listen 포트를 확인함.

sudo ss -tlnp | grep ':6379'

2.3 TLS 접속 확인

client certificate 인증을 사용하는 경우:

redis-cli --tls \
  --cert /etc/redis/certs/client.crt \
  --key /etc/redis/certs/client.key \
  --cacert /etc/redis/certs/ca.crt \
  --user app \
  --askpass \
  ping

구버전 CLI 또는 자동화 환경에서는 secret을 환경에서 주입함.

export REDISCLI_AUTH='CHANGE_ME_TO_LONG_RANDOM_PASSWORD'

redis-cli --tls \
  --cert /etc/redis/certs/client.crt \
  --key /etc/redis/certs/client.key \
  --cacert /etc/redis/certs/ca.crt \
  --user app \
  ping

unset REDISCLI_AUTH

2.4 TLS 적용 시 주의 사항

TLS 적용 전 다음을 확인함.

  • Redis server binary가 TLS 지원으로 빌드되어 있는지 확인함.
  • Redis client library가 TLS를 지원하는지 확인함.
  • 애플리케이션 connection string 또는 client option 변경이 가능한지 확인함.
  • Sentinel, replica, Cluster 구성에서도 TLS 설정이 필요한지 확인함.
  • 인증서 만료일과 교체 절차를 문서화함.
  • 인증서 private key 권한을 Redis 사용자 외에는 읽을 수 없게 제한함.

TLS는 보안을 강화하지만 CPU 비용이 추가됨. 고트래픽 환경에서는 TLS 적용 후 latency와 CPU 사용률을 반드시 측정함.