Как установить и защитить Redis на Debian 9

Вступление

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

Предпосылки

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

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

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

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

Обновите локальный кеш пакета + apt + и установите Redis, набрав:

sudo apt update
sudo apt install redis-server

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

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

sudo nano /etc/redis/redis.conf

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

. . .

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

sudo systemctl restart redis

После этого вы установили и настроили 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; ; vendor preset: enabled)
  Active:  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-cli

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

ping
OutputPONG

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

set test "It's working!"
OutputOK

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

get test

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

Output"It's working!"

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

exit

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

sudo systemctl restart redis

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

redis-cli
get test

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

Output"It's working!"

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

exit

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

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

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

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

sudo nano /etc/redis/redis.conf

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

/etc/redis/redis.conf

bind 127.0.0.1

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

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

sudo systemctl restart redis

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

sudo netstat -lnp | grep redis
Outputtcp        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 только прослушивает * 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 + на безопасный пароль.

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

sudo systemctl restart redis.service

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

redis-cli

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

set key1 10

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

Output(error) NOAUTH Authentication required.

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

auth

Redis признает:

OutputOK

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

set key1 10
OutputOK

+ 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

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

/etc/redis/redis.conf

. . .
# It is also possible to completely kill a command by renaming it into
# an empty string:
#



. . .

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

/etc/redis/redis.conf

. . .
# rename-command CONFIG ""


. . .

Сохраните ваши изменения и закройте файл.

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

sudo systemctl restart redis

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

redis-cli

Затем подтвердите:

auth
OutputOK

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

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

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

asc12_config get requirepass
Output1) "requirepass"
2) ""

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

exit

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

OutputNOAUTH Authentication required.

Заключение

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

Имейте в виду, что, как только кто-то вошел в систему на вашем сервере, очень легко обойти функции безопасности, связанные с Redis, которые мы ввели. Поэтому наиболее важной функцией безопасности на вашем сервере Redis является брандмауэр (который вы настроили, если выполнили предварительное условие https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9#step -four-% E2% 80% (учебник по начальной настройке брандмауэра (начальная настройка сервера)), поскольку злоумышленникам крайне сложно преодолеть этот барьер.