Pular para conteúdo

encrypted-session: Criptografar e descriptografar valores de variáveis do NGINX

Instalação

Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:

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

Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:

load_module modules/ngx_http_encrypted_session_module.so;

Este documento descreve o nginx-module-encrypted-session v0.9 lançado em 18 de novembro de 2021.


## key deve ter 32 bytes de comprimento
encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

## iv não deve ter mais de 16 bytes
## padrão: "deadbeefdeadbeef" (sem aspas)
encrypted_session_iv "1234567812345678";

## padrão: 1d (1 dia)
encrypted_session_expires 3600; # em seg

location /encrypt {
    set $raw 'texto a ser criptografado'; # do módulo ngx_rewrite
    set_encrypt_session $session $raw;
    set_encode_base32 $session; # do módulo ngx_set_misc

    add_header Set-Cookie 'my_login=$session';  # do módulo ngx_headers

    # seu manipulador de conteúdo vai aqui...
}

location /decrypt {
    set_decode_base32 $session $cookie_my_login; # do módulo ngx_set_misc
    set_decrypt_session $raw $session;

    if ($raw = '') {
        # sessão inválida
    }

    # seu manipulador de conteúdo vai aqui...
}

Descrição

Este módulo fornece suporte para criptografia e descriptografia de variáveis do nginx baseado em AES-256 com Mac.

Este módulo é geralmente usado com o ngx_set_misc module e as diretivas do módulo de reescrita padrão.

Este módulo pode ser usado para implementar login simples de usuários e ACL.

Geralmente, você apenas descriptografa dados no nível do nginx e passa os dados não criptografados para seu backend FastCGI/HTTP, como em

location /blah {
    set_decrypt_session $raw_text $encrypted;

    # esta diretiva é do módulo 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;
}

Aplicações web em Lua que rodam diretamente no ngx_lua podem chamar as diretivas deste módulo diretamente de dentro do código Lua:

local raw_text = ndk.set_var.set_decrypt_session(encrypted_text)

Diretivas

encrypted_session_key

sintaxe: encrypted_session_key <key>

padrão: não

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

Define a chave para o cifrador (deve ter 32 bytes de comprimento). Por exemplo,

encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

encrypted_session_iv

sintaxe: encrypted_session_iv <iv>

padrão: encrypted_session_iv "deadbeefdeadbeef";

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

Define o vetor inicial usado para o cifrador (não deve ter mais de 16 bytes).

Por exemplo,

encrypted_session_iv "12345678";

encrypted_session_expires

sintaxe: encrypted_session_expires <time>

padrão: encrypted_session_expires 1d;

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

Define a diferença de tempo de expiração (em segundos por padrão).

Por exemplo, considere a seguinte configuração:

encypted_session_expires 1d;

Quando sua sessão está sendo gerada, ngx_encrypted_session irá inserir um tempo de expiração (1 dia no futuro neste exemplo) na string da sessão criptografada, de forma que quando a sessão for descriptografada mais tarde, o servidor pode extrair o tempo de expiração da sessão e compará-lo com o tempo atual do sistema do servidor. Não importa como você transfere e armazena sua sessão, como usando cookies, ou argumentos de consulta de URI, ou o que for.

As pessoas podem confundir esta configuração com a data de expiração de cookies HTTP. Esta diretiva simplesmente controla quando a sessão expira; ela não sabe nada sobre cookies HTTP. Mesmo que o usuário final interceptasse esta sessão do cookie e a usasse manualmente mais tarde, o servidor ainda a rejeitará quando o tempo de expiração passar.

set_encrypt_session

sintaxe: set_encrypt_session $target <value>

padrão: não

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

Criptografa o valor da string especificado pelo argumento value e salva o resultado na variável especificada por $target.

Por exemplo,

set_encrypt_session $res $value;

criptografará o valor na variável $value na variável alvo $res.

O argumento value também pode ser um valor de string do nginx, por exemplo,

set_encrypt_session $res "meu valor = $value";

Os dados resultantes podem ser descriptografados posteriormente através da diretiva set_decrypt_session.

set_decrypt_session

sintaxe: set_decrypt_session $target <value>

padrão: não

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

Semelhante à set_encrypt_session, mas realiza a operação inversa, ou seja, descriptografa os dados.

Veja Também

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-encrypted-session.