Установка и защита Redis в Debian 9

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

Требования

Для работы вам понадобится сервер Debian 9, настроенный по этому мануалу.

1: Установка и настройка Redis

Последнюю версию Redis можно найти в официальных репозиториях Debian.

Обновите локальный индекс пакетов и установите Redis:

sudo apt update
sudo apt install redis-server

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

Откройте этот файл с помощью текстового редактора:

sudo nano /etc/redis/redis.conf

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

sudo systemctl restart redis

Теперь Redis установлен, настроен и работает на вашей машине. Теперь нужно протестировать установку.

2: Тестирование Redis

Как и любое новое ПО, Redis нужно проверить после установки.

Для начала убедитесь, что сервис Redis запущен:

sudo systemctl status redis

Если команда не вернет ошибок, вы увидите такой вывод:

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-09-05 20:19:44 UTC; 41s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 10829 ExecStopPost=/bin/run-parts --verbose /etc/redis/redis-server.post-down.d (code=exited, status=0/SUCCESS)
Process: 10825 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
Process: 10823 ExecStop=/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d (code=exited, status=0/SUCCESS)
Process: 10842 ExecStartPost=/bin/run-parts --verbose /etc/redis/redis-server.post-up.d (code=exited, status=0/SUCCESS)
Process: 10838 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Process: 10834 ExecStartPre=/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d (code=exited, status=0/SUCCESS)
Main PID: 10841 (redis-server)
Tasks: 3 (limit: 4915)
CGroup: /system.slice/redis-server.service
└─10841 /usr/bin/redis-server 127.0.0.1:6379
. . .

Как видите, Redis работает и уже включен как сервис (то есть добавлен в автозагрузку).

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

sudo systemctl disable redis

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

redis-cli

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

ping
PONG

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

set test "It's working!"
OK

Извлеките значение ключа:

get test

Команда должна ответить:

"It's working!"

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

exit

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

sudo systemctl restart redis

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

redis-cli
get test

Вы должны получить:

"It's working!"

Закройте командную строку:

exit

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

3: Подключение к localhost

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

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

sudo nano /etc/redis/redis.conf

Найдите эту строку и раскомментируйте ее:

bind 127.0.0.1

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

Перезапустите сервис:

sudo systemctl restart redis

Убедитесь, что настройки обновились:

sudo netstat -lnp | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      10959/redis-server

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

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

4: Настройка парольной аутентификации Redis

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

sudo nano /etc/redis/redis.conf

Найдите раздел SECURITY, а в нем – закомментированную директиву:

# requirepass foobared

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

Примечание: В файле redis.conf над директивой requirepass вы увидите такое предупреждение:

# 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

Вы получите такой вывод:

RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Скопируйте и вставьте полученное значение в requirepass:

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

Выбрав надежный пароль, сохраните и закройте файл, а затем перезапустите Redis:

sudo systemctl restart redis.service

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

redis-cli

Для проверки работоспособности пароля Redis используйте такую последовательность команд. Первая команда пытается установить ключ без пароля:

set key1 10
Redis должен вернуть ошибку:
(error) NOAUTH Authentication required.

Следующая команда пройдет аутентификацию:

auth your_redis_password
OK

После того как Redis принял пароль, попробуйте снова добавить ключ:

set key1 10
OK

Запросите свой новый ключ:

get key1
"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

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

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

Откройте файл:

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:

sudo systemctl restart redis

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

redis-cli

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

auth your_redis_password
OK

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

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

Теперь сработает переименованная команда:

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

Закройте redis-cli:

exit

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

NOAUTH Authentication required.

Важно! Что касается переименования команд, в конце раздела SECURITY в файле /etc/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 или этот файл не был передан slave машинам, тогда проблем не должно быть. Помните об этом при переименовании команд. Лучшее время для переименования команды – это сразу после установки или когда вы не используете AOF (то есть перед развертыванием приложения, использующего Redis).

Если вы используете AOF в установке master-slave, GitHub советует вот что:

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

Лучший способ избежать проблем с переименованием в таких случаях – убедиться, что переименованные команды применяются ко всем экземплярам установки master-slave.

Заключение

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

Tags: , ,