DevOps

Redis에서 TLS를 활성화

IT오이시이 2025. 7. 21. 10:29
728x90

Redis with TLS/SSL

Redis에서 TLS를 활성화하고 tls-auth-clients yes로 클라이언트 인증을 요구하려면, 서버와 클라이언트 모두에 대해 SSL 인증서와 키를 생성하여 redis.conf에 등록해야 합니다.

아래는 OpenSSL을 사용해 서버용 TLS 키/인증서를 생성하는 방법과, 이를 어떻게 redis.conf에 등록하는지 설명합니다.

🔐 1. TLS를 위한 인증서/키 파일 생성 (서버용)

A. 기본 경로 예:
/etc/redis/ssl/ 또는 /usr/local/etc/redis/ssl/

B. TLS 키/인증서 생성 명령어 (CA, 서버 인증서, 키 포함)

  • redis_ca.crt: CA 인증서(클라이언트에도 반드시 배포)
  • redis_ca.key: CA 개인키(유출 주의, 외부 공개 금지)

 

# 1. 인증서 저장 폴더 생성
mkdir -p /etc/redis/ssl
cd /etc/redis/ssl

# 2. Root CA 키 & 인증서 생성 (사용자 자신이 CA 역할)
openssl genrsa -out local_ca.key 4096
openssl req -x509 -new -nodes -key local_ca.key -sha256 -days 3650 -out local_ca.crt \
     -subj "/C=KR/ST=Seoul/L=Seoul/O=MyRedisCA/CN=RedisLocalCA"

# 3. 서버 키 생성
openssl genrsa -out redis_srv.key 2048

# 4. 서버용 CSR (Certificate Signing Request) 생성
openssl req -new -key redis_srv.key -out redis_srv.csr \
  -subj "/C=KR/ST=Seoul/L=Seoul/O=RedisServer/CN=redis.local"

# 5. 서버 인증서 서명 (CA로부터)
openssl x509 -req -in redis_srv.csr -CA local_ca.crt -CAkey local_ca.key -CAcreateserial \
    -out redis_srv.crt  \
    -days 3650 -sha256

 

/etc/redis/ssl/
├── local_ca.crt    # CA 인증서 (클라이언트에 배포)
├── local_ca.key    # CA 개인키 (비공개)
├── redis_srv.key   # Redis 서버 개인키 
├── redis_srv.csr   # Redis 서버 CSR (임시)
├── redis_srv.crt   # Redis 서버 인증서 (최종, CA로 서명됨)

 

# systemd 설정 :  /etc/systemd/system/redis.service

# /etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --supervised systemd
ExecStop=/usr/bin/redis-cli shutdown
Restart=always
LimitNOFILE=10000
Type=notify
TimeoutStartSec=30

# 메모리 잠금 (옵션)
LimitNOFILE=10000

[Install]
WantedBy=multi-user.target

 

 

  1. systemctl daemon-reload : 서비스 파일 변경시 항상 수행
  2. systemctl enable redis.service : 부팅 시 자동 시작
  3. systemctl start redis.service : 서비스 기동

 

주요 항목 설명:

항목설명
User=redis, Group=redis Redis 프로세스가 redis 사용자와 그룹 권한으로 실행됨
ExecStart Redis 서버 실행 명령어. --supervised systemd 옵션 필수: systemd와 상태 통신을 위해 필요
ExecStop Redis 종료 시 사용되는 명령. redis-cli shutdown 명령으로 안전하게 중지
Restart=always redis-server가 오류 등으로 종료되었을 경우 자동 재시작 처리
LimitNOFILE=10000 Redis에서 열 수 있는 최대 파일 디스크립터 수 향상 (fd limit 증가)
Type=notify Redis가 systemd에 상태 통지를 sd_notify()로 하기 때문에 이 설정 필수
TimeoutStartSec=30 Redis 서버가 30초 안에 응답하지 않으면 시작 실패로 취급됨
 

⚠️ redis.conf 파일 안에도 반드시 다음 설정이 포함되어야 합니다:

 


 

  1. redis.conf에 TLS 키/인증서 설정
# TLS 전용 포트 설정 (일반 포트 비활성화 권장)
port 0
tls-port 6379

# 서버 인증서 및 키 경로
tls-cert-file /etc/redis/ssl/redis_srv.crt
tls-key-file /etc/redis/ssl/redis_srv.key

# 신뢰할 CA 인증서 경로
tls-ca-cert-file /etc/redis/ssl/local_ca.crt

# 클라이언트 인증 요구
tls-auth-clients yes

# (선택적 권장) 허용 프로토콜
tls-protocols "TLSv1.2 TLSv1.3"

example redis.conf

bind 0.0.0.0
protected-mode yes

tcp-backlog 511
timeout 0
tcp-keepalive 300

# TLS 설정
# 일반 포트 사용 안함
port 0
tls-port 6379


# 서버 인증서 및 키 경로
tls-cert-file /etc/redis/ssl/redis_srv.crt
tls-key-file /etc/redis/ssl/redis_srv.key

# 신뢰할 CA 인증서 경로
tls-ca-cert-file /etc/redis/ssl/local_ca.crt

# mTLS: 클라이언트 인증서 요구 여부
tls-auth-clients yes

# (선택적 권장) 허용 프로토콜
tls-protocols "TLSv1.2 TLSv1.3"
tls-prefer-server-ciphers yes


daemonize no

pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log


aclfile /etc/redis/users.acl

databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no

dir /var/lib/redis

replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100


acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no

oom-score-adj no
oom-score-adj-values 0 200 800

disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes

lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128

latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

 

 

핵심 구문 확인 및 설명

 

 

🔐 1. TLS 설정

 

port 0
tls-port 6379

  • Redis는 오직 TLS 포트(6379)를 통해서만 연결을 수락.
  • 평문 통신 비활성화(port 0).

 

tls-cert-file /etc/redis/ssl/redis_srv.crt
tls-key-file /etc/redis/ssl/redis_srv.key
tls-ca-cert-file /etc/redis/ssl/local_ca.crt

  • 서버 인증서, 개인 키, 그리고 클라이언트를 신뢰할 CA 인증서 지정.

 

tls-auth-clients yes

  • 클라이언트 인증서가 필수입니다.
    모든 클라이언트는 redis_ca.crt로 서명된 인증서를 서버에 제출해야 접속 가능.

 

tls-protocols "TLSv1.2 TLSv1.3"
tls-prefer-server-ciphers yes

  • 허용 프로토콜: TLS 1.2/1.3 (1.1 이하 비허용).
  • 서버 측에서 암호화 방식 우선 결정.

 

🌐 2. 접속 관련 설정

 

bind 0.0.0.0
protected-mode yes

  • bind 0.0.0.0: 모든 인터페이스에서 접속 수락
  • protected-mode yes: 위험 방지 장치 → 인증 없는 외부 접근 제한
    ⚠️ 대신 적절한 인증(AUTH, TLS 등) 설정이 매우 중요

 

tcp-backlog 511
timeout 0
tcp-keepalive 300

  • 높은 연결 수용 준비.
  • timeout 0: 클라이언트 연결 무기한 유효
  • tcp-keepalive 300: TCP 연결에 대해 5분마다 keepalive.

 

📁 3. 파일 및 프로세스 정의

 

daemonize no # 백그라운드로 실행 안함 (포그라운드 실행)
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis.log
loglevel notice

 

🔐 4. 인증 정책 (ACL)

 

aclfile /etc/redis/users.acl

  • 사용자 ACL을 외부 파일로 관리 (redis 6+)
  • 사용자 비밀번호, 권한, 명령 제한은 여기서 정의

예시:

user appuser on >supersecurepassword ~* +@all

 

💾 5. 데이터 저장 관련

 

dir /var/lib/redis dbfilename dump.rdb appendonly no

  • Redis RDB 방식 사용 (AOF 비활성화)
  • dir: 데이타 파일이 저장될 경로

 

🔁 6. 복제 관련

 

replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no

  • 복제 지연이 있어도 슬레이브는 요청 응답 가능
  • 슬레이브는 쓰기 불가(read-only)

 

🧠 7. 메모리 관리 및 성능 옵션

 

lazyfree-lazy-eviction no lazyfree-lazy-expire no ... oom-score-adj no disable-thp yes jemalloc-bg-thread yes

  • lazy free 기능 비활성화 (즉시 메모리 해제)
  • OOM 파라미터로 CPU/메모리 점수 조절 안함
  • Transparent Huge Pages(THP) 비활성화 (성능 안정화)
  • jemalloc 백그라운드 메모리 재사용 스레드 활성화

 

⚠️ 확인/보완이 필요한 부분

항목상태설명

🔐 인증서 경로 /etc/redis/ssl/*.crt 로 지정되어 사용 가능
🧑‍💻 사용자 인증 🔸 반드시 /etc/redis/users.acl 내 사용자 정의 필요 (requirepass, ACL SETUSER, +@commands)
🔗 인증서 권한 🔸 redis.crt와 redis.key는 Redis 데몬이 읽을 수 있어야 하며, 600 권한 유지 필요
🔓 bind 0.0.0.0 ⚠️ 외부 노출. 반드시 TLS + 인증 + ACL 조합으로 보안 유지할 것
📡 방화벽 설정 ⚠️ 반드시 OS 레벨에서 Redis 포트(6379) 접근을 IP별 제한할 것 (예: iptables, AWS 보안그룹 등)

✅ 추천 추가 확인 체크리스트

  • 클라이언트들이 CA로 서명된 인증서를 제대로 갖추고 있는가?
  • users.acl에 앱 유저, 관리자 유저 등 정의되어 있는가?
  • Redis 시작 시 인증서 오류 없이 정상 기동 가능한가? (redis-server /etc/redis/redis.conf)
  • 포트 6379에서 STARTTLS 없이 바로 TLS 동작 중인가? (관리 툴로 확인 가능)

 

📌 결론

이 설정은:

  • TLS + mTLS 완전 적용
  • bind 0.0.0.0 환경에서도 안전하게 운영 가능한 구성을 제공
  • AOF 비활성화, RDB 사용 환경
728x90
반응형