DevGang
Авторизоваться

Настройка 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);

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

#NodeJS #Redis
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

В подарок 100$ на счет при регистрации

Получить