웹사이트 검색

Rocky Linux 9에서 Redis를 설치하고 보호하는 방법


소개

Redis는 캐싱에 뛰어난 오픈 소스 메모리 내 키-값 데이터 저장소입니다. Redis는 유연성, 성능, 확장성 및 광범위한 언어 지원으로 알려진 비관계형 데이터베이스입니다.

Redis는 신뢰할 수 있는 환경에서 신뢰할 수 있는 클라이언트가 사용하도록 설계되었으며 자체적으로 강력한 보안 기능이 없습니다. 그러나 Redis에는 암호 인증 및 일부 명령의 이름을 바꾸거나 비활성화하는 기능과 같은 몇 가지 보안 기능이 있습니다. 이 자습서에서는 Redis를 설치하고 이러한 보안 기능을 구성하는 방법에 대한 지침을 제공합니다. 또한 Rocky Linux 9에서 독립 실행형 Redis 설치의 보안을 강화할 수 있는 몇 가지 다른 설정도 다룹니다.

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

전제 조건

이 튜토리얼을 완료하려면 Rocky Linux 9를 실행하는 서버가 필요합니다. 이 서버에는 관리 권한이 있는 루트가 아닌 사용자와 firewalld로 구성된 방화벽이 있어야 합니다. 이를 설정하려면 Rocky Linux 9용 초기 서버 설정 가이드를 따르십시오.

1단계 - Redis 설치 및 시작

DNF 패키지 관리자를 사용하여 Redis를 설치할 수 있습니다. DNF를 사용하여 Redis, 해당 종속성 및 사용자 친화적인 텍스트 편집기인 nano를 설치할 수 있습니다. nano를 설치할 필요는 없지만 이 가이드 전체의 예제에서 사용합니다.

  1. sudo dnf install redis nano

이 명령은 선택한 패키지를 설치할지 묻는 메시지를 표시합니다. y를 누른 다음 ENTER를 눌러 이렇게 합니다.

Output
. . . Total download size: 2.0 M Installed size: 7.4 M Is this ok [y/N]: y

다음으로 설치 중에 자동으로 생성된 Redis 구성 파일에서 중요한 구성 변경 사항이 하나 있습니다.

원하는 텍스트 편집기로 이 파일을 엽니다. 여기서는 nano를 사용합니다.

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

파일 내에서 supervised 지시문을 찾습니다. 이 지시문을 사용하면 Redis를 서비스로 관리하는 init 시스템을 선언하여 해당 작업을 더 잘 제어할 수 있습니다. supervised 지시문은 기본적으로 no로 설정됩니다. systemd init 시스템을 사용하는 Rocky Linux를 실행 중이므로 필요한 경우 줄의 주석을 제거하고(시작 부분에서 #를 제거하여) systemd로 변경합니다.

. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

이 시점에서 Redis 구성 파일에 대해 수행해야 하는 유일한 변경 사항이므로 완료되면 저장하고 닫습니다. nano를 사용하여 파일을 편집한 경우 CTRL + X를 눌러 저장하고 종료한 다음 메시지가 표시되면 Y를 누른 다음 Enter를 누릅니다.

파일을 편집한 후 Redis 서비스를 시작합니다.

  1. sudo systemctl start redis.service

부팅 시 Redis를 시작하려면 enable 명령을 사용하여 Redis를 활성화할 수 있습니다.

  1. sudo systemctl enable redis

이 명령에는 유닛 파일 이름 뒤에 .service 접미사가 포함되어 있지 않습니다. 이 접미사는 서비스 이름에서 자동으로 구문 분석될 수 있으므로 일반적으로 systemctl 명령에서 제외할 수 있습니다.

다음을 실행하여 Redis의 상태를 확인할 수 있습니다.

  1. sudo systemctl status redis
Output
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago Main PID: 14478 (redis-server) Tasks: 4 (limit: 11152) Memory: 6.6M CGroup: /system.slice/redis.service └─14478 /usr/bin/redis-server 127.0.0.1:6379

Redis가 실제로 실행 중임을 확인한 후 다음 명령을 사용하여 Redis의 기능을 테스트할 수 있습니다.

  1. redis-cli ping

응답으로 PONG이 인쇄되어야 합니다.

Output
PONG

이 경우 서버에서 Redis가 실행 중이며 보안을 강화하도록 구성을 시작할 수 있음을 의미합니다.

2단계 - Redis 구성 및 방화벽으로 보호

Redis를 보호하는 효과적인 방법은 실행 중인 서버를 보호하는 것입니다. Redis가 로컬 호스트 또는 개인 IP 주소에만 바인딩되고 서버에 방화벽이 실행 중인지 확인하여 이를 수행할 수 있습니다.

그러나 다른 자습서를 사용하여 Redis를 설정하기로 선택한 경우 어디에서나 연결할 수 있도록 구성 파일을 업데이트했을 수 있습니다. 이는 localhost 또는 개인 IP에 바인딩하는 것만큼 안전하지 않습니다.

이 문제를 해결하려면 원하는 텍스트 편집기로 Redis 구성 파일을 다시 엽니다.

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

bind로 시작하는 줄을 찾아 줄 시작 부분에서 # 기호를 제거하여 주석 처리되거나 비활성화되지 않았는지 확인합니다. 필요한 것:

. . .
bind 127.0.0.1 -::1

Redis를 다른 IP 주소에 바인딩해야 하는 경우(별도의 호스트에서 Redis에 액세스하는 경우와 같이) 사설 IP 주소에 바인딩하는 것을 강력히 고려해야 합니다. 퍼블릭 IP 주소에 바인딩하면 외부 당사자에 대한 Redis 인터페이스의 노출이 증가합니다.

. . .
bind your_private_ip

bind 지시문이 주석 처리되지 않았는지 확인한 후 파일을 저장하고 닫을 수 있습니다.

필수 초기 서버 설정 자습서를 따랐고 서버에 firewalld를 설치했으며 다른 호스트에서 Redis에 연결할 계획이 없다면 Redis에 대한 추가 방화벽 규칙을 추가할 필요가 없습니다. 결국, 방화벽 규칙에서 명시적으로 허용하지 않는 한 들어오는 모든 트래픽은 기본적으로 삭제됩니다. Redis 서버의 기본 독립 실행형 설치는 루프백 인터페이스(127.0.0.1 또는 localhost)에서만 수신하므로 기본 포트에서 들어오는 트래픽에 대해 걱정할 필요가 없습니다.

그러나 다른 호스트에서 Redis에 액세스할 계획이라면 firewall-cmd 명령을 사용하여 firewalld 구성을 일부 변경해야 합니다. 다시 말하지만, 서비스가 노출되는 호스트 수를 제한하려면 사설 IP 주소를 사용하여 호스트에서 Redis 서버에 대한 액세스만 허용해야 합니다.

시작하려면 방화벽 정책에 전용 Redis 영역을 추가합니다.

  1. sudo firewall-cmd --permanent --new-zone=redis

그런 다음 열려 있는 포트를 지정합니다. Redis는 기본적으로 포트 6379를 사용합니다.

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

다음으로 방화벽을 통과하고 Redis에 액세스할 수 있도록 허용해야 하는 개인 IP 주소를 지정합니다.

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

이러한 명령을 실행한 후 방화벽을 다시 로드하여 새 규칙을 구현합니다.

  1. sudo firewall-cmd --reload

이 구성에서 방화벽이 클라이언트의 IP 주소에서 패킷을 발견하면 전용 Redis 영역의 규칙을 해당 연결에 적용합니다. 다른 모든 연결은 기본 public 영역에서 처리됩니다. 기본 영역의 서비스는 명시적으로 일치하지 않는 서비스뿐만 아니라 모든 연결에 적용되므로 Redis 영역에 다른 서비스(예: SSH)를 추가할 필요가 없습니다. 해당 규칙이 해당 연결에 자동으로 적용되기 때문입니다.

firewalld, ufw 또는 iptables를 사용하는지 여부에 관계없이 모든 방화벽 도구를 사용할 수 있습니다. 중요한 것은 알 수 없는 개인이 서버에 액세스할 수 없도록 방화벽이 실행되고 있다는 것입니다. 다음 단계에서는 강력한 암호로만 액세스할 수 있도록 Redis를 구성합니다.

3단계 - Redis 비밀번호 구성

Redis 암호를 구성하면 내장 보안 기능 중 하나인 auth 명령이 활성화되어 클라이언트가 데이터베이스에 액세스하기 전에 인증해야 합니다. bind 설정과 마찬가지로 비밀번호는 Redis의 구성 파일인 /etc/redis/redis.conf에서 직접 구성됩니다. 해당 파일을 다시 엽니다.

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

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

. . .
# requirepass foobared

#를 제거하여 주석을 제거하고 fobared를 선택한 매우 강력한 비밀번호로 변경하십시오.

참고: 암호를 직접 만드는 대신 apg 또는 pwgen과 같은 도구를 사용하여 암호를 생성할 수 있습니다. 비밀번호를 생성하기 위해 애플리케이션을 설치하지 않으려면 아래 명령을 사용할 수 있습니다. 이 명령은 문자열 값을 에코하고 문자열의 SHA256 체크섬을 표시하는 다음 sha256sum 명령으로 파이프합니다.

작성된 대로 이 명령을 입력하면 매번 동일한 암호가 생성된다는 점에 유의하십시오. 고유한 암호를 만들려면 따옴표로 묶인 문자열을 다른 단어나 구로 변경합니다.

  1. echo "digital-ocean" | sha256sum

생성된 암호는 기억하기 어렵지만 Redis에 필요한 암호 유형과 정확히 일치하는 매우 강력하고 길 것입니다. 해당 명령의 출력을 복사하여 requirepass의 새 값으로 붙여 넣으면 다음과 같아야 합니다.

. . .
requirepass password_copied_from_output

또는 더 짧은 암호를 선호하는 경우 다른 체크섬의 출력을 대신 사용할 수 있습니다. 다시 말하지만 이 명령과 동일한 암호를 생성하지 않도록 따옴표로 묶인 단어를 변경합니다.

  1. echo "digital-ocean" | sha1sum

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

  1. sudo systemctl restart redis

암호가 작동하는지 테스트하려면 Redis 클라이언트를 엽니다.

  1. redis-cli

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

  1. set key1 10

아직 인증하지 않았기 때문에 작동하지 않으므로 Redis가 오류를 반환합니다.

Output
(error) NOAUTH Authentication required.

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

  1. auth your_redis_password

Redis는 사용자가 인증되었음을 확인합니다.

Output
OK

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

  1. set key1 10
Output
OK

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

  1. get key1
Output
"10"

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

  1. quit

권한이 없는 사용자가 Redis 설치에 액세스하는 것은 이제 매우 어려울 것입니다. Redis 명령줄 클라이언트를 이미 사용 중이고 Redis를 다시 시작하는 경우 다시 인증해야 합니다. 또한 SSL 또는 VPN이 없으면 Redis에 원격으로 연결하는 경우 이 비밀번호가 여전히 외부에서 가로챌 수 있습니다.

다음으로 이 가이드에서는 악의적인 행위자로부터 Redis를 더욱 보호하기 위해 Redis 명령의 이름을 바꾸는 방법을 살펴봅니다.

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

Redis에 내장된 또 다른 보안 기능을 사용하면 위험한 것으로 간주되는 특정 명령의 이름을 바꾸거나 완전히 비활성화할 수 있습니다. 권한이 없는 사용자가 실행할 때 이러한 명령을 사용하여 데이터를 재구성, 파기 또는 지우는 데 사용할 수 있습니다. 위험한 것으로 간주되는 일부 명령은 다음과 같습니다.

  • FLUSHDB
  • FLUSHALL
  • PEXPIRE
  • <코드>삭제
  • 구성
  • 종료
  • BGREWRITEAOF
  • BGSAVE
  • 저장
  • SPOP
  • SREM
  • 이름 바꾸기
  • 디버그

이것은 포괄적인 목록은 아니지만 이 목록에 있는 모든 명령의 이름을 바꾸거나 비활성화하면 데이터 저장소의 보안을 개선하는 데 도움이 될 수 있습니다. 주어진 명령을 비활성화하거나 이름을 바꿔야 하는지 여부는 특정 요구 사항에 따라 다릅니다. 악용될 수 있는 명령을 절대 사용하지 않을 것임을 알고 있다면 비활성화할 수 있습니다. 그렇지 않으면 대신 이름을 바꿔야 합니다.

인증 암호와 마찬가지로 이름 변경 또는 비활성화 명령은 /etc/redis/redis.conf 파일의 SECURITY 섹션에서 구성됩니다. Redis 명령을 활성화 또는 비활성화하려면 편집을 위해 구성 파일을 한 번 더 엽니다.

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

참고: 다음은 예입니다. 자신에게 맞는 명령을 비활성화하거나 이름을 바꾸도록 선택해야 합니다. Redis의 명령에 대해 자세히 알아보고 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 ""

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

# 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 SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

변경 사항을 저장하고 파일을 닫습니다. 그런 다음 Redis를 다시 시작하여 변경 사항을 적용합니다.

  1. sudo systemctl restart redis.service

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

  1. redis-cli

앞에서 정의한 암호를 사용하여 자신을 인증합니다.

  1. auth your_redis_password
Output
OK

CONFIG 명령의 이름을 ASC12_CONFIG로 변경했다고 가정하면 config 명령을 사용하려는 시도는 실패합니다.

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

대신 이름이 바뀐 명령을 호출하면 성공합니다. Redis 명령은 대소문자를 구분하지 않습니다.

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

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

  1. exit

경고: 이름 바꾸기 명령과 관련하여 /etc/redis/redis.conf 파일의 SECURITY 섹션 끝에 다음과 같은 주의 문구가 있습니다.

. . .

# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.

. . .

즉, 이름이 변경된 명령이 AOF 파일에 없거나 존재하지만 AOF 파일이 복제본으로 전송되지 않은 경우 문제가 없어야 합니다. 명령의 이름을 바꿀 때 이를 염두에 두십시오. 명령의 이름을 바꾸는 가장 좋은 시간은 AOF 지속성을 사용하지 않을 때 또는 설치 직후(즉, Redis 사용 애플리케이션이 배포되기 전)입니다.

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

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

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

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 6 22:22 redis

이 출력은 Redis 데이터 디렉토리가 redis 사용자가 소유하고 redis 그룹에 보조 액세스 권한이 부여되었음을 나타냅니다. 이 소유권 설정은 8진수 표기법을 사용하여 750으로 설정된 폴더의 권한과 마찬가지로 안전합니다.

Redis 데이터 디렉터리에 안전하지 않은 권한이 있는 경우 chmod 명령을 실행하여 Redis 사용자 및 그룹만 폴더와 해당 콘텐츠에 액세스할 수 있도록 할 수 있습니다. 다음 예에서는 이 폴더의 권한 설정을 770으로 변경합니다.

  1. sudo chmod 770 /var/lib/redis

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

  1. ls -l /etc/redis/redis.conf
Output
-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis/redis.conf

해당 권한(640)은 Redis 사용자와 루트 그룹만 Redis 구성 파일을 읽을 수 있음을 의미합니다. 구성 파일에는 4단계에서 구성한 암호화되지 않은 암호가 포함되어 있으므로 redis.conf는 redis 사용자가 소유하고 redis 그룹이 2차 소유권을 가져야 합니다. 이를 설정하려면 다음 명령을 실행하십시오.

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

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

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

이전 ls 명령을 다시 실행하여 새 소유권과 권한을 확인할 수 있습니다.

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
  1. ls -l /etc/redis/redis.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis/redis.conf

마지막으로 Redis를 다시 시작하여 다음 변경 사항을 반영합니다.

  1. sudo systemctl restart redis

이를 통해 Redis 설치가 보호되었습니다.

결론

누군가 서버에 로그인하면 Redis 관련 보안 기능을 우회할 수 있습니다. 그렇기 때문에 이 튜토리얼에서 다루는 가장 중요한 보안 기능은 알 수 없는 사용자가 처음부터 서버에 로그인하는 것을 방지하는 방화벽입니다.

신뢰할 수 없는 네트워크에서 Redis 통신을 보호하려는 경우 공식 Redis 보안 가이드에서 Redis 개발자가 권장하는 대로 SSL 프록시를 사용해야 합니다.