Системы кэширования объектов памяти, такие как Memcached, могут оптимизировать производительность базы данных, временно сохраняя часто запрашиваемые или недавно извлеченные записи в памяти. Таким образом, они уменьшают количество прямых запросов к базам данных.
Поскольку такие системы, как Memcached, при неправильной настройке подвергают сервер dos-атакам, важно заранее обеспечить безопасность серверов Memcached. В этом мануале вы узнаете, как защитить сервер Memcached, привязав установку к локальному или частному сетевому интерфейсу и создав авторизованного пользователя для экземпляра Memcached.
Требования
Для работы вам понадобится сервер Ubuntu 18.04, настроенный по этому мануалу.
1: Установка Memcached из официального репозитория
Если система Memcached еще не установлена на сервере, вы можете установить ее из официальных репозиториев Ubuntu. Во-первых, обновите локальный индекс пакетов:
sudo apt update
Затем установите официальный пакет:
sudo apt install memcached
Также можно установить libmemcached-tools, библиотеку, которая предоставляет несколько инструментов для работы с сервером Memcached:
sudo apt install libmemcached-tools
Теперь Memcached установлен как сервис, а на сервере есть инструменты, которые позволят вам проверить его подключение. Можно перейти к конфигурации.
2: Защита Memcached
Чтобы убедиться, что экземпляр Memcached прослушивает локальный интерфейс 127.0.0.1, нужно проверить настройку по умолчанию в конфигурационном файле /etc/memcached.conf. Текущая версия Memcached, которая поставляется с Ubuntu и Debian, включает параметр –l для определения локального интерфейса, что предотвращает dos-атаки. Нужно убедиться, что он установлен правильно.
Откройте файл /etc/memcached.conf:
sudo nano /etc/memcached.conf
Чтобы проверить настройку интерфейса, найдите следующую строку в файле:
. . .
-l 127.0.0.1
. . .
Если вы видите значение по умолчанию -l 127.0.0.1, тогда изменять эту строку нет необходимости. Если вы измените этот параметр, чтобы открыть другой интерфейс, тогда также неплохо было бы отключить UDP, поскольку он, скорее всего, будет использоваться в атаках типа «отказ в обслуживании». Чтобы отключить UDP (оставив TCP без изменений), добавьте следующий параметр в конец этого файла:
. . .
-U 0
Сохраните и закройте файл.
Перезапустите сервис Memcached:
sudo systemctl restart memcached
Убедитесь, что Memcached привязан к локальному интерфейсу и прослушивает только TCP-соединения:
sudo netstat -plunt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
. . .
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 2279/memcached
. . .
Это подтверждает, что memcached привязан к адресу 127.0.0.1 и использует только TCP.
3: Добавление авторизованных пользователей
Чтобы добавить авторизованных пользователей в Memcached, можно использовать Simple Authentication and Security Layer (SASL), структуру, которая изолирует процедуру аутентификации из протоколов приложений. Включите SASL в конфигурационном файле Memcached, а затем добавьте пользователя с учетными данными для аутентификации.
Поддержка SASL
Сначала нужно проверить подключение экземпляра Memcached с помощью команды memcstat. Это поможет подтвердить, что SASL и аутентификация пользователей включены после внесения изменений в конфигурации.
Чтобы убедиться, что Memcached запущен и работает, введите следующее:
memcstat --servers="127.0.0.1"
Server: 127.0.0.1 (11211)
pid: 2279
uptime: 65
time: 1546620611
version: 1.5.6
. . .
Теперь можно включить SASL. Во-первых, нужно добавить параметр -S в /etc/memcached.conf. Откройте файл еще раз:
sudo nano /etc/memcached.conf
В конец файла добавьте следующее:
. . .
-S
Затем найдите и раскомментируйте параметр -vv, который предоставит подробный вывод в /var/log/memcached. Строка должна выглядеть так:
. . .
-vv
Сохраните и закройте файл.
Перезапустите сервис Memcached:
sudo systemctl restart memcached
Затем можно взглянуть на логи, чтобы убедиться, что поддержка SASL включена:
sudo journalctl -u memcached
Вы должны увидеть следующую строку, которая включает поддержку SASL:
. . .
Jan 04 16:51:12 memcached systemd-memcached-wrapper[2310]: Initialized SASL.
. . .
Теперь можно снова проверить подключение, но после включения поддержки SASL эта команда должна выдать ошибку без аутентификации:
memcstat --servers="127.0.0.1"
Эта команда не вернет результат. Введите следующее, чтобы проверить ее статус:
echo $?
$? всегда будет возвращать код вывода последней завершенной команды. Как правило, любой ответ, кроме 0, указывает на сбой процесса. В этом случае вы должны увидеть статус выхода 1, что значит, что команда memcstat была выполнена неправильно.
Создание пользователя
Теперь можно скачать sasl2-bin – пакет, содержащий административные программы для пользовательской базы данных SASL. Это позволит вам создать аутентифицированного пользователя.
sudo apt install sasl2-bin
Затем нужно создать каталог и файл, где Memcached будет проверять параметры конфигурации SASL.
sudo mkdir /etc/sasl2
sudo nano /etc/sasl2/memcached.conf
Добавьте следующее в файл:
mech_list: plain
log_level: 5
sasldb_path: /etc/sasl2/memcached-sasldb2
Кроме уровня логирования здесь нужно указать параметр mech_list и присвоить ему значение plain, благодаря чему Memcached сможет использовать свой собственный файл паролей и проверять пароли в виде простого текста. Также нужно указать путь к файлу базы данных пользователя, который будет создан далее. Сохраните и закройте файл.
Теперь нужно создать базу данных SASL с учетными данными пользователя. Используйте команду saslpasswd2, чтобы сделать новую запись для пользователя в базе данных с помощью опции -c. Здесь пользователь условно называется 8host, но вы можете заменить это имя. Используя опцию -f, можно указать путь к базе данных (путь, который вы указали в каталоге /etc/sasl2/memcached.conf):
sudo saslpasswd2 -a memcached -c -f /etc/sasl2/memcached-sasldb2 8host
Вам будет предложено подтвердить выбранный пароль.
Теперь передайте пользователю memcache права на БД SASL.
sudo chown memcache:memcache /etc/sasl2/memcached-sasldb2
Перезапустите сервис Memcached:
sudo systemctl restart memcached
Команда memcstat снова подтвердит, сработал ли процесс аутентификации. На этот раз запустите команду с учетными данными:
memcstat --servers="127.0.0.1" --username=8host --password=your_password
Server: 127.0.0.1 (11211)
pid: 2772
uptime: 31
time: 1546621072
version: 1.5.6 Ubuntu
. . .
Сервис Memcached поддерживает SASL и аутентификацию пользователей.
4: Настройка доступа по частной сети (опционально)
Теперь вы знаете, как настроить Memcached для прослушивания локального интерфейса, что может предотвратить атаки типа отказ в обслуживании и защитить интерфейс Memcached от воздействия внешних сторон. Однако в некоторых случаях есть необходимость разрешить доступ к Memcached другим серверам. Для этого можно привязать Memcached к интерфейсу частной сети.
Здесь мы расскажем, как настроить брандмауэр на примере UFW.
Ограничение доступа по IP-адресу в брандмауэре
Прежде чем приступить к конфигурации, рекомендуется настроить правила брандмауэра, чтобы ограничить доступ к серверу Memcached. Для этого вам понадобятся внутренние IP-адреса клиентов, которые должны иметь доступ к Memcached.
Если вы используете брандмауэр UFW, вы можете ограничить доступ к экземпляру Memcached, введя следующее:
sudo ufw allow from client_server_private_IP/32 to any port 11211
Читайте также: Основы UFW: общие правила и команды фаервола
После этого можно привязать Memcached к интерфейсу частной сети.
Настройка Memcached для поддержки интерфейса частной сети
Теперь, когда брандмауэр готов, вы можете привязать Memcached к частному интерфейсу сервера вместо 127.0.0.1.
Откройте /etc/memcached.conf:
sudo nano /etc/memcached.conf
Найдите строку -l 127.0.0.1, которую вы уже проверяли или редактировали ранее, и измените адрес. Теперь здесь должен быть внутренний адрес сервера memcached:
. . .
-l memcached_servers_private_IP
. . .
Сохраните и закройте файл.
Перезапустите Memcached:
sudo systemctl restart memcached
Убедитесь, что все работает правильно, с помощью команды netstat:
sudo netstat -plunt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
. . .
tcp 0 0 memcached_server_private_IP:11211 0.0.0.0:* LISTEN 2912/memcached
. . .
Проверьте подключение с внешнего клиента, чтобы убедиться, что вы все еще можете получить доступ к сервису. Рекомендуется также проверить доступ с неавторизованного клиента, чтобы убедиться, что брандмауэр не пропустит соединение.
Заключение
Теперь вы умеете устанавливать Memcached и обеспечивать безопасность этого сервиса.
Чтобы узнать больше о Memcached, ознакомьтесь с документацией проекта.
Читайте также: Установка memcached в Ubuntu 14.04