Как обезопасить вашу установку Redis в Ubuntu 18.04

Вступление

Redis - это оперативная память, NoSQL, кэш-память и ключ-значение, которые также можно сохранить на диске. Он был разработан для использованияtrusted clients вtrusted environment, без каких-либо собственных надежных функций безопасности. Чтобы подчеркнуть этот момент, вот цитата изofficial Redis website:

Redis предназначен для доступа доверенных клиентов в доверенных средах. Это означает, что, как правило, не рекомендуется открывать экземпляр Redis непосредственно в Интернете или, вообще, в среде, где ненадежные клиенты могут получить прямой доступ к TCP-порту Redis или сокету UNIX.

В общем, Redis не оптимизирован для максимальной безопасности, но для максимальной производительности и простоты.

Несмотря на это, в Redis есть несколько базовых функций безопасности. К ним относятся возможность создавать незашифрованный пароль и свободу переименовывать и отключать команды. Примечательно, что в нем отсутствует настоящая система контроля доступа.

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

В этом руководстве вы узнаете, как настроить несколько функций безопасности, которые есть в Redis, и внесете несколько изменений в конфигурацию вашей системы, что повысит уровень безопасности автономной установки Redis на сервере Ubuntu.

Обратите внимание, что в этом руководстве не рассматриваются ситуации, когда сервер Redis и клиентские приложения находятся на разных хостах или в разных центрах обработки данных. Установки, в которых трафик Redis должен проходить через небезопасную или ненадежную сеть, требуют совершенно другого набора конфигураций, таких как настройка прокси-сервера SSL илиVPNмежду машинами Redis, в дополнение к приведенным здесь.

Предпосылки

Для этого урока вам понадобятся:

  • Сервер Ubuntu 18.04. На этом сервере также должен быть пользователь без полномочий root с привилегиямиsudo, а также брандмауэр, настроенный с помощью UFW, который вы можете настроить, следуя нашимInitial Server Setup Guide for Ubuntu 18.04.

  • Redis установлен и настроен на вашем сервере. Вы можете настроить это, выполнивthis guide for Ubuntu 18.04 servers.

[[step-1 -—- verifying-that-redis-is-running]] == Шаг 1. Проверка работы Redis

Во-первых, подключитесь к вашему серверу по SSH с вашим пользователем без полномочий root.

Чтобы проверить, что Redis работает, откройте командную строку Redis с помощью командыredis-cli:

redis-cli

[.Примечание]##

Note: если вы уже установили пароль для Redis, вы должны пройти аутентификацию с помощью командыauth после подключения:

auth your_redis_password
OutputOK

Если вы не установили пароль для Redis, вы можете прочитать, как это сделать, на шаге 4 этого руководства.

Проверьте соединение с помощью командыping:

ping

Если Redis работает правильно, вы увидите следующее:

OutputPONG

После этого выйдите из командной строки Redis:

quit

Теперь, когда вы подтвердили, что Redis работает и работает правильно, вы можете перейти к наиболее важному этапу повышения безопасности вашего сервера: настройке брандмауэра.

[[step-2 -—-securing-the-server-with-ufw]] == Шаг 2 - Защита сервера с помощью UFW

Redis - это просто приложение, которое работает на вашем сервере. Поскольку у него есть только несколько фундаментальных функций безопасности, первый шаг к его обеспечению - это защита сервера, на котором он работает. В случае общедоступного сервера, такого как ваш сервер Ubuntu 18.04, первым шагом является настройка брандмауэра, как описано вInitial Server Setup Guide for Ubuntu 18.04. Follow that link and set up your firewall now if you haven’t already done so.

Если вы не уверены, настроили ли вы брандмауэр или он активен, вы можете проверить это, выполнив следующее:

sudo ufw status

Если вы следовали Руководству по первоначальной настройке сервера для Ubuntu 18.04, вы увидите следующее:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Если вы внедрили правила брандмауэра с помощью этого руководства, вам не нужно добавлять дополнительное правило для Redis, потому что по умолчанию UFW отбрасывает весь входящий трафик, если это явно не разрешено. Поскольку по умолчанию автономная установка сервера Redis прослушивает только петлевой интерфейс (127.0.0.1 илиlocalhost), входящий трафик на его порт по умолчанию не должен беспокоить.

Для получения дополнительной информации о том, как добавлять правила, см. Этотguide on common UFW rules and commands.

[[step-3 -—- binding-to-localhost]] == Шаг 3. Привязка к localhost

По умолчанию Redis доступен только изlocalhost. Однако, если вы следовали другому руководству по настройке Redis, чем то, которое приведено в разделе предварительных требований, вы могли обновить файл конфигурации, чтобы разрешить подключения из любого места. Это не так безопасно, как привязка кlocalhost.

Откройте файл конфигурации Redis для редактирования:

sudo nano /etc/redis/redis.conf

Найдите эту строку и убедитесь, что она не закомментирована (удалите#, если он существует):

/etc/redis/redis.conf

bind 127.0.0.1

Сохраните и закройте файл, когда закончите (нажмитеCTRL + X,Y, затемENTER).

Затем перезапустите сервис, чтобы systemd считал ваши изменения:

sudo systemctl restart redis

Чтобы убедиться, что это изменение вступило в силу, выполните следующую командуnetstat:

sudo netstat -lnp | grep redis
Outputtcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2855/redis-server 1

Этот вывод показывает, что программаredis-server привязана кlocalhost (127.0.0.1), что отражает изменение, которое вы только что внесли в файл конфигурации. Если вы видите другой IP-адрес в этом столбце (например,0.0.0.0), вам следует дважды проверить, раскомментировали ли вы правильную строку, и снова перезапустить службу Redis.

Теперь, когда ваша установка Redis прослушивает толькоlocalhost, злоумышленникам будет сложнее делать запросы или получать доступ к вашему серверу. Тем не менее, Redis в настоящее время не требует от пользователей аутентификации перед внесением изменений в конфигурацию или данные, которые он хранит. Чтобы исправить это, Redis позволяет вам требовать от пользователей аутентификации с паролем перед внесением изменений через клиент Redis (redis-cli).

[[step-4 -—- configuring-a-redis-password]] == Шаг 4. Настройка пароля Redis

Настройка пароля Redis включает одну из двух встроенных функций безопасности - командуauth, которая требует от клиентов аутентификации для доступа к базе данных. Пароль настраивается непосредственно в файле конфигурации Redis,/etc/redis/redis.conf, поэтому снова откройте этот файл с помощью предпочитаемого вами редактора:

sudo nano /etc/redis/redis.conf

Прокрутите до разделаSECURITY и найдите прокомментированную директиву, которая гласит:

/etc/redis/redis.conf

# requirepass foobared

Раскомментируйте его, удалив#, и заменитеfoobared на безопасный пароль.

[.Примечание]##

Note: Над директивойrequirepass в файлеredis.conf есть комментированное предупреждение:

/etc/redis/redis.conf

# 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 удалит любые разрывы строк, выводимые первой командой:

openssl rand 60 | openssl base64 -A

Ваш вывод должен выглядеть примерно так:

OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

После копирования и вставки вывода этой команды в качестве нового значения дляrequirepass он должен читать:

/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

После установки пароля сохраните файл и перезапустите Redis:

sudo systemctl restart redis.service

Чтобы проверить, работает ли пароль, откройте командную строку Redis:

redis-cli

Ниже показана последовательность команд, используемая для проверки работоспособности пароля Redis. Первая команда пытается установить ключ к значению до аутентификации:

set key1 10

Это не сработает, потому что вы не прошли аутентификацию, поэтому Redis возвращает ошибку:

Output(error) NOAUTH Authentication required.

Следующая команда аутентифицируется с паролем, указанным в файле конфигурации Redis:

auth your_redis_password

Redis признает:

OutputOK

После этого повторное выполнение предыдущей команды завершится успешно:

set key1 10
OutputOK

get key1 запрашивает Redis значение нового ключа.

get key1
Output"10"

Убедившись, что вы можете запускать команды в клиенте Redis после аутентификации, вы можете выйти изredis-cli:

quit

Далее мы рассмотрим переименование команд Redis, которые, если они были введены по ошибке или злонамеренным пользователем, могут нанести серьезный ущерб вашей машине.

[[step-5 -—- renaming-dangerous-commands]] == Шаг 5. Переименование опасных команд

Другая функция безопасности, встроенная в Redis, включает переименование или полное отключение определенных команд, которые считаются опасными.

При запуске по ошибке или неавторизованными пользователями такие команды могут использоваться для изменения конфигурации, уничтожения или иного удаления ваших данных. Как и пароль аутентификации, переименование или отключение команд настраивается в том же разделеSECURITY файла/etc/redis/redis.conf.

Некоторые из команд, которые считаются опасными, включают:FLUSHDB,FLUSHALL,KEYS,PEXPIRE,DEL,CONFIG,SHUTDOWN,BGREWRITEAOF,BGSAVE,SAVE,SPOP,SREM,RENAME иDEBUG. Это не полный список, но переименование или отключение всех команд в этом списке является хорошей отправной точкой для повышения безопасности вашего сервера Redis.

Нужно ли отключать или переименовывать команду, зависит от ваших конкретных потребностей или потребностей вашего сайта. Если вы знаете, что никогда не будете использовать команду, которая может быть нарушена, вы можете отключить ее. В противном случае, это может быть в ваших интересах, чтобы переименовать его.

Чтобы включить или отключить команды Redis, еще раз откройте файл конфигурации:

sudo nano  /etc/redis/redis.conf

[.warning] #Warning: Следующие шаги, показывающие, как отключать и переименовывать команды, являются примерами. Вам следует отключить или переименовать только те команды, которые имеют для вас смысл. Вы можете самостоятельно просмотреть полный список команд и определить, как они могут быть использованы неправильно наredis.io/commands.
#

Чтобы отключить команду, просто переименуйте ее в пустую строку (обозначенную парой кавычек без других символов между ними), как показано ниже:

/etc/redis/redis.conf

. . .
# 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 ""
. . .

Чтобы переименовать команду, дайте ей другое имя, как показано в примерах ниже. Переименованные команды должны быть сложными для других, но их легко запомнить:

/etc/redis/redis.conf

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

Сохраните ваши изменения и закройте файл.

После переименования команды примените изменения, перезапустив Redis:

sudo systemctl restart redis.service

Чтобы проверить новую команду, введите командную строку Redis:

redis-cli

Далее аутентифицируемся:

auth your_redis_password
OutputOK

Предположим, вы переименовали командуCONFIG вASC12_CONFIG, как в предыдущем примере. Сначала попробуйте использовать исходную командуCONFIG. Он должен потерпеть неудачу, потому что вы переименовали его:

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

Однако вызов переименованной команды будет успешным. Он не чувствителен к регистру:

asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"

Наконец, вы можете выйти изredis-cli:

exit

Обратите внимание, что если вы уже используете командную строку Redis и затем перезапускаете Redis, вам нужно будет пройти повторную аутентификацию. В противном случае вы получите эту ошибку, если наберете команду:

OutputNOAUTH Authentication required.

[.предупреждение]##

Что касается практики переименования команд, в конце разделаSECURITY в/etc/redis/redis.conf есть предостережение, которое гласит:

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

Замечания: Проект Redis предпочитает использовать термины «главный» и «подчиненный», тогда как DigitalOcean обычно предпочитает альтернативы «первичный» и «вторичный». Чтобы избежать путаницы, мы решили использовать здесь термины, используемые в документации Redis.

Это означает, что если переименованная команда отсутствует в файле AOF или если она есть, но файл AOF не был передан ведомым, то проблем быть не должно.

Так что имейте это в виду, когда вы пытаетесь переименовать команды. Лучшее время для переименования команды - это когда вы не используете постоянство AOF или сразу после установки, то есть до того, как ваше приложение, использующее Redis, было развернуто.

Когда вы используете AOF и имеете дело с установкой ведущий-ведомый, учитывайтеthis answer from the project’s GitHub issue page. Ниже приводится ответ на вопрос автора:

Команды регистрируются в AOF и реплицируются на ведомое устройство так же, как они отправляются, поэтому, если вы попытаетесь воспроизвести AOF на экземпляре, который не имеет того же переименования, вы можете столкнуться с несоответствиями, так как команда не может быть выполнена ( то же самое для рабов).

Таким образом, лучший способ справиться с переименованием в подобных случаях - убедиться, что переименованные команды применяются ко всем экземплярам в установках «главный-подчиненный».

Заключение

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

Если вы пытаетесь защитить обмен данными Redis через ненадежную сеть, вам придется использовать прокси-сервер SSL, как рекомендуют разработчики Redis вofficial Redis security guide.

Related