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.