Настройка Redis TLS
Transport Layer Security (TLS) - это криптографический протокол, который обеспечивает безопасную доставку данных между приложениями и их базами данных Redis. Теперь, когда Redis 6 имеет встроенную поддержку TLS, а Heroku - дополнительную поддержку уровня Hobby-dev, пришло время использовать TLS с минимальными усилиями!
Три простых шага по настройке Heroku-Redis TLS для продакшна
1. Проверьте конфигурацию приложения Heroku.
Первое, что нужно сделать, это дважды проверить, поддерживается ли TLS с учетом уровня вашего приложения Heroku и версии Redis. Вы можете сделать это в Settings > Config Vars
. Пока существует сгенерированная переменная с именем REDIS_TLS_URL
, это означает, что ваше приложение поддерживает TLS.
2. Настройте переменные среды.
Теперь, когда у нас есть сгенерированная переменная среды, нам нужно убедиться, что наше приложение указывает на правильный URL-адрес в файле конфигурации. Логическая переменная secure будет полезна для других нужд конфигурации.
redis: {
url: process.env.REDIS_TLS_URL ?? process.env.REDIS_URL,
secure: !!process.env.REDIS_TLS_URL,
prefix: process.env.REDIS_PREFIX || "",
},
3. Подключитесь к клиенту.
Чтобы подключить это к нашему клиенту, нам нужно указать, следует ли включать второй параметр, указывающий параметры TLS. Поскольку у Heroku есть самоподписывающиеся сертификаты, на этом этапе нам не нужно передавать какой-либо сгенерированный сертификат ключей. Heroku во всем разберется за вас!
import Redis from "ioredis";
const isTLS = config.get("redis.secure");
if (isTLS) {
_redis = new Redis(REDIS_URL, {
tls: {
rejectUnauthorized: false,
},
});
} else {
_redis = new Redis(REDIS_URL);
}
Вот и все! Есть всего три простых шага, чтобы запустить Redis TLS в продакшн среде с Heroku-Redis.
Прежде чем мы перейдем к локальной настройке TLS, задайте себе вопрос. Уместно ли то, что мы не раскрываем тестовые данные в виде простого текста? Для большинства проектов ответ - нет. Однако, если вы обнаружите, что вашему проекту требуется дополнительный уровень безопасности, читайте дальше.
Три шага к локальному Redis TLS
1. Создание сертификатов и ключей
Запустите этот сценарий из Redis в своем терминале, чтобы сгенерировать необходимый сертификат и ключи.
sh gen-test-cert.sh
2. Настройка Docker Redis.
Чтобы включить Redis TLS при сборке, необходимо установить в файле `redis.conf` включение TLS. Это означает снятие комментариев со следующих строк из файла по умолчанию `redis.conf`. Вы можете получить официальную копию здесь.
port 0
tls-port 6379
tls-cert-file /usr/local/etc/redis/tls/redis.crt
tls-key-file /usr/local/etc/redis/tls/redis.key
tls-ca-cert-file /usr/local/etc/redis/tls/ca.crt
Наряду с настройкой конфигурации Redis, локально сгенерированные сертификаты и ключ необходимо подключить к образу Redis для создания докеров.
redis:
image: redis:6.2.0
command: redis-server /redis.conf
environment:
REDIS_PASSWORD:
REDIS_TLS_ENABLED: "yes"
REDIS_TLS_CERT_FILE: /usr/local/etc/redis/redis.crt
REDIS_TLS_KEY_FILE: /usr/local/etc/redis/redis.key
REDIS_TLS_CA_FILE: /usr/local/etc/redis/ca.crt
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf
- ./tls/redis.crt:/usr/local/etc/redis/tls/redis.crt
- ./tls/redis.key:/usr/local/etc/redis/tls/redis.key
- ./tls/ca.crt:/usr/local/etc/redis/tls/ca.crt
ports:
- "6379:6379"
3. Подключение к клиенту
Подобно настройке клиента только для продакшн среды, мы передаем сам URL-адрес, но теперь мы передаем все самостоятельно сгенерированные сертификаты и ключи.
const REDIS_URL: string = config.get("redis.tlsUrl");
const redis_uri = new URL(REDIS_URL);
const redisOptions: any = REDIS_URL.includes("rediss://")
? {
port: Number(redis_uri.port),
host: redis_uri.hostname,
password: redis_uri.password,
db: 0,
tls: {
rejectUnauthorized: false,
cert: fs.readFileSync("tls/redis.crt"),
key: fs.readFileSync("tls/redis.key"),
ca: fs.readFileSync("tls/ca.crt"),
},
}
: REDIS_URL;
_redis = new Redis(redisOptions);
Вот и все! После этого второго набора из трех шагов мы можем обезопасить транспортировку наших данных из внешнего интерфейса в базу данных.