Redis 설치 보안: 필수 구성 팁
네트워크 바인딩, 보호 모드, ACL 또는 비밀번호, 안전한 명령 액세스, 방화벽 규칙, 최소 권한 및 TLS를 사용하여 Redis를 보호합니다.
Redis 설치 보안 강화: 필수 구성 팁
Redis는 빠르고 간단하며, 종종 애플리케이션 코드에서 세션 데이터, 큐, 카운터 및 캐시된 레코드를 저장하는 데 신뢰됩니다. 따라서 Redis 보안은 중요합니다. 하나의 노출된 인스턴스는 공격자가 데이터를 읽거나, FLUSHALL로 키를 삭제하거나, 관리 명령을 남용할 수 있게 합니다.
목표는 Redis가 필요한 시스템에서만 접근 가능하도록 하고, 인증을 요구하며, 위험한 명령 액세스를 줄이고, 구성 및 지속적 데이터를 보관하는 파일을 보호하는 것입니다.
1. 네트워크 구성: 노출 제한
가장 즉각적인 보안 조치는 Redis가 수신 대기하는 네트워크 인터페이스를 제어하는 것입니다. 많은 패키지된 Redis 설치가 기본적으로 localhost에 바인딩되지만, 컨테이너 이미지, 사용자 정의 구성 파일 및 이전 배포는 다를 수 있습니다. 기본값이 안전하다고 가정하지 말고 항상 활성 redis.conf를 확인하십시오.
특정 인터페이스에 바인딩 (bind)
Redis가 필요한 인터페이스에서만 수신 대기하도록 구성해야 합니다. 대부분의 프로덕션 환경에서는 루프백 주소 또는 애플리케이션 서버에서 사용하는 특정 개인 IP 주소에만 바인딩하는 것을 의미합니다.
내부 또는 로컬 전용 액세스
애플리케이션 서버가 Redis와 동일한 호스트에 있는 경우 루프백 주소에만 독점적으로 바인딩하십시오.
# redis.conf 구성 스니펫
bind 127.0.0.1
네트워크 개인 액세스
애플리케이션 서버가 개인 네트워크 세그먼트에 있고 네트워크 액세스가 필요한 경우 해당 특정 개인 IP 주소에 바인딩하십시오. Redis를 공용 인터넷 연결 IP에 바인딩하지 마십시오. 원격 액세스가 필요한 경우 개인 네트워크에 두고 방화벽 규칙 또는 보안 그룹으로 트래픽을 제한하십시오.
# Redis에 액세스해야 하는 특정 내부 IP 주소를 나열합니다.
bind 192.168.1.100 10.0.0.5
보호 모드 이해
Redis 3.2부터 보호 모드는 표준 Redis 빌드에서 기본적으로 활성화됩니다. Redis가 원격 클라이언트에 대해 명시적으로 구성되지 않은 경우 외부 액세스를 차단하는 데 도움이 됩니다. 이를 주요 제어 수단이 아닌 안전망으로 취급하십시오. 바인딩 제한, 인증 및 방화벽 규칙을 사용하십시오.
특정 구성에 대해 비활성화해야 하는 경우 다음을 사용할 수 있습니다.
protected-mode no
경고:
bind, 인증 및 네트워크 필터링을 올바르게 구성한 경우에만protected-mode를 비활성화하십시오.
2. 인증 및 액세스 제어
네트워크 액세스가 제한되면 다음 방어 계층은 인증입니다. 클라이언트는 유효한 비밀번호를 제공하거나, 바람직하게는 최신 ACL(Access Control List) 시스템을 사용하는 경우에만 Redis와 상호 작용할 수 있어야 합니다.
비밀번호 보호 구현 (requirepass)
redis.conf 파일에서 requirepass 지시문을 사용하여 클라이언트 인증을 강제합니다. 이는 기본 보안을 위한 전역 공유 비밀로 작동합니다.
# 강력하고 고유한 비밀번호 설정
requirepass T4h!S_Is_V3ry_S3cure_P@ss
비밀번호를 사용하여 연결하려면 클라이언트가 AUTH 명령을 사용해야 합니다.
# redis-cli 사용 예시
$ redis-cli
127.0.0.1:6379> AUTH T4h!S_Is_V3ry_S3cure_P@ss
OK
127.0.0.1:6379> PING
PONG
고급 보안: Redis ACL(Access Control Lists)
Redis 6.0 이상을 실행하는 프로덕션 환경의 경우 ACL이 선호되는 인증 방법입니다. ACL을 사용하면 특정 비밀번호와 세분화된 권한(예: 사용자 A는 읽기만 가능, 사용자 B는 특정 키스페이스에 쓰기 가능)을 가진 여러 사용자를 정의할 수 있습니다.
ACL 구성은 일반적으로 redis.conf 또는 별도의 ACL 파일에서 사용자와 해당 규칙을 정의하는 것을 포함합니다.
# redis.conf 또는 aclfile의 예시 ACL 사용자 정의
user default off
user app_reader on >app_read_P@ss ~cache:* +get +scan
user app_writer on >app_write_P@ss ~data:* +set +del
위험한 명령 이름 바꾸기 또는 비활성화
특정 관리 명령(예: FLUSHALL, CONFIG, KEYS, SHUTDOWN)은 오용될 경우 운영 중단을 일으키거나 민감한 구성 세부 정보를 노출할 수 있습니다. 이러한 명령의 이름을 모호한 이름으로 바꾸거나 완전히 비활성화하는 것이 모범 사례입니다.
명령 이름을 바꾸려면 rename-command를 사용하십시오.
# 무단 변경을 방지하기 위해 CONFIG 명령 이름 바꾸기
rename-command CONFIG HIDE_MY_CONFIG
# FLUSHALL 완전히 비활성화
rename-command FLUSHALL ""
3. 운영 보안 모범 사례
내부 Redis 구성 외에도 강력한 외부 운영 보안 조치를 적용하는 것은 완전한 보안 태세를 위해 중요합니다.
엄격한 방화벽 규칙 적용
bind 지시문 설정에 관계없이 항상 클라우드 보안 그룹, iptables 또는 유사한 방화벽 솔루션을 사용하여 네트워크 필터링을 적용하십시오. Redis 기본 포트(6379)는 신뢰할 수 있는 애플리케이션 서버의 특정 IP 주소 또는 IP 범위에만 열려 있어야 합니다.
방화벽 규칙 예시 (Linux/iptables)
알려진 애플리케이션 서버 IP(192.168.1.50)에서만 포트 6379의 수신 트래픽을 허용합니다.
# 특정 애플리케이션 서버 허용
iptables -A INPUT -p tcp -s 192.168.1.50 --dport 6379 -j ACCEPT
# 기타 수신 Redis 트래픽 거부
iptables -A INPUT -p tcp --dport 6379 -j DROP
최소 권한으로 실행
Redis 서버 프로세스를 root 사용자로 실행하지 마십시오. 공격자가 Redis 프로세스를 손상시키면 root로 실행하면 전체 운영 체제에 대한 완전한 제어 권한을 부여하게 됩니다.
redis와 같은 전용 권한이 없는 시스템 사용자를 만든 다음 서비스 관리자가 해당 사용자로 Redis 프로세스를 실행하도록 구성하십시오. systemd를 사용하는 경우 일반적으로 User=redis 및 Group=redis와 같은 지시문이 있는 단위 파일이나 배포판에서 제공하는 패키지 서비스에서 처리됩니다.
구성 파일 및 지속성 보호
redis.conf 파일에는 requirepass 비밀번호 및 네트워크 설정과 같은 민감한 정보가 포함되어 있습니다. 이 파일과 지속성 파일(RDB 스냅샷 및 AOF 로그)이 다른 시스템 사용자에 의한 무단 읽기 또는 수정을 방지하기 위해 제한적인 파일 권한으로 보호되는지 확인하십시오.
# 권장 권한 예시
# 'redis' 사용자와 root만 읽기/쓰기 가능
chown redis:redis /etc/redis/redis.conf
chmod 600 /etc/redis/redis.conf
SSL/TLS 암호화 구현
Redis 트래픽이 신뢰할 수 없는 네트워크 세그먼트(내부라도)를 통과하는 환경의 경우 SSL/TLS 암호화를 구현하십시오. Redis는 역사적으로 기본 TLS 지원이 부족했지만 최신 버전(Redis 6부터)은 완전히 지원합니다. TLS를 구성하려면 인증서를 생성하고 redis.conf에서 관련 지시문을 설정해야 합니다.
# TLS 리스너 활성화
tls-port 6379
port 0
tls-auth-clients yes
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
port 0은 일반 텍스트 리스너를 비활성화합니다. 모든 클라이언트가 신뢰할 수 있는 로컬 경로에 있고 명확한 이유가 있는 경우에만 일반 텍스트 포트를 유지하십시오.
필수 보안 단계 요약
Redis 설치를 보호하는 것은 계층화된 작업입니다. 노출부터 시작하여 인증, 그 다음 운영 제어 순으로 진행하십시오.
- 네트워크 액세스 제한:
bind 127.0.0.1또는 특정 개인 IP를 사용하십시오. - 인증 강제:
requirepass(기본) 또는 ACL(고급)을 사용하십시오. - 명령 강화: 위험한 관리 명령(
FLUSHALL,CONFIG)을 비활성화하거나 이름을 바꾸십시오. - 방화벽 사용: 신뢰할 수 있는 애플리케이션 서버에서만 포트 6379의 트래픽을 허용하십시오.
- 최소 권한: Redis 프로세스를 root가 아닌 전용 사용자로 실행하십시오.
- 트래픽 암호화: 적절한 경우 네트워크 연결에 SSL/TLS를 활성화하십시오.