Поддержка SSL/TLS в Redis: инструкция по настройке

Поддержка SSL/TLS в Redis: инструкция по настройке

Redis — высокопроизводительная in-memory база данных, широко используемая для кэширования, хранения сессий, реализации очередей и других задач, требующих быстрого доступа к данным. Однако по умолчанию Redis не шифрует передаваемые между клиентом и сервером данные, что делает соединение уязвимым к перехвату трафика в ненадёжных сетях. Поддержка SSL/TLS в Redis решает эту проблему, обеспечивая конфиденциальность и целостность данных.

Настройка SSL/TLS в Redis требует использования версии 6.0 или выше и предварительной генерации сертификатов. Основной путь — активация TLS через параметры конфигурации, такие как tls-port, tls-cert-file, tls-key-file и tls-ca-cert-file.

Зачем включать TLS в Redis?

По умолчанию Redis работает по открытому TCP-порту, чаще всего 6379, без шифрования. Это оправдано в изолированных средах, но становится критической уязвимостью при использовании в публичных сетях, облачных инфраструктурах или при межсервисном взаимодействии. Перехват трафика позволяет злоумышленнику получить доступ к чувствительным данным: токенам аутентификации, персональной информации, внутренним сообщениям.
Включение TLS (Transport Layer Security) защищает канал связи между клиентами и сервером Redis. Шифрование гарантирует, что даже при перехвате пакетов данные останутся недоступными для чтения. Это особенно важно при соблюдении стандартов безопасности, таких как PCI DSS, HIPAA или GDPR, где требуется защита передаваемых данных.
TLS также обеспечивает аутентификацию сервера (а при необходимости и клиента), предотвращая атаки типа MITM (man-in-the-middle). Сертификаты позволяют клиенту убедиться, что он подключается к доверенному экземпляру Redis, а не к поддельному серверу.

Полезно знать: Начиная с версии 6.0, Redis официально поддерживает TLS/SSL. Ранние версии требуют проксирования через stunnel или nginx, что усложняет архитектуру.

Требования для настройки TLS

Для успешного внедрения TLS в Redis необходимо выполнить несколько условий:

  • Redis версии 6.0 или выше. Проверить версию можно командой redis-server --version.
  • Открытый сертификат (PEM-формат) и закрытый ключ, привязанные к домену или IP-адресу сервера.
  • CA-сертификат (Certificate Authority), если используется самоподписанный центр сертификации.
  • Доступ к редактированию конфигурационного файла Redis (redis.conf).
  • Права на открытие дополнительного порта (по умолчанию 6380 для TLS).

Redis не поддерживает одновременную работу обычного и TLS-порта в одном процессе без явного указания обоих. Однако можно настроить один экземпляр на прослушивание двух портов: нешифрованного (6379) и зашифрованного (6380), хотя это не рекомендуется в продакшене.
Если вы используете Redis в Docker, убедитесь, что образ основан на версии 6.0+. Например, официальный образ redis:6.2 или новее. Для Kubernetes потребуется примонтировать секреты с сертификатами.

Проверка поддержки TLS в сборке Redis

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

redis-cli info | grep ssl

Если вывод содержит строки вроде tls_supported:1, значит, TLS доступен. Если такой строки нет, возможно, Redis собран без OpenSSL/LibreSSL.

«Всегда проверяйте поддержку TLS в своей сборке до начала настройки. Особенно это критично при использовании сторонних дистрибутивов или старых пакетов из репозиториев.» — Алексей Смирнов, DevOps-инженер

Генерация сертификатов для Redis

Для работы TLS необходимы сертификаты. В продакшене рекомендуется использовать сертификаты от доверенного центра (например, Let’s Encrypt), но для тестирования подойдут самоподписанные.

Шаг 1: Установка OpenSSL

Убедитесь, что OpenSSL установлен:

sudo apt install openssl # Ubuntu/Debian
sudo yum install openssl # CentOS/RHEL

Шаг 2: Генерация CA (Центр сертификации)

  1. Создайте закрытый ключ CA:
    openssl genrsa -out ca.key 4096
  2. Создайте корневой сертификат:
    openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=Redis CA"

Шаг 3: Генерация сертификата сервера

  1. Создайте ключ сервера:
    openssl genrsa -out redis.key 2048
  2. Создайте запрос на сертификат (CSR):
    openssl req -new -key redis.key -out redis.csr -subj "/CN=redis.local"
  3. Подпишите CSR с помощью CA:
    openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt -days 365

Шаг 4: Настройка SAN (Subject Alternative Name)

Если Redis доступен по IP или нескольким доменам, добавьте SAN. Создайте файл sans.cnf:

[SAN]
subjectAltName=DNS:redis.local,IP:192.168.1.10

И используйте его при подписи:

openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt -days 365 -extfile sans.cnf -extensions SAN
Полезно знать: Redis не проверяет имя хоста автоматически. Клиент должен вручную проверять соответствие CN или SAN при подключении.

Конфигурация Redis с поддержкой TLS

После получения сертификатов необходимо настроить Redis. Откройте redis.conf и добавьте следующие параметры:

Параметр
Описание
Пример значения
tls-port
Порт для зашифрованных соединений
6380
port
Порт для обычных соединений (может быть отключён)
0 (чтобы отключить)
tls-cert-file
Путь к сертификату сервера (.crt)
/etc/redis/tls/redis.crt
tls-key-file
Путь к закрытому ключу сервера (.key)
/etc/redis/tls/redis.key
tls-ca-cert-file
Путь к CA-сертификату (для проверки клиентов или цепочки)
/etc/redis/tls/ca.crt
tls-auth-clients
Требовать аутентификацию клиентов (yes/no)
no (по умолчанию)
tls-protocols
Поддерживаемые версии TLS
TLSv1.2 TLSv1.3

Пример минимальной конфигурации:

tls-port 6380
port 0
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
tls-protocols TLSv1.2 TLSv1.3

После сохранения файла перезапустите Redis:

sudo systemctl restart redis-server

Убедитесь, что процесс слушает порт 6380:

ss -tuln | grep 6380

Отключение незашифрованного порта

Для максимальной безопасности установите port 0. Это полностью отключает TCP-порт 6379. Если нужно временно оставить оба порта, убедитесь, что незашифрованный доступ ограничен только локальной сетью.

Подключение клиентов через TLS

Клиенты должны использовать TLS-совместимые драйверы. Ниже — примеры для популярных языков.

Python (библиотека redis-py)

Установите версию 4.0+:

pip install redis>=4.0

Пример подключения:

import redis
r = redis.Redis(
 host='redis.local',
 port=6380,
 ssl=True,
 ssl_ca_certs='/path/to/ca.crt',
 ssl_cert_reqs='required' # проверка сертификата
)
print(r.ping())

Node.js (ioredis)

const Redis = require("ioredis");
const redis = new Redis({
 host: "redis.local",
 port: 6380,
 tls: {
 ca: require("fs").readFileSync("/path/to/ca.crt"),
 },
});
redis.ping().then(console.log);

Java (Lettuce)

Используйте зависимость:
«`xml
<dependency>
<groupId>io.lettuce.core</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.1.5.RELEASE</version>
</dependency>
«`
Код:
«`java
SslOptions sslOptions = SslOptions.builder()
.jdkSslProvider()
.build();
ClientOptions clientOptions = ClientOptions.builder()
.sslOptions(sslOptions)
.build();
RedisURI uri = RedisURI.Builder.redis(«redis.local», 6380)
.withSsl(true)
.build();
StatefulRedisConnection connection = RedisClient.create(uri)
.setOptions(clientOptions)
.connect();
«`

Полезно знать: При использовании самоподписанных сертификатов клиенты по умолчанию могут отклонять соединение. Убедитесь, что CA-сертификат добавлен в доверенные или явно указан в параметрах.

Рекомендации по безопасности

Настройка TLS — это только первый шаг. Для полноценной защиты следуйте лучшим практикам:

  • Используйте TLS 1.2 и выше. Отключите устаревшие протоколы (SSLv3, TLSv1.0, TLSv1.1).
  • Регулярно обновляйте сертификаты. Срок действия — не более года, особенно при использовании Let’s Encrypt.
  • Храните ключи в безопасном месте. Закрытые ключи должны быть доступны только владельцу процесса Redis (обычно пользователь redis).
  • Ограничьте права доступа к конфигурационным файлам:
    chmod 600 /etc/redis/tls/*.key
  • Активируйте аутентификацию клиентов (mTLS), если требуется двусторонняя проверка.

Включение mTLS (Mutual TLS)

Чтобы Redis проверял клиентские сертификаты, установите:

tls-auth-clients yes

Клиент должен предоставить свой сертификат, подписанный тем же CA. Это полезно в микросервисных архитектурах, где каждый сервис должен быть аутентифицирован.

Типичные ошибки и их устранение

  • Ошибка: «SSL handshake failed»
    Причина: несоответствие сертификата имени хоста или неверный CA.
    Решение: проверьте SAN, убедитесь, что клиент использует правильный ca.crt.
  • Ошибка: «Permission denied» при запуске Redis
    Причина: процесс Redis не может прочитать .key файл.
    Решение: установите права chown redis:redis *.key и chmod 600 *.key.
  • Redis не слушает порт 6380
    Причина: ошибка в конфигурации или конфликт с другим сервисом.
    Решение: проверьте логи journalctl -u redis-server, убедитесь, что tls-port задан корректно.
  • Клиент подключается, но команды не работают
    Причина: забыт пароль после включения TLS.
    Решение: TLS не отменяет аутентификацию. Используйте requirepass в конфиге и передавайте пароль в клиенте.
«При диагностике проблем с TLS используйте утилиту openssl s_client:
openssl s_client -connect redis.local:6380 -CAfile ca.crt
Это покажет детали рукопожатия и возможные ошибки сертификатов.» — Дмитрий Петров, специалист по информационной безопасности

Заключение

Включение TLS в Redis — обязательный шаг при развертывании в любой среде, выходящей за пределы изолированной сети. Начиная с версии 6.0, Redis предоставляет встроенную поддержку шифрования, что упрощает настройку по сравнению с проксированием через stunnel. Ключевые этапы — генерация сертификатов, корректная настройка redis.conf и использование TLS-совместимых клиентских библиотек.
Без шифрования данные Redis передаются в открытом виде, что создаёт серьёзные риски. Даже в частных облаках трафик может быть перехвачен. TLS не только шифрует данные, но и позволяет реализовать строгую аутентификацию через mTLS, повышая уровень доверия между сервисами.

Настройка TLS в Redis — это не опция, а стандарт безопасности. При правильном подходе она добавляет минимальные накладные расходы, но многократно повышает защищённость системы.
  • Используйте Redis 6.0+ для встроенной поддержки TLS.
  • Генерируйте сертификаты с учётом SAN и сроков действия.
  • Настройте tls-port, tls-cert-file, tls-key-file и tls-ca-cert-file.
  • Отключайте незашифрованный порт в продакшене.
  • Проверяйте подключение через openssl s_client и логи Redis.
⚠️ Дисклеймер — нажмите, чтобы развернуть

Материалы, опубликованные в разделе «Блог» на сайте RU DESIGN SHOP (rudesignshop.ru), носят исключительно информационный и ознакомительный характер и не являются руководством к действию, финансовой рекомендацией, медицинской услугой, ветеринарным назначением либо рекламой товаров и услуг, включая азартные игры. Публикации не содержат призывов к участию в азартных играх и не направлены на продвижение соответствующих операторов.

Безопасность применения товаров и веществ: при использовании строительных материалов, бытовой химии, пестицидов и агрохимикатов необходимо строго следовать инструкциям производителя и действующему законодательству Российской Федерации, включая Федеральный закон РФ от 19.07.1997 № 109-ФЗ «О безопасном обращении с пестицидами и агрохимикатами».

Упоминание товарных знаков, брендов и организаций носит исключительно информационный характер и не означает наличие партнёрских отношений или одобрения со стороны правообладателей.

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

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

Правовая ответственность: решения, принятые на основе опубликованной информации, пользователь принимает самостоятельно и на свой риск; редакция и авторы несут ответственность в пределах, установленных законодательством Российской Федерации.

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

Упоминание организаций с ограниченным статусом: компания Meta Platforms Inc. (социальные сети Facebook и Instagram) признана экстремистской организацией решением суда РФ, её деятельность запрещена на территории Российской Федерации; любые упоминания приводятся исключительно в информационных целях.

Авторские права и источники: информация собирается из открытых источников; её актуальность указывается на дату публикации и может изменяться.

Изображения и иллюстрации используются на условиях, разрешённых правообладателями. При возникновении претензий редакция готова оперативно рассмотреть обращение и внести необходимые изменения.

Персональные данные и cookies: сайт использует cookies и обрабатывает персональные данные пользователей в соответствии с Федеральным законом № 152-ФЗ «О персональных данных» и Политикой конфиденциальности RU DESIGN SHOP.

Мнения авторов могут не совпадать с позицией государственных органов или коммерческих организаций, упомянутых в материалах.