Как зашифровать трафик в Redis с помощью Spiped в Ubuntu 16.04

Вступление

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

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

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

Предпосылки

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

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

Что такое спайпл?

Утилита + spiped + проста в установке и настройке для безопасной связи между двумя сетевыми сокетами (обычные сетевые порты или сокеты Unix). Его можно использовать для настройки зашифрованной связи между двумя удаленными серверами. Клиент подключается к локальному порту и + spiped + зашифровывает его перед отправкой на удаленный сервер. На стороне сервера + spiped + прослушивает настроенный порт и расшифровывает трафик перед его передачей на локальный порт (в нашем случае это порт, который прослушивает сервер Redis).

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

  • Ubuntu поддерживает пакеты для + spiped + в своих репозиториях по умолчанию.

  • В настоящее время проект Redis предлагает использовать + spiped + для шифрования трафика.

  • Конфигурация проста и интуитивно понятна.

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

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

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

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

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

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

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

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

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

Мы будем использовать Chris Lea’s Redis сервер 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 +. Мы попытаемся получить доступ к этому ключу с нашего клиентского компьютера после настройки + spiped +.

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

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

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

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

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

Далее вам необходимо установить + spiped + на каждом из серверов и клиентов. Если вам не нужно ничего устанавливать в предыдущем разделе, обязательно добавьте команду + sudo apt-get update + для обновления индекса вашего пакета перед установкой:

sudo apt-get install spiped

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

Создайте ключ шифрования на сервере Redis

Затем создайте каталог конфигурации + spiped + внутри + / etc + на вашем сервере Redis, чтобы сохранить ключ, который мы сгенерируем для шифрования:

sudo mkdir /etc/spiped

Создайте безопасный ключ, набрав:

sudo dd if=/dev/urandom of=/etc/spiped/redis.key bs=32 count=1

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

sudo chmod 600 /etc/spiped/redis.key

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

Создать системный файл модуля для серверов Redis

Утилита + spiped + очень проста и не поддерживает чтение файла конфигурации. Поскольку каждый канал должен быть настроен вручную, пакет Ubuntu не поставляется со скриптом инициализации для автоматического запуска канала при загрузке.

Чтобы решить эти проблемы, мы создадим простой системный файл systemd. Чтобы начать, откройте новый файл модуля в каталоге + / etc / systemd / system:

sudo nano /etc/systemd/system/spiped-receive.service

Внутри создайте раздел + [Unit] +, чтобы описать модуль и установить порядок так, чтобы этот модуль запускался после того, как сеть станет доступна:

/etc/systemd/system/spiped-receive.service

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

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

  • + -F +: запустить на переднем плане. Система systemd init предназначена для управления сервисами, работающими на переднем плане, когда это возможно. Работа на переднем плане упрощает настройку.

  • + -d +: расшифровать трафик из исходного сокета. Это сообщает + spiped + направление шифрования, чтобы он мог расшифровать трафик из источника и зашифровать трафик от цели.

  • + -s +: определяет исходный сокет. IP-адреса должны быть в квадратных скобках, после которых следует двоеточие, а затем порт. Для сервера Redis это должно быть общедоступным IP-адресом и портом Redis.

  • + -t +: целевой сокет. Это где трафик будет перенаправлен после расшифровки. Redis прослушивает порт 6379 на локальном хосте по умолчанию, поэтому мы должны это использовать.

  • + -k +: указывает файл ключа для использования. Это должно указывать на ключ шифрования, который мы сгенерировали ранее.

Все эти опции будут включены в одну директиву + ExecStart +, которая является единственным элементом, который нам нужен в этом разделе:

/etc/systemd/system/spiped-receive.service

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -d -s []:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key

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

/etc/systemd/system/spiped-receive.service

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -d -s []:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key

[Install]
WantedBy=multi-user.target

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

Запустите службу spiped и настройте брандмауэр на сервере Redis.

Запустите и включите новый модуль + spiped +, набрав:

sudo systemctl start spiped-receive.service
sudo systemctl enable spiped-receive.service

Если вы проверите сервисы, прослушивающие соединения на вашем сервере Redis, вы должны увидеть + spiped +, прослушивающий порт 6379 в общедоступном интерфейсе. Вы также должны увидеть, что Redis прослушивает этот же порт на локальном интерфейсе:

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 :6379          0.0.0.0:*               LISTEN      4292/spiped
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2679/redis-server 1
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1720/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1720/sshd

Хотя + spiped + прослушивает общедоступный интерфейс, брандмауэр, вероятно, еще не настроен на пропуск трафика.

Чтобы разрешить весь трафик на порт 6379, введите:

sudo ufw allow 6379

Это откроет доступ к порту 6379 в вашем общедоступном интерфейсе, где прослушивается + spiped +. Порт + spiped + принимает только зашифрованный трафик.

Передать ключ шифрования клиенту

Чтобы передать ключ шифрования клиенту, нам нужно установить безопасное соединение между нашими двумя серверами. Мы будем использовать + ssh +, поскольку это позволяет нам использовать нашу существующую конфигурацию.

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

Дополнительные шаги для аутентификации на основе ключей

Отключитесь от вашего сервера Redis:

exit

Теперь на вашем локальном компьютере убедитесь, что агент SSH запущен и ваш закрытый ключ добавлен к нему:

eval `ssh-agent`
ssh-add

Теперь снова подключитесь к вашему серверу Redis и добавьте флаг + -A + для пересылки ваших ключей:

ssh -A @

Теперь вы можете продолжить с шагами ниже.

Передача Ключа

Мы подключимся с сервера Redis к клиенту, потому что наш файл ключей требует локальных привилегий + sudo + для доступа. Теперь мы можем передать файл, убедившись, что в конце команды ниже указано двоеточие:

sudo -E scp /etc/spiped/redis.key @:

+ scp + для записи в домашний каталог вашего пользователя на клиентском компьютере.

После передачи ключа создайте каталог + / etc / spiped + на клиентском компьютере:

sudo mkdir /etc/spiped

Переместите ключ шифрования в новый каталог:

sudo mv ~/redis.key /etc/spiped

Заблокируйте разрешения для ограничения доступа:

sudo chmod 600 /etc/spiped/redis.key

Теперь, когда у клиента есть копия ключа шифрования сервера, мы можем настроить клиентскую часть конфигурации + spiped +.

Создать системный файл модуля для клиентов Redis

Нам потребуется создать системный файл systemd для + spiped + на стороне клиента, как мы это делали на сервере Redis.

Откройте новый системный файл systemd, набрав:

sudo nano /etc/systemd/system/spiped-send.service

Внутри откройте раздел + [Unit] +, чтобы описать сервис и убедитесь, что он зависит от доступности сети:

/etc/systemd/system/spiped-send.service

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

Затем откройте раздел + [Service] +, чтобы выполнить процесс + spiped +. Используемые здесь параметры очень похожи на параметры, используемые на сервере Redis, со следующими отличиями:

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

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

  • + -t +: определяет целевой сокет, как и раньше. Для клиента это будет публичный IP-адрес удаленного сервера Redis и открытый порт.

Они будут установлены с использованием директивы + ExecStart + снова:

/etc/systemd/system/spiped-send.service

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t []:6379 -k /etc/spiped/redis.key

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

/etc/systemd/system/spiped-send.service

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t []:6379 -k /etc/spiped/redis.key

[Install]
WantedBy=multi-user.target

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

Запустите spiped Сервис на Клиенте и протестируйте соединение

Теперь мы можем запустить наш сервис + spiped + на клиенте и включить его автоматический запуск при загрузке:

sudo systemctl start spiped-send.service
sudo systemctl enable spiped-send.service

Проверьте правильность настройки туннеля на клиенте:

sudo netstat -plunt
Redis client 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:8000          0.0.0.0:*               LISTEN      3264/spiped
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1705/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1705/sshd

Как видите, + spiped + прослушивает локальный порт 8000 для соединений.

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

redis-cli -p 8000 ping
Redis client outputPONG

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

redis-cli -p 8000 get test
Redis client output"success"

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

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

redis-cli -h  -p 6379 ping
Redis client outputError: Protocol error, got "\xac" as reply type byte

Как видите, трафик принимается только через удаленный порт Redis, если он правильно зашифрован через туннель.

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

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

Расширить этот пример для обработки нескольких клиентов просто. Вам нужно будет выполнить следующие действия, описанные выше.

  • Установите клиентское программное обеспечение Redis и пакет + spiped + на новом клиенте

  • Передайте ключ шифрования новому клиенту

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

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

Чтобы настроить защищенный обмен данными между серверами (например, для репликации или кластеризации), вам потребуется настроить два параллельных туннеля:

  • На новом сервере установите серверный пакет Redis и + spiped +

  • Создайте новый ключ шифрования для нового сервера Redis (используйте уникальное имя для файла)

  • Скопируйте ключ шифрования с одного сервера на другой в каталог + / etc / spiped +

  • Создайте системный файл + spiped + systemd на каждом сервере (включая существующие серверы), чтобы на каждом сервере был файл, выполняющий каждую роль:

  • Файл принимающего устройства, отображающий внешний порт на локальный Redis

  • Отправляющий файл модуля, отображающий локальный порт на незащищенный порт удаленного сервера

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

  • Настройте каждый экземпляр Redis для подключения к локально сопоставленному порту для доступа к удаленному серверу, изменив файл конфигурации Redis (требуемые директивы зависят от взаимоотношений серверов. Смотрите Redis документы для более подробной информации).

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

Заключение

Redis - это мощный и гибкий инструмент, который незаменим во многих случаях. Однако использование Redis в небезопасной среде - это огромная ответственность, которая делает ваши серверы и данные уязвимыми для атак или кражи. Важно защитить трафик другими способами, если у вас нет изолированной сети, заполненной только доверенными сторонами. Метод, описанный в этом руководстве, является лишь одним из способов обеспечения связи между сторонами Redis. Другие варианты включают tunneling with stunnel или https: // www.digitalocean.com/community/tutorials/how-to-encrypt-traffic-to-redis-with-peervpn-on-ubuntu-16-04, описывающий настройку VPN].

Related