웹사이트 검색

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


소개

Redis는 유연성, 성능 및 광범위한 언어 지원으로 잘 알려진 메모리 내 키-값 저장소입니다. 이 튜토리얼은 Ubuntu 18.04 서버에서 Redis를 설치, 구성 및 보호하는 방법을 보여줍니다.

전제 조건

이 가이드를 완료하려면 sudo 권한이 있고 기본 방화벽이 구성된 루트가 아닌 사용자가 있는 Ubuntu 18.04 서버에 액세스해야 합니다. 초기 서버 설정 가이드에 따라 설정할 수 있습니다.

시작할 준비가 되면 sudo 사용자로 Ubuntu 18.04 서버에 로그인하고 아래에서 계속 진행하십시오.

1단계 - Redis 설치 및 구성

Redis의 최신 버전을 얻기 위해 apt를 사용하여 공식 Ubuntu 리포지토리에서 설치합니다.

먼저 최근에 수행하지 않은 경우 로컬 apt 패키지 캐시를 업데이트합니다.

  1. sudo apt update

그런 다음 다음을 입력하여 Redis를 설치합니다.

  1. sudo apt install redis-server

이렇게 하면 Redis와 해당 종속성이 다운로드되고 설치됩니다. 다음으로 설치 중에 자동으로 생성된 Redis 구성 파일에서 중요한 구성 변경 사항이 하나 있습니다.

원하는 텍스트 편집기로 이 파일을 엽니다.

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

파일 내에서 supervised 지시문을 찾습니다. 이 지시문을 사용하면 Redis를 서비스로 관리하는 init 시스템을 선언하여 해당 작업을 더 잘 제어할 수 있습니다. supervised 지시문은 기본적으로 no로 설정됩니다. systemd init 시스템을 사용하는 Ubuntu를 실행 중이므로 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 구성 파일에 대해 수행해야 하는 유일한 변경 사항이므로 완료되면 저장하고 닫습니다. 그런 다음 Redis 서비스를 다시 시작하여 구성 파일에 대한 변경 사항을 반영합니다.

  1. sudo systemctl restart redis.service

이것으로 Redis를 설치하고 구성했으며 머신에서 실행 중입니다. 그러나 사용을 시작하기 전에 Redis가 올바르게 작동하는지 먼저 확인하는 것이 좋습니다.

2단계 - Redis 테스트

새로 설치된 소프트웨어와 마찬가지로 구성을 추가로 변경하기 전에 Redis가 예상대로 작동하는지 확인하는 것이 좋습니다. 이 단계에서는 Redis가 올바르게 작동하는지 확인하는 몇 가지 방법을 살펴보겠습니다.

Redis 서비스가 실행 중인지 확인하여 시작합니다.

  1. sudo systemctl status redis

오류 없이 실행 중인 경우 이 명령은 다음과 유사한 출력을 생성합니다.

Output
● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-06-27 18:48:52 UTC; 12s ago Docs: http://redis.io/documentation, man:redis-server(1) Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS) Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS) Main PID: 2445 (redis-server) Tasks: 4 (limit: 4704) CGroup: /system.slice/redis-server.service └─2445 /usr/bin/redis-server 127.0.0.1:6379 . . .

여기에서 Redis가 실행 중이고 이미 활성화되어 있음을 알 수 있습니다. 즉, 서버가 부팅될 때마다 시작되도록 설정되어 있습니다.

참고: 이 설정은 Redis의 많은 일반적인 사용 사례에 바람직합니다. 그러나 서버가 부팅될 때마다 Redis를 수동으로 시작하려면 다음 명령을 사용하여 이를 구성할 수 있습니다.

  1. sudo systemctl disable redis

Redis가 올바르게 작동하는지 테스트하려면 명령줄 클라이언트를 사용하여 서버에 연결합니다.

  1. redis-cli

다음 프롬프트에서 ping 명령으로 연결을 테스트합니다.

  1. ping
Output
PONG

이 출력은 서버 연결이 아직 살아 있음을 확인합니다. 다음으로 다음을 실행하여 키를 설정할 수 있는지 확인합니다.

  1. set test "It's working!"
Output
OK

다음을 입력하여 값을 검색합니다.

  1. get test

모든 것이 작동한다고 가정하면 저장한 값을 검색할 수 있습니다.

Output
"It's working!"

값을 가져올 수 있음을 확인한 후 Redis 프롬프트를 종료하여 셸로 돌아갑니다.

  1. exit

마지막 테스트로 Redis가 중지되거나 다시 시작된 후에도 데이터를 유지할 수 있는지 확인합니다. 이렇게 하려면 먼저 Redis 인스턴스를 다시 시작합니다.

  1. sudo systemctl restart redis

그런 다음 명령줄 클라이언트에 다시 한 번 연결하고 테스트 값을 계속 사용할 수 있는지 확인합니다.

  1. redis-cli
  1. get test

키 값은 계속 액세스할 수 있어야 합니다.

Output
"It's working!"

완료되면 다시 셸로 종료합니다.

  1. exit

이를 통해 Redis 설치가 완벽하게 작동하고 사용할 준비가 되었습니다. 그러나 일부 기본 구성 설정은 안전하지 않으며 악의적인 행위자가 서버와 해당 데이터를 공격하고 액세스할 수 있는 기회를 제공합니다. 이 자습서의 나머지 단계에서는 공식 Redis 웹 사이트에서 규정한 대로 이러한 취약성을 완화하는 방법을 다룹니다. 이러한 단계는 선택 사항이며 따르지 않아도 Redis가 계속 작동하지만 시스템 보안을 강화하기 위해 완료하는 것이 적극 권장됩니다.

3단계 - localhost에 바인딩

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

이를 수정하려면 편집을 위해 Redis 구성 파일을 엽니다.

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

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

bind 127.0.0.1 ::1

완료되면 파일을 저장하고 닫습니다(CTRL + X, Y, ENTER를 차례로 누름).

그런 다음 systemd가 변경 사항을 읽을 수 있도록 서비스를 다시 시작합니다.

  1. sudo systemctl restart redis

이 변경 사항이 적용되었는지 확인하려면 다음 netstat 명령을 실행하십시오.

  1. sudo netstat -lnp | grep redis
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 14222/redis-server tcp6 0 0 ::1:6379 :::* LISTEN 14222/redis-server

이 출력은 Redis 구성 파일의 bind 설정을 반영하여 redis-server 프로그램이 localhost(127.0.0.1)에 바인딩되었음을 보여줍니다. 해당 열에 다른 IP 주소(예: 0.0.0.0)가 표시되면 올바른 행의 주석을 제거했는지 다시 확인하고 Redis 서비스를 다시 시작해야 합니다.

이제 Redis 설치는 localhost에서만 수신 대기하므로 악의적인 행위자가 요청을 하거나 서버에 대한 액세스 권한을 얻는 것이 더 어려워질 것입니다. 그러나 Redis는 현재 구성이나 보유한 데이터를 변경하기 전에 사용자가 자신을 인증하도록 요구하도록 설정되어 있지 않습니다. 이 문제를 해결하기 위해 Redis에서는 사용자가 Redis 클라이언트(redis-cli)를 통해 변경하기 전에 암호로 인증하도록 요구할 수 있습니다.

4단계 - Redis 비밀번호 구성

Redis 암호를 구성하면 클라이언트가 데이터베이스에 액세스하려면 인증을 요구하는 auth 명령이라는 두 가지 기본 제공 보안 기능 중 하나가 활성화됩니다. 비밀번호는 Redis의 구성 파일인 /etc/redis/redis.conf에서 직접 구성되므로 선호하는 편집기로 해당 파일을 다시 여십시오.

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

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

# requirepass foobared

#를 제거하여 주석을 제거하고 fobared를 보안 암호로 변경하십시오.

참고: requirepass 파일의 requirepass 지시문 위에 주석 처리된 경고가 있습니다.

# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#

따라서 매우 강력하고 매우 긴 값을 비밀번호로 지정하는 것이 중요합니다. 비밀번호를 직접 구성하는 대신 openssl 명령을 사용하여 다음 예와 같이 임의의 비밀번호를 생성할 수 있습니다. 여기에 표시된 것처럼 첫 번째 명령의 출력을 두 번째 openssl 명령으로 파이프하면 첫 번째 명령에서 생성된 모든 줄바꿈이 제거됩니다.

  1. openssl rand 60 | openssl base64 -A

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

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

해당 명령의 출력을 복사하여 requirepass의 새 값으로 붙여 넣으면 다음과 같아야 합니다.

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

  1. sudo systemctl restart redis.service

암호가 작동하는지 테스트하려면 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 클라이언트에서 명령을 실행할 수 있음을 확인한 후 redis-cli를 종료할 수 있습니다.

  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 서버의 보안을 강화하기 위한 좋은 출발점입니다.

명령을 비활성화하거나 이름을 바꿔야 하는지 여부는 특정 요구 사항이나 사이트 요구 사항에 따라 다릅니다. 악용될 수 있는 명령을 절대 사용하지 않을 것임을 알고 있다면 비활성화할 수 있습니다. 그렇지 않으면 이름을 바꾸는 것이 가장 좋을 수 있습니다.

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 지시문을 추가하고 그 뒤에 빈 문자열을 추가하면 FLUSHDB, FLUSHALLDEBUG가 됩니다. 이 Redis 설치에서 비활성화됩니다.

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

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

이 예에서는 SHUTDOWNCONFIG 명령의 이름을 각각 SHUTDOWN_MENOTASC12_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'

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

  1. asc12_config get requirepass

Redis의 config 명령을 실행하는 사람은 누구나 설치 구성 파일과 상호 작용할 수 있습니다. get과 조합되고 구성 파일의 지시문이 뒤따라오면 이 명령은 해당 지시문과 현재 설정을 반환합니다.

Output
1) "requirepass" 2) "your_redis_password"

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

  1. exit

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

Output
NOAUTH Authentication required.

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

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

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

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

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

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

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

참고: Redis 프로젝트는 "마스터\ 및 "슬레이브\라는 용어를 사용하는 반면 DigitalOcean은 일반적으로 "기본\ 및 "레플리카\라는 용어를 선호합니다. 혼동을 피하기 위해 Redis 설명서에 사용된 용어를 여기에서 사용하기로 했습니다.

결론

이 자습서에서는 Redis를 설치 및 구성하고 Redis 설치가 올바르게 작동하는지 확인했으며 내장된 보안 기능을 사용하여 악의적인 행위자의 공격에 덜 취약하도록 만들었습니다.

누군가가 귀하의 서버에 로그인하면 우리가 마련한 Redis 관련 보안 기능을 우회하기가 매우 쉽다는 점을 명심하십시오. 따라서 Redis 서버에서 가장 중요한 보안 기능은 방화벽(필수 조건인 초기 서버 설정 자습서를 따랐을 경우 구성한 방화벽)입니다. 이는 악의적인 행위자가 해당 울타리를 뛰어넘는 것을 극도로 어렵게 만들기 때문입니다.