Saltar a contenido

encrypted-session: Cifrar y descifrar valores de variables NGINX

Instalación

Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:

  • RedHat Enterprise Linux 7, 8, 9 y 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 y 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

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_http_encrypted_session_module.so;

Este documento describe nginx-module-encrypted-session v0.9 lanzado el 18 de noviembre de 2021.


## key must be of 32 bytes long
encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

## iv must not be longer than 16 bytes
## default: "deadbeefdeadbeef" (w/o quotes)
encrypted_session_iv "1234567812345678";

## default: 1d (1 day)
encrypted_session_expires 3600; # in sec

location /encrypt {
    set $raw 'text to encrypted'; # from the ngx_rewrite module
    set_encrypt_session $session $raw;
    set_encode_base32 $session; # from the ngx_set_misc module

    add_header Set-Cookie 'my_login=$session';  # from the ngx_headers module

    # your content handler goes here...
}

location /decrypt {
    set_decode_base32 $session $cookie_my_login; # from the ngx_set_misc module
    set_decrypt_session $raw $session;

    if ($raw = '') {
        # bad session
    }

    # your content handler goes here...
}

Descripción

Este módulo proporciona soporte para cifrado y descifrado de variables nginx basado en AES-256 con Mac.

Este módulo se utiliza generalmente con el ngx_set_misc module y las directivas del módulo de reescritura estándar.

Este módulo puede ser utilizado para implementar un inicio de sesión de usuario simple y ACL.

Generalmente, solo descifras datos a nivel de nginx y pasas los datos no cifrados a tu backend FastCGI/HTTP, como en

location /blah {
    set_decrypt_session $raw_text $encrypted;

    # this directive is from the ngx_set_misc module
    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;
}

Las aplicaciones web en Lua que se ejecutan directamente en ngx_lua pueden llamar directamente a las directivas de este módulo desde el código Lua:

local raw_text = ndk.set_var.set_decrypt_session(encrypted_text)

Directivas

encrypted_session_key

sintaxis: encrypted_session_key <key>

predeterminado: no

contexto: http, server, server if, location, location if

Establece la clave para el cifrado (debe tener 32 bytes de longitud). Por ejemplo,

encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

encrypted_session_iv

sintaxis: encrypted_session_iv <iv>

predeterminado: encrypted_session_iv "deadbeefdeadbeef";

contexto: http, server, server if, location, location if

Establece el vector inicial utilizado para el cifrado (no debe ser más largo que 16 bytes).

Por ejemplo,

encrypted_session_iv "12345678";

encrypted_session_expires

sintaxis: encrypted_session_expires <time>

predeterminado: encrypted_session_expires 1d;

contexto: http, server, server if, location, location if

Establece la diferencia de tiempo de expiración (en segundos por defecto).

Por ejemplo, considera la siguiente configuración:

encypted_session_expires 1d;

Cuando se genera tu sesión, ngx_encrypted_session plantará un tiempo de expiración (1 día en el futuro en este ejemplo) en la cadena de sesión cifrada, de modo que cuando la sesión se descifre más tarde, el servidor pueda extraer el tiempo de expiración de la sesión y compararlo con la hora actual del sistema del servidor. No importa cómo transfieras y almacenes tu sesión, ya sea utilizando cookies, o argumentos de consulta de URI, o lo que sea.

Las personas pueden confundir esta configuración con la fecha de expiración de las cookies HTTP. Esta directiva simplemente controla cuándo expira la sesión; no sabe nada sobre las cookies HTTP. Incluso si el usuario final intercepta esta sesión de la cookie por sí mismo y la usa más tarde manualmente, el servidor aún la rechazará cuando el tiempo de expiración haya pasado.

set_encrypt_session

sintaxis: set_encrypt_session $target <value>

predeterminado: no

contexto: http, server, server if, location, location if

Cifra el valor de cadena especificado por el argumento value y guarda el resultado en la variable especificada por $target.

Por ejemplo,

set_encrypt_session $res $value;

cifrará el valor en la variable $value en la variable objetivo $res.

El argumento value también puede ser un valor de cadena de nginx, por ejemplo,

set_encrypt_session $res "my value = $value";

Los datos resultantes pueden ser descifrados más tarde a través de la directiva set_decrypt_session.

set_decrypt_session

sintaxis: set_decrypt_session $target <value>

predeterminado: no

contexto: http, server, server if, location, location if

Similar a set_encrypt_session, pero realiza la operación inversa, es decir, descifra los datos.

Ver También

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-encrypted-session.