Как установить и защитить Memcached
Linux, Ubuntu | Комментировать запись
Системы кэширования объектов памяти, такие как Memcached, оптимизируют производительность базы данных, временно сохраняя часто запрашиваемые или недавно извлеченные записи. Так они уменьшают количество прямых запросов к базам данных.
При неправильной настройке Memcached и других подобных систем сервер подвержен dos-атакам, потому безопасность серверов Memcached важно обеспечить заранее. Здесь мы расскажем, как защитить сервер Memcached, привязав установку к локальному или частному сетевому интерфейсу и создав авторизованного пользователя.
Требования
Для работы вам понадобится предварительно настроенный виртуальный сервер, пользователь sudo и брандмауэр. Мы используем сервер Ubuntu 22.04, настроенный по этому мануалу.
1: Установка Memcached
Если Memcached еще не установлен на вашем сервере, вы можете установить его из официальных репозиториев Ubuntu. Во-первых, обновите локальный индекс пакетов:
sudo apt update
После этого установите официальный пакет:
sudo apt install memcached
Также можно установить библиотеку libmemcached-tools, которая предоставляет несколько полезных инструментов для изучения, тестирования и управления сервером Memcached:
sudo apt install libmemcached-tools
Теперь Memcached установлен как сервис, а на сервере есть инструменты, которые позволят вам проверить его подключение.
Чтобы запустить сервис, введите команду:
sudo systemctl start memcached
Пора переходить к конфигурации и защите программы.
2: Настройка параметров сети Memcached (опционально)
Если вашему серверу Memcached необходимо поддерживать только локальные соединения IPv4 по TCP, вы можете пропустить этот раздел и перейти к разделу 3. В противном случае, если вам нужно настроить Memcached для поддержки сокетов UDP или соединений IPv6, выполните соответствующие инструкции в этом разделе.
Во-первых, убедитесь, что ваш экземпляр Memcached прослушивает локальный интерфейс IPv4 127.0.0.1. В текущей версии Memcached, поставляемой в Ubuntu и Debian, параметр конфигурации -l установлен на локальный интерфейс, то есть сервис настроен на прием соединений только с того сервера, на котором работает Memcached.
Убедитесь, что Memcached в настоящее время привязан к локальному интерфейсу IPv4 127.0.0.1 и прослушивает только TCP-соединения, используя команду ss:
sudo ss -plunt
Используемые в команде флаги будут изменять вывод ss следующим образом:
- -p добавляет имя процесса, использующего сокет
- -l ограничивает вывод прослушиваемыми сокетами, исключая сокеты, подключенные к другим системам.
- -u включает в вывод сокеты на основе UDP.
- -n отображает в выводе числовые значения вместо удобочитаемых имен и значений.
- -t включает в вывод сокеты на базе TCP
Вы должны получить примерно такой вывод:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=8889,fd=26)) . . .
Эти данные подтверждают, что memcached привязан к адресу loopback 127.0.0.1 IPv4 и использует только протокол TCP.
Теперь, когда мы убедились, что Memcached настроен для поддержки IPv4 по TCP, мы можем отредактировать /etc/memcached.conf, чтобы добавить поддержку соединений UDP, Unix Domain Sockets или IPv6.
Настройка IPv6
Чтобы разрешить IPv6 подключения к Memcached, откройте файл /etc/memcached.conf с помощью nano или другого редактора:
sudo nano /etc/memcached.conf
Найдите строку:
. . . -l 127.0.0.1
В этой строке Memcached настроен на прослушивание локального интерфейса IPv4. Чтобы включить поддержку IPv6, добавьте строку, содержащую локальный loopback адрес IPv6 (::1), например:
. . . -l 127.0.0.1 -l ::1
Сохраните и закройте файл. Затем перезапустите Memcached с помощью команды systemctl:
sudo systemctl restart memcached
Теперь вы можете убедиться, что Memcached прослушивает соединения IPv6. Для этого можно использовать ту же команду ss:
sudo ss -plunt
Вы должны получить следующий вывод:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=8889,fd=26)) . . . tcp LISTEN 0 1024 [::1]:11211 [::]:* users:(("memcached",pid=8889,fd=27))
Выделенные строки в выводе указывают, что Memcached теперь прослушивает TCP-соединения на локальном интерфейсе IPv6.
Обратите внимание: если вы хотите отключить поддержку IPv4 и оставить только поддержку соединений IPv6, вы можете удалить строку -l 127.0.0.1 из /etc/memcached.conf и перезапустить сервис с помощью команды systemctl.
Настройка UDP
Если вы хотите использовать Memcached с сокетами UDP, вы можете включить их поддержку, отредактировав файл /etc/memcached.conf.
Откройте /etc/memcached.conf с помощью nano или другого редактора, затем добавьте в конец файла следующую строку:
. . . -U 11211
Если вам не нужна поддержка TCP, найдите строку -p 11211 и измените ее на -p 0, чтобы отключить TCP-соединения.
Когда вы закончите редактирование, сохраните и закройте файл.
Затем перезапустите сервис Memcached с помощью systemctl, чтобы применить обновления:
sudo systemctl restart memcached
Убедитесь, что Memcached прослушивает соединения UDP:
sudo ss -plunt
Если вы отключили поддержку TCP и включили соединения IPv6, вы должны получить подобный вывод:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . udp UNCONN 0 0 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=8889,fd=28)) udp UNCONN 0 0 [::1]:11211 [::]:* users:(("memcached",pid=8889,fd=29)) . . .
Обратите внимание, что ваши выходные данные могут отличаться, если у вас включены только соединения IPv4 и вы оставили включенными TCP-соединения.
Настройка сокетов домена Unix
Если вы хотите использовать Memcached с сокетами домена Unix, вы можете включить их поддержку, отредактировав файл /etc/memcached.conf. Обратите внимание, если вы настроите Memcached для поддержки этих сокетов, Memcached отключит поддержку TCP и UDP, поэтому перед включением поддержки сокетов убедитесь, что вашим приложениям не нужны эти протоколы.
Откройте файл /etc/memcached.conf с помощью nano или другого редактора, затем добавьте следующие строки в конец:
. . . -s /var/run/memcached/memcached.sock
Флаг -a определяет права доступа к файлу сокета. Убедитесь, что пользователь, которому необходимо подключиться к Memcached, является частью группы memcache на вашем сервере. Иначе при попытке доступа к сокету он получит отказ.
Затем перезапустите Memcached с помощью команды systemctl, чтобы применить обновления:
sudo systemctl restart memcached
Убедитесь, что Memcached прослушивает подключения Unix Domain Socket, используя команду ss -lnx:
sudo ss -lnx | grep memcached
Флаг -x ограничивает вывод ss файлами сокетов. Вы должны получить примерно такой вывод:
u_str LISTEN 0 1024 /var/run/memcached/memcached.sock 20234658 * 0
Теперь, когда мы настроили сетевые параметры Memcached, мы можем перейти к настройке SASL для аутентификации в Memcached.
3: Добавление авторизованных пользователей
Чтобы добавить авторизованных пользователей в Memcached, можно использовать Simple Authentication and Security Layer (SASL), структуру, которая изолирует процедуру аутентификации из протоколов приложений. Включите SASL в конфигурационном файле Memcached, а затем добавьте пользователя с учетными данными для аутентификации.
Поддержка SASL
Чтобы приступить к настройке поддержки SASL, необходимо установить пакет sasl2-bin, который содержит программы для управления пользовательской БД SASL. Этот инструмент позволит вам создать аутентифицированного пользователя. Выполните следующую команду, чтобы установить его:
sudo apt install sasl2-bin
Затем создайте каталог и файл, которые Memcached будет проверять на наличие конфигурации SASL. Это делается с помощью команды mkdir:
sudo mkdir -p /etc/sasl2
Теперь создайте конфигурационный файл SASL с помощью nano или другого редактора:
sudo nano /etc/sasl2/memcached.conf
Вставьте в него строки:
log_level: 5 mech_list: plain sasldb_path: /etc/sasl2/memcached-sasldb2
В дополнение к уровню логирования мы установили значение plain для mech_list, благодаря чему Memcached будет использовать свой собственный файл паролей и проверять пароль в виде открытого текста. Последняя строка, которую мы добавили, указывает путь к файлу пользовательской БД, который мы создадим немного позже. Сохраните и закройте файл, когда закончите.
Теперь мы создадим базу данных SASL с учетными данными пользователя. Используем команду saslpasswd2 с флагом -c для создания новой записи в базе SASL. Здесь пользователь условно называется 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
Теперь у вас есть конфигурация SASL, которую Memcached может использовать для аутентификации. В следующем разделе мы убедимся, что Memcached работает с параметрами по умолчанию, а затем перенастроим его и проверим, поддерживает ли он аутентификацию SASL.
Настройка поддержки SASL
Сначала нужно проверить подключение экземпляра Memcached с помощью команды memcstat. Это поможет подтвердить, что SASL и аутентификация пользователей включены после внесения изменений в конфигурации.
Чтобы убедиться, что Memcached запущен и работает, введите следующее:
memcstat --servers="127.0.0.1"
Если вы используете IPv6, укажите ::1 вместо адреса IPv4 127.0.0.1. Если вы используете сокет домена Unix, используйте путь к сокету вместо IP-адреса, например –servers=/var/run/memcached/memached.sock.
После запуска команды memcstat и подключения к Memcached вы получите такой вывод:
Server: 127.0.0.1 (11211) pid: 2299875 uptime: 2020 time: 1632404590 version: 1.5.22 . . .
Примечание: Если вы используете Memcached с поддержкой UDP, команда memcstat не сможет подключиться к порту UDP. Используйте следующую команду netcat для проверки подключения:
nc -u 127.0.0.1 11211 -vz
Если Memcached отвечает, вы должны получить следующий вывод:
Connection to 127.0.0.1 11211 port [udp/*] succeeded!
Если вы используете Memcached с IPv6 и UDP, вам нужна следующая команда:
nc -6 -u ::1 11211 -vz
Теперь можно включить SASL. Для этого добавьте параметр -S в /etc/memcached.conf. Снова откройте файл с помощью nano или любого другого редактора:
sudo nano /etc/memcached.conf
В конец файла добавьте следующее:
. . . -S
Затем найдите и раскомментируйте параметр -vv, который предоставит подробный вывод в /var/log/memcached. Незакомментированная строка должна выглядеть так:
. . . -vv
Сохраните и закройте файл.
Перезапустите сервис Memcached с помощью следующей команды systemctl:
sudo systemctl restart memcached
Затем проверьте логи journalctl для Memcached, чтобы убедиться, что поддержка SASL включена:
sudo journalctl -u memcached |grep SASL
Вы должны получить подобную строку, указывающую, что поддержка SASL была включена:
Sep 23 17:00:55 memcached systemd-memcached-wrapper[2303930]: Initialized SASL.
Теперь вы можете снова проверить подключение к Memcached. При настроенной и инициализированной поддержке SASL следующая команда memcstat должна выдать ошибку, если ей не предоставить валидных учетных данных для аутентификации:
memcstat --servers="127.0.0.1"
Эта команда не вернет результат. Введите следующее, чтобы проверить ее статус:
echo $?
$? всегда будет возвращать код вывода последней завершенной команды. Как правило, любой ответ, кроме 0, указывает на сбой процесса. В этом случае вы должны увидеть статус выхода 1, что значит, что команда memcstat была выполнена неправильно.
Снова запустите memcstat, на этот раз с учетными данными, чтобы проверить, сработал ли процесс аутентификации. Запустите следующую команду (заменив условные учетные данные вашими настоящими данными):
memcstat --servers="127.0.0.1" --username=8host --password=your_password
Вы должны получить примерно такой вывод:
Server: 127.0.0.1 (11211) pid: 3831 uptime: 9 time: 1520028517 version: 1.4.25 . . .
Теперь сервис Memcached поддерживает SASL и аутентификацию пользователей.
4: Настройка доступа по частной сети (опционально)
Вы уже знаете, как настроить Memcached для прослушивания локального интерфейса, что может предотвратить атаки типа отказ в обслуживании и защитить интерфейс Memcached от воздействия внешних сторон. Однако в некоторых случаях есть необходимость разрешить доступ к Memcached другим серверам. Для этого можно привязать Memcached к интерфейсу частной сети.
Здесь мы расскажем, как настроить брандмауэр на примере UFW.
Ограничение доступа по IP-адресу в брандмауэре
Прежде чем приступить к конфигурации, рекомендуется настроить правила брандмауэра, чтобы ограничить доступ к серверу Memcached. Для этого вам понадобятся внутренние IP-адреса клиентов, которые должны иметь доступ к Memcached.
Если вы используете брандмауэр UFW, вы можете ограничить доступ к экземпляру Memcached, введя следующее:
sudo ufw allow from client_system_private_IP/32 to any port 11211
Если через частную сеть к Memcached обращаются несколько систем, обязательно добавьте дополнительные правила ufw для каждой из них, используя указанное выше правило в качестве шаблона.
Читайте также: Основы UFW: общие правила и команды фаервола
После этого можно привязать Memcached к интерфейсу частной сети.
Настройка Memcached для поддержки интерфейса частной сети
Теперь, когда брандмауэр готов, вы можете привязать Memcached к частному интерфейсу сервера вместо 127.0.0.1.
Сначала используйте эту команду, чтобы узнать частный сетевой интерфейс сервера Memcached.
ip -brief address show
В зависимости от настроек вывод может отличаться, но в целом он будет иметь примерно такой вид:
lo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 203.0.113.1/20 10.10.0.5/16 2001:DB8::1/64 fe80::7ced:9ff:fe52:4695/64 eth1 UP 10.136.32.212/16 fe80::2cee:92ff:fe21:8bc4/64
В этом примере сетевые интерфейсы определяются по именам eth0 и eth1. IPv4-адреса в строке eth0 — это общедоступные IP-адреса сервера.
10.136.32.212 в строке eth1 — это частный адрес IPv4 сервера, а fe80::2cee:92ff:fe21:8bc4 — это частный адрес IPv6. Ваши IP-адреса будут отличаться, но всегда будут попадать в следующие диапазоны (по спецификации RFC 1918):
- от 0.0.0 до10.255.255.255 (префикс 10/8)
- от 16.0.0 до172.31.255.255 (префикс 172.16/12)
- от 168.0.0 до192.168.255.255 (префикс 192.168/16)
Узнав свой адрес, откройте /etc/memcached.conf:
sudo nano /etc/memcached.conf
Найдите строку -l 127.0.0.1, которую вы уже проверяли или редактировали ранее, и измените адрес. Теперь здесь нужно указать внутренний адрес сервера memcached:
. . . -l memcached_servers_private_IP . . .
Если вы хотите, чтобы Memcached прослушивал несколько адресов, добавьте такую же строку для каждого адреса IPv4 или IPv6, используя формат -l memcached_servers_private_IP. Сохраните и закройте файл.
Перезапустите Memcached:
sudo systemctl restart memcached
Убедитесь, что все работает правильно, с помощью команды netstat:
sudo ss -plunt
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process . . . tcp LISTEN 0 1024 10.137.0.2:11211 0.0.0.0:* users:(("memcached",pid=8991,fd=27)) . . .
Проверьте подключение с внешнего клиента, чтобы убедиться, что вы все еще можете получить доступ к сервису. Рекомендуется также проверить доступ с неавторизованного клиента, чтобы убедиться, что брандмауэр не пропустит соединение.
Заключение
В этом руководстве вы узнали, как настроить Memcached с поддержкой IPv4, IPv6, TCP, UDP и сокетов домена Unix. Также вы узнали, как защитить свой сервер Memcached с помощью аутентификации SASL, привязать Memcached к локальному или частному сетевому интерфейсу и настроить правила брандмауэра для ограничения доступа к Memcached.
Чтобы узнать больше о Memcached, ознакомьтесь с документацией проекта.
Tags: Memcached, Ubuntu, Ubuntu 22.04