TLS 는 6.0 부터 정식 지원이지만 기본 빌드에는 들어 있지 않다. 소스에서 올렸다면 TLS 를 켜고 다시 빌드해야 한다.
dnf install -y openssl-devel
make distclean
make BUILD_TLS=yes
지원 여부는 서버에 물어보면 된다.
redis-server --tls-port 0 --port 6379 --version
redis-cli INFO server | grep -i executable
TLS 없이 빌드된 바이너리에 tls-port 를 주면 TLS not supported 로 기동에 실패한다. 패키지로 설치한 경우 배포판에 따라 redis-tls 같은 별도 패키지가 필요하다.
서버 인증서, 키, 그리고 클라이언트 인증서를 검증할 CA 가 필요하다. 키 파일은 redis 실행 계정만 읽을 수 있어야 한다.
install -d -o redis -g redis -m 750 /etc/redis/tls
install -o redis -g redis -m 640 server.crt /etc/redis/tls/
install -o redis -g redis -m 600 server.key /etc/redis/tls/
install -o redis -g redis -m 644 ca.crt /etc/redis/tls/
핵심은 port 0 이다. 이것을 빠뜨리면 TLS 포트를 열어도 평문 포트가 그대로 살아 있어 "TLS 전용" 이 되지 않는다.
port 0
tls-port 6379
tls-cert-file /etc/redis/tls/server.crt
tls-key-file /etc/redis/tls/server.key
tls-ca-cert-file /etc/redis/tls/ca.crt
# 클라이언트 인증서 요구 여부. yes 가 기본이며 상호 인증이 된다
tls-auth-clients yes
tls-protocols "TLSv1.2 TLSv1.3"
tls-ciphersuites TLS_AES_256_GCM_SHA384
복제와 클러스터 버스도 따로 켜야 한다. 켜지 않으면 복제본이 평문으로 붙으려다 실패한다.
tls-replication yes
tls-cluster yes
Sentinel 을 쓰면 Sentinel 설정 파일에도 같은 tls-* 항목을 넣어야 한다.
redis-cli --tls \
--cert /etc/redis/tls/client.crt \
--key /etc/redis/tls/client.key \
--cacert /etc/redis/tls/ca.crt \
-h redis01 -p 6379 PING
평문 접속이 실제로 막혔는지도 확인한다. 아래가 응답하면 port 0 이 적용되지 않은 것이다.
redis-cli -h redis01 -p 6379 PING
인증서 체인만 검증하려면 다음을 쓴다.
openssl s_client -connect redis01:6379 -CAfile /etc/redis/tls/ca.crt </dev/null
tls-auth-clients yes 상태에서 클라이언트 인증서를 주지 않으면 연결이 끊긴다. 상호 인증이 필요 없으면 no 로 두되, 그만큼 접근 제어를 requirepass/ACL 과 방화벽으로 채워야 한다.
인증서의 CN 또는 SAN 이 접속에 쓰는 호스트 이름과 달라도 검증에 실패한다. IP 로 붙는다면 인증서 SAN 에 IP 를 넣는다.
인증서를 갱신했으면 다시 읽혀야 한다. 파일만 바꿔도 서버는 예전 것을 쓰고 있으므로 재시작하거나 CONFIG SET tls-cert-file ... 로 갱신한다.
모니터링 도구와 exporter 도 TLS 로 붙도록 함께 바꾼다. 평문 포트를 닫는 순간 이들이 먼저 끊긴다.