Aller au contenu

encrypted-session: Chiffrer et déchiffrer les valeurs de variables NGINX

Installation

Vous pouvez installer ce module dans toute distribution basée sur RHEL, y compris, mais sans s'y limiter :

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

Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :

load_module modules/ngx_http_encrypted_session_module.so;

Ce document décrit nginx-module-encrypted-session v0.9 publié le 18 novembre 2021.


## la clé doit faire 32 octets de long
encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

## l'iv ne doit pas dépasser 16 octets
## par défaut : "deadbeefdeadbeef" (sans les guillemets)
encrypted_session_iv "1234567812345678";

## par défaut : 1d (1 jour)
encrypted_session_expires 3600; # en sec

location /encrypt {
    set $raw 'texte à chiffrer'; # depuis le module ngx_rewrite
    set_encrypt_session $session $raw;
    set_encode_base32 $session; # depuis le module ngx_set_misc

    add_header Set-Cookie 'my_login=$session';  # depuis le module ngx_headers

    # votre gestionnaire de contenu va ici...
}

location /decrypt {
    set_decode_base32 $session $cookie_my_login; # depuis le module ngx_set_misc
    set_decrypt_session $raw $session;

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

    # votre gestionnaire de contenu va ici...
}

Description

Ce module fournit un support de chiffrement et de déchiffrement pour les variables nginx basé sur AES-256 avec Mac.

Ce module est généralement utilisé avec le module ngx_set_misc et les directives du module de réécriture standard.

Ce module peut être utilisé pour implémenter une connexion utilisateur simple et un contrôle d'accès (ACL).

En général, vous déchiffrez simplement les données au niveau nginx et passez les données non chiffrées à votre backend FastCGI/HTTP, comme dans

location /blah {
    set_decrypt_session $raw_text $encrypted;

    # cette directive provient du module 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;
}

Les applications web Lua s'exécutant directement sur ngx_lua peuvent appeler les directives de ce module directement depuis le code Lua :

local raw_text = ndk.set_var.set_decrypt_session(encrypted_text)

Directives

encrypted_session_key

syntax: encrypted_session_key <key>

default: non

context: http, server, server if, location, location if

Définit la clé pour le chiffrement (doit faire 32 octets de long). Par exemple,

encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

encrypted_session_iv

syntax: encrypted_session_iv <iv>

default: encrypted_session_iv "deadbeefdeadbeef";

context: http, server, server if, location, location if

Définit le vecteur d'initialisation utilisé pour le chiffrement (ne doit pas être plus long que 16 octets).

Par exemple,

encrypted_session_iv "12345678";

encrypted_session_expires

syntax: encrypted_session_expires <time>

default: encrypted_session_expires 1d;

context: http, server, server if, location, location if

Définit la durée d'expiration (en secondes par défaut).

Par exemple, considérez la configuration suivante :

encypted_session_expires 1d;

Lorsque votre session est générée, ngx_encrypted_session va insérer une durée d'expiration (1 jour dans le futur dans cet exemple) dans la chaîne de session chiffrée, de sorte que lorsque la session est déchiffrée plus tard, le serveur peut extraire la durée d'expiration de la session et la comparer avec l'heure système actuelle du serveur. Peu importe comment vous transférez et stockez votre session, que ce soit en utilisant des cookies, ou des arguments de requête URI, ou autre.

Les gens peuvent confondre ce paramètre avec la date d'expiration des cookies HTTP. Cette directive contrôle simplement quand la session expire ; elle ne sait rien des cookies HTTP. Même si l'utilisateur final intercepte cette session depuis le cookie par lui-même et l'utilise manuellement plus tard, le serveur la rejettera toujours lorsque la durée d'expiration sera dépassée.

set_encrypt_session

syntax: set_encrypt_session $target <value>

default: non

context: http, server, server if, location, location if

Chiffre la valeur de chaîne spécifiée par l'argument value et enregistre le résultat dans la variable spécifiée par $target.

Par exemple,

set_encrypt_session $res $value;

chiffrera la valeur dans la variable $value dans la variable cible $res.

L'argument value peut également être une valeur de chaîne nginx, par exemple,

set_encrypt_session $res "ma valeur = $value";

Les données résultantes peuvent être déchiffrées ultérieurement via la directive set_decrypt_session.

set_decrypt_session

syntax: set_decrypt_session $target <value>

default: non

context: http, server, server if, location, location if

Semblable à set_encrypt_session, mais effectue l'opération inverse, c'est-à-dire, pour déchiffrer les données.

Voir Aussi

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-encrypted-session.