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

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


Введение

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

Предпосылки

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

Когда вы будете готовы начать, войдите на свой сервер Ubuntu 18.04 как пользователь sudo и продолжите ниже.

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

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

Во-первых, обновите локальный кеш пакетов apt, если вы не делали этого в последнее время:

  1. sudo apt update

Затем установите Redis, набрав:

  1. sudo apt install redis-server

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

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

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

Внутри файла найдите директиву supervised. Эта директива позволяет вам объявить систему инициализации для управления Redis как службой, предоставляя вам больший контроль над ее работой. По умолчанию для директивы supervised установлено значение no. Поскольку вы используете Ubuntu, использующую систему инициализации 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 на данный момент, поэтому сохраните и закройте его, когда закончите. Затем перезапустите службу Redis, чтобы отразить изменения, внесенные в файл конфигурации:

  1. sudo systemctl restart redis.service

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

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

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

Начните с проверки того, что служба Redis запущена:

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

  1. sudo systemctl disable redis

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

  1. redis-cli

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

  1. ping
Output
PONG

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

  1. set test "It's working!"
Output
OK

Получите значение, набрав:

  1. get test

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

Output
"It's working!"

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

  1. exit

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

  1. sudo systemctl restart redis

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

  1. redis-cli
  1. get test

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

Output
"It's working!"

Когда закончите, снова выйдите в оболочку:

  1. exit

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

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

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

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

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

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

bind 127.0.0.1 ::1

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

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

  1. sudo systemctl restart redis

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

  1. 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 привязана к локальному хосту (127.0.0.1), что отражает параметр bind в файле конфигурации Redis. Если вы видите другой IP-адрес в этом столбце (например, 0.0.0.0), вам следует дважды проверить, что вы раскомментировали правильную строку, и снова перезапустить службу Redis.

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

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

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

  1. sudo nano /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, как показано здесь, он удалит все разрывы строк, созданные этой первой командой:

  1. openssl rand 60 | openssl base64 -A

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

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

  1. sudo systemctl restart redis.service

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

  1. redis-cli

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

  1. set key1 10

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

Output
(error) NOAUTH Authentication required.

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

  1. auth your_redis_password

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

Output
OK

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

  1. set key1 10
Output
OK

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

  1. get key1
Output
"10"

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

  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.

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

Чтобы включить или отключить команды 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 и после них указать пустые строки, FLUSHDB, FLUSHALL и DEBUG будут отключен в этой установке Redis.

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

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

В этих примерах команды SHUTDOWN и CONFIG переименовываются в SHUTDOWN_MENOT и 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'

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

  1. asc12_config get requirepass

Команда Redis config позволяет любому, кто ее запускает, взаимодействовать с файлом конфигурации установки. В сочетании с get и последующей директивой из файла конфигурации команда вернет эту директиву и ее текущую настройку:

Output
1) "requirepass" 2) "your_redis_password"

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

  1. exit

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

Output
NOAUTH Authentication required.

Предупреждение. Что касается практики переименования команд, в конце раздела БЕЗОПАСНОСТЬ в /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 на экземпляре, который не имеет такого же переименования, вы можете столкнуться с несоответствиями, поскольку команда не может быть выполнена ( то же самое для рабов).

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

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

Заключение

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

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