Tutorial

Установка и обеспечение безопасности Redis в Ubuntu 18.04

UbuntuNoSQLRedisUbuntu 18.04

Предыдущая версия данного обучающего руководства была написана Джастином Эллингвудом

Введение

Redis — это быстрое хранилище данных типа «ключ‑значение», известное своей гибкостью, производительностью и широким выбором поддерживаемых языков. В этом руководстве описывается установка, настройка и обеспечение безопасности Redis на сервере Ubuntu 18.04.

Предварительные требования

Для выполнения данного руководства вам потребуется сервер Ubuntu 18.04 с пользователем без прав root с привилегиями sudo и брандмауэром с базовой конфигурацией. Вы можете выполнить настройку с помощью нашего руководства по первоначальной настройке сервера.

​​Когда все будет готово, выполните вход на сервер Ubuntu 18.04 с помощью пользователя с правами sudo и продолжите выполнять дальнейшие инструкции.

Шаг 1 — Установка и настройка Redis

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

Обновите локальный кэш пакета apt и установите Redis с помощью следующей команды:

  • sudo apt update
  • sudo apt install redis-server

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

Откройте этот файл в предпочитаемом текстовом редакторе:

  • sudo nano /etc/redis/redis.conf

Внутри файла найдите директиву supervised. Эта директива позволяет объявить систему инициализации для управления Redis как службой, предоставляя вам более широкий контроль за ее работой. Для директивы supervised по умолчанию установлено значение no. Поскольку вы запускаете Ubuntu, которая использует систему инициализации systemd, измените значение на systemd:

/etc/redis/redis.conf
. . .

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

  • sudo systemctl restart redis.service

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

Шаг 2 — Тестирование Redis

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

Сначала проверьте, что служба Redis запущена:

  • 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 каждый раз вручную при загрузке сервера, воспользуйтесь следующей командой:

  • sudo systemctl disable redis

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

  • redis-cli

В появившемся диалоговом окне протестируйте подключение с помощью команды ping:

  • ping
Output
PONG

Данный вывод подтверждает, что подключение сервера активно. Затем проверьте, что вы можете задать ключи:

  • set test "It's working!"
Output
OK

Запросите значение с помощью следующей команды:

  • get test

Если все работает корректно, вы получите сохраненное значение:

Output
"It's working!"

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

  • exit

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

  • sudo systemctl restart redis

Откройте клиент командной строки и проверьте, что ваше тестовое значение все еще доступно:

  • redis-cli
  • get test

Значение вашего ключа должно оставаться доступным:

Output
"It's working!"

Выйдите в командную строку после завершения:

  • exit

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

Шаг 3 — Привязка к localhost

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

Чтобы исправить это, откройте файл конфигурации Redis для редактирования:

  • sudo nano /etc/redis/redis.conf

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

/etc/redis/redis.conf
bind 127.0.0.1 ::1

Сохраните и закройте файл после завершения (нажмите CTRL + X, Y, затем ENTER).

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

  • sudo systemctl restart redis

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

  • 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-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, поэтому вам нужно снова открыть этот файл в предпочитаемом редакторе:

  • sudo nano /etc/redis/redis.conf

Прокрутите содержимое файла до раздела SECURITY и найдите следующую закомментированную директиву:

/etc/redis/redis.conf
# requirepass foobared

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

Примечание: над директивой requirepass в файле 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

Вывод должен выглядеть следующим образом:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

/etc/redis/redis.conf
requirepass 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 принимает пароль:

Output
OK

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

  • set key1 10
Output
OK

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

  • get key1
Output
"10"

Подтвердив, что вы можете выполнять команды в клиенте Redis после аутентификации, вы можете закрыть redis-cli:

  • quit

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

Шаг 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

Предупреждение. Седующие шаги с демонстрацией отключения или переименования команд являются примерами. Вы должны отключить или переименовать команды, имеющие смысл для вас. Вы можете просмотреть полный список команд самостоятельно и узнать, как они могут использоваться злоумышленниками, по адресу 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
Output
OK

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

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

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

  • asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

После этого вы можете закрыть redis-cli:

  • exit

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

Output
NOAUTH Authentication required.

В отношении практики переименования команд в конце раздела SECURITY файла /etc/redis/redis.conf есть следующее предостережение:

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

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

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

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

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

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

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

Заключение

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

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

0 Comments

Creative Commons License