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:
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.
Para suportar a criptografia, o Zabbix deve ser compilado e vinculado a um dos bibliotecas de criptografia suportadas:
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. :::
Conexões no Zabbix podem usar:
Existem dois parâmetros importantes usados para especificar a criptografia entre Componentes do Zabbix:
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:
TLSAccept=unencrypted,cert
no arquivo de configuração do agente e reinicie o agente ZabbixTLSAccept=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| |-------|-------------------|--------------------- --------|------------------------------| ||Unencrypted|Unencrypted|Criptografado, certificado e criptografado com base em PSK| ||Criptografado, baseado em certificado|Criptado, baseado em certificado|Não criptografado e criptografado com base em PSK| ||Criptografado, baseado em PSK|Criptado, baseado em PSK|Não criptografado e criptografado com base em certificado| ||Criptografado, baseado em PSK|Criptografia não criptografada e baseada em PSK|Criptografia baseada em certificado| ||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. :::
Veja zabbix_get e zabbix_sender manpages para usá-los com criptografia.
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 |
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.
O caso mais simples são as conexões de saída:
--tls-cipher13
e --tls-cipher
podem ser usados (a criptografia é especificada sem ambiguidade com um --tls-connect
parâmetro)O caso mais simples são as conexões de saída:
--tls-cipher13
e --tls-cipher
podem ser usados (a criptografia é especificada sem ambiguidade com um --tls-connect
parâmetro)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
:
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
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
: