Ir para o conteúdo

Sessões

São detalhadas abaixo as configurações para controle de balanceamento de carga e cache de sessões.

Variável Descrição Rápida
HSM_DISABLE_SESSION_CACHE Desabilita (valor em 1) o cache de sessão.
HSM_LOAD_BALANCE_LIST Caminho do arquivo com a lista de HSMs para o balanceamento.
HSM_LB_FILE_REFRESH_INTERVAL Intervalo (em segundos) de atualização do arquivo de balanceamento.
HSM_BALANCE_SUSPEND_TIME Tempo (em segundos) de suspensão automática de um HSM não responsivo da lisa de balanceamento.
HSM_PIX_HTTP_CONN_REFRESH_INTERVAL Intervalo (em segundos) de atualização do carregamento dos objetos do HSM nas operações de Pix request(POST/GET/DELETE).

Cache de Sessão

Variável de ambiente a ser definida: HSM_DISABLE_SESSION_CACHE

Valor Cache de Sessões
Não definida habilitado
0 habilitado
1 desabilitado

Somente desabilite o cache de sessões se tiver certeza que a aplicação será de alguma forma beneficiada com esta configuração.

Para mais detalhes consulte o tópico Cache de Sessão.

Em conjunto com o balanceamento funciona um sistema de cache de sessões, visando aperfeiçoar o uso de banda de rede e alocação/desalocação de recursos no HSM e no servidor da aplicação. Quando a aplicação solicita o término da sessão ao HSM, ela é finalizada logicamente (para a aplicação a sessão foi fechada com sucesso); a biblioteca do HSM (carregada no espaço de endereço do processo da aplicação) mantém por um determinado tempo a sessão física com o HSM; se uma nova sessão for solicitada, a biblioteca reutiliza aquela sessão física (re-autenticando localmente o usuário). Ao reutilizar uma sessão já estabelecida há um ganho por não se fazer novamente a negociação da sessão física, principalmente se a aplicação estiver usando sessões cifradas (TLS). O tipo da nova sessão (aberta ou cifrada) deve ser o mesmo da sessão física existente. Caso a sessão física no cache não seja reutilizada dentro do tempo de espera, ela é fisicamente encerrada.

O cache de sessões tem as seguintes características:

  1. Intra-processo: o cache é feito por processo. Isso significa que 2 aplicações em uma mesma máquina terão um cache cada uma, sem compartilhar sessões entre os processos;
  2. Centralizado: implementado na biblioteca do HSM. Desta forma o cache é habilitado em um ponto central e todas as outras bibliotecas dependentes dela herdarão a funcionalidade;
  3. Transparente: para habilitar o cache de sessões é necessário apenas habilitar uma variável de ambiente. Não há necessidade de alteração na aplicação.

Observações:

  1. Sessões com autenticação de 2o. fator não entram no cache. Um exemplo é o uso de OTP;
  2. O cache de sessões pode ser ignorado, em uma determinada sessão, usando a flag CACHE_BYPASS em DOpenSesssion;
  3. O cache de sessões é habilitado por padrão;
  4. Uma sessão pode ser forçada a ser removida do cache utilizando a flag CLOSE_PHYSICALLY em DCloseSession;
  5. Pode ser utilizado juntamente com o balanceamento de carga.
  6. O tempo de espera até a sessão ser descartada pela biblioteca é de 04 minutos.

Um fluxo do cache de sessões pode ser representado como na figura abaixo:

---
title: Fluxo de cache de sessões
---

%%{ init: { 'flowchart': { 'curve': 'basis' }} }%%
sequenceDiagram
    autonumber
    participant app as Aplicação
    participant lib as Biblioteca
    participant hsm as HSM

    app ->> lib: Início da sessão 1
    activate app
    lib ->> hsm: Abre sessão
    activate lib
    activate hsm
    loop Sessão 1
        %% necessário manter o espaço após o spi: (ou usar um text)
        app -->> lib: Requisição
        lib -->> app: Resposta
    end
    app ->> lib: Fim da sessão 1
    deactivate app

    Note right of lib: A sessão física<br>permanece aberta

    app ->> lib: Início da sessão 2
    activate app
    Note right of lib: A sessão existente<br>é reutilizada
    loop Sessão 2
        %% necessário manter o espaço após o spi: (ou usar um text)
        app -->> lib: Requisição
        lib -->> app: Resposta
    end
    app ->> lib: Fim da sessão 2
    deactivate app
    deactivate lib
    deactivate hsm

Balanceamento de Carga

Variável de ambiente a ser definida: HSM_LOAD_BALANCE_LIST

Valor Balanceamento de Carga
Não definida desabilitado
nome do arquivo usa a lista de HSMs

Contem o caminho e nome do arquivo com a lista de endereços IPs e portas dos HSMs. Em cada linha do arquivo deve ser indicado o endereço e a porta (usar 4433) de um HSM. Até dezesseis endereços podem ser informadas. O arquivo deverá ser em formato texto ASCII com o seguinte formato no conteúdo:

<endereco_ip_1>        <porta>
<endereco_ip_2>        <porta>
...
<endereco_ip_16>        <porta>

Exemplo:

10.0.20.1        4433
10.0.20.2        4433
É possível ter um esquema de balanceamento do tipo ativo-passivo, onde várias listas (até 16) são definidas, e a biblioteca vai passar de uma lista para outra, em esquema circular tipo round robin. Quando nenhum dos HSMs da lista atual responder ao pedido de abertura de sessão, a próxima lista passa a ser utilizada, e permanece sendo utilizada até que novamente nenhum dos HSMs responda e então a próxima lista é carregada e assim por diante. Esta funcionalidade está disponível a partir da versão 1.3.0.14 da biblioteca.

Para utilizar este esquema ativo-passivo crie cada lista de HSMs em um arquivo com o formato indicado acima, e no valor da variável de ambiente indique todos os arquivos, com o caminho completo, separando conforme o padrão do sistema operacional onde estiver executando a aplicação, ; para Windows e : para Unix/Linux.

O Dinamo dispõe de um mecanismo de balanceamento de carga, permitindo maior disponibilidade do ambiente e desempenho para as aplicações. É possível ter até 16 (dezesseis) unidades do Dinamo em sistema de balanceamento de carga, com a mesma quantidade de sessões em cada um dos equipamentos. O balanceamento de carga é transparente para a aplicação, ou seja, uma vez habilitado o balanceamento no ambiente, a aplicação se beneficia sem precisar de qualquer alteração.

O balanceamento funciona num esquema tipo round-robin, distribuindo conexões circularmente entre os HSM configurados para balanceamento. A unidade de balanceamento é a sessão com o HSM, independente da carga ou das APIs utilizadas em cada sessão e também da taxa de utilização de recursos em cada HSM. O HSM que vai estabelecer a sessão com a aplicação é definido pela estrutura de balanceamento e não pela aplicação. O esquema do balanceamento funciona por processo, ou seja, dentro de cada processo são suas sessões que serão balanceadas; caso dois processos rodem ao mesmo tempo, cada um terá uma estrutura de balanceamento separada e independente.

Caso a aplicação esteja utilizando objetos armazenados no HSM, é preciso que o objeto exista em todos os HSMs. O recomendado é que um HSM seja preparado inicialmente com todos os objetos usados pela aplicação e a partir dele seja gerado um backup, que será restaurado em todos os demais HSMs que fazem parte do conjunto de balanceamento.

Atenção

O balanceamento não pode ser usado por aplicações que criam objetos dentro da sessão, precisam persistir estes objetos entre sessões mas não utilizam o mecanismo de replicação do HSM, pois neste caso a criação do objeto não é replicada entre os HSMs e não há garantia que a próxima sessão será dirigida ao HSM onde o objeto foi criado. Para aplicações que criam objetos que devem persistir entre sessões, e o mecanismo de replicação do HSM não seja utilizado, é função da aplicação manter um mecanismo de sincronização entre as bases dos HSMs participantes do balanceamento. Tal mecanismo pode ser baseado por exemplo na exportação e importação de objetos.

O balanceamento de carga e o cache de sessões são habilitados por intermédio de variáveis de ambiente. Se a definição das variável de ambiente tiver escopo de sistema (system wide), todas as aplicações são beneficiadas pela estrutura de balanceamento e/ou cache (pois os processos herdam as definições de variáveis de ambiente do sistema). Também é possível fazer uma configuração definindo a variável de ambiente apenas para o processo particular de uma aplicação. Consulte a documentação do sistema operacional para detalhes sobre criação e escopo de variáveis de ambiente.

O balanceamento de carga m as seguintes características:

  1. Intra-processo: o balanceamento de carga é feito por processo. Isso significa que 2 aplicações em uma mesma máquina terão conjuntos de balanceamento distintos;
  2. Centralizado: implementado na biblioteca do HSM. Desta forma o balanceamento é habilitado em um ponto central e todas as outras bibliotecas dependentes dela herdarão a funcionalidade
  3. Transparente: para habilitar o balanceamento é necessário apenas habilitar uma variável de ambiente. Não é necessário nenhuma alteração de código fonte da aplicação

Um diagrama estrutural do mecanismos de balanceamento de carga é mostrado na figura abaixo:

---
title: Balanceamento de carga
---

%%{ init: { 'flowchart': { 'curve': 'basis' } } }%%

flowchart LR

    classDef red_s stroke:#f00
    s1.1[Sessão 1]
    s2.1[Sessão 2]
    sn.1[Sessão n]
    lib1((biblioteca<br>fa:fa-list-ol)):::red_s

    s1.2[Sessão 1]
    s2.2[Sessão 2]
    sn.2[Sessão n]
    lib2((biblioteca<br>fa:fa-list-ol)):::red_s

    hsm1[fa:fa-network-wired HSM 1]
    hsm2[fa:fa-network-wired HSM 2]
    hsmn[fa:fa-network-wired HSM n]

    subgraph Processo 1
    s1.1 --> lib1
    s2.1 --> lib1
    sn.1 --> lib1
    end

    subgraph Processo 2
    s1.2 --> lib2
    s2.2 --> lib2
    sn.2 --> lib2
    end

    %%subgraph Pool de HSMs
    hsm1:::red_s
    hsm2:::red_s
    hsmn:::red_s
    %%end

    lib1 -...-> hsm1
    lib1 -...-> hsm2
    lib1 -...-> hsmn

    lib2 -...-> hsm1
    lib2 -...-> hsm2
    lib2 -...-> hsmn

Intervalo de atualização

Variável de ambiente a ser definida: HSM_LB_FILE_REFRESH_INTERVAL

Valor Intervalo de atualização
Não definida somente na inicialização da biblioteca.
0 somente na inicialização da biblioteca.
n recarga (em segundos) da lista de balanceamento.

As listas carregadas são as definidas na variável de ambiente HSM_LOAD_BALANCE_LIST.

Caso os arquivos da lista de balanceamento estejam corrompidos, inválidos a lista de balanceamento alterada não será atualizada.

Caso a lista de balanceamento alterada esteja igual a lista de balanceamento atual a atualização não será efetuada, para evitar o recarregamento desnecessário da lista de balanceamento.

Caso a lista de balanceamento seja atualizada, as sessões atuais serão marcadas para serem finalizadas ao término das operações e as novas sessões serão criadas utilizando a nova lista de balanceamento.

Tempo de Suspensão

Variável de ambiente a ser definida: HSM_BALANCE_SUSPEND_TIME

Valor Tempo de Suspensão
Não definida tempo de suspensão default de 120 segundos.
n tempo em segundos de suspensão.

Durante a operação da biblioteca com balanceamento de carga pode acontecer de um ou mais dos endereços indicados na lista não conseguir estabelecer sessão com a aplicação. Neste caso a biblioteca vai retirar temporariamente da lista de balanceamento o endereço problemático e vai tentar uma nova conexão vencido este prazo.

Intervalo de atualização de objetos no Pix Request

Variável de ambiente a ser definida: HSM_PIX_HTTP_CONN_REFRESH_INTERVAL

Valor Intervalo de atualização
Não definida atualiza os objetos a cada operação de Pix Request.
0 atualiza os objetos a cada operação de Pix Request.
n recarga (em segundos) da lista de balanceamento.

Em cada operação Pix Request (Requisições HTTP POST, GET e DELETE) é feito o carregamento dos objetos armazenados no HSM (handle de chave privada, certificado e cadeia do peer) para poder realizar o fechamento do túnel TLS.

A vantagem do recarregamento dos objetos à cada operação de Pix Request é que permite que, caso o objeto seja alterado, ele seja recarregado já na proxima operação. Por outro lado, estes recarregamento frequente causa um custo de performance desnecessário.

A vantagem de definir um intervalo de tempo para que haja o recarregamento dos objetos do HSM nas operações de Pix Request é um ganho de performance. Isto permite uma melhoria na performance com o custo de ter que esperar no máximo o tempo de recarga definido na variável de ambiente para que os novos objetos sejam recarregados. Como normalmente a troca de chaves e certificados é feita com pouca frequência, é possível configurar um intervalo para que os objetos sejam carregados com impacto reduzido.