Как зашифровать трафик для Redis с PeerVPN в Ubuntu 16.04

Вступление

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

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

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

Предпосылки

Для начала у вас должен быть пользователь без полномочий root с правамиsudo, настроенными на каждой из ваших машин. Кроме того, в этом руководстве предполагается, что у вас установлен базовый брандмауэр. Вы можете следовать нашимUbuntu 16.04 initial server setup guide, чтобы выполнить эти требования.

Когда вы будете готовы продолжить, следуйте ниже.

Что такое PeerVPN?

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

Некоторые преимущества использования PeerVPN:

  • Простая и интуитивно понятная конфигурация. В отличие от многих VPN, PeerVPN может быть настроен с минимальными затратами и не требует центрального сервера.

  • Универсальное решение для зашифрованной сетевой связи. В отличие от некоторых вариантов туннелирования, VPN обеспечивает безопасную сеть для трафикаany. Зашифрованная связь должна быть настроена только один раз и может использоваться всеми службами.

  • Для связи между серверами требуется только одно соединение. В отличие от туннельных решений, для взаимодействия двух серверов Redis требуется только одна конфигурация.

Некоторые недостатки:

  • Ubuntu в настоящее время не имеет пакета для PeerVPN в репозиториях по умолчанию.

  • Там нет включенного сценария инициализации, поэтому он должен быть создан для автоматического создания необходимых подключений при загрузке.

Имея в виду эти характеристики, давайте начнем.

Установите Redis Server и клиентские пакеты

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

[.note] #Note: Инструкции сервера Redis устанавливают тестовый ключ, который будет использоваться для проверки соединения позже. Если у вас уже установлен сервер Redis, вы можете установить этот ключ или использовать любой другой известный ключ при тестировании соединения.
#

Установка сервера Redis

Мы будем использоватьChris Lea’s Redis server PPA для установки последней версии Redis. Всегда соблюдайте осторожность при использовании стороннего хранилища. В этом случае Крис Ли - надежный упаковщик, который поддерживает высококачественные, современные пакеты для нескольких популярных проектов с открытым исходным кодом.

Добавьте 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

Если программное обеспечение установлено и запущено, вы должны увидеть:

Redis server outputPONG

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

redis-cli set test 'success'

Мы установили ключtest на значениеsuccess. Мы попытаемся получить доступ к этому ключу с нашего клиентского компьютера после настройки PeerVPN.

Установка клиента Redis

Другой компьютер с Ubuntu 16.04 будет работать как клиент. Все необходимое нам программное обеспечение доступно в пакетеredis-tools в репозитории по умолчанию:

sudo apt-get update
sudo apt-get install redis-tools

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

Установите PeerVPN на каждом компьютере

Далее вам нужно будет установить PeerVPN на каждом из серверов и клиентов. Как упоминалось выше, Ubuntu в настоящее время не включает пакеты PeerVPN в свои репозитории.

К счастью,project’s website включает скомпилированный двоичный файл для Linux в разделеDownload. Щелкните правой кнопкой мыши и скопируйте ссылку для статически связанного двоичного файла Linux на этой странице, чтобы убедиться, что у вас самая последняя версия.

На каждой из ваших машин перейдите в каталог/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

Располагая исполняемый файл и файл конфигурации на своем месте, мы можем настроить PeerVPN на каждой из наших машин.

Генерация безопасного секретного ключа

PeerVPN использует общий секретный ключ длиной до 512 символов для аутентификации легальных машин в сети. Важно использовать строгие значения для защиты целостности вашего сетевого трафика. Поскольку это общий секрет, нам нужно создать только одно значение для нашей сети (для этого мы будем использовать сервер Redis, но не имеет значения, какой вы выберете).

Один простой способ создать надежный секрет максимальной длины - это OpenSSL. Убедитесь, что он выводит на выходе 512 символов или меньше сwc (вы можете настроить 382 в этой команде, чтобы повлиять на длину вывода):

openssl rand -base64 382 | tr -d '\n' | wc
Redis server output      0       1     512

Если длина правильная, удалитеwc, чтобы создать секрет с высокой энтропией. Мы добавимecho в конце, чтобы поставить последнюю новую строку:

openssl rand -base64 382 | tr -d '\n' && echo

Вы должны увидеть что-то вроде этого(do not copy the below value!):

Redis server outputajHpYYMJYtv+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. Имя сети - это произвольный идентификатор для этой конкретной сети, аpsk - это общий секрет, упомянутый ранее:

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

Затем явно установитеport, которые PeerVPN может использовать для подключения к одноранговым узлам, чтобы мы могли легко настроить наш брандмауэр (в этом руководстве мы будем использовать 7000). Установитеenabletunneling, чтобы этот аппарат был активной частью сети. Задайте имя для сетиinterface, которое будет отображаться в таких инструментах, какip иifconfig.

/etc/peervpn.conf

networkname RedisNet
psk your_generated_secret

port 7000
enabletunneling yes
interface peervpn0

Вам нужно будет выбрать размер сети VPN и назначить уникальный IP-адрес VPN каждому серверу с помощью директивыifconfig4. Это делается с помощьюCIDR notation. Мы определим сеть VPN как 10.8.0.0/24. Это даст нам 254 потенциальных адреса (намного больше, чем нам нужно), все начиная с 10.8.0. Поскольку каждый адрес должен быть уникальным, мы будем использовать:

  • 10.8.0.1/24 для нашего сервера Redis

  • 10.8.0.2/24 для нашего клиентского сервера

Наконец, используйтеinitpeers, чтобы указать другие серверы, которые будут в сети. Поскольку PeerVPN не использует централизованный сервер управления, с этими узлами свяжутся во время инициализации, чтобы присоединиться к сети VPN. После подключения сервер автоматически получит информацию о любых дополнительных пирах в сети.

Одноранговый узел должен быть указан с использованием его общедоступного IP-адреса (not IP-адрес VPN, назначенного в конфигурации PeerVPN) и порта прослушивания PeerVPN. Дополнительные одноранговые узлы могут быть указаны в той же строке, также разделенные пробелом (примеры приведены в комментариях в файле):

/etc/peervpn.conf

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], чтобы описать модуль и установить порядок, чтобы этот модуль запускался после того, как сеть станет доступной:

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

Затем откройте раздел[Service], чтобы определить фактическую команду для запуска. Здесь нам просто нужно использоватьExecStart, чтобы вызвать двоичный файлpeervpn и указать его на созданный нами файл конфигурации:

/etc/systemd/system/peervpn.service

[Unit]
Description=PeerVPN network service
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf

Наконец, мы добавим раздел[Install], чтобы сообщить systemd, когда следует автоматически запускать модуль, если он включен:

/etc/systemd/system/peervpn.service

[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

Если вы проверите сервисы, прослушивающие соединения на ваших серверах, вы должны увидеть, что PeerVPN прослушивает порт 7000 для интерфейсов IPv4 и IPv6 (если доступно):

sudo netstat -plunt
OutputActive 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, где PeerVPN прослушивает соединения, а также трафик из самой сети 10.8.0.0/24:

sudo ufw allow 7000
sudo ufw allow from 10.8.0.0/24

Это откроет доступ к порту 7000 на вашем общедоступном интерфейсе, где PeerVPN прослушивает. Это также позволит трафику свободно перетекать из VPN.

Проверьте, можете ли вы подключиться к другому серверу, используя IP-адрес VPN. Например, с вашего сервера Redis вы можете набрать:

ping 10.8.0.2

Вы должны иметь возможность подключиться без проблем.

Настройте параметры сервера Redis

Теперь, когда VPN настроен, нам нужно настроить интерфейсы, которые слушает Redis. По умолчанию Redis привязывается только к локальному интерфейсу.

Откройте файл конфигурации Redis на сервере Redis:

sudo nano /etc/redis/redis.conf

Внутри найдите директивуbind, которая в настоящее время должна иметь значение 127.0.0.1. Добавьте IP-адрес VPN сервера Redis в конец:

/etc/redis/redis.conf

. . .
bind 127.0.0.1 10.8.0.1
. . .

Сохраните и закройте файл, когда вы закончите.

Теперь перезапустите сервис Redis, набрав:

sudo systemctl restart redis-server.service

Сервис Redis теперь должен быть доступен для соединений от VPN-партнеров. Вы можете проверить это, повторно проверив прослушивающие порты:

sudo netstat -plunt
Redis server outputActive 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.

Тестовые подключения от клиента Redis

Когда VPN работает и Redis прослушивает сеть VPN, мы можем проверить, чтобы наш клиентский компьютер Redis мог получить доступ к серверу Redis.

Для этого укажите вашему клиенту IP-адрес VPN сервера Redis с помощью параметра-h:

redis-cli -h 10.8.0.1 ping
Redis client outputPONG

Запрос на тестовый ключ, который мы задали в начале этого руководства:

redis-cli -h 10.8.0.1 get test
Redis client output"success"

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

Расширение вышеприведенного примера для связи с несколькими клиентами и между серверами

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

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

  • Установите PeerVPN, загрузив tarball, а затем распаковав и распространив файлы

  • Скопируйте конфигурацию PeerVPN с других серверов и настройте эти директивы:

    • ifconfig4 должен быть установлен на неиспользуемый IP-адрес в сети VPN.

    • initpeers должен указывать хотя бы на один, но предпочтительно на все существующие одноранговые узлы

  • Скопируйте файл системного модуля PeerVPN на новый клиентский компьютер

  • Запустите сервис PeerVPN и включите его при загрузке

  • Откройте внешний порт и сеть VPN в брандмауэре

  • (Только для серверов Redis) Настройте конфигурацию Redis для привязки к новому интерфейсу VPN

Заключение

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

Related