코딩하는 오징어

Redis의 데이터 보호하기 본문

Database/Redis

Redis의 데이터 보호하기

코딩하는 오징어 2018. 4. 9. 20:23
반응형

Redis의 데이터 보호하기

Redis는 많은 곳에 적용 할 수 있는 훌륭한 IN-Memory NoSQL DB이다. 세션 관리를 위해 Redis를 많이 사용하는데 누군가에게 데이터를 탈취 당한다면 인증을 하지않은 사용자가 서버를 휘젓고 다닐 수 있다. 그렇기 때문에 Redis 인스턴스를 보호하는 것은 굉장히 중요하다.

다음과 같이 세 가지 방법으로 Redis 인스턴스들을 보호할 수 있다.

  • 비밀번호 설정하기
  • 커맨드 명령어 바꾸기
  • 네트워크 보안

비밀번호 설정하기

Redis를 설계했을 때, Redis의 주요 목표는 최고의 보안 수준보다는 최고의 성능과 단순성이었다. Redis가 평문 패스워드를 기반으로 하는 기본 보안 메커니즘을 구현했지만, Redis는 접근 제어 목록(Access Control List, ACL)을 구현하지 않았다. 따라서, 퍼미션 레벨 단위로 사용자를 구분 설정할 수 없다. 인증 기능은 requirepass 설정으로 활성화할 수 있다. Redis는 굉장한 속도를 자랑하기 때문에 악성 유저가 초당 수천 개의 패스워드를 요청해 잠재적으로 알아맞힐 수 있기 때문에 이 방법만으로 데이터를 보호하는 것은 추천하지 않는다.

커맨드 명령어 바꾸기

누군가 당신의 Redis에 접근하여 FLUSHALL커맨드를 날렸다고 해보자. 이 얼마나 황당한 일인가. 때려죽여도 모자랄 그 누군가를 탓 할 필요없다. 당신이 조금만 더 신경써서 대처했다면 일어나지 않을일이다. 커맨드를 바꿔서 당신만이 FLUSHALL을 할 수 있게 하자. FLUSHDB, FLUSHALL, CONFIG, KEYS, DEBUG, SAVE와 같은 중요한 커맨드는 알기 어렵게 하거나, 사용을 금지시켜야한다. 특정 커맨드의 사용을 금지하려면, 새로운 이름을 빈 문자열로 설정해야 한다. 커맨드를 변경하기 위해서는 rename-commands.conf라는 설정 파일을 생성해야한다. redis.conf에 include 지시자를 사용해 rename-commands.conf파일을 포함시킨다.

  • rename-commands.conf 파일 내용(example)

rename-command FLUSHDB eaiojaesihf192370189f0uaf
rename-command FLUSHALL aksjdfi21hajsdfh8923ajkd
rename-command CONFIG ""
rename-command KEYS ""
rename-command DEBUG ""
rename-command SAVE ""

rename-commands.conf파일을 작성했다면 redis.conf파일에 include /path/rename-commands.conf를 추가한 후, redis-server를 재시작한다.

네트워크 보안

신뢰할 만한 네트워크에서 Redis를 실행해야 하지만, 현재 많은 Redis 서버를 공개된 클라우드에 배포하고 있기 때문에 보안에 더욱 신경 써야 한다. 다음은 네트워크 설정으로 Redis를 안전하게 보호할 여러 방법이다.

  • 방화벽 규칙을 사용
  • 공개된 클라우드에서 네트워크 인터페이스로 바로 접속하지 못하게하고, 루프백 인터페이스로 Redis 실행
  • 공용 인터넷 대신 가상 사설 클라우드(VPC)에서 Redis실행
  • 클라이언트와 서버 간의 통신 암호화

방화벽 규칙을 사용

방화벽 규칙은 레디스 서버를 보호할 수 있는 안전한 대안이며, 접근 가능한 클라이언트가 접속하지 못하도록 신뢰할 수 있는 사이더(Classes Inter-Domain Routing, CIDR)의 모든 블록 리스트를 요구한다. 유닉스 기반 서버에서 방화벽 규칙을 설정하라면 iptables 프로그램을 사용할 수 있다. iptables사용법은 리눅스 탭에서 소개하도록 하겠다. 클라우드에서 Redis가 실행 중 이라면, 클라우드 공급자의 문서를 확인하자. (AWS를 사용하고 있다면 보안 그룹(security group)을 설정하는 방법을 설명한 문서를 확인)

루프백 네트워크 인터페이스로 Redis 실행

웹 애플리케이션과 redis-server가 동일 장비에서 실행되는 상황에서, redis-server를 루프백 인터페이스(127.0.0.1)에 바인드할 수 있다. 이 방식은 외부에서 Redis의 접속을 막는 방식이고 루프백 인터페이스는 물리적인 네트워크 인터페이스보다 빠르다(루프백 인터페이스는 주소를 절대 변경할 수 없는 가상 인터페이스다.) 다음 내용을 redis.conf파일에 포함시킴으로써 redis-server를 루프백 인터페이스에 바인드할 수 있다.

bind 127.0.0.1
코드를 변경한 후, redis-server를 재실행한다.

가상 사설 클라우드에서 Redis를 실행

현재 일부 공용 클라우드 공급자는 가상 사설 클라우드(Virtual Private Clouds, VPCs)서비스를 제공하고 있으며, 가상 사설 클라우드는 Redis 서버의 보안 관리에 매우 유용한 툴이 되기도 한다. VPC는 공용 클라우드에서 실행되는 주문형 자원 풀(Pool)이다. VPC의 자원은 동일한 공용 클라우드의 다른 사용자로부터 격리된다. 예를 들어, 제한하는 방화벽 규칙을 정의한 것이 전혀 없다면, 모든 장비는 공용 클라우드에서 서로 연결될 수 있지만, VPC에서는 장비끼리 서로 연결 될 수 없다. 동일한 VPC의 장비들만 서로 연결 될 수 있다.

클라이언트와 서버 간의 통신 암호화

Redis는 어떠한 암호화도 지원하지 않는다. 클라이언트-서버 연결에 암호화를 적용하려면, 별도의 툴이 필요하다. SSL(TLS)을 이용해 Redis 통신을 암호화하면, 네트워크를 도청하려는 악의적인 공격자를 막을 수 있고, SSL(TLS) 키를 가진 신뢰할 수 있는 클라이언트만이 Redis에 연결할 수 있게한다. Redis 통신을 암호화할 수 있는 툴은 stunnel이다. stunnel은 로컬 클라이언트와 로컬 또는 원격 서버 간의 통신을 SSL로 암호화하는 래퍼(wrapper)다.

  • stunnel은 보안 터널(secure tunnel)이라고도 불린다. 특정 프로토콜 기반 위에 외부 프로토콜을 사용하는 것을 터널링(tunneling)프로토콜이라고 하는데, stunnel은 SSL암호화를 적용한 터널링 프로토콜을 적용한 것이라 할 수 있다.

이상 글을 마치겠다. 간단하게만 소개했으니 위 방법들을 적용하려면 키워드를 잡고 구글링을 하거나 Redis doc을 확인해보자.

참고자료: Redis 핵심정리 chapter 7

반응형
Comments