Как да инсталирате и защитите Redis на Rocky Linux 8


Въведение

Redis е хранилище на данни за ключ-стойност с отворен код в паметта, което превъзхожда кеширането. Redis е нерелационна база данни, известна със своята гъвкавост, производителност, мащабируемост и широка езикова поддръжка.

Redis е проектиран за използване от доверени клиенти в надеждна среда и няма собствени стабилни функции за сигурност. Redis обаче има няколко функции за сигурност като удостоверяване с парола и възможност за преименуване или деактивиране на някои команди. Този урок предоставя инструкции как да инсталирате Redis и да конфигурирате тези функции за сигурност. Той също така обхваща няколко други настройки, които могат да повишат сигурността на самостоятелна инсталация на Redis на Rocky Linux 8.

Обърнете внимание, че това ръководство не разглежда ситуации, при които Redis сървърът и клиентските приложения са на различни хостове или в различни центрове за данни. Инсталациите, при които трафикът на Redis трябва да премине през несигурна или ненадеждна мрежа, ще изискват различен набор от конфигурации, като например настройка на SSL прокси или VPN между Redis машините.

Можете също да използвате управляваната услуга Redis на DigitalOcean.

Предпоставки

За да завършите този урок, ще ви трябва сървър, работещ с Rocky Linux 8. Този сървър трябва да има не-root потребител с администраторски права и защитна стена, конфигурирана с firewalld. За да настроите това, следвайте нашето ръководство за първоначална настройка на сървъра за Rocky Linux 8.

Стъпка 1 — Инсталиране и стартиране на Redis

Можете да инсталирате Redis с мениджъра на пакети DNF. Използвайки DNF, можете да инсталирате Redis, неговите зависимости и nano, удобен за потребителя текстов редактор. Не е необходимо да инсталирате nano, но ние ще го използваме в примери в това ръководство:

  1. sudo dnf install redis nano

Тази команда ще ви подкани да потвърдите, че искате да инсталирате избраните пакети. Натиснете y и след това ENTER, за да направите това:

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

След това има една важна конфигурационна промяна, която трябва да направите в конфигурационния файл на Redis, който беше генериран автоматично по време на инсталацията.

Отворете този файл с предпочитания от вас текстов редактор. Тук ще използваме nano:

  1. sudo nano /etc/redis.conf

Във файла намерете директивата supervised. Тази директива ви позволява да декларирате система за стартиране, за да управлявате Redis като услуга, като ви предоставя повече контрол върху нейната работа. Директивата supervised е зададена на no по подразбиране. Тъй като използвате Rocky Linux, който използва системата за стартиране на systemd, променете това на 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:

  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 наистина работи, можете да тествате неговата функционалност с тази команда:

  1. redis-cli ping

Това трябва да отпечата PONG като отговор:

Output
PONG

Ако случаят е такъв, това означава, че вече имате Redis, работещ на вашия сървър и можете да започнете да го конфигурирате, за да подобрите неговата сигурност.

Стъпка 2 — Конфигуриране на Redis и защитата му със защитна стена

Ефективен начин за защита на Redis е да защитите сървъра, на който работи. Можете да направите това, като се уверите, че Redis е обвързан само с localhost или с частен IP адрес и също така, че сървърът има работеща защитна стена.

Ако обаче сте избрали да настроите Redis с помощта на друг урок, тогава може да сте актуализирали конфигурационния файл, за да позволите връзки отвсякъде. Това не е толкова сигурно, колкото обвързването към localhost или частен IP.

За да коригирате това, отворете отново конфигурационния файл на Redis с предпочитания от вас текстов редактор:

  1. sudo nano /etc/redis.conf

Намерете реда, започващ с bind, и се уверете, че не е коментиран или деактивиран, като премахнете знака # в началото на реда от необходимото:

. . .
bind 127.0.0.1

Ако трябва да свържете Redis с друг IP адрес (както в случаите, когато ще имате достъп до Redis от отделен хост), трябва силно да обмислите обвързването му с частен IP адрес. Свързването с публичен IP адрес увеличава излагането на вашия Redis интерфейс на външни страни:

. . .
bind your_private_ip

След като потвърдите, че директивата bind не е коментирана, можете да запишете и затворите файла.

Ако сте следвали предпоставката за начално ръководство за настройка на сървъра и сте инсталирали защитна стена на вашия сървър и не планирате да се свързвате с Redis от друг хост, тогава не е необходимо да добавяте никакви допълнителни правила за защитна стена за Redis. В крайна сметка всеки входящ трафик ще бъде премахнат по подразбиране, освен ако не е изрично разрешено от правилата на защитната стена. Тъй като самостоятелната инсталация по подразбиране на Redis сървър слуша само loopback интерфейса (127.0.0.1 или localhost), не трябва да има притеснения за входящия трафик на неговия порт по подразбиране.

Ако все пак планирате да получите достъп до Redis от друг хост, ще трябва да направите някои промени в конфигурацията на вашата защитна стена, като използвате командата firewall-cmd. Отново трябва да разрешите достъп до вашия Redis сървър само от вашите хостове, като използвате техните частни IP адреси, за да ограничите броя на хостовете, на които е изложена вашата услуга.

За да започнете, добавете специална Redis зона към вашата политика за защитна стена:

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

След това посочете кой порт искате да отворите. Redis използва порт 6379 по подразбиране:

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

След това посочете всички частни IP адреси, на които трябва да бъде позволено да преминават през защитната стена и да имат достъп до Redis:

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

След като изпълните тези команди, презаредете защитната стена, за да приложите новите правила:

  1. sudo firewall-cmd --reload

При тази конфигурация, когато защитната стена срещне пакет от IP адреса на вашия клиент, тя ще приложи правилата в специалната Redis зона към тази връзка. Всички други връзки ще бъдат обработени от зоната публична по подразбиране. Услугите в зоната по подразбиране се прилагат за всяка връзка, а не само за тези, които не съвпадат изрично, така че не е необходимо да добавяте други услуги (напр. SSH) към зоната Redis, защото тези правила ще бъдат приложени към тази връзка автоматично.

Имайте предвид, че използването на всеки инструмент за защитна стена ще работи, независимо дали използвате firewalld, ufw или iptables. Важното е защитната стена да работи, така че неизвестни лица да нямат достъп до вашия сървър. В следващата стъпка ще конфигурирате Redis да бъде достъпен само със силна парола.

Стъпка 3 — Конфигуриране на Redis парола

Конфигурирането на парола за Redis активира една от вградените функции за сигурност — командата auth — която изисква клиентите да се удостоверят, преди да им бъде разрешен достъп до базата данни. Подобно на настройката bind, паролата се конфигурира директно в конфигурационния файл на Redis, /etc/redis.conf. Отворете отново този файл:

  1. sudo nano /etc/redis.conf

Превъртете до секцията СИГУРНОСТ и потърсете коментирана директива, която гласи:

. . .
# requirepass foobared

Разкоментирайте го, като премахнете # и променете foobared на много силна парола по ваш избор.

Забележка: Вместо сами да създавате парола, можете да използвате инструмент като apg или pwgen, за да я генерирате. Ако обаче не искате да инсталирате приложение само за генериране на парола, можете да използвате командата по-долу. Тази команда отразява стойност на низ и я предава в следната команда sha256sum, която ще покаже контролната сума на низа SHA256.

Имайте предвид, че въвеждането на тази команда, както е написана, ще генерира една и съща парола всеки път. За да създадете уникална парола, променете низа в кавички на друга дума или фраза:

  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
  • КЛЮЧОВЕ
  • ИЗТЕЧЕ
  • DEL
  • КОНФИГ
  • ИЗКЛЮЧВАНЕ
  • BGREWRITEAOF
  • BGSAVE
  • ЗАПАЗВАНЕ
  • SPOP
  • SREM
  • ПРЕНИМЕНУВАНЕ
  • ОТСТРАНЯВАНЕ НА ГРЕШКИ

Това не е изчерпателен списък, но преименуването или деактивирането на всички команди в този списък може да помогне за подобряване на сигурността на вашето хранилище за данни. Дали трябва да деактивирате или преименувате дадена команда ще зависи от вашите специфични нужди. Ако знаете, че никога няма да използвате команда, която може да бъде злоупотребена, можете да я деактивирате. В противен случай трябва да го преименувате.

Подобно на паролата за удостоверяване, командите за преименуване или деактивиране се конфигурират в секцията СИГУРНОСТ на файла /etc/redis.conf. За да активирате или деактивирате Redis команди, отворете конфигурационния файл за редактиране още веднъж:

  1. sudo nano /etc/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.conf, което гласи:

. . .

# 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 persistence или веднага след инсталирането (т.е. преди вашето приложение, използващо Redis, да бъде внедрено).

Стъпка 5 — Задаване на собственост върху директория с данни и разрешения за файлове

Тази стъпка ще премине през няколко промени в собствеността и разрешенията, които може да се наложи да направите, за да подобрите профила на защита на вашата инсталация на Redis. Това включва да се уверите, че само потребителят, който трябва да има достъп до Redis, има разрешение да чете неговите данни. Този потребител по подразбиране е потребителят на redis.

Можете да проверите това чрез grep-ing за директорията с данни на Redis в дълъг списък на нейната родителска директория. Тази команда и нейният изход са дадени по-долу:

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

Този изход показва, че директорията с данни на Redis е собственост на потребителя на redis, с вторичен достъп, предоставен на групата redis. Тази настройка за собственост е защитена, както и разрешенията на папката, които, използвайки осмична нотация, са зададени на 750.

Ако вашата директория с данни на Redis има несигурни разрешения, можете да гарантирате, че само потребителят и групата на Redis имат достъп до папката и нейното съдържание, като изпълните командата chmod. Следният пример променя настройката за разрешения на тази папка на 770:

  1. sudo chmod 770 /var/lib/redis

Другото разрешение, което може да се наложи да промените, е това на конфигурационния файл на Redis. По подразбиране той има разрешение за файл 640 и се притежава от root, с вторична собственост от root групата:

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

Това разрешение (640) означава, че конфигурационният файл на Redis може да се чете само от потребителя на redis и основната група. Тъй като конфигурационният файл съдържа нешифрованата парола, която сте конфигурирали в Стъпка 4, redis.conf трябва да се притежава от потребителя redis, с вторична собственост от групата redis. За да зададете това, изпълнете следната команда:

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

След това променете разрешенията, така че само собственикът на файла да може да чете и пише в него:

  1. sudo chmod 600 /etc/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.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf

Накрая рестартирайте Redis, за да отразите тези промени:

  1. sudo systemctl restart redis

С това вашата инсталация на Redis е защитена.

Заключение

Имайте предвид, че след като някой влезе в сървъра ви, е възможно да заобиколите специфичните за Redis функции за сигурност, които сте въвели. Ето защо най-важната функция за сигурност, разгледана в този урок, е защитната стена, тъй като тя не позволява на неизвестни потребители да влизат във вашия сървър на първо място.

Ако се опитвате да защитите комуникацията на Redis в ненадеждна мрежа, ще трябва да използвате SSL прокси, както е препоръчано от разработчиците на Redis в официалното ръководство за сигурност на Redis.