웹사이트 검색

Ubuntu 14.04에서 Redis 설치를 보호하는 방법


소개

Redis는 메모리 내, NoSQL, 키-값 캐시 및 저장소이며 디스크에도 지속할 수 있습니다.

이 튜토리얼은 Redis 서버에 대한 기본 보안을 구현하는 방법을 보여줍니다.

그러나 Redis는 자체의 강력한 보안 기능 없이 신뢰할 수 있는 환경에서 신뢰할 수 있는 클라이언트가 사용하도록 설계되었다는 점을 명심하십시오. 그 점을 강조하기 위해 다음은 공식 Redis 웹 사이트의 인용문입니다.

Redis는 신뢰할 수 있는 환경 내에서 신뢰할 수 있는 클라이언트가 액세스하도록 설계되었습니다. 즉, 일반적으로 Redis 인스턴스를 인터넷에 직접 노출하거나 일반적으로 신뢰할 수 없는 클라이언트가 Redis TCP 포트 또는 UNIX 소켓에 직접 액세스할 수 있는 환경에 노출하는 것은 좋지 않습니다.

. . .

일반적으로 Redis는 최대 보안이 아니라 최대 성능과 단순성을 위해 최적화되어 있습니다.

보안이 없는 성능과 단순성은 재앙의 비결입니다. Redis가 제공하는 몇 가지 보안 기능도 별로 칭찬할 것이 없습니다. 여기에는 암호화되지 않은 기본 암호, 이름 바꾸기 및 비활성화 명령이 포함됩니다. 진정한 액세스 제어 시스템이 없습니다.

그러나 기존 보안 기능을 구성하는 것은 데이터베이스를 보안되지 않은 상태로 두는 것보다 여전히 큰 단계입니다.

이 튜토리얼에서는 Redis에 있는 몇 가지 보안 기능과 Ubuntu 14.04에서 독립 실행형 Redis 설치의 보안 상태를 강화하는 몇 가지 다른 시스템 보안 기능을 구성하는 방법을 읽습니다.

이 가이드는 Redis 서버와 클라이언트 애플리케이션이 서로 다른 호스트 또는 서로 다른 데이터 센터에 있는 상황을 다루지 않습니다. Redis 트래픽이 안전하지 않거나 신뢰할 수 없는 네트워크를 통과해야 하는 설치에는 여기에 제공된 것 외에도 Redis 머신 간에 SSL 프록시 또는 VPN 설정과 같은 완전히 다른 구성 세트가 필요합니다.

전제 조건

이 자습서에는 다음이 필요합니다.

  • 초기 서버 설정에서 sudo 사용자가 추가된 Ubuntu 14.04 서버
  • 이 iptables 가이드를 사용하여 구성된 iptables는 (선택 사항) 네임서버 업데이트 단계까지 진행됩니다(네임서버 구성 부분을 수행하지 않으면 APT가 작동하지 않음). 네임서버 설정하면 끝\n
  • 이 Redis 가이드에서 2단계 — Redis 마스터 구성 단계까지의 마스터 전용 설치 지침을 사용하여 Redis가 설치되고 작동합니다.\n

1단계 - Redis가 실행 중인지 확인

먼저 SSH를 사용하여 서버에 로그인합니다.

  1. ssh username@server-ip-address

Redis가 작동하는지 확인하려면 Redis 명령줄을 사용합니다. redis-cli 명령은 Redis 명령줄에 액세스하는 데 사용됩니다.

  1. redis-cli

이미 Redis에 대한 비밀번호를 설정한 경우 연결 후 auth해야 합니다.

  1. auth your_redis_password
OK

데이터베이스 서버를 테스트합니다.

  1. ping

응답:

PONG

출구:

  1. quit

2단계 — iptables로 서버 보안

iptables의 전제 조건을 따랐다면 이 단계를 건너뛰어도 됩니다. 또는 지금 할 수 있습니다.

Redis는 서버에서 실행되는 애플리케이션일 뿐이며 자체 보안 기능이 없기 때문에 Redis를 진정으로 보호하는 첫 번째 단계는 먼저 실행 중인 서버를 보호하는 것입니다.

Ubuntu 14.04 서버와 같은 공용 서버의 경우 이 iptables 가이드에 제공된 대로 방화벽을 구성하는 것이 첫 번째 단계입니다. 해당 링크를 따라 지금 방화벽을 설정하십시오.

해당 가이드를 사용하여 방화벽 규칙을 구현한 경우 Redis에 대한 추가 규칙을 추가할 필요가 없습니다. 기본적으로 명시적으로 허용되지 않는 한 모든 수신 트래픽이 삭제되기 때문입니다. Redis 서버의 기본 독립 실행형 설치는 루프백 인터페이스(127.0.0.1 또는 localhost)에서만 수신하므로 기본 포트에서 들어오는 트래픽에 대해 걱정할 필요가 없습니다.

Redis에 대한 IP 주소를 구체적으로 허용해야 하는 경우 netstat 명령. 네 번째 열(여기서 127.0.0.1:6379)은 Redis와 연결된 IP 주소 및 포트 조합을 나타냅니다.

  1. sudo netstat -plunt | grep -i redis
tcp   0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8562/redis-server 1

방화벽 정책에서 이 IP 주소가 허용되는지 확인하십시오. 규칙을 추가하는 방법에 대한 자세한 내용은 이 iptables 기본 문서를 참조하세요.

3단계 - localhost에 바인딩

기본적으로 Redis 서버는 localhost에서만 액세스할 수 있습니다. 그러나 자습서를 따라 Redis 마스터 서버를 설정한 경우 어디에서나 연결할 수 있도록 구성 파일을 업데이트했습니다. 이는 localhost에 바인딩하는 것만큼 안전하지 않습니다.

편집을 위해 Redis 구성 파일을 엽니다.

  1. sudo nano /etc/redis/redis.conf

이 줄을 찾아 주석이 제거되었는지 확인합니다(#가 있으면 제거).

bind 127.0.0.1

이 파일을 계속 사용할 것이므로 지금은 열어 두십시오.

4단계 - Redis 비밀번호 구성

Ubuntu 14.04에서 Redis 클러스터를 구성하는 방법 문서를 사용하여 Redis를 설치한 경우 Redis에 대한 암호를 구성해야 합니다. 귀하의 재량에 따라 이 섹션에 따라 지금 더 안전한 암호를 만들 수 있습니다. 그렇지 않은 경우 이 섹션의 지침은 데이터베이스 서버 암호를 설정하는 방법을 보여줍니다.

Redis 암호를 구성하면 클라이언트가 데이터베이스에 액세스하려면 인증을 요구하는 auth 명령이라는 두 가지 기본 제공 보안 기능 중 하나가 활성화됩니다. 암호는 Redis의 구성 파일인 /etc/redis/redis.conf에서 직접 구성되며 이전 단계에서 열어 두어야 합니다.

SECURITY 섹션으로 스크롤하고 다음과 같은 주석 처리된 지시문을 찾습니다.

# requirepass foobared

#를 제거하여 주석을 제거하고 fobared를 매우 강력하고 매우 긴 값으로 변경합니다.

암호를 직접 구성하는 대신 apg 또는 pwgen과 같은 도구를 사용하여 암호를 생성할 수 있습니다. 암호를 생성하기 위해 응용 프로그램을 설치하지 않으려면 아래의 한 줄을 사용할 수 있습니다. 이것이 생성하는 것과 다른 암호를 생성하려면 따옴표로 묶인 단어를 변경하십시오.

  1. echo "digital-ocean" | sha256sum

출력은 다음과 같아야 합니다.

960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

생성된 암호는 발음할 수 없지만 Redis에 필요한 암호 유형과 정확히 일치하는 매우 강력하고 긴 암호를 제공합니다. 해당 명령의 출력을 복사하여 requirepass의 새 값으로 붙여 넣으면 다음과 같아야 합니다.

requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

더 짧은 암호를 선호하는 경우 대신 아래 명령의 출력을 사용하십시오. 다시 말하지만, 다음과 같은 암호를 생성하지 않도록 따옴표로 묶인 단어를 변경합니다.

  1. echo "digital-ocean" | sha1sum

이번에는 다소 짧은 출력을 얻을 수 있습니다.

10d9a99851a411cdae8c3fa09d7290df192441a9

비밀번호를 설정한 후 파일을 저장하고 Redis를 다시 시작합니다.

  1. sudo service redis-server restart

암호가 작동하는지 테스트하려면 Redis 명령줄에 액세스합니다.

  1. redis-cli

다음 출력은 Redis 암호가 작동하는지 여부를 테스트하는 데 사용되는 일련의 명령을 보여줍니다. 첫 번째 명령은 인증 전에 키를 값으로 설정하려고 시도합니다.

  1. set key1 10

작동하지 않으므로 Redis는 오류를 반환합니다.

(error) NOAUTH Authentication required.

두 번째 명령은 Redis 구성 파일에 지정된 비밀번호로 인증합니다.

  1. auth your_redis_password

레디스는 인정합니다.

OK

그런 다음 이전 명령을 다시 실행하면 성공합니다.

  1. set key1 10
OK

get key1은 Redis에 새 키 값을 쿼리합니다.

  1. get key1
"10"

마지막 명령은 redis-cli를 종료합니다. exit를 사용할 수도 있습니다.

  1. quit

다음으로 Redis 명령의 이름을 바꾸는 방법을 살펴보겠습니다.

5단계 - 위험한 명령 이름 바꾸기

Redis에 내장된 다른 보안 기능을 사용하면 위험한 것으로 간주되는 특정 명령의 이름을 바꾸거나 완전히 비활성화할 수 있습니다.

권한이 없는 사용자가 실행할 때 이러한 명령을 사용하여 데이터를 재구성, 파괴 또는 지울 수 있습니다. 인증 암호와 마찬가지로 이름 변경 또는 비활성화 명령은 /etc/redis/redis.conf 파일의 동일한 SECURITY 섹션에서 구성됩니다.

위험한 것으로 알려진 일부 명령에는 FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME 및 DEBUG가 포함됩니다. 포괄적인 목록은 아니지만 해당 목록에 있는 모든 명령의 이름을 바꾸거나 비활성화하는 것이 좋은 출발점입니다.

명령을 비활성화하거나 이름을 바꾸는 것은 사이트에 따라 다릅니다. 남용될 수 있는 명령을 절대 사용하지 않을 것임을 알고 있다면 비활성화할 수 있습니다. 그렇지 않으면 이름을 바꿉니다.

Redis 명령을 활성화 또는 비활성화하려면 편집을 위해 구성 파일을 한 번 더 엽니다.

  1. sudo nano /etc/redis/redis.conf

다음은 예입니다. 자신에게 맞는 명령을 비활성화하거나 이름을 바꾸도록 선택해야 합니다. 명령을 직접 확인하고 redis.io/commands에서 오용될 수 있는 방법을 확인할 수 있습니다.

명령을 비활성화하거나 종료하려면 아래와 같이 이름을 빈 문자열로 바꾸십시오.

# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

명령의 이름을 바꾸려면 아래 예와 같이 다른 이름을 지정하십시오. 이름이 변경된 명령은 다른 사람이 추측하기 어렵지만 기억하기 쉬워야 합니다. 자신의 삶을 어렵게 만들지 마십시오.

rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

변경 사항을 저장합니다.

명령 이름을 바꾼 후 Redis를 다시 시작하여 변경 사항을 적용합니다.

  1. sudo service redis-server restart

새 명령을 테스트하려면 Redis 명령줄을 입력합니다.

  1. redis-cli

그런 다음 CONFIG 명령의 이름을 ASC12_CONFIG로 변경했다고 가정하면 다음 출력은 새 명령이 적용되었는지 테스트하는 방법을 보여줍니다.

인증 후:

  1. auth your_redis_password
OK

config 명령을 사용하려는 첫 번째 시도는 이름이 바뀌었기 때문에 실패해야 합니다.

  1. config get requirepass
(error) ERR unknown command 'config'

이름이 바뀐 명령을 성공적으로 호출해야 합니다(대소문자 구분 안 함).

  1. asc12_config get requirepass
1) "requirepass"
2) "your_redis_password"

마지막으로 redis-cli를 종료할 수 있습니다.

  1. exit

참고: 이미 Redis 명령줄을 사용하고 있는 경우 Redis를 다시 시작하면 다시 인증해야 합니다. 그렇지 않으면 다음 명령을 입력하면 이 오류가 발생합니다.

NOAUTH Authentication required.

이름 바꾸기 명령과 관련하여 /etc/redis/redis.confSECURITY 섹션 끝에 다음과 같은 주의 사항이 있습니다.

AOF 파일에 기록되거나 슬레이브로 전송되는 명령의 이름을 변경하면 문제가 발생할 수 있습니다.

즉, 이름이 변경된 명령이 AOF 파일에 없거나 존재하지만 AOF 파일이 슬레이브에 전송되지 않은 경우 문제가 없어야 합니다.

따라서 명령의 이름을 바꾸려고 할 때 이 점을 염두에 두십시오. 명령의 이름을 바꾸는 가장 좋은 시기는 AOF 지속성을 사용하지 않을 때 또는 설치 직후, 즉 Redis 사용 애플리케이션이 배포되기 전입니다.

AOF를 사용하고 마스터-슬레이브 설치를 처리할 때 프로젝트의 GitHub 문제 페이지에서 이 답변을 고려하십시오. 다음은 작성자의 질문에 대한 답변입니다.

명령은 AOF에 기록되고 전송된 것과 동일한 방식으로 슬레이브에 복제되므로 동일한 이름 변경이 없는 인스턴스에서 AOF를 재생하려고 하면 명령을 실행할 수 없기 때문에 불일치에 직면할 수 있습니다( 노예도 마찬가지)

따라서 이와 같은 경우 이름 변경을 처리하는 가장 좋은 방법은 이름이 변경된 명령이 마스터-슬레이브 설치의 모든 인스턴스에 적용되는지 확인하는 것입니다.

6단계 - 데이터 디렉토리 소유권 및 파일 권한 설정

이 단계에서는 Redis 설치의 보안 프로필을 개선하기 위해 수행할 수 있는 몇 가지 소유권 및 권한 변경 사항을 고려합니다. 여기에는 Redis에 액세스해야 하는 사용자만 해당 데이터를 읽을 수 있는 권한이 있는지 확인하는 작업이 포함됩니다. 해당 사용자는 기본적으로 redis 사용자입니다.

상위 디렉토리의 긴 목록에서 Redis 데이터 디렉토리에 대해 grep을 수행하여 이를 확인할 수 있습니다. 명령과 그 출력은 다음과 같습니다.

  1. ls -l /var/lib | grep redis
drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

Redis 데이터 디렉터리는 redis 사용자가 소유하고 redis 그룹에 보조 액세스 권한이 부여된 것을 볼 수 있습니다. 그 부분이 좋습니다.

그렇지 않은 부분은 폴더의 권한인 755입니다. Redis 사용자만 폴더와 해당 콘텐츠에 액세스할 수 있도록 하려면 권한을 700으로 변경합니다.

  1. sudo chmod 700 /var/lib/redis

변경해야 하는 다른 권한은 Redis 구성 파일의 권한입니다. 기본적으로 파일 권한은 644이며 루트가 소유하고 루트 그룹이 2차 소유권을 갖습니다.

  1. ls -l /etc/redis/redis.conf
-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis/redis.conf

해당 권한(644)은 4단계에서 구성한 암호화되지 않은 암호를 포함하기 때문에 누구나 읽을 수 있지만 좋은 생각이 아닙니다.

소유권과 권한을 변경해야 합니다. 이상적으로는 redis 사용자가 소유하고 루트 사용자가 2차 소유권을 가져야 합니다. 그렇게 하려면 다음 명령을 실행하십시오.

  1. sudo chown redis:root /etc/redis/redis.conf

그런 다음 파일 소유자만 파일을 읽거나 쓸 수 있도록 소유권을 변경합니다.

  1. sudo chmod 600 /etc/redis/redis.conf

다음을 사용하여 새 소유권 및 권한을 확인할 수 있습니다.

  1. ls -l /etc/redis/redis.conf
total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf

마지막으로 Redis를 다시 시작합니다.

  1. sudo service redis-server restart

결론

누군가가 귀하의 서버에 로그인하면 우리가 배치한 Redis 관련 보안 기능을 우회하기가 매우 쉽다는 점을 명심하십시오. 따라서 가장 중요한 보안 기능은 울타리를 뛰어넘는 것을 극도로 어렵게 만드는 것입니다.

그것이 당신의 방화벽이어야 합니다.

서버 보안을 한 단계 더 높이려면 OSSEC와 같은 침입 탐지 시스템을 구성할 수 있습니다. Ubuntu 14.04에서 OSSEC를 구성하려면 이 OSSEC 가이드를 참조하세요.

신뢰할 수 없는 네트워크에서 Redis 통신을 보호하려는 경우 공식 Redis 보안 가이드에서 Redis 개발자가 권장하는 대로 SSL 프록시를 사용해야 합니다. Redis 통신을 보호하기 위해 SSL 프록시를 설정하는 것은 별도의 주제입니다.

이름 바꾸기 섹션에 Redis 명령의 전체 목록을 포함하지 않았습니다. 그러나 이를 직접 확인하고 redis.io/commands에서 어떻게 오용될 수 있는지 확인할 수 있습니다.