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

Вступление

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

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

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

Предпосылки

Для завершения этого руководства вам понадобится:

  • Доступ к серверу Ubuntu 18.04. На этом сервере должен быть пользователь без полномочий root с административными привилегиями и брандмауэр, настроенный сufw. Чтобы настроить это, следуйте нашимinitial server setup guide for Ubuntu 18.04.

  • Управляемый экземпляр базы данных Redis. Шаги, описанные в этом руководстве, были протестированы на базе данных Redis, управляемой DigitalOcean, хотя в целом они должны работать для управляемых баз данных от любого облачного провайдера. Чтобы подготовить базу данных Redis, управляемую DigitalOcean, следуйте нашимManaged Redis product documentation.

[[step-1 -—- install-stunnel-and-redis-cli]] == Шаг 1. Установка Stunnel и redis-cli

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

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

sudo apt update

Затем установите пакетыredis-tools иstunnel4 с APT:

sudo apt install redis-tools stunnel4

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

Вы можете проверить, правильно ли установлен stunnel и работает ли его службаsystemd, выполнив следующую команду:

sudo systemctl status stunnel4
Output● 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 работает, но на самом деле он ничего не может сделать, поскольку мы еще не настроили его.

[[step-2 -—- configuring-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/stunnel4

# /etc/default/stunnel
# Julien LEMOINE 
# 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

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

/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

Первые пять строк в файле -global options, что означает, что они будут применяться ко всем службам, которые вы включаете в этот файл:

  • fips: включает или отключает режим FIPS 140-2 stunnel. В этом режиме stunnel проверит, что соединение соответствуетFederal Information Processing Standard. Установка этого параметра наno отключает эту функцию. Обратите внимание, что отключение этого не менее безопасно, но его сохранение (как по умолчанию) потребует дополнительной настройки.

  • setuid: определяет идентификатор пользователя Unix, под которым будет запускаться stunnel. По умолчанию владельцем процесса stunnel является пользовательroot. Однакоstunnel documentation recommends, которые вы теряете административные привилегии после запуска туннеля, поскольку невыполнение этого требования создает угрозу безопасности. Установка параметраsetuid наnobody приведет к тому, чтоnobody, непривилегированный пользователь, станет владельцем процесса stunnel после того, как туннель будет установлен.

  • setgid: определяет идентификатор группы 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.

Остальные строки -service-level options - применяются только к туннелю, который мы создадим дляredis-cli:

  • [redis-cli]: этоservice name, указывающее, что следующие строки представляют индивидуальную конфигурацию службы для клиентской программы. В файле конфигурации Stunnel может быть несколько служб, хотя каждая из них должна быть связана с существующим клиентским приложением, и у вас не может быть двух служб для одного и того же приложения.

  • client: установка наyes указывает stunnel работать в режиме клиента, что означает, что stunnel будет подключаться к серверу TLS (управляемому экземпляру Redis), а не действовать как сервер TLS.

  • accept: определяет хост и порт, на котором stunnel будет принимать соединения от клиента. Здесь мы указываем IP-адрес127.0.0.1, который является адресом обратной связи IPv4, используемым для представленияlocalhost, и порта8000. Это означает, что stunnel будет прослушивать соединения, исходящие от сервера Ubuntu на порту8000, и шифровать их. Обратите внимание, что вы можете установить для порта любой номер порта, который вам нравится, если он еще не используется.

  • connect: определяет удаленный адрес и порт, к которому stunnel будет устанавливать соединение. Обязательно измените этот параметр, чтобы он соответствовал порту вашей управляемой базы данных и имени хоста или IP-адресу.

[.Примечание]##

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

Если вы используете базу данных Redis, управляемую DigitalOcean, вы можете найти эту информацию, перейдя вControl Panel и нажавDatabases в меню левой боковой панели. Затем щелкните имя экземпляра Redis, к которому вы хотите подключиться, и прокрутите вниз до разделаConnection Details. Там вы найдете поля, описывающиеhost иport вашей базы данных.

Это довольно минимальная конфигурация, которая оставляет многие настройки по умолчанию для Stunnel. Программа имеет много вариантов для создания туннелей, которые соответствуют вашим конкретным потребностям. См.the official documentation для более подробной информации.

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

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

sudo systemctl restart stunnel4

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

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

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

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

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

Здесь вы можете видеть, чтоnobody действительно взял на себя процесс остановки.

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

[[step-3 -—- connected-to-your-managed-database-over-tls]] == Шаг 3. Подключение к управляемой базе данных через TLS

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

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

redis-cli -h localhost -p 8000

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

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

[.Примечание]##

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

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

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

auth password

Если вы используете управляемую базу данных DigitalOcean, вы можете найти пароль вашего экземпляра Redis там же, где и его имя хоста и порт. В вашемControl Panel нажмитеDatabases в меню левой боковой панели. Затем нажмите на имя экземпляра Redis, к которому вы подключены. Прокрутите вниз до разделаConnection Details, и там вы найдете поле с надписьюpassword. Нажмите кнопкуshow, чтобы открыть пароль, затем скопируйте и вставьте его в любую из этих команд - заменивpassword - для аутентификации.

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

ping

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

Output PONG

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

Output Error: Server closed the connection

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

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

exit

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

sudo systemctl reload stunnel4

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

sudo pkill stunnel

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

sudo systemctl restart stunnel4

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

Заключение

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

Отсюда вы можете начать изучать Redis и интегрировать его с вашим следующим приложением. Если вы новичок в работе с Redis, вы можете найти нашу серию статей оHow To Manage a Redis Database.

Related