Как установить и защитить Memcached

Системы кэширования объектов памяти, такие как 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: , ,

Добавить комментарий