16. Criptografia

Visão geral

O Zabbix suporta comunicação criptografada entre os seus componentes (Zabbix server/Proxy/Agent/Sender/get) através de TLS v1.2. O suporte a criptografia começou no Zabbix 3.0. A criptografia baseada em PSK e certificado também é suportada.

A criptografia é opcional e configurável para cada componente (ex. alguns proxies e agentes podem estar configurados para utilizar criptografia com certificados ao falar com o Server, enquanto outros utilizam PSK, e outros não usam criptografia).

O proxy pode utilizar diferentes configurações de criptografia para diferentes hosts.

Os daemons do Zabbix utilizam uma porta para escutar comunicações criptografadas ou não criptografia. Adicionar a criptografia não exigirá a abertura de novas portas nos firewalls.

Limitações

  • As chaves privadas são armazenadas em texto plano em arquivos com permissão de leitura pelos componentes do Zabbix durante a inicialização.
  • As chaves compartilhadas são informadas na interface web do Zabbix e salvas em texto plano no banco de dados.
  • A criptografia nativa da solução não proteje as comunicações:​
   * entre o servidor web do Zabbix e o navegador do usuário ((Nota do tradutor: para isso você deve habilitar o HTTPS no Apache)),
          * entre a interface web e o Zabbix Server,
          * entre o Zabbix Server/Proxy e seu banco de dados.
       * Atualmente cada conexão criptografada precisa de validação TLS completa, não é feito nenhum cache de sessão ou uso de sistema de tickets.
       * A adição de criptografia aumenta o tempo de verificações e ações, dependendo da latência da rede.\\ Por exemplo, se atraso do pacote é de 100ms quando se abre uma conexão TCP e envia uma requisição em texto plano consome cerca de 200ms.\\ A mesma solicitação com o uso de criptografia gastará cerca de 1000 ms para o estabelecimento da conexão TLS.\\ O tempo limite (timeout) precisa ser ajustado, de outra forma alguns itens e ações executando scripts remotos que funcionavam com a conexão sem criptografia poderão falhar por esgotamento do tempo quando passarem a utilizar criptografia.

Compilando o Zabbix com o suporte a criptografia

Para suportar a criptografia do Zabbix você precisa compilar e associar com uma destas três bibliotecas:

  • mbed TLS (antigamente PolarSSL)(versão 1.3.9 ou superior - 1.3.x) - o mbed TLS 2.x não é suportado atualmente
  • GnuTLS (a partir da versão 3.1.18)
  • OpenSSL (a partir da versão 1.0.1)

A biblioteca é selecionada através de parâmetro no script de configuração:

  • --with-mbedtls[=DIR]
  • --with-gnutls[=DIR]
  • --with-openssl[=DIR]

Por exemplo, para configurar os fontes do servidor edo agente com OpenSSL você pode executar algo assim:
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

Diferentes componentes do Zabbix podem ser compilados com diferentes bibliotecas criptográficas (ex. um servidor com OpenSSL, um agente com GnuTLS).

Se você planejar utilizar PSK, considere a utilização das bibliotecas GnuTLS ou mbed TLS nos componentes Zabbix usando PSKs. As bibliotecas GnuTLS e mbed TLS suportam a suite de cifras com Perfeito encaminhamento de segredo. A biblioteca OpenSSL (versões 1.0.1, 1.0.2c) suporta o PSK mas não tem disponível as suítes de cifras que provejam o perfeito encaminhamento de segredo.

Gerenciamento de conexão criptografada

As conexões do Zabbix podem usar:

Existem dois parâmetros importantes utilizados para especificar a criptografia de conexões entre os componentes do Zabbix:

  • TLSConnect
  • TLSAccept

TLSConnect define qual criptografia a utilizar nas conexões de saída e pode pegar 1 de 3 valores (unencrypted, PSK, certificate). TLSConnect é utilizado em arquivos de configuração do Zabbix proxy (em modo ativo, identifica apenas conexões para o servidor) e do Zabbix agentd (para verificações ativas). Na interface web o TLSConnect é equivalente ao campo Conexões com o host em Configuração → Hosts →<some host> aba Criptografia e o campo Conexões com o proxy em Administração→Proxies→<some proxy> aba Criptografia. Se um tipo de conexão criptografada falhar, não será tentado outro tipo. TLSAccept define quais tipos de conexão de entrada serão permitidos. Tipos possíveis: unencrypted, PSK, certificate. Podem ser definidos 1 ou mais valores. TLSAccept é utilizado em arquivos de configuração do proxy (em modo passivo) e do agente (em modo passivo). Na interface web do Zabbix o TLSAccept é equivalente ao campo "Conexões com o host" em "//Configuração → Hosts →<some host>" aba Criptografia e o campo "Conexões com o proxy" em //Administração→Proxies→<some proxy>" aba Criptografia.

Normalmente você configura somente um tipo de criptografia para as conexões de entrada. Mas você pode precisar alterar o tipo de criptografia, (ex. de não criptografado para criptografia baseada em certificados) com o mínimo de 'downtime' e possibilidade de rápido retorno. \\Para fazer isso defina TLSAccept=unencrypted,cert no arquivo de configuração do agente o o reinicie. \\Então você poderá testar a conexão com o zabbix_get com o agente usando certificado. Se funcionar, você reconfigura a criptografia daquele agente na interface web do Zabbix, configurando para o uso de certificado. Quando o cache de comunicação do servidor for atualizado (e a configuração do proxy for atualizada se o proxy estiver sendo monitorado por um) as conexões começarão a ocorrer de forma criptografa. \\Se tudo estiver funcionando como o esperado você pode configurar TLSAccept=cert na configuração do agente e reinicia-lo. Agora o agente vai aceitar apenas conexões criptografadas e com certificado. Comunicações sem criptografia ou baseadas em PSK serão rejeitadas.

A configuração funciona de forma similar entre o Zabbix Server/Proxy. Se o host estiver configurado para usar certificado, então apenas comunicações criptografadas com certificados serão aceitas pelo agente (verificações ativas) e pelo zabbix_sender (trapper items).

Provavelmente você irá configurar para que as comunicações de entrda e de saída ocorram com o mesmo tipo de criptografia ou sem criptografia para todos. Mas é tecnicamente possível configurar isso de forma assimétrica, ex. criptografia com certificados para entrada e com PSK para a saída.

Para uma visão geral, a configuração de criptografia de cada host será apresentada na interface do Zabbix no canto direito da listagem de hosts na coluna "Criptografia do agente". Exemplos de configurações:

Exemplo Conexões PARA o host Conexões permitidas DO host Conexões REJEITADAS do host
none.png Texto plano Texto plano Certificado ou chave compartilhada
cert.png Criptografado, por certificado Criptografado, por certificado Texto plano e chave compartilhada
psk_psk.png Criptografado, por chave compartilhada Criptografado, por chave compartilhada Texto plano ou chave
psk_none_psk.png Criptografado, por chave compartilhada Texto plano ou chave compartilhada Certificado
all.png Criptografado, por certificado Texto plano, certificado ou chave compartilhada -

O padrão sao conexões não criptografadas. A criptografia precisa ser configurada em cada host e proxy individualmente.

zabbix_get e zabbix_sender com criptografia

Consulte o manual dos componentes zabbix_get e zabbix_sender para informações sobre como eles trabalham com criptografia.

Algorítimos de criptografia

Os algorítimos são configurados internamente durante a inicialização do Zabbix e, dependendo da biblioteca de criptografia, eles podem não ser configuráveis pelo usuário.

Lista de bibliotecas de criptografia configuradas ordenadas por sua prioridade:

Library Certificate ciphersuites PSK ciphersuites
mbed TLS (PolarSSL) 1.3.9 TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256
TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA
TLS-RSA-WITH-AES-128-GCM-SHA256
TLS-RSA-WITH-AES-128-CBC-SHA256
TLS-RSA-WITH-AES-128-CBC-SHA
TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256
TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA
TLS-PSK-WITH-AES-128-GCM-SHA256
TLS-PSK-WITH-AES-128-CBC-SHA256
TLS-PSK-WITH-AES-128-CBC-SHA
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

Uso dos conjuntos criptográficos (linhas - TLS de cliente, colunas - TLS de servidor): Usando certificados:

mbed TLS (PolarSSL) GnuTLS OpenSSL
mbed TLS (PolarSSL) TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
GnuTLS TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256
OpenSSL TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256

Usando PSK:

mbed TLS (PolarSSL) GnuTLS OpenSSL
mbed TLS (PolarSSL) TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256 TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256 TLS-PSK-WITH-AES-128-CBC-SHA
GnuTLS TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256 TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256 TLS-PSK-WITH-AES-128-CBC-SHA
OpenSSL TLS-PSK-WITH-AES-128-CBC-SHA TLS-PSK-WITH-AES-128-CBC-SHA TLS-PSK-WITH-AES-128-CBC-SHA