Redis parameter PROTECTED-MODE

<< Server Cmds Intro BIND >>

Redis PROTECTED-MODE

protected-mode는 레디스 서버 버전 3.2.0 부터 redis.conf에 추가된 파라미터이다.   이것은 보안의 한 요소이다.   이 글에서는 protected-mode와 같이 보아야 하는 bind, requirepass 파라미터를 케이스 별로 살펴봄으로써 보안을 위해 어떤 설정을 해야 하는지 알아본다.

이 문서는 버전 3.2.2를 기준으로 만들었다.

우선 각 파라미터를 간단히 알아보자.

  • protected-mode: yes/no로 설정한다. Default는 yes이다.
    • Yes이고 bind가 지정되어 있으면 지정한 IP로만 접속할 수 있다.
    • Yes이고 bind가 지정되지 않았으면(comment) 127.0.0.1 (local)만 접속할 수 있다.
    • No이고 bind가 지정되어 있으면 지정한 IP만 접속할 수 있다.
    • No이고 bind가 지정되지 않았으면(comment) 모든 IP로 접속할 수 있다.
  • bind: IP를 지정한다. 최대 16개까지 지정할 수 있다.   여기서 의미하는 IP는 서버의 network interface IP이다. 즉, 서버에서 리눅스 ifconfig 명령으로 나오는 IP 중 실제로 통신에 사용되는 IP를 말한다.   클라이언트 IP를 의미하는 것이 아니다.   Default는 127.0.0.1이다.
  • requirepass: password를 지정한다.   Password를 지정하면 서버 접속 후 auth password 명령을 우선 실행해야 한다.

이제부터 각 케이스에 대해서 알아보자.
이 서버에서는 사용 가능한 IP가 127.0.0.1, 192.168.56.102 두 개라고 가정한다.


케이스 1: 기본 설정

protected-mode == yes , bind == 127.0.0.1 , requirepass == NULL

이 경우가 기본 설정(default)이다.   이렇게 하면 bind에 있는 IP 127.0.0.1로만 접속이 가능하다.

[redis-3.2.2]$ src/redis-cli -h 127.0.0.1 -p 7000
127.0.0.1:7000> ping
PONG

그러므로 이 설정은 외부에서는 레디스 서버에 접속할 수 없고, 로컬(local)에서만 가능하다. 다른 IP인 192.168.56.102로 접속하면 다음과 같은 메시지가 나오고 접속할 수 없다.

[redis-3.2.2]$ src/redis-cli -h 192.168.56.102 -p 7000
Could not connect to Redis at 192.168.56.102:7000: Connection refused
Could not connect to Redis at 192.168.56.102:7000: Connection refused
not connected> exit

케이스 2: bind NULL

protected-mode == yes , bind == NULL , requirepass == NULL

bind IP를 설정하지 않았을 경우 IP 127.0.0.1 만 접속 가능하다.   설정하지 않는 방법은 bind 파라미터를 '#'으로 comment 처리한다.   그러므로 이 경우도 로컬에서만 접속 가능하다.   하지만, 이 경우 192.168.56.102로 접속하면 접속은 된다.   명령을 입력하면 다음과 같은 에러 메시지가 나오고 명령을 실행할 수 없다.   이 메시지는 센티널에 접속했을 때 가장 많이 받는 메시지이다. 왜냐하면 센티널의 기본(default) 설정이 이와 같기 때문에 127.0.0.1이 아닌 다른 IP로 접속하면 이 메시지를 받는다.   Sentinel.conf에는 protected-mode, bind 파라미터가 들어있지 않기 때문에 기본값인 protected-mode yes, bind NULL로 설정되는 것이다.

[redis-3.2.2]$ src/redis-cli -h 192.168.56.102 -p 7000
192.168.56.102:7000> ping
(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients.   In this mode connections are only accepted from the loopback interface.   If you want to connect from external computers to Redis you may adopt one of the following solutions:

1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent.

2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server.

3) If you started the server manually just for testing, restart it with the '--protected-mode no' option.

4) Setup a bind address or an authentication password.

NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
192.168.56.102:7000>

케이스 1, 2가 결과적으로는 동일하지만, 차이점이 있다.   케이스 1은 레디스 서버가 IP 127.0.0.1만 listen() 한다.   그러므로 두 번째 IP로 접속하면 접속 자체가 되지 않는다.   케이스 2는 bind에 아무것도 지정하지 않았으므로 모든 IP, 여기서는 두 개 IP를 listen 한다.   그래서 두 번째 IP로 접속했을 때 접속은 되는 것이다.   케이스 2는 불필요하게 두 번째 IP도 listen 하고 있는 것이므로, 케이스 1과 같이 설정하는 것이 좋다.

에러 메시지 중에서 1), 2), 3)은 protected-mode를 no로 설정하는 방법을 세 가지로 설명한 것이다.   4)는 bind IP(address)와 requirepass password 설정하라는 내용이다.

여기서 주의할 것은 센티널 서버의 경우 auth 명령을 사용할 수 없으므로 requirepass 방법은 사용할 수 없다는 것이다.   센티널 설정 관련해서 sentinel.conf에는 protected-mode, bind 파라미터가 버전에 따라 없거나 comment 처리되어 있으므로 추가로 입력하거나 comment(#)를 제거해야 합니다.


케이스 3: bind 0.0.0.0

protected-mode == yes , bind == 0.0.0.0 , requirepass == NULL

달라진 점은 bind IP에 0.0.0.0을 넣은 것이다.   이렇게 하면 서버에 있는 모든 IP로 리슨을 한다.   모든 IP로 접속을 받기를 원하면 0.0.0.0으로 설정하면 된다.   이 설정을 사용하면 127.0.0.1과 192.168.56.102 두 IP 모두 접속이 가능하다.  보안 강도는 좀 낮아진다고 볼 수 있다.


케이스 4: bind '두 번째 IP'

protected-mode == yes , bind == 192.168.56.102 , requirepass == NULL

Bind에 두 번째 IP를 넣었다. 이렇게 하면 두 번째 IP로만 접속이 가능하다. 로컬에서도 이 IP로 접속하면 된다.


케이스 5: requirepass password

protected-mode == yes , bind == NULL , requirepass == password

Password를 지정하면 protected-mode 일 때도 두 IP로 모두 접속 가능하다.   하지만 이 설정은 센티널에서는 사용할 수 없다. 센티널은 AUTH 명령을 사용할 수 없기 때문에 password를 지정하고 센티널에 접속해서 AUTH 명령을 실행하면 "알 수 없는 명령(ERR unknown command 'AUTH')" 이라고 나온다.

레디스 버전 3.2.2 기준으로 센티널에서 실행할 수 있는 명령 리스트이다.
1. ping
2. sentinel
3. subscribe
4. unsubscribe
5. psubscribe
6. punsubscribe
7. publish
8. info
9. role
10.client
11.shutdown


케이스 6: protected-mode no

protected-mode == no , bind == NULL , requirepass == NULL

두 IP로 모두 접속 가능하다. 보안이 가장 낮은 단계이다.


정리

Standalone 모드나 Cluster 모드는 세 가지 파라미터를 모두 설정 (protected-mode yes, bind IP1 IP2, requirepass password) 해서 사용하십시요. 운영모드에서는 bind 0.0.0.0을 설정하지 마시고 사용하는 IP를 넣으세요.
센티널은 protected-mode yes, bind IP1 IP2를 설정해서 사용하세요.   이 파라미터를 sentinel.conf에 추가로 입력하면 됩니다.


참고 자료

레디스 보안과 protected mode에 대한 살바토르의 글과 사용자들의 의견이다.



<< Server Cmds Intro PROTECTED-MODE BIND >>

질문하거나 댓글을 보려면 클릭하세요.  댓글수 :    조회수 :

Email 返事がかかってなれば、メールでお知らせします。