Подключение к управляемому экземпляру Redis по TLS с помощью Stunnel и redis-cli

У управляемых баз данных (в том числе и Redis) есть такие преимущества, как высокая доступность и автоматические обновления. Однако при каждом подключении к такой БД вы рискуете стать жертвой sniffing-атак.

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

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

Требования

  • Сервер Ubuntu 18.04, настроенный по этому мануалу.
  • Управляемая база данных Redis (руководство достаточно универсально и должно сработать с любой БД Redis независимо от провайдера).

1: Установка Stunnel и redis-cli

Стандартная установка сервера Redis обычно поставляется с redis-cli. Однако вы можете установить redis-cli без сервера Redis. Для этого можно установить пакет redis-tools из стандартных репозиториев Ubuntu. Также из стандартных репозиториев можно установить stunnel, загрузив пакет stunnel4.

Сначала обновите индекс пакетов сервера, если вы еще этого не сделали:

sudo apt update

Затем установите пакеты redis-tools и stunnel4 с помощью менеджера APT:

sudo apt install redis-tools stunnel4

При появлении запроса нажмите Enter, чтобы подтвердить установку пакетов.

Вы можете проверить, правильно ли был установлен stunnel и работает ли его сервис systemd, запросив его состояние

sudo systemctl status stunnel4
stunnel4.service - LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)
Loaded: loaded (/etc/init.d/stunnel4; generated)
Active: active (exited) since Thu 2019-09-12 14:34:05 UTC; 8s ago
Docs: man:systemd-sysv-generator(8)
Tasks: 0 (limit: 2362)
CGroup: /system.slice/stunnel4.service
Sep 12 14:34:05 stunnel systemd[1]: Starting LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)...
Sep 12 14:34:05 stunnel stunnel4[2034]: TLS tunnels disabled, see /etc/default/stunnel4
Sep 12 14:34:05 stunnel systemd[1]: Started LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons).

Как видите, сервис stunnel активен, хотя процесс немедленно прекратил работу. Это говорит о том, что stunnel работает, но пока что он ничего не может сделать, поскольку мы еще не настроили его.

2: Настройка Stunnel

Современные системы Linux используют systemd для инициализации и управления сервисами и демонами. Однако для запуска stunnel использует SysV-подобный сценарий, основанный на более старой системе инициализации UNIX System V. Вам нужно отредактировать файл /etc/default/stunnel4, чтобы включить этот скрипт.

Откройте этот файл в текстовом редакторе (мы будем использовать nano):

sudo nano /etc/default/stunnel4

Найдите в верхней части файла опцию ENABLED. По умолчанию в ней установлено значение 0, но его нужно изменить на 1, чтобы включить запуск stunnel при загрузке:

# /etc/default/stunnel
# Julien LEMOINE <speedblue@debian.org>
# September 2003
# Change to one to enable stunnel automatic startup
ENABLED=1
. . .

Сохраните и закройте файл. Если вы использовали nano, нажмите для этого Ctrl+X, Y, а затем Enter.

После этого нужно создать конфигурационный файл stunnel, который сообщит программе, куда она должна направить трафик.

Откройте новый файл stunnel.conf в каталоге /etc/stunnel:

sudo nano /etc/stunnel/stunnel.conf

Добавьте следующие строки в этот файл:

fips = no
setuid = nobody
setgid = nogroup
pid =
debug = 7
[redis-cli]
client = yes
accept = 127.0.0.1:8000
connect = managed_redis_hostname_or_ip:managed_redis_port

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

  • fips: управляет режимом FIPS 140-. В таком режиме stunnel проверяет, соответствует ли соединение Федеральному стандарту по обработке информации. Значение no отключает эту функцию. Отключение этого режима не повлияет на безопасность. Но если вы захотите оставить его включенным (как по умолчанию), то вам потребуется дополнительная настройка.
  • setuid: определяет ID пользователя Unix, с помощью которого будет работать stunnel. По умолчанию процесс stunnel принадлежит пользователю root. Но документация stunnel рекомендует сбрасывать административные привилегии после запуска туннеля, поскольку иначе может возникнуть угроза безопасности. Если параметру setuid задать значение none, ни один непривилегированный пользователь не станет владельцем процесса stunnel после создания туннеля.
  • setgid: определяет ID группы Unix, с помощью которой будет работать stunnel. Подобно setuid, эта конфигурация задает группу без каких-либо специальных привилегий – nogroup – чтобы избежать любых потенциальных проблем безопасности.
  • pid: определяет местоположение файла, в котором stunnel создаст файл .pid (этот файл содержит PID процесса). Файлы .pid обычно используются другими программами для поиска PID запущенного процесса. По умолчанию stunnel создает файл .pid в каталоге /var/run/stunnel4/. Поскольку пользователь nobody не имеет доступа к этому каталогу, он не сможет правильно запустить туннель. Не предоставляя никаких аргументов параметру pid в этой конфигурации, мы отключаем такое поведение, поскольку .pid файл нам сейчас не нужен. Если в будущем вам понадобится включить файл .pid, укажите файл, в который пользователь nobody может добавлять записи.
  • debug: устанавливает уровень отладки stunnel, который может варьироваться от 0 до 7. В этом примере мы установим 7, самый высокий доступный уровень – это предоставит наиболее подробную информацию, если stunnel столкнется с какими-либо проблемами. Вы можете установить здесь любой уровень, который вам нравится. По умолчанию установлено значение 5.

Остальные строки – это параметры для данного сервиса. Они  применяются только к туннелю, который мы создадим для redis-cli:

  • [redis-cli]: имя сервиса. Оно указывает, что в следующих строках представлена ​​индивидуальная конфигурация сервиса для клиентской программы. В конфигурации Stunnel может быть несколько сервисов, но каждый из них должна быть связан с существующим клиентским приложением. Нельзя создавать два сервиса для одного и того же приложения.
  • client: если здесь установлено значение yes, stunnel будет работать в режиме клиента, то есть stunnel будет подключаться к TLS-серверу (управляемому экземпляру Redis), а не действовать как TLS-сервер.
  • accept: Определяет хост и порт, по которому stunnel будет принимать соединения от клиента. Здесь указан IP-адрес 127.0.0.1, loopback адрес IPv4 для представления localhost, и порт 8000. Это значит, что stunnel будет прослушивать соединения, исходящие от сервера Ubuntu через порт 8000, и шифровать их. Обратите внимание: вы можете установить любой номер свободный порта.
  • connect: определяет удаленный адрес и порт, к которому будет подключаться stunnel. Обязательно укажите здесь порт и имя хоста или IP-адрес вашей управляемой базы данных.

Примечание: Имя хоста/IP-адрес и номер порта в директиве connect должны относиться к вашей управляемой базе данных Redis. Обычно их можно найти в пользовательском интерфейсе БД вашего облачного провайдера, который обслуживает ваш экземпляр Redis.

Это минимальная конфигурация. Многие настройки Stunnel остались по умолчанию. Эта программа поддерживает много опций для создания туннелей, что позволяет создавать туннели под потребности конкретного проекта. Более подробную информацию можно найти в официальной документации.

После добавления этих параметров сохраните и закройте файл.

Затем перезапустите сервис stunnel4, чтобы он прочитал новые конфигурации:

sudo systemctl restart stunnel4

После этого с помощью netstat вы сможете проверить, был ли создан stunnel. Netstat — это утилита командной строки для отображения сетевых подключений. Выполните следующую команду, которая передает выходные данные netstat в команду grep, которая затем ищет в них все вхождения шаблона stunnel:

sudo netstat -plunt | grep stunnel
tcp        0      0 127.0.0.1:8000         0.0.0.0:*               LISTEN      17868/stunnel

Эти выходные данные сообщают, что stunnel прослушивает соединения через локальный порт 8000.

Вы также можете убедиться, что пользователь nobody стал владельцем процесса stunnel. Это делается с помощью программы ps, которая отображает все запущенные в данный момент процессы:

ps aux | grep stunnel
nobody   15674  0.0  0.1 121912  3180 ?        Ssl  19:28   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
. . .

Как видите, пользователь nobody является владельцем процесса stunnel.

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

3: Подключение к управляемой базе данных по TLS

Теперь, когда вы установили redis-cli и настроили stunnel на своем сервере, вы можете подключиться к управляемой базе данных по протоколу TLS.

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

redis-cli -h localhost -p 8000

Эта команда содержит флаг -h, который сообщает redis-cli, что следующим аргументом будет хост, к которому нужно подключиться. В данном случае это localhost, поскольку мы подключаемся к туннелю, созданному на сервере локально. После этого идет флаг -p, который задает порт локального туннеля, в данном случае это 8000.

После выполнения этой команды вы подключитесь к управляемому серверу Redis. Ваша командная строка изменится, что значит, что вы подключились к БД и находитесь в интерактивном режиме redis-cli.

Примечание: Зачастую управляемые базы данных настраиваются так, чтобы при подключении пользователи проходили парольную аутентификацию. Если для подключения к вашей управляемой БД Redis требуется пароль, вы можете включить в команду redis-cli флаг -a, а затем указать пароль:

redis-cli -h localhost -p 8000 -a password

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

auth password

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

ping

Если соединение работает, команда вернет PONG:

PONG

Но если stunnel не туннелирует трафик с вашего сервера на экземпляр Redis, вы увидите следующее сообщение об ошибке, после чего соединение будет сброшено:

Error: Server closed the connection

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

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

exit

Если в дальнейшем вы будете менять конфигурацию stunnel, вам потребуется перезагрузить сервис stunnel4, чтобы изменения вступили в силу:

sudo systemctl reload stunnel4

Если в какой-то момент в будущем вы захотите закрыть туннель TLS, вы не сможете закрыть его с помощью systemctl. Вместо этого нужно завершить процесс с помощью команды pkill:

sudo pkill stunnel

Позже вы можете снова открыть туннель, перезапустив сервис:

sudo systemctl restart stunnel4

Теперь, когда вы успешно настроили stunnel, вы можете добавить данные в свойуправляемый экземпляр Redis с помощью redis-cli.

Заключение

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

Теперь вы можете интегрировать Redis с вашим приложением. Если вы новичок в работе с Redis, вам могут пригодиться другие наши мануалы.

Tags: , , , , ,