Практическое задание

Эта задача — шаг 9 курса «Redis в проде»

TLS для Redis со своим CA

сложно~30 мин

Трафик к Redis идёт открытым текстом — пароли и данные видны любому, кто слушает сеть. Включи TLS на отдельном порту, не ломая старый.

  1. Сгенерируй в каталоге /etc/redis/tls/ свой удостоверяющий центр — ca.key и самоподписанный ca.crt.
  2. Выпусти серверный ключ redis.key и сертификат redis.crt, подписанный этим CA (не самоподписанный), для имени localhost или адреса 127.0.0.1.
  3. Ключ redis.key должен читаться пользователем redis, но не читаться всеми остальными.
  4. В /etc/redis/redis.conf включи TLS на порту 6380 (обычный порт 6379 продолжает работать), клиентские сертификаты не требуй. Перезапусти Redis.

Итог: redis-cli -p 6380 --tls --cacert /etc/redis/tls/ca.crt ping отвечает PONG, а клиент без TLS на 6380 не проходит.

Что потренируешь:
  • redis
  • TLS
  • openssl
  • PKI
  • удостоверяющий центр
  • tls-port

Разбор темы

Redis по умолчанию передаёт команды, пароли AUTH и данные открытым текстом. Начиная с версии 6 он умеет TLS: директива tls-port открывает отдельный зашифрованный порт, tls-cert-file/tls-key-file задают сертификат сервера, tls-ca-cert-file — CA, которому сервер доверяет при проверке клиентов (tls-auth-clients yes включает взаимный TLS). Во внутренней инфраструктуре сертификаты обычно выпускает свой CA: клиенту достаточно доверять его корневому сертификату (--cacert), чтобы проверять любой сервер. Приватный ключ сервера должен читаться только процессом Redis, а старый порт без TLS держат открытым на время миграции клиентов и потом закрывают (port 0).

Что проверяется

  1. серверный сертификат подписан своим CA
  2. сертификат выписан на localhost или 127.0.0.1
  3. ключ читает redis, но не все подряд
  4. TLS-порт 6380 отвечает PONG
  5. без TLS на 6380 не пускает
  6. обычный порт 6379 работает, данные на месте

Как это выглядит