본문 바로가기

SearchDeveloper/개발자를 위한 레디스

11장 보안

원본 저장소 데이터 들고 있는거고 pub/sub 메시지 전달자 역할이기 때문에 보안은 중요하다

 

커넥션 제어

커넥션을 제어하는 3가지 방법

bind

  • 10.0.0.2, 127.0.01만 레디스 접근 가능

bind: 서버는 여러 개의 네트워크 인터페이스를 가질 수 있다.여러 IP 중 어떤 IP만 레디스 접근 가능하게할건지 지정한다.

  • 0.0.0.0 혹은 * 로 설정하면 모든 연결 허용
  • 특정 값 설정하는 것 권장

 

패스워드

이전 버전

  • 각 인스턴스에 하나의 패스워드만 설정 가능 (requirepass)
  • # 비번 설정 or redis.conf
    CONFIG SET requirepass password
    

-a (auth)로 redis-cli 접속

redis-cli -a password

혹은

redis-cli
AUTH password


<br>

### 6버전 이후

- ACL(Access Control List) 로 PW 설정 권장
- 유저 생성, 유저별로 다른 pw 설정, 권한 부여 가능

<br>

<br>

## Protected mode

`yes` (기본값)면 pw 설정 안 했을 때 로컬(127.0.0.1) 접속만 허용한다.

- `bind`로 다른 IP 지정해도 마찬가지

`no` 면 pw 없이 접근 가능하므로 운영 모드에서 `yes` 설정 권장

<br>

# 커맨드 제어

- `CONFIG SET`으로 중요 설정값 변경 가능하기 때문에 제어는 중요
- 커맨드 제어 방법 2가지

<br>

## 커맨드 이름 변경

- `rename-command`로 특정 커맨드를 다른 이름으로 변경하거나 못 쓰게 비활성화할 수 있다.
- redis.conf에서만 변경 가능, 동적 변경 불가, `CONFIG GET`으로 확인 불가, `CONFIG SET` 세팅 불가

<br>

_redis.conf_

```java
rename-command CONFIG CONFIG_NEW
  • CONFIG 커맨드를 CONFIG_NEW로 변경

redis.conf

rename-command CONFIG ""
  • CONFIG 커맨드를 사용 불가

 

센티널 사용중이라면

센티널에서 레디스로 REPLICAOF, CONFIG 커맨드 직접 날려 레디스 제어하기 때문에 sentinel.conf에서도 똑같이 rename 해줘야함

 

sentinel.conf

sentinel rename-command mymaster CONFIG CONFIG_NEW



커맨드 실행 환경 제어

버전 7부터 특정 커맨드 실행하는 환경 제어 가능

_

_

redis.conf 혹은 커맨드로

enable-protected-configs no
enable-debug-command no
enable-module-command no

no면 모든 연결 수행 차단, yes면 모든 연결 수행 허용, local이면 로컬에서만 수행 허용

 

    • enable-protected-configs : CONFIG로 기본 경로 dir, 백업 파일 dbfile 등 옵션 변경하기 차단
    • enable-debug-command : DEBUG 커맨드 차단
      • DEBUG SEGFAULT: Redis 프로세스를 즉시 충돌(Crash)시키고 종료합니다. (테스트용)
        DEBUG RELOAD: RDB 파일을 저장하고 다시 로드합니다. (데이터가 클 경우 서비스 지연 발생)
        DEBUG SLEEP <seconds>: 지정된 시간 동안 Redis 서버를 완전히 멈춥니다(Hang). 모든 클라이언트의 요청이 차단됩니다.
        DEBUG OBJECT <key>: 특정 키가 메모리 어디에 어떻게 저장되어 있는지 상세 내부 정보를 보여줍니다.
        

레디스 다운 가능

      •  
    • enable-module-command : MODULE 커맨드 차단
      • MODULE LOAD <path>: 서버가 실행 중인 상태에서 새로운 모듈(.so 파일)을 동적으로 로드합니다.
        MODULE LIST: 현재 로드된 모듈 목록을 확인합니다.
        MODULE UNLOAD: 로드된 모듈을 제거합니다.
        

악성 코드 모듈 업로드 가능

    •  



레디스 해킹 사례

서버 A 레디스는 protected-mode no라 pw 없이 접근 가능 / 서버 B에서 A를 해킹하는게 목표

▶️ 서버B에서 SSH 키 생성 후 레디스 통해 A에 키 저장 후 접근 가능하게 함

 

  • 서버 B에서 키 생성: ssh-keygen -t rsa > key.txt
  • B에서 A 접근해
    • flushall로 레디스 전체 삭제 후 key.txt 내용을 레디스 키의 데이터로 넣기
    • 데이터 저장 경로, 파일명 변경 CONFIG SET dir /home/centos/.ssh / CONFIG SET dbfilename authorized_keys
    • SAVE 로 데이터 백업 파일 저장
  • → B 의 공개키가 저장되어 SSH로 B가 A에게 접근 가능하게 됨

 

SSH
→ 접근하려는 쪽이 키 생성해서 보내는 구조 (공개키는 보내고 비밀키는 자기가 갖고)


SSH 원리는 공개키 암호화(Public Key Cryptography) 방식을 사용하며, 절차를 제대로 밟았다면 비밀번호 없이 접속이 가능해집니다.

1. 공개키 암호화 원리 (자물쇠와 열쇠)

SSH 키 쌍을 생성하면 두 개의 파일이 만들어집니다.

  • 비밀키 (Private Key): 나(A 서버)만 가지고 있는 '열쇠'입니다. 절대 남에게 주면 안 됩니다.
  • 공개키 (Public Key): 누구에게나 줘도 되는 '자물쇠'입니다. 이 파일을 B 서버에 보내는 것입니다.

2. 접속 가능하게 만드는 법 (핵심 절차) A → B로 접근하는 상황

A 서버에서 생성한 공개키 파일을 B 서버의 특정 위치에 저장해야 합니다. 단순히 전송만 한다고 끝나는 게 아니라, B 서버의 약속된 장소에 등록해야 합니다.

  1. A 서버: ssh-keygen으로 키 생성 (id_rsa, id_rsa.pub).
  2. 전송: id_rsa.pub(공개키) 파일을 B 서버로 보냅니다.
  3. B 서버 등록: 받은 공개키 내용을 B 서버 사용자의 ~/.ssh/authorized_keys 파일 안에 한 줄로 추가(append)합니다.

꿀팁: ssh-copy-id 유저명@B서버IP 명령어를 쓰면 이 복잡한 과정을 한 방에 자동으로 처리해 줍니다.


3. 왜 비번 없이 접속될까? (인증 과정)

A가 B에 접속을 시도하면 다음과 같은 대화가 오갑니다.

  • B 서버: "오, 내 authorized_keys에 자물쇠가 하나 있네? 이걸로 암호화한 문제를 낼 테니 풀어봐!"
  • A 서버: (본인이 가진 비밀키로 문제를 풀어서 던짐)
  • B 서버: "정답! 내 자물쇠를 열 수 있는 진짜 열쇠를 가졌구나. 통과!"

 

 

ACL

  • 레디스 6버전 이후
  • 유저 개념 도입
  • 각 유저 별로 실행 가능한 커맨드, 접근 가능한 키 제한 가능

 

유저 생성/삭제

ACL SETUSER, ACL GETUSER, ACL LIST

127.0.0.1:6379> ACL SETUSER hiseo on >pwpw ~cached:* &* +@all -@dangerous
OK
127.0.0.1:6379> ACL GETUSER hiseo
 1) "flags"
 2) 1) "on"
    2) "sanitize-payload"
 3) "passwords"
 4) 1) "74af43e6ac3509ef4035853a43b5ecf230612906c5ed9eaab28575971613ff74"
 5) "commands"
 6) "+@all -@dangerous"
 7) "keys"
 8) "~cached:*"
 9) "channels"
10) "&*"
11) "selectors"
12) (empty array)

127.0.0.1:6379> ACL SETUSER hiseo ~id:*
OK

127.0.0.1:6379> ACL GETUSER hiseo
 1) "flags"
 2) 1) "on"
    2) "sanitize-payload"
 3) "passwords"
 4) 1) "74af43e6ac3509ef4035853a43b5ecf230612906c5ed9eaab28575971613ff74" // SHA256 암호화
 5) "commands"
 6) "+@all -@dangerous"
 7) "keys"
 8) "~cached:* ~id:*" // 접근 가능한 키 추가됨
 9) "channels"
10) "&*"
11) "selectors"
12) (empty array)

127.0.0.1:6379> ACL LIST
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user hiseo on sanitize-payload #74af43e6ac3509ef4035853a43b5ecf230612906c5ed9eaab28575971613ff74 ~cached:* ~id:* &* +@all -@dangerous"
3) "user hiso on sanitize-payload #74af43e6ac3509ef4035853a43b5ecf230612906c5ed9eaab28575971613ff74 ~* &* +@all -@dangerous"

 

1) "user default on nopass sanitize-payload ~* &* +@all"

는 디폴트 유저

  • 이름: default, 활성 상태임: on, 비번 없음: nopass, 데이터 검사: sanitize-payload, 모든 키 접근 가능: ~*, 모든 채널 접근 가능: &*, 모든 커맨드 접근 가능: +@all

 

유저 상태 제어

  • on 구문 없이 생성하면 디폴트 off 로 생성됨.
  • 후에 on 세팅 필요
    • ACL SETUSER 이름 on
  • on을 off로 변경하면 기존 연결은 여전히 유지됨. 새 연결이 안 되는 거임

 

패스워드

  • 패스워드 설정: >패스워드 , 패스워드 제거: <패스워드
  • pw 1개 이상 지정 가능
  • pw 지정 안 하면 유저 접근 불가, nopass 로 설정(기존 pw 삭제됨)하면 pw없이 접근 가능
  • resetpass 는 모든 pw, nopass 제거되어 접근 불가됨
  • requirepass는 pw가 평문 저장인데 ACL은 SHA256 암호화되어 저장된다.
  • ACL GENPASS 로 pw로 쓸 난수 생성 기능 제공

 

커맨드 권한 제어

  • 운영 편의성 위해 일부 커맨드는 카테고리화 되어있다.
  • +@all, allcommands : 모든 커맨드 수행 허용, -@all, nocommands : 모든 커맨드 수행 불가
  • 유저 생성 시 커맨드 언급 없으면 -@all 로 생성된다.
  • 특정 카테고리로 제어하려면 +@<카테고리>, 특정 커맨드로 제어하면 @ 없이 +<커맨드>
  • ACL룰은 왼쪽부터 오른쪽으로 순서대로 적용됨
    • ACL SETUSER user1 +@all -@admin +bgsave +slowlog|get

먼저 모든 권한 부여하고 @admin 빼고 bgsave 더하고 slowlog 중 get 서브 커맨드만 권한 추가

 

ACL CAT, ACL CAT dangerous**

카테고리 커맨드 리스트 확인**

127.0.0.1:6379> ACL CAT
 1) "keyspace"
 2) "read"
 3) "write"
 4) "set"
 5) "sortedset"
 6) "list"
 7) "hash"
 8) "string"
 9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"

127.0.0.1:6379> ACL CAT dangerous
 1) "debug"
 2) "module|list"
 3) "module|loadex"
 4) "module|load"
 5) "module|unload"
 6) "monitor"
 7) "flushall"
 8) "cluster|forget"
 ...

 

dangerous

  • 레디스 구성 변경이나 오래 수행될 수 있는 커맨드, 운영자 아니면 사용하지 않아도 되는 커맨드
  • 구성 변경 커맨드
    • replconf
    • replicaof - 마스터 변경
    • migrate
    • failover
  • 장애 유발 커맨드
    • sort - 모든 키 접근해서 오래 걸름
    • flushdb
    • flushall
    • keys
  • 운영 커맨드
    • shutdown
    • monitor
    • acl|log, acl|deluser, acl|list, acl|setuser
    • bgsave, brewriteaof
    • info
    • config|get, config|set, config|rewrite, config|resetstat - 운영자 아님 볼 일 없음
    • debug
    • cluster|addslots, cluster|forget, cluster|failover
    • latency|graph, latency|doctor, latency|reset, latency|history
    • client|list, client|kill, client|pause
    • module|loadex, module|list, module|unload

 

admin

  • dangerous에서 장애 유발 키워드만 제외한 커맨드들

 

fast

  • O(1) 로 수행되는 커맨드들
  • get , spop, hset

 

127.0.0.1:6379> ACL CAT fast
  8) "rpop"
  9) "zincrby"
 10) "rpush"
 11) "hsetnx"
 12) "llen"
 13) "httl"
 14) "incrby"
 15) "zrem"
 16) "sismember"
 18) "lpop"
 19) "hmget"
 20) "getset"
 21) "incr"
 22) "sadd"
 24) "hello"
 25) "append"
 26) "hexists"
 27) "incrbyfloat"
 28) "time"
 29) "xautoclaim"
 30) "xlen"
 31) "lpush"
 ...

 

slow

  • fast에 속하지 않은 커맨드
  • scan, set, setbit, sunion

 

keyspace

  • 키 관련 커맨드
  • scan, keys, rename, type, expire, exists, TTL 확인

 

read

  • 읽기 커맨드
  • 자료구조 별 읽기 커맨드 포함
  • get, hget, xtrange

 

write

  • 메모리에 데이터 쓰는 커맨드
  • set, lset, setbit, hmset, expire, pexpire

 

키 접근 제어

  • ~* 혹은 allkeys : 모든 키 접근 허용 / ~<패턴> : 접근 가능한 키 정의
    • ~mail:* : mail: 로 시작하는 모든 키 접근 허용
  • 레디스 7부터 읽기, 쓰기 따로 부여 가능 (%R, %W, %RW )
    • ACL SETUSER user2 ~log:* %R~mail:* %W~sms:* %RW~blog:*
  • resetkeys : 유저의 모든 키 접근 권한 초기화

 

설렉터

  • 레디스 7부터 도입된 유연한 ACL 규칙 설정 위함
  • 위 권한이면 user2 가 mail:* 키의 TTL 같은 메타데이터도 확인 가능. 근데 GET만 강제하고 싶을 때
  • ACL SETUSER user2 resetkeys ~log:* (+GET ~mail:*)

괄호 안이 설렉터. mail:* 키는 GET만 부여함

 

pub/sub 채널 접근 제어

  • &<패턴> 로 채널 접근 권한 제어
  • allchannels 또는 &* : 모든 pub/sub 채널 접근 허용
  • resetchannels 어떤 채널도 발행, 구독 불가
  • 유저 생성시 기본 resetchannels

 

유저 초기화

  • reset 유저 모든 권환 회수하고 기본 상태로 변경 (ACL SETUSER 직후와 동일해짐)
  • resetpass, resetkeys, resetchannels, off, -@all 상태로 변경됨

 

ACL 규칙 파일로 관리하기

  • redis.conf에 한 번에 해도 되고 ACL 파일 따로 관리도 가능
  • 따로 관리하고 싶으면 redis.conf에 명세
aclfile /etc/redis/users.acl
  • 어디에 저장해도 내용은 동일
  • 따로 관리하면 ACL LOAD, ACL SAVE 커맨드로 유저 데이터를 레디스로 로드, 저장 가능 (대신 CONFIG REWRITE로는 안 됨)



SSL/TLS

레디스 6부터 SSL/TLS 프로토콜 이용한 보안 연결 지원함

 

SSL/TLS란?

  • SSL(Secure Sockets Layer): 암호화를 위한 인터넷 기반 프로토콜
    • 1995년 출시, 1996년부터 업데이트 안 됨. 현재는 TLS를 대부분 사용중
  • TLS(Transport Layer Security): 현재 널리 사용되는 보안 프로토콜, SSL에서 시작돼 발전됨
    • TLS 버전 1.12 이상 권장
  • SSL/TLS: 데이터 전송 과정에서 정보를 암호화해 중간에서 데이터 노출, 조작되는 것 방지
    • 클라, 서버 간 안전한 핸드셰이크 과정에서
      • 상호 인증으로 모두 신뢰 가능한지 확인
      • 무결성(데이터 전송과정에서 왜곡되지 않았음), 기밀성 보장
      • 제3자가 데이터 열람 못 하게 보호

 

레디스에서 SSL/TLS 사용하기

기본적으론 비활성화라 처음 빌드할 때부터 아래처럼 정의

make BUILD_TLS=yes

 

일반적으로 레디스, 클라이언트 간 동일한 인증서 사용하므로 복사해두기 (key, ca, ca-cert)

 

     
용어 쉬운 비유 기술적 설명
key (Private Key) 인감 도장 서버 본인임을 증명하는 비밀키입니다. 서버에만 저장하며 절대 유출되면 안 됩니다. 데이터 암호화의 핵심 열쇠입니다.
cert (Certificate) 신분증 서버의 공개키와 서버 정보가 담긴 문서입니다. "나는 안전한 서버다"라는 것을 클라이언트에게 보여주는 용도입니다.
ca (Certificate Authority) 정부(발급기관) 신분증(Cert)이 진짜인지 보증해 주는 신뢰할 수 있는 기관입니다. (예: Let's Encrypt, DigiCert 등)
ca-cert (CA Certificate) 정부의 직인 클라이언트가 서버의 신분증을 확인하기 위해 사용하는 CA의 공개키입니다. 이 직인이 찍혀 있어야 신분증을 믿어줍니다.

파일 생성은 openssl 커맨드로 하는 듯함

 

redis.conf 설정하기

tls-port <포트 번호>
port 0 # 일반 포트는 끄고 TLS 포트만 사용
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt
  • tls-port 설정해야 SSL/TLS 사용됨
  • port, tls-port 둘 다 설정하면 port로는 일반적인 통신, tls-port로는 인증서 기반 TLS 통신
    • 보안 강화하려면 port 0으로 해서 기본 포트 비활성화해 TLS로만 접근하게 할 수 있음

 

refis-cli로 접근하기 - 인증 파일 명세

redis-cli --tls \
--cert /path/to/redis.crt \
--key /path/to/redis.key \
--cacert /path/to/ca.crt

애플리케이션 코드로 접근할 때도 인증 파일 명세해줘야함

 

SSL/TLS를 사용한 HA 구성

복제 구성

SSL/TLS사용하는 마스터와 TLS 연결로 복제 구성하기 위해선 복제본도 아래 설정 추가해야함

 

tls-port <포트 번호>

tls-replication yes

tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt

tls-replication yes : 기본값은 no. no면 일반 프로토콜로 마스터랑 연결돼서 정상적으로 연결할 수 없음

 

센티널 구성

sentinel.conf에도 다음 설정 추가

tls-port <포트 번호>

tls-replication yes

tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt

 

클러스터 구성

레디스 클러스터 구성에서 SSL/TLS 설정하려면 아래 설정 추가

tls-port <포트 번호>

tls-replication yes
tls-cluster yes

tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt

모든 클러스터 노드 간 연결과 클러스터 버스 통신이 SSL/TLS프로토콜로 통신됨

'SearchDeveloper > 개발자를 위한 레디스' 카테고리의 다른 글

13 레디스 운영하기 (끝)  (0) 2026.06.07
12장 클라이언트 관리  (0) 2026.06.07
10장 클러스터  (0) 2026.06.07
9장 센티널  (0) 2026.06.07
8장 복제  (1) 2026.06.07