Esta é uma tradução da página de documentação original em inglês. Ajude-nos a torná-la melhor.

17. Criptografia

Visão geral

Zabbix suporta comunicações criptografadas entre componentes Zabbix usando Protocolo Transport Layer Security (TLS) v.1.2 e 1.3 (dependendo do biblioteca de criptografia). Criptografia baseada em certificado e baseada em chave pré-compartilhada é suportado.

A criptografia pode ser configurada para conexões:

A criptografia é opcional e configurável para componentes individuais:

  • Alguns proxies e agentes podem ser configurados para usar certificados criptografia com o servidor, enquanto outros podem usar criptografia baseada em chave, e ainda outros continuam com não criptografado comunicações (como antes)
  • Servidor (proxy) pode usar diferentes configurações de criptografia para diferentes anfitriões

Os programas daemon Zabbix usam uma porta de escuta para conexões de entrada não criptografadas. Adicionar uma criptografia não requer abrindo novas portas em firewalls.

Limitações

  • As chaves privadas são armazenadas em texto simples em arquivos legíveis pelo Zabbix componentes durante a inicialização
  • Chaves pré-compartilhadas são inseridas no frontend do Zabbix e armazenadas no Zabbix banco de dados em texto simples
  • A criptografia integrada não protege as comunicações:
    • Entre o servidor web rodando o frontend Zabbix e a web do usuário navegador
    • Entre o frontend Zabbix e o servidor Zabbix
  • Atualmente, cada conexão criptografada é aberta com um handshake TLS completo, nenhum cache de sessão e tickets são implementados
  • A adição de criptografia aumenta o tempo para verificações e ações de itens, dependendo da latência da rede:
    • Por exemplo, se o atraso do pacote for de 100ms, abrir um TCP conexão e envio de solicitação não criptografada leva cerca de 200ms. Com criptografia são adicionados cerca de 1000 ms para estabelecer o TLS conexão;
    • Os tempos limite podem precisar ser aumentados, caso contrário, alguns itens e ações que executam scripts remotos em agentes podem funcionar com conexões não criptografadas, mas falham com o tempo limite com criptografado.
  • A criptografia não é suportada por network descoberta. Verificações do agente Zabbix realizada pela descoberta de rede não será criptografada e se o Zabbix agente está configurado para rejeitar conexões não criptografadas, tais verificações não terá sucesso.

Compilando Zabbix com suporte a criptografia

Para suportar a criptografia, o Zabbix deve ser compilado e vinculado a um dos bibliotecas de criptografia suportadas:

  • GnuTLS - da versão 3.1.18
  • OpenSSL - versões 1.0.1, 1.0.2, 1.1.0, 1.1.1
  • LibreSSL - testado com as versões 2.7.4, 2.8.2:
    • LibreSSL 2.6.x não é suportado
    • O LibreSSL é suportado como um substituto compatível do OpenSSL; as novas funções de API específicas do LibreSSL tls_*() não são usadas. Componentes Zabbix compilados com LibreSSL não poderão usar PSK, somente certificados podem ser usados.

A biblioteca é selecionada especificando a respectiva opção para script "configurar":

  • --with-gnutls[=DIR]
  • --with-openssl[=DIR] (também usado para LibreSSL)

Por exemplo, para configurar as origens para servidor e agente com OpenSSL você pode usar algo como:

./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

Diferentes componentes Zabbix podem ser compilados com diferentes criptomoedas bibliotecas (por exemplo, um servidor com OpenSSL, um agente com GnuTLS).

::: não importante Se você planeja usar chaves pré-compartilhadas (PSK), considere usar bibliotecas GnuTLS ou OpenSSL 1.1.0 (ou mais recente) em Componentes Zabbix usando PSKs. Bibliotecas GnuTLS e OpenSSL 1.1.0 suporta conjuntos de cifras PSK com Perfect Forward Sigilo. Versões mais antigas da biblioteca OpenSSL (1.0.1, 1.0.2c) também suportam PSKs, mas os conjuntos de cifras PSK disponíveis não fornecem Perfect Forward Segredo. :::

Gerenciamento de criptografia de conexão

Conexões no Zabbix podem usar:

Existem dois parâmetros importantes usados ​​para especificar a criptografia entre Componentes do Zabbix:

  • TLSConnect - especifica qual criptografia usar para saída conexões (não criptografadas, PSK ou certificado)
  • TLSAccept - especifica quais tipos de conexões são permitidas conexões de entrada (não criptografadas, PSK ou certificado). Um ou mais valores podem ser especificados.

TLSConnect é usado nos arquivos de configuração do proxy Zabbix (no modo ativo, especifica apenas conexões com o servidor) e agente Zabbix (para verificações ativas). No frontend do Zabbix, o equivalente do TLSConnect é o Conexões ao host campo em Configuração → Hosts → <alguns host> → guia Criptografia e o campo Conexões ao proxy em Administração → Proxies → <algum proxy> → guia Criptografia. Se o tipo de criptografia configurado para falha de conexão, nenhuma outra criptografia tipos serão tentados.

TLSAccept é usado nos arquivos de configuração do proxy Zabbix (no modo passivo, especifica apenas conexões do servidor) e agente Zabbix (para verificações passivas). No frontend do Zabbix, o equivalente do TLSAccept é o Conexões do host campo em Configuração → Hosts → <alguns host> → aba Criptografia e o campo Conexões do proxy em Administração → Proxies → <algum proxy> → guia Criptografia.

Normalmente você configura apenas um tipo de criptografia para criptografias. Mas você pode querer mudar o tipo de criptografia, por exemplo a partir de descriptografado para baseado em certificado com tempo de inatividade e reversão mínimos possibilidade. Para alcançar isto:

  • Defina TLSAccept=unencrypted,cert no arquivo de configuração do agente e reinicie o agente Zabbix
  • Teste a conexão com o zabbix_get para o agente usando o certificado. Se funciona, você pode reconfigurar a criptografia para esse agente no Zabbix frontend na Configuração → Hosts → <algum host> → Aba Criptografia definindo Conexões ao host para "Certificado".
  • Quando o cache de configuração do servidor é atualizado (e proxy configuração é atualizada se o host for monitorado por proxy) então as conexões com esse agente serão criptografadas
  • Se tudo funcionar como esperado, você pode definir TLSAccept=cert no arquivo de configuração do agente e reinicie o agente Zabbix. Agora o agente aceitará apenas conexões baseadas em certificados criptografados. Conexões não criptografadas e baseadas em PSK serão rejeitadas.

De maneira semelhante, funciona no servidor e no proxy. Se no Zabbix frontend em configuração do host Conexões do host é definido como "Certificado" e somente conexões criptografadas baseadas em certificado serão aceitas do agent (verificações ativas) e zabbix_sender (itens do trapper).

Muito provavelmente você irá configurar conexões de entrada e saída para usar o mesmo tipo de criptografia ou nenhuma criptografia. Mas tecnicamente é possível configurá-lo assimetricamente, por ex. baseado em certificado criptografia para conexões de entrada e baseadas em PSK para conexões de saída.

A configuração de criptografia para cada host é exibida no Zabbix frontend, em Configuração → Hosts na coluna Criptografia do agente. Por exemplo:

|Exemplo|Conexões ao host|Conexões permitidas do host|Conexões rejeitadas do host| |-------|-------------------|--------------------- --------|------------------------------| |none_none.png|Unencrypted|Unencrypted|Criptografado, certificado e criptografado com base em PSK| |cert_cert.png|Criptografado, baseado em certificado|Criptado, baseado em certificado|Não criptografado e criptografado com base em PSK| |psk_psk.png|Criptografado, baseado em PSK|Criptado, baseado em PSK|Não criptografado e criptografado com base em certificado| |psk_none_psk.png|Criptografado, baseado em PSK|Criptografia não criptografada e baseada em PSK|Criptografia baseada em certificado| |cert_all.png|Criptografado, baseado em certificado|Não criptografado, PSK ou criptografado baseado em certificado|-|

::: não importante As conexões não são criptografadas por padrão. Criptografia deve ser configurado para cada host e proxy individualmente. :::

zabbix_get e zabbix_sender com criptografia

Veja zabbix_get e zabbix_sender manpages para usá-los com criptografia.

Ciphersuites

Ciphersuites por padrão são configurados internamente durante a inicialização do Zabbix e, antes do Zabbix 4.0.19, 4.4.7, não são configuráveis ​​pelo usuário.

Desde o Zabbix 4.0.19, 4.4.7 também os ciphersuites configurados pelo usuário são suportado para GnuTLS e OpenSSL. Os usuários podem configure ciphersuites de acordo com suas políticas de segurança. O uso deste recurso é opcional (integrado ciphersuites padrão ainda funcionam).

Para bibliotecas de criptografia compiladas com configurações padrão Zabbix built-in regras normalmente resultam nos seguintes conjuntos de cifras (em ordem de prioridade mais alta para mais baixa):

Biblioteca Certificate ciphersuites PSK ciphersuites
GnuTLS 3.1.18 TLS_ECDHE_RSA_AES_128_GCM_SHA256
TLS_ECDHE_RSA_AES_128_CBC_SHA256
TLS_ECDHE_RSA_AES_128 _CBC_SHA1
TLS_RSA_AES_128_GCM_SHA256
TLS_RSA_AES_128_CBC_SHA256
TLS_RSA_AES_128_CBC_SHA1
TLS_ECDHE _PSK_AES_128_CBC_SHA256
TLS_ECDHE_PSK_AES_128_CBC_SHA1
TLS_PSK_AES_128_GCM_SHA256
TLS_PSK_AES_128 _CBC_SHA256
TLS_PSK_AES_128_CBC_SHA1
OpenSSL 1.0.2c ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128- SHA256
AES128-SHA
PSK-AES128-CBC-SHA
OpenSSL 1.1.0 ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128- CCM8
AES128-CCM
AES128-SHA256
AES128-SHA
ECDHE-PSK-AES128-CBC-SHA256
ECDHE-PSK-AES128-CBC-SHA
PSK-AES128 -GCM-SHA256
PSK-AES128-CCM8
PSK-AES128-CCM
PSK-AES128-CBC-SHA256
PSK-AES128-CBC-SHA
OpenSSL 1.1.1d TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
ECDHE-RSA-AES128-GCM- SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-CCM8
AES128-CCM
AES128-SHA256
AES128-SHA
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_GCM_SHA256
ECDHE-PSK-AES128-CBC-SHA256
ECDHE-PSK-AES128-CBC-SHA
PSK-AES128-GCM-SHA256
PSK-AES128-CCM8
PSK-AES128-CCM
PSK-AES128-CBC-SHA256
PSK-AES128-CBC-SHA

Ciphersuites configurados pelo usuário

Os critérios de seleção do conjunto de cifras integrados podem ser substituídos por ciphersuites configurados pelo usuário.

::: não importante Ciphersuites configurados pelo usuário é um recurso destinado para usuários avançados que entendem conjuntos de criptografia TLS, sua segurança e consequências de erros e que se sentem à vontade com o TLS solução de problemas. :::

Os critérios de seleção do ciphersuite integrados podem ser substituídos usando o seguintes parâmetros:

Substituir escopo Parâmetro Valor Descrição
Seleção de Ciphersuite para certificados TLSCipherCert13 Válido OpenSSL 1.1.1 cipher strings para protocolo TLS 1.3 (seus valores são passados ​​para a função OpenSSL SSL_CTX_set_ciphersuites()). Critérios de seleção de conjuntos de códigos baseados em certificados para TLS 1.3

Somente OpenSSL 1.1.1 ou mais recente.
TLSCipherCert OpenSSL válido strings de criptografia para TLS 1.2 ou GnuTLS válido strings de prioridade. Seus valores são passados ​​para as funções SSL_CTX_set_cipher_list() ou gnutls_priority_init(), respectivamente. Critérios de seleção de conjuntos de códigos baseados em certificados para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)
Seleção de Ciphersuite para PSK TLSCipherPSK13 Válido OpenSSL 1.1.1 cipher strings para protocolo TLS 1.3 (seus valores são passados ​​para a função OpenSSL SSL_CTX_set_ciphersuites()). Critérios de seleção de conjuntos de códigos baseados em PSK para TLS 1.3

Somente OpenSSL 1.1.1 ou mais recente.
TLSCipherPSK OpenSSL válido strings de criptografia para TLS 1.2 ou GnuTLS válido strings de prioridade. Seus valores são passados ​​para as funções SSL_CTX_set_cipher_list() ou gnutls_priority_init(), respectivamente. Critérios de seleção de ciphersuite baseados em PSK para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)
Lista combinada de ciphersuite para certificado e PSK TLSCipherAll13 Valid OpenSSL 1.1.1 cipher strings para protocolo TLS 1.3 (seus valores são passados ​​para a função OpenSSL SSL_CTX_set_ciphersuites()). Critérios de seleção de Ciphersuite para TLS 1.3

Somente OpenSSL 1.1.1 ou mais recente.
TLSCipherAll OpenSSL válido strings de criptografia para TLS 1.2 ou GnuTLS válido strings de prioridade. Seus valores são passados ​​para as funções SSL_CTX_set_cipher_list() ou gnutls_priority_init(), respectivamente. Critérios de seleção do Ciphersuite para TLS 1.2/1.3 (GnuTLS), TLS 1.2 (OpenSSL)

Para substituir a seleção do ciphersuite em zabbix_get e zabbix_sender utilitários - use o parâmetros de linha de comando:

  • --tls-cipher13
  • --tls-cipher

Os novos parâmetros são opcionais. Se um parâmetro não for especificado, o valor padrão interno é usado. Se um parâmetro é definido, ele não pode ser vazio.

Se a configuração de um valor TLSCipher* na biblioteca de criptografia falhar, o servidor, proxy ou agente não será iniciado e um erro será registrado.

É importante entender quando cada parâmetro é aplicável.

Conexões de saída

O caso mais simples são as conexões de saída:

  • Para conexões de saída com certificado - use TLSCipherCert13 ou TLSCipherCert
  • Para conexões de saída com PSK - use TLSCipherPSK13 e TLS CipherPSK
  • No caso dos utilitários zabbix_get e zabbix_sender a linha de comando parâmetros --tls-cipher13 e --tls-cipher podem ser usados (a criptografia é especificada sem ambiguidade com um --tls-connect parâmetro)
Conexões de saída

O caso mais simples são as conexões de saída:

  • Para conexões de saída com certificado - use TLSCipherCert13 ou TLSCipherCert
  • Para conexões de saída com PSK - use TLSCipherPSK13 e TLS CipherPSK
  • No caso dos utilitários zabbix_get e zabbix_sender a linha de comando parâmetros --tls-cipher13 e --tls-cipher podem ser usados (a criptografia é especificada sem ambiguidade com um --tls-connect parâmetro)
Testando strings de cifras e permitindo apenas conjuntos de cifras PFS

Para ver quais ciphersuites foram selecionados, você precisa definir 'DebugLevel=4' no arquivo de configuração, ou use a opção -vv para zabbix_sender.

Algumas experiências com os parâmetros TLSCipher* podem ser necessárias antes de obter os conjuntos de cifras desejados. É inconveniente reiniciar Servidor, proxy ou agente Zabbix várias vezes apenas para ajustar TLSCipher* parâmetros. Opções mais convenientes estão usando zabbix_sender ou o comando openssl. Vamos mostrar os dois.

1. Usando zabbix_sender.

Vamos fazer um arquivo de configuração de teste, por exemplo /home/zabbix/test.conf, com a sintaxe de um arquivo zabbix_agentd.conf:

  Nome do host=não existente
         ServerActive=inexistente
         
         TLSConnect=cert
         TLSCAFile=/home/zabbix/ca.crt
         TLSCertFile=/home/zabbix/agent.crt
         TLSKeyFile=/home/zabbix/agent.key
         TLSPSKIdentity=inexistente
         TLSPSKFile=/home/zabbix/agent.psk

Você precisa de certificados válidos de CA e agente e PSK para este exemplo. Ajuste os caminhos e nomes de certificados e arquivos PSK para seu ambiente.

Se você não estiver usando certificados, mas apenas PSK, você pode simplificar arquivo de teste:

  Nome do host=não existente
         ServerActive=inexistente
         
         TLSConnect=psk
         TLSPSKIdentity=inexistente
         TLSPSKFile=/home/zabbix/agentd.psk

Os ciphersuites selecionados podem ser vistos executando zabbix_sender (exemplo compilado com OpenSSL 1.1.d):

  $ zabbix_sender -vv -c /home/zabbix/test.conf -k item_não-existente -o 1 2>&1 | grep ciphersuites
         zabbix_sender [41271]: depuração: zbx_tls_init_child () ciphersuites de certificados: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-MCG-SHA256 ECDHE-RSA-AES de 128 SHA256 ECDHE-RSA-AES128-SHA AES128-MCG-SHA256 AES128-CCM8 AES128-CCM AES128-SHA256 AES128-SHA
         zabbix_sender [41271]: depuração: zbx_tls_init_child () PSK ciphersuites: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES de 128 CBC-SHA256 ECDHE-PSK-AES de 128 CBC-SHA PSK-AES128-MCG-SHA256 PSK-AES de 128 CCM8 PSK-AES de 128 CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA
         zabbix_sender [41271]: depuração: zbx_tls_init_child () certificado e PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-MCG-SHA256 ECDHE-RSA-AES de 128 SHA256 ECDHE-RSA-AES128-SHA AES128-MCG-SHA256 AES128-CCM8 AES128 -CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA

Aqui você vê os conjuntos de cifras selecionados por padrão. Esses valores padrão são escolhidos para garantir a interoperabilidade com os agentes Zabbix rodando em sistemas com versões mais antigas do OpenSSL (de 1.0.1).

Com sistemas mais novos, você pode optar por aumentar a segurança permitindo apenas um alguns conjuntos de cifras, e. apenas ciphersuites com PFS (Perfect Forward Segredo). Vamos tentar permitir apenas ciphersuites com PFS usando Parâmetros TLSCipher*.

::: não importante O resultado não será interoperável com sistemas usando OpenSSL 1.0.1 e 1.0.2, se PSK for usado. Baseado em certificado criptografia deve funcionar. :::

Adicione duas linhas ao arquivo de configuração test.conf:

  TLSCipherCert=EECDH+aRSA+AES128
         TLS CipherPSK=kECDHEPSK+AES128

e teste novamente:

  $ zabbix_sender -vv -c /home/zabbix/test.conf -k item_não-existente -o 1 2>&1 | grep ciphersuites
         zabbix_sender [42892]: DEBUG: zbx_tls_init_child() certificados ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES1128-SHA256 ECDHE-RSA-AES1128-SHA256
         zabbix_sender [42892]: DEBUG: zbx_tls_init_child() Ciphersuites PSK: TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA
         zabbix_sender [42892]: depuração: zbx_tls_init_child () certificado e PSK ciphersuites: TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-MCG-SHA256 ECDHE-RSA-AES de 128 SHA256 ECDHE-RSA-AES128-SHA AES128-MCG-SHA256 AES128-CCM8 AES128 -CCM AES128-SHA256 AES128-SHA ECDHE-PSK-AES128-CBC-SHA256 ECDHE-PSK-AES128-CBC-SHA PSK-AES128-GCM-SHA256 PSK-AES128-CCM8 PSK-AES128-CCM PSK-AES128-CBC-SHA256 PSK-AES128-CBC-SHA

As listas "certificate ciphersuites" e "PSK ciphersuites" foram alteradas - eles são mais curtos do que antes, contendo apenas conjuntos de cifras TLS 1.3 e TLS 1.2 ECDHE-* ciphersuites conforme esperado.

2. TLSCipherAll e TLSCipherAll13 não podem ser testados com zabbix_sender; eles não afetam "certificados e conjuntos de cifras PSK" valor mostrado no exemplo acima. Para ajustar TLScipherAll e TLSCipherAll13 você precisa experimentar com o agente, proxy ou servidor.

Portanto, para permitir apenas conjuntos de cifras PFS, você pode precisar adicionar até três parâmetros

  TLSCipherCert=EECDH+aRSA+AES128
         TLS CipherPSK=kECDHEPSK+AES128
         TLSCipherAll=EECDH+aRSA+AES128:kECDHEPSK+AES128

para zabbix_agentd.conf, zabbix_proxy.c

Mudando de AES128 para AES256

O Zabbix usa o AES128 como padrão interno para dados. Vamos supor que você está usando certificados e deseja mudar para AES256, no OpenSSL 1.1.1.

Isso pode ser feito adicionando os respectivos parâmetros em zabbix_server.conf:

  TLSCAFile=/home/zabbix/ca.crt
         TLSCertFile=/home/zabbix/server.crt
         TLSKeyFile=/home/zabbix/server.key
         TLSCipherCert13=TLS_AES_256_GCM_SHA384
         TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384
         TLSipherPSK13=TLS_CHACHA20_POLY1305_SHA256
         TLSCipherPSK=kECDHEPSK+AES256:-SHA1
         TLSipherAll13=TLS_AES_256_GCM_SHA384
         TLSCipherAll=EECDH+aRSA+AES256:-SHA1:-SHA384

::: não importante Embora apenas conjuntos de criptografia relacionados a certificados será usado, os parâmetros TLSCipherPSK* também são definidos para evitar seus valores padrão que incluem cifras menos seguras para interoperabilidade. Ciphersuites PSK não podem ser completamente desabilitados em servidor/proxy. :::

E em zabbix_agentd.conf:

  TLSConnect=cert
         TLSAccept=cert
         TLSCAFile=/home/zabbix/ca.crt
         TLSCertFile=/home/zabbix/agent.crt
         TLSKeyFile=/home/zabbix/agent.key
         TLSCipherCert13=TLS_AES_256_GCM_SHA384
         TLSCipherCert=EECDH+aRSA+AES256:-SHA1:-SHA384