Redis 네트워크 및 기본 보안¶
Redis bind, protected-mode, firewalld 기준을 정리함.
1. Redis 기본 보안 설정¶
Redis는 외부 인터넷에 직접 노출하면 안 됨. Redis 포트 6379/tcp는 신뢰된 애플리케이션 서버 또는 내부망에서만 접근 가능해야 함.
1.1 localhost 전용 기본 구성¶
애플리케이션과 Redis가 같은 서버에 있는 경우에는 localhost 전용 구성을 기본으로 함.
Redis 설정 파일에서 다음 항목을 확인 또는 설정함.
bind 127.0.0.1
protected-mode yes
port 6379
IPv6 localhost를 함께 사용할 경우 다음처럼 설정할 수 있음.
bind 127.0.0.1 ::1
protected-mode yes
port 6379
설정 변경 후 Redis를 재시작함.
sudo systemctl restart redis
listen 주소를 확인함.
sudo ss -tlnp | grep ':6379'
정상 예시:
LISTEN 0 511 127.0.0.1:6379 0.0.0.0:* users:(("redis-server",pid=1234,fd=6))
1.2 내부망 원격 접근 구성¶
다른 애플리케이션 서버에서 Redis에 접근해야 하는 경우에는 Redis 서버의 사설 IP만 bind함.
예시:
bind 127.0.0.1 192.168.1.50
protected-mode yes
port 6379
여기서 192.168.1.50은 Redis 서버 자신의 사설 IP임.
설정 후 Redis를 재시작함.
sudo systemctl restart redis
listen 주소를 확인함.
sudo ss -tlnp | grep ':6379'
1.3 운영에서 피해야 할 설정¶
다음 설정은 운영 환경에서 기본값으로 사용하지 않음.
bind 0.0.0.0
protected-mode no
bind 0.0.0.0은 모든 네트워크 인터페이스에서 Redis 연결을 받겠다는 의미임. 방화벽, 보안 그룹, 네트워크 ACL, Redis 인증 설정이 완전히 통제되지 않으면 매우 위험함.
운영 기준에서는 다음 원칙을 적용함.
- 기본은 localhost-only로 구성함.
- 원격 접근이 필요할 때만 사설 IP를 bind함.
- firewall은 source IP 제한을 우선함.
- 인증을 반드시 설정함.
- 가능하면 TLS를 적용함.
- public IP에서 Redis 포트가 열리지 않도록 확인함.
2. Firewalld 설정¶
Redis가 localhost에서만 동작한다면 firewall port open이 필요하지 않음.
원격 애플리케이션 서버에서 Redis에 접근해야 하는 경우에만 firewalld를 설정함.
2.1 Firewalld 상태 확인¶
sudo systemctl is-active firewalld
sudo firewall-cmd --get-active-zones
2.2 특정 애플리케이션 서버 IP만 허용¶
예시에서 Redis 서버는 192.168.1.50, 애플리케이션 서버는 192.168.1.100이라고 가정함.
sudo firewall-cmd --permanent --zone=public \
--add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="6379" accept'
sudo firewall-cmd --reload
설정 확인:
sudo firewall-cmd --zone=public \
--query-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="6379" accept'
2.3 특정 IP 대역만 허용¶
예시:
sudo firewall-cmd --permanent --zone=public \
--add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="6379" accept'
sudo firewall-cmd --reload
2.4 TLS 포트 운영 시 방화벽¶
TLS-only 구성에서도 기본 포트가 6379라면 방화벽 정책은 동일함. 포트를 별도로 분리하는 경우 해당 포트만 허용함.
sudo firewall-cmd --permanent --zone=public \
--add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="6380" accept'
sudo firewall-cmd --reload
2.5 운영에서 피해야 할 방화벽 설정¶
다음 명령은 zone 전체에 Redis 서비스를 여는 방식이므로 운영 기본값으로 사용하지 않음.
sudo firewall-cmd --permanent --zone=public --add-service=redis
sudo firewall-cmd --reload
다음 명령도 zone 전체에 Redis 포트를 여는 방식이므로 운영 기본값으로 사용하지 않음.
sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --reload
이미 열려 있다면 제거함.
sudo firewall-cmd --permanent --zone=public --remove-service=redis
sudo firewall-cmd --permanent --remove-port=6379/tcp
sudo firewall-cmd --reload
2.6 외부 접근 검증¶
Redis 서버에서 listen 주소를 확인함.
sudo ss -tlnp | grep ':6379'
애플리케이션 서버에서 접속을 확인함.
redis-cli -h 192.168.1.50 -p 6379 --askpass ping
TLS 사용 시:
redis-cli --tls \
-h 192.168.1.50 \
-p 6379 \
--cacert /etc/redis/certs/ca.crt \
--user app \
--askpass \
ping
허용되지 않은 서버에서는 접속이 실패해야 함.