Поддержка SSL/TLS в Redis: инструкция по настройке
Redis — высокопроизводительная in-memory база данных, широко используемая для кэширования, хранения сессий, реализации очередей и других задач, требующих быстрого доступа к данным. Однако по умолчанию Redis не шифрует передаваемые между клиентом и сервером данные, что делает соединение уязвимым к перехвату трафика в ненадёжных сетях. Поддержка SSL/TLS в Redis решает эту проблему, обеспечивая конфиденциальность и целостность данных.
- Зачем включать TLS в Redis?
- Требования для настройки TLS
- Проверка поддержки TLS в сборке Redis
- Генерация сертификатов для Redis
- Шаг 1: Установка OpenSSL
- Шаг 2: Генерация CA (Центр сертификации)
- Шаг 3: Генерация сертификата сервера
- Шаг 4: Настройка SAN (Subject Alternative Name)
- Конфигурация Redis с поддержкой TLS
- Отключение незашифрованного порта
- Подключение клиентов через TLS
- Python (библиотека redis-py)
- Node.js (ioredis)
- Java (Lettuce)
- Рекомендации по безопасности
- Включение mTLS (Mutual TLS)
- Типичные ошибки и их устранение
- Заключение
Зачем включать TLS в Redis?
По умолчанию Redis работает по открытому TCP-порту, чаще всего 6379, без шифрования. Это оправдано в изолированных средах, но становится критической уязвимостью при использовании в публичных сетях, облачных инфраструктурах или при межсервисном взаимодействии. Перехват трафика позволяет злоумышленнику получить доступ к чувствительным данным: токенам аутентификации, персональной информации, внутренним сообщениям.
Включение TLS (Transport Layer Security) защищает канал связи между клиентами и сервером Redis. Шифрование гарантирует, что даже при перехвате пакетов данные останутся недоступными для чтения. Это особенно важно при соблюдении стандартов безопасности, таких как PCI DSS, HIPAA или GDPR, где требуется защита передаваемых данных.
TLS также обеспечивает аутентификацию сервера (а при необходимости и клиента), предотвращая атаки типа MITM (man-in-the-middle). Сертификаты позволяют клиенту убедиться, что он подключается к доверенному экземпляру Redis, а не к поддельному серверу.
Требования для настройки 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.
Генерация сертификатов для Redis
Для работы TLS необходимы сертификаты. В продакшене рекомендуется использовать сертификаты от доверенного центра (например, Let’s Encrypt), но для тестирования подойдут самоподписанные.
Шаг 1: Установка OpenSSL
Убедитесь, что OpenSSL установлен:
sudo apt install openssl # Ubuntu/Debian
sudo yum install openssl # CentOS/RHEL
Шаг 2: Генерация CA (Центр сертификации)
- Создайте закрытый ключ CA:
openssl genrsa -out ca.key 4096 - Создайте корневой сертификат:
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=Redis CA"
Шаг 3: Генерация сертификата сервера
- Создайте ключ сервера:
openssl genrsa -out redis.key 2048 - Создайте запрос на сертификат (CSR):
openssl req -new -key redis.key -out redis.csr -subj "/CN=redis.local" - Подпишите 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 с поддержкой 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();
«`
Рекомендации по безопасности
Настройка 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в конфиге и передавайте пароль в клиенте.
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, повышая уровень доверия между сервисами.
- Используйте 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.
Мнения авторов могут не совпадать с позицией государственных органов или коммерческих организаций, упомянутых в материалах.