Redis – открытое in-memory хранилище типа «ключ-значение». Redis поддерживает транзакции, шаблон проектирования pub-sub, автоматический обход сбоев и многое другое. Для Redis разработано множество клиентов в различных языках программирования.
Примечание: Список рекомендованных клиентов можно найти здесь.
Однако Redis не имеет никаких функций шифрования данных. Хранилище нужно развёртывать в изолированной частной сети, доступ к которой есть только у заведомо безопасных клиентов, либо же настроить шифрование трафика самостоятельно.
Данное руководство поможет настроить шифрование трафика Redis с помощью программы PeerVPN. В отличие от некоторых других средств, эта программа предоставляет удобное гибкое решение для настройки сети server-to-server, не привязанной к конкретному порту или сервису.
Требования
В руководстве настройка продемонстрирована на примере двух серверов Ubuntu 16.04. На серверах должны быть:
- Пользователь с доступом к sudo.
- Базовый брандмауэр.
Все необходимые инструкции можно найти в руководстве по начальной настройке.
Что такое PeerVPN?
PeerVPN – это очень простая VPN-технология, которая устанавливает топологию сетки. Это означает, что ведущего сервера, который поддерживает взаимодействие между нодами, в инфраструктуре нет. Весь трафик между нодами шифруется с помощью VPN, а сервисы и брандмауэр можно настроить для приема трафика только на интерфейсе VPN.
Преимущества PeerVPN:
- Интуитивная настройка. В отличие от многих программ VPN, PeerVPN очень проста в настройке и не требует отдельного сервера.
- Универсальное средство для настройки шифрования сетевых соединений. В отличие от некоторых средств туннелирования, VPN обеспечивает защищенную сеть для любого трафика. Шифрование нужно настроить один раз, после чего оно доступно для всех сервисов.
- В отличие от туннелирования, для взаимодействия между серверами нужно всего одно соединение.
Недостатки PeerVPN:
- Программа не предоставляет сценарий инициализации, поэтому его необходимо написать самостоятельно, чтобы автоматически создавать необходимые соединения при загрузке.
Установка сервера и клиента Redis
На один сервер Ubuntu 16.04 нужно установить пакеты сервера Redis, на второй – пакеты клиента Redis. Если вы сделали это заранее, пропустите раздел.
Примечание: Сервер Redis устанавливает тестовый ключ, который в дальнейшем будет использоваться для проверки соединения. Если вы уже установили сервер Redis, вы можете продолжить и установить такой ключ (вы можете выбрать любое ключевое слово).
Установка сервера Redis
Чтобы установить последнюю доступную версию Redis, используйте этот PPA.
Примечание: Всегда проверяйте пакеты, загруженные из сторонних репозиториев.
Добавьте PPA и установите Redis.
sudo apt-add-repository ppa:chris-lea/redis-server
sudo apt-get update
sudo apt-get install redis-server
Чтобы ответить на запросы инсталлятора, нажмите Enter.
После завершения установки убедитесь, что вы можете подключиться к сервису Redis локально:
redis-cli ping
Если программа успешно установлена и запущена, на экране появится:
PONG
Теперь добавьте ключ для дальнейшего использования:
redis-cli set test 'success'
Это присвоит ключу test значение success. Это ключевое слово нужно использовать в дальнейшем для проверки соединения с stunnel.
Установка клиента Redis
Второй сервер Ubuntu 16.04 будет использоваться в качестве клиента. Все необходимые пакеты можно загрузить из стандартного реопзитория:
sudo apt-get update
sudo apt-get install redis-tools
Установка PeerVPN
Примечание: Данный раздел нужно выполнить на всех машинах Redis.
На данный момент репозитории Ubuntu не предоставляют пакетов PeerVPN.
На сайте проекта можно найти скомпилированный бинарный файл для Linux (в разделе Download). Кликните правой кнопкой и скопируйте ссылку на файл.
Откройте каталог /tmp и загрузите пакет с помощью curl:
cd /tmp
curl -LO https://peervpn.net/files/peervpn-0-044-linux-x86.tar.gz
Распакуйте архив:
tar xzvf peervpn*
Скопируйте бинарный файл в каталог /usr/local/bin, а образец конфигурационного файла в /etc.
sudo cp /tmp/peervpn*/peervpn /usr/local/bin
sudo cp /tmp/peervpn*/peervpn.conf /etc
Настройка сети PeerVPN
Примечание: Данный раздел нужно выполнить на каждой машине.
Генерирование секретного ключа безопасности
PeerVPN использует секретный ключ до 512 символов для проверки подлинности машин в сети. Все машины в сети PeerVPN совместно используют один ключ. Для защиты целостности сетевого трафика необходимо использовать надёжные ключи. Создайте один секретный ключ на любой машине Redis.
OpenSSL – простой способ сгенерировать надёжный ключ максимальной длины. С помощью команды wc проверьте длину ключа.
openssl rand -base64 382 | tr -d '\n' | wc
0 1 512
Если длина ключа правильная, удалите команду wc, чтобы сгенерировать ключ. Добавьте в конец команды echo.
openssl rand -base64 382 | tr -d '\n' && echo
ajHpYYMJYtv+m0K6yZbYmk8npPujlcv9QDozQZ06ucV2gsHoMGqyfd50X8OnY6hicj5iFNjDN/9QVTB3nhMOV2ufU/kfWCbtskUuk1zHWYZsvy71KnLRhA8W8dnu+NEKdIh28H2qUsiay7On5kOZPcrONvv/pHHYbxmFI2G9TyYT+CZWIAxUV/vUWl41VycjASmZYaSI6lWgYONopncNfDF5Z6oznPH8ge6sQsszbe1ZjNqLRUrx/jgL3fy7SXSLCIrsSuifBv/pb36d9/y+YPZEbxsMInoK5QEWrpIf/xjbMFlndtGc20olhh05h66qz/GiimLMivrN8g+PibVaBRUmWav/pngUvKYsEEPSc0wrr5ZuvpvBGTTKqPdR+soCnd/iWPzmwRBW56vBGxed3GNbkgmjDpTSnvNEN+gKPt07drHSbGqfFbdMdsKbjE+IWiqiVO1aviJsNpMhBO/o9uIcKxPmuze6loZKTh7/qjJuY62E//SsgFzDHDhP2w==
Примечание: Не копируйте это значение! Скопируйте вывод своей команды и используйте полученный ключ в настройке PeerVPN.
Настройка PeerVPN
Примечание: Данный раздел нужно выполнить на каждой машине.
Чтобы настроить PeerVPN, откройте файл /etc/peervpn.conf:
sudo nano /etc/peervpn.conf
Файл содержит комментарии, описывающие все опции. Ознакомьтесь с доступными параметрами.
Руководство предлагает довольно простую настройку. Вы можете добавить все необходимые параметры в начало файла, либо же найти и раскомментировать все нужные параметры.
Сначала нужно установить опции networkname и psk. Значения этих опций должны быть одинаковыми на каждой машине в VPN. Networkname – произвольное имя этой сети; psk – секретный ключ.
networkname RedisNet
psk your_generated_secret
Далее нужно указать порт (опция port), который может использовать PeerVPN (например,7000). Опция enabletunneling должна иметь значение yes, чтобы машина стала активной частью сети. Также нужно указать сетевой интерфейс (директива interface), он будет отображаться в выводе инструментов ip и ifconfig.
networkname RedisNet
psk your_generated_secret
port 7000
enabletunneling yes
interface peervpn0
Укажите размер сети VPN, присвойте уникальный IP-адрес VPN каждому серверу с помощью ifconfig4. Для этого используется CIDR. Предположим, адрес сети – 10.8.0.0/24. Это даёт нам 254 потенциальных адреса (гораздо больше, чем нужно), начиная с 10.8.0. каждый адрес должен быть уникальным.
- Сервер Redis – 10.8.0.1/24;
- Клиент – 10.8.0.2/24.
С помощью initpeers укажите другие серверы, которые будут присутствовать в сети. PeerVPN не использует сервер для централизованного управления, все хосты будут связаны в VPN-сеть во время инициализации. После этого каждый сервер получит всю информацию о других серверах сети.
Укажите внешний IP серверов (не IP-адрес сети, указанный в PeerVPN) и порт, который нужно прослушивать. Адреса нужно разделить пробелами.
networkname RedisNet<^>
psk your_generated_secret
port 7000
enabletunneling yes
interface peervpn0
# Increment the IP address below for each additional server
# For example, the second node on the network could be 10.8.0.2/24
ifconfig4 10.8.0.1/24
initpeers other_server_public_IP 7000
Сохраните и закройте файл. Конфигурационный файл на всех машинах будет почти одинаковым, отличаться будет только ifconfig4 и initpeers.
Создание юнит-файла PeerVPN
Чтобы управлять сервисом PeerVPN и иметь возможность автоматически запускать его, создайте юнит-файл. Откройте новый юнит-файл в каталоге /etc/systemd/system:
sudo nano /etc/systemd/system/peervpn.service
Добавьте в него раздел [Unit] с описанием сервиса:
[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target
Затем добавьте раздел [Service], он определяет команды, которые нужно запустить. В данном случае директива ExecStart должна вызывать бинарный файл peervpn и направлять его на конфигурационный файл.
[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf
Теперь нужно добавить раздел [Install]:
[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf
[Install]
WantedBy=multi-user.target
Сохраните и закройте файл.
Запуск сервиса PeerVPN и настройка брандмауэра
Чтобы запустить и включить сервис PeerVPN, введите:
sudo systemctl start peervpn.service
sudo systemctl enable peervpn.service
Проверьте сервисы, которые прослушивают соединения на сервере Redis; вы должны увидеть сервис PeerVPN, использующий порт 7000 на интерфейсах IPv4 иIPv6.
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:6379 0.0.0.0:* LISTEN 2662/redis-server 1
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1724/sshd
tcp6 0 0 :::22 :::* LISTEN 1724/sshd
udp 0 0 0.0.0.0:7000 0.0.0.0:* 4609/peervpn
udp6 0 0 :::7000 :::* 4609/peervpn
Сервис PeerVPN прослушивает открытый интерфейс, однако брандмауэр, скорее всего, блокирует этот трафик.
Чтобы разблокировать порт 7000 и трафик сети 10.8.0.0/24, введите:
sudo ufw allow 7000
sudo ufw allow from 10.8.0.0/24
Убедитесь, что вы можете получить доступ ко второму серверу.
ping 10.8.0.2
Отладка сервера Redis
Теперь VPN настроена. Отредактируйте интерфейсы, которые прослушивает сервер Redis. По умолчанию он использует только локальный интерфейс.
Откройте конфигурационный файл на сервере Redis:
sudo nano /etc/redis/redis.conf
Найдите директиву bind. По умолчанию её значение 127.0.0.1. Вставьте в конец IP-адрес VPN сервера Redis.
. . .
bind 127.0.0.1 10.8.0.1
. . .
Сохраните и закройте файл.
Перезапустите сервис Redis:
sudo systemctl restart redis-server.service
Теперь сервис Redis доступен для других серверов VPN сети. Чтобы убедиться в этом, введите:
sudo netstat -plunt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.8.0.1:6379 0.0.0.0:* LISTEN 4767/redis-server 1
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 4767/redis-server 1
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1724/sshd
tcp6 0 0 :::22 :::* LISTEN 1724/sshd
udp 0 0 0.0.0.0:7000 0.0.0.0:* 4609/peervpn
udp6 0 0 :::7000 :::* 4609/peervpn
Обратите внимание на верхнюю строку: это значит, что теперь Redis прослушивает интерфейс VPN.
Тестирование подключения
Примечание: Этот раздел нужно выполнить на клиенте.
Теперь нужно убедиться, что клиент может получить доступ к серверу.
Для этого направьте клиент на VPN IP-адрес сервера Redis и добавьте опцию –h.
redis-cli -h 10.8.0.1 ping
PONG
Запросите тестовый ключ, установленный в начале руководства:
redis-cli -p 8000 get test
"success"
Это значит, что у клиента есть доступ к удалённой базе данных.
Расширение настроек
Выше мы рассмотрели пример простой настройки шифрования для одного клиента и одного сервера Redis. Эту настройку вы можете применить и для большой инфраструктуры.
PeerVPN использует топологию сетки, потому добавить новый сервер очень просто. Для этого нужно:
- Установить PeerVPN.
- Скопировать конфигурации PeerVPN; откорректировать директивы ifconfig4 (уникальный IP-адрес сети VPN) и initpeers (минимум один, а лучше все рабочие серверы этой установки).
- Скопировать юнит-файл PeerVPN на новую машину.
- Запустить сервис PeerVPN и включить его автозапуск.
- Открыть внешний порт и сеть VPN в брандмауэре.
- Откорректировать настройки Redis для подключения к новому интерфейсу VPN (для серверов Redis).
Заключение
Redis – производительный и гибкий инструмент для хранения данных. Однако обмен данными Redis не защищен, что позволяет злоумышленникам похитить информацию. Поэтому очень важно зашифровать трафик между удалёнными серверами Redis.
Читайте также: