그동안 어째서인지 모르겠지만
redis.conf의 bind 파라미터가 Redis 서버로 접속 가능한 client ip 를 제어하는 ACL 기능이라고 생각해왔는데
그게 잘못된 것이라는 것을 이제야 알게 되어 내용을 정리합니다.
bind 파라미터란?
Redis는 TCP/IP 통신을 사용하기 때문에 요청을 받아줄 IP:Port를 설정하고 그 IP:Port로 들어오는 클라이언트의 요청을 받아들이게 되는데요
bind 파라미터는 Redis가 클라이언트의 요청을 받아주기 위해 열어놓은 IP를 설정하는 파라미터입니다.
즉! Redis 서버에서 ifconfig로 확인했을 때 나오는 IP들, 아래에서는 127.0.0.1 , 172.20.0.10, 0.0.0.0 이 값들만 가질 수 있게 됩니다.
- redis.conf bind 파라미터 설명
# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
[root@edd0a396ddfd tmp]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:14:00:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.20.0.10/24 brd 172.20.0.255 scope global eth0
valid_lft forever preferred_lft forever
bind 파라미터는 서버에 할당된 사용가능한 IP를 bind 파라미터에 설정하여 해당 IP로 들어오는 클라이언트의 요청만 받아들이겠다 라는 의미가 됩니다.
PostgreSQL의 pg_hba.conf, MySQL 계정의 host 처럼 ACL의 역할을 하는 파라미터가 아니었던 거죠..ㅎㅎ
위 서버의 Redis 서버는 bind 파라미터로 아래와 같은 값을 가질 수 있는데 각각의 의미는 다음과 같습니다.
- bind 127.0.0.1 : local 접근만 허용, 외부에서는 접근 안됨
- bind 172.20.0.10 : 외부에서의 접근만 허용, local에선 접근 안됨
- bind 0.0.0.0 : local 접근 + 외부 접근 허용
간단한 테스트를 통해 어떻게 동작하는지 확인해보겠습니다.
테스트
TEST 수행은 아래와 같은 설정에서 진행했습니다
protected-mode yes
require-pass qhdks123
- protected-mode yes 설정은 requiere-pass,bind 둘다 설정되지 않은 경우, 로컬에서의 접속만 허용하는 설정입니다
- 위와 같이 require-pass 가 존재하는 경우에는 no / yes 차이가 없습니다.
- bind 파라미터는 동적으로 변경이 안되기 때문에 재기동이 필요하다
- Redis 6 버전부터는 bind, port 동적으로 변경 가능
bind 127.0.0.1
[root@edd0a396ddfd redis-stable]# redis-cli -a qhdks123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
[root@edd0a396ddfd redis-stable]# redis-cli -h 172.20.0.10 -a qhdks123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 172.20.0.10:6379: Connection refused
=> localhost로 접속 성공, 172.20.0.10 으로 접속 실패
bind 172.20.0.10
[root@edd0a396ddfd redis-stable]# redis-cli -a qhdks123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>
[root@edd0a396ddfd redis-stable]# redis-cli -h 172.20.0.10 -a qhdks123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.20.0.10:6379>
=> localhost로 접속 실패, 172.20.0.10 으로 접속 성공
bind 0.0.0.0
[root@edd0a396ddfd redis-stable]# redis-cli -a qhdks123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
[root@edd0a396ddfd redis-stable]# redis-cli -h 172.20.0.10 -a qhdks123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.20.0.10:6379>
=> localhost, 172.20.0.10 둘다 성공
bind x
172.20.0.10:6379> config get protected-mode
1) "protected-mode"
2) "yes"
172.20.0.10:6379> config get bind
1) "bind"
2) ""
[root@edd0a396ddfd redis-stable]# redis-cli -a qhdks123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
[root@edd0a396ddfd redis-stable]# redis-cli -h 172.20.0.10 -a qhdks123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.20.0.10:6379>
=> localhost, 172.20.0.10 둘다 성공
결론
- bind 파라미터는 접속가능한 client ip를 관리하는 ACL 기능이 아니다!
- 위와 같은 기능을 제공하려면 Redis 서버 iptables 단에서 제어해야한다
- 뇌피셜을 지양하고 공식문서를 잘 읽어보자…..