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

Вступление

Redis - это оперативная память, NoSQL, кэш-память и ключ-значение, которые также можно сохранить на диске.

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

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

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

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

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

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

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

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

Предпосылки

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

  • Сервер Ubuntu 14.04 с добавленным пользователем sudo изinitial server setup

  • iptables, настроенный с использованиемthis iptables guide, вплоть до шага(Optional) Update Nameservers (если вы не выполните часть настройки сервера имен, APT не будет работать). После настройки серверов имен все готово

  • Redis установлен и работает с использованием инструкций из установки только для мастера отthis Redis guide до этапаStep 2 — Configure Redis Master

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

Сначала войдите на свой сервер, используя SSH:

ssh username@server-ip-address

Чтобы проверить, что Redis работает, используйте командную строку Redis. Командаredis-cli используется для доступа к командной строке Redis.

redis-cli

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

Если вы уже установили пароль для Redis, вам необходимо установитьauth после подключения.

auth your_redis_password

Выход

OK

Проверьте сервер базы данных:

ping

Отклик:

Выход

PONG

Выход:

quit

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

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

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

В случае общедоступного сервера, такого как ваш сервер Ubuntu 14.04, первым шагом является настройка брандмауэра, как указано вthis iptables guide. Follow that link and set up your firewall now.

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

Если вам нужно специально разрешить IP-адрес для Redis, вы можете проверить, какой IP-адрес Redis прослушивает и к какому порту он привязан,grep-в выводе командыnetstat. Четвертый столбец - здесь127.0.0.1:6379 - указывает комбинацию IP-адреса и порта, связанную с Redis:

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 basics article.

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

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

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

sudo nano /etc/redis/redis.conf

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

/etc/redis/redis.conf

bind 127.0.0.1

Мы будем продолжать использовать этот файл, поэтому пока держите его открытым.

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

Если вы установили Redis с помощью статьиHow To Configure a Redis Cluster on Ubuntu 14.04, вы должны были настроить для него пароль. На ваше усмотрение, вы можете сделать более безопасный пароль, следуя этому разделу. Если нет, инструкции в этом разделе показывают, как установить пароль сервера базы данных.

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

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

/etc/redis/redis.conf

# requirepass foobared

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

Вместо того, чтобы придумывать пароль самостоятельно, вы можете использовать такой инструмент, какapg илиpwgen для его создания. Если вы не хотите устанавливать приложение только для генерации пароля, вы можете использовать одну строку ниже. Чтобы сгенерировать пароль, отличный от того, который он будет генерировать, измените слово в кавычках.

echo "digital-ocean" | sha256sum

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

Выход

960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

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

/etc/redis/redis.conf

requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

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

echo "digital-ocean" | sha1sum

На этот раз вы получите более короткий вывод:

Выход

10d9a99851a411cdae8c3fa09d7290df192441a9

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

sudo service redis-server restart

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

redis-cli

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

set key1 10

Это не сработает, поэтому Redis возвращает ошибку.

Выход

(error) NOAUTH Authentication required.

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

auth your_redis_password

Redis признает.

Выход

OK

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

set key1 10

Выход

OK

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

get key1

Выход

"10"

Последняя команда завершаетredis-cli. Вы также можете использоватьexit:

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, откройте файл конфигурации для редактирования еще раз:

sudo nano  /etc/redis/redis.conf

These are examples. You should choose to disable or rename the commands that make sense for you. Вы можете сами проверить команды и определить, как они могут быть использованы неправильно на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 service redis-server restart

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

redis-cli

Затем, предполагая, что вы переименовали командуCONFIG вASC12_CONFIG, следующие выходные данные показывают, как проверить, была ли применена новая команда.

После аутентификации:

auth your_redis_password

Выход

OK

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

config get requirepass

Выход

(error) ERR unknown command 'config'

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

asc12_config get requirepass

Выход

1) "requirepass"
2) "your_redis_password"

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

exit

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

Выход

NOAUTH 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.

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

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

Когда вы используете AOF и имеете дело с установкой master-slave, обдумайте этот ответ на странице проекта GitHub. Ниже приводится ответ на вопрос автора:

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

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

[[step-6 -—- setting-data-directory-owner-and-file-permissions]] == Шаг 6 - Установка прав собственности на каталог данных и прав доступа к файлам

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

Вы можете убедиться в этом, выполнивgrep-ing для каталога данных Redis в длинном списке его родительского каталога. Команда и ее вывод приведены ниже.

ls -l /var/lib | grep redis

Выход

drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

Вы можете видеть, что каталог данных Redis принадлежит пользователюredis, а вторичный доступ предоставлен группеredis. Эта часть хороша.

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

sudo chmod 700 /var/lib/redis

Другое разрешение, которое вы должны изменить, - это разрешение в файле конфигурации Redis. По умолчанию он имеет права доступа к файлу 644 и принадлежитroot, а второстепенное право собственности - группеroot:

ls -l /etc/redis/redis.conf

Выход

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

Это разрешение (644) доступно для чтения всем, что не очень хорошая идея, поскольку оно содержит незашифрованный пароль, настроенный на шаге 4.

Нам нужно сменить владельца и разрешения. В идеале он должен принадлежать пользователюredis, а второстепенное право собственности - пользователюroot. Для этого выполните следующую команду:

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

Затем измените владельца так, чтобы только владелец файла мог читать и / или записывать в него:

sudo chmod 600 /etc/redis/redis.conf

Вы можете подтвердить новое право собственности и разрешение, используя:

ls -l /etc/redis/redis.conf

Выход

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

Наконец, перезапустите Redis:

sudo service redis-server restart

Заключение

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

Это должен быть ваш брандмауэр.

Чтобы поднять безопасность вашего сервера на новый уровень, вы можете настроить систему обнаружения вторжений, такую ​​как OSSEC. Чтобы настроить OSSEC в Ubuntu 14.04, см.this OSSEC guide.

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

Мы не включили полный список команд Redis в раздел переименования. Однако вы можете проверить это сами и определить, как они могут быть использованы не по назначению вredis.io/commands.

Related