Поиск по сайту:

Как защитить установку Redis в Ubuntu 14.04


Введение

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

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

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

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

. . .

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

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

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

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

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

Предпосылки

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

  • Сервер Ubuntu 14.04 с добавленным пользователем sudo из начальной настройки сервера.
  • iptables, настроенные с помощью этого руководства по iptables, вплоть до шага (необязательного) обновления серверов имен (если вы не выполните часть настройки сервера имен, APT не будет работать). После настройки серверов имен все готово.
  • Redis установлен и работает с использованием инструкций по установке только для мастера из этого руководства по Redis, вплоть до шага 2 — Настройка мастера Redis.

Шаг 1 — Проверка того, что Redis работает

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

  1. ssh username@server-ip-address

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

  1. redis-cli

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

  1. auth your_redis_password
OK

Протестируйте сервер базы данных:

  1. ping

Ответ:

PONG

Выход:

  1. quit

Шаг 2 — Защита сервера с помощью iptables

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

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

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

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

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

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

Шаг 3 — Привязка к локальному хосту

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

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

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

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

bind 127.0.0.1

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

Шаг 4 — Настройка пароля Redis

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

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

Прокрутите до раздела БЕЗОПАСНОСТЬ и найдите закомментированную директиву, которая гласит:

# requirepass foobared

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

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

  1. echo "digital-ocean" | sha256sum

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

960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

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

requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

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

  1. echo "digital-ocean" | sha1sum

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

10d9a99851a411cdae8c3fa09d7290df192441a9

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

  1. sudo service redis-server restart

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

  1. redis-cli

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

  1. set key1 10

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

(error) NOAUTH Authentication required.

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

  1. auth your_redis_password

Редис признает.

OK

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

  1. set key1 10
OK

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

  1. get key1
"10"

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

  1. quit

Далее мы рассмотрим переименование команд Redis.

Шаг 5 — Переименование опасных команд

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

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

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

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

Чтобы включить или отключить команды 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 CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

Сохраните изменения.

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

  1. sudo service redis-server restart

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

  1. redis-cli

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

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

  1. auth your_redis_password
OK

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

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

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

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

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

  1. exit

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

NOAUTH Authentication required.

Что касается команд переименования, в конце раздела БЕЗОПАСНОСТЬ в /etc/redis/redis.conf есть предупреждение, которое гласит:

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

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

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

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

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

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

Шаг 6 — Установка владельца каталога данных и прав доступа к файлам

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

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

  1. ls -l /var/lib | grep redis
drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

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

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

  1. sudo chmod 700 /var/lib/redis

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

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

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

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

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

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

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

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

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

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

  1. sudo service redis-server restart

Заключение

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

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

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

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

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