Перейти к содержанию

encrypted-session: Шифрование и расшифровка значений переменных NGINX

Установка

Вы можете установить этот модуль в любом дистрибутиве на базе RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-encrypted-session
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-encrypted-session

Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_encrypted_session_module.so;

Этот документ описывает nginx-module-encrypted-session v0.9, выпущенный 18 ноября 2021 года.


## ключ должен быть длиной 32 байта
encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

## iv не должен превышать 16 байт
## по умолчанию: "deadbeefdeadbeef" (без кавычек)
encrypted_session_iv "1234567812345678";

## по умолчанию: 1d (1 день)
encrypted_session_expires 3600; # в секундах

location /encrypt {
    set $raw 'text to encrypted'; # из модуля ngx_rewrite
    set_encrypt_session $session $raw;
    set_encode_base32 $session; # из модуля ngx_set_misc

    add_header Set-Cookie 'my_login=$session';  # из модуля ngx_headers

    # ваш обработчик контента здесь...
}

location /decrypt {
    set_decode_base32 $session $cookie_my_login; # из модуля ngx_set_misc
    set_decrypt_session $raw $session;

    if ($raw = '') {
        # плохая сессия
    }

    # ваш обработчик контента здесь...
}

Описание

Этот модуль предоставляет поддержку шифрования и расшифровки для переменных nginx на основе AES-256 с Mac.

Этот модуль обычно используется с ngx_set_misc module и директивами стандартного модуля переписывания.

Этот модуль может быть использован для реализации простой авторизации пользователей и ACL.

Обычно вы просто расшифровываете данные на уровне nginx и передаете расшифрованные данные вашему FastCGI/HTTP бэкенду, как в

location /blah {
    set_decrypt_session $raw_text $encrypted;

    # эта директива из модуля ngx_set_misc
    set_escape_uri $escaped_raw_text $raw_text;

    fastcgi_param QUERY_STRING "uid=$uid";
    fastcgi_pass unix:/path/to/my/php/or/python/fastcgi.sock;
}

Lua веб-приложения, работающие непосредственно на ngx_lua, могут вызывать директивы этого модуля непосредственно из кода Lua:

local raw_text = ndk.set_var.set_decrypt_session(encrypted_text)

Директивы

encrypted_session_key

синтаксис: encrypted_session_key <key>

по умолчанию: нет

контекст: http, server, server if, location, location if

Устанавливает ключ для шифрования (должен быть длиной 32 байта). Например,

encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

encrypted_session_iv

синтаксис: encrypted_session_iv <iv>

по умолчанию: encrypted_session_iv "deadbeefdeadbeef";

контекст: http, server, server if, location, location if

Устанавливает начальный вектор, используемый для шифрования (не должен превышать 16 байт).

Например,

encrypted_session_iv "12345678";

encrypted_session_expires

синтаксис: encrypted_session_expires <time>

по умолчанию: encrypted_session_expires 1d;

контекст: http, server, server if, location, location if

Устанавливает время истечения срока действия (по умолчанию в секундах).

Например, рассмотрим следующую конфигурацию:

encypted_session_expires 1d;

Когда ваша сессия создается, ngx_encrypted_session устанавливает время истечения (1 день в будущем в этом примере) в строку зашифрованной сессии, так что, когда сессия будет расшифрована позже, сервер сможет извлечь время истечения из сессии и сравнить его с текущим временем системы сервера. Неважно, как вы передаете и храните свою сессию, будь то с помощью cookies, или аргументов запроса URI, или чего-либо еще.

Люди могут путать эту настройку с датой истечения HTTP cookies. Эта директива просто контролирует, когда сессия истекает; она ничего не знает о HTTP cookies. Даже если конечный пользователь сам перехватил эту сессию из cookie и использует ее позже вручную, сервер все равно отклонит ее, когда время истечения пройдет.

set_encrypt_session

синтаксис: set_encrypt_session $target <value>

по умолчанию: нет

контекст: http, server, server if, location, location if

Шифрует строковое значение, указанное аргументом value, и сохраняет результат в переменной, указанной $target.

Например,

set_encrypt_session $res $value;

зашифрует значение в переменной $value в целевую переменную $res.

Аргумент value также может быть строковым значением nginx, например,

set_encrypt_session $res "my value = $value";

Полученные данные могут быть позже расшифрованы с помощью директивы set_decrypt_session.

set_decrypt_session

синтаксис: set_decrypt_session $target <value>

по умолчанию: нет

контекст: http, server, server if, location, location if

Похоже на set_encrypt_session, но выполняет обратную операцию, то есть расшифровывает данные.

См. также

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-encrypted-session.