Configurando Criptografia no Zabbix

By | 28 de abril de 2016

Neste post irei abordar como configurar a Criptografia no Zabbix. Na versão 3 do Zabbix é possível criptografar a comunicação entre o Servidor e os Agentes. É possível criptografar também a comunicação entre Servidor e o Proxy. É bom observar que a criptografia nativa protege apenas a comunicação entre Servidor <-> Agente/Proxy. A comunicação do Server/proxy com banco de dados, bem como entre o frontend e o navegador cliente, não são protegidas.

Um item que deve ser levado em consideração é em relação ao desempenho da comunicação, que cai bastante com o uso da criptografia. Segundo o manual do Zabbix uma consulta que em texto plano demora 200ms para ter resposta pode chegar a 1000ms com o uso da criptografia. Isso pode causar timeout em alguns itens e scripts, que devem ser ajustados para evitar problemas.

O Zabbix permite o uso de chaves pré compartilhadas (PSK) ou Certificados digitais para realizar a criptografia. Ambas possuem vantagens e desvantagens. Iremos realizar a configuração dos dois métodos:

Para o uso da criptografia no Zabbix deve-se habilitar esse recurso ao compila-lo (ex: ./configure […] –with-gnutls). Segundo a documentação, os pacotes pré-compilados (RPM e Deb) possuem criptografia habilitada.

Criptografia no Zabbix utilizando Chaves Pré-Compartilhadas (PSK)

Vantagens:

  • Implementação mais simples
  • Desempenho melhor, comparado ao uso de Certificados Digitais

Desvantagem:

  • As chaves são mostradas na interface web e armazenadas em texto limpo no banco de dados

Configuração:
Servidor: Não é necessária nenhuma configuração adicional

Agente:

Gerar a chave:
# openssl rand -hex 32 > /home/zabbix/zabbix-agent.psk
(abra o arquivo e copie a chave, será necessário para configurar na interface web)

Alterar os seguintes itens no zabbix_agentd.conf:

TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK01 #Esse item é a identificação da chave; cada chave deve ter sua identificação.
TLSPSKFile=/home/zabbix/zabbix_agentd.psk

Configuração na Interface Web:

Na configuração do Host, vá em “Encryption”, selecione “PSK” e configure os itens de acordo com sua configuração:
criptografia no zabbix com psk

Inicie o agente, se estiver tudo correto irá funcionar:

criptografia no zabbix com psk funcionando

 

Criptografia no Zabbix utilizando Certificados Digitais

Vantagens:

  • Implementação “teoricamente” mais robusta
  • Autenticação do Agente/Proxy (controverso)
  • Possibilidade de uso de CA para gerenciamento de Certificados Digitais

Desvantagens:

  • Desempenho inferior
  • Implementação mais complexa

Talvez eu esteja errado, mas me parece que a implementação da criptografia com Certificados Digitais do Zabbix foi aplicada exclusivamente para prover confidencialidade, e foi perdida a oportunidade de utilizar os Certificados para prover a Autenticidade do Host. Isso porque:

  1. Você tem que especificar quem assinou o Certificado de cada Host. Isso faz com que não seja necessário que os Certificados sejam assinados por uma mesma CA (Certificate Authority). Seria melhor se você obrigatoriamente tivesse que utilizar a mesma CA que assinou o certificado do Servidor, traria uma confiabilidade maior, além tornar desnecessário o preenchimento do campo “issuer” na interface Web.
  2. A verificação  do Certificado/CA é baseada apenas no “Subject” do Certificado. Nada impede de um suposto atacante de criar um outro certificado com outra chave privada e utilizar o mesmo “Subject”. Me parece que o correto seria utilizar o hash do certificado, para confirmar a autenticidade do mesmo.

Configuração:

Criando a CA e assinando certificado do Servidor:
Para esse exemplo irei criar uma CA no Servidor do Zabbix (estou utliizando CentOS 7), e irei utiliza-la para assinar o Certificado do agente.

# cd /etc/pki/CA
# openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650
(Ele irá pedir uma senha para criação da chave, além de atributos do certificado. Preencha todos os campos, para evitar problemas posteriormente.)
# touch /etc/pki/CA/index.txt
# echo “01” > /etc/pki/CA/serial
# mkdir /etc/zabbix/certs
# cd /etc/zabbix/certs
# openssl genrsa -out chave.key 2048
# openssl req -new -key chave.key -out requisicao.csr
(preencha os dados da requisição. O campo “common name” deve ser o nome da máquina)
# openssl ca -in requisicao.csr
(a senha que ele solicita é a senha da chave da CA)

Copie o conteúdo do certificado (começa em —–BEGIN CERTIFICATE e vai até —–END CERTIFICATE – incluindo estas linhas) e cole em /etc/zabbix/certs/server.pem.

Configurando o Zabbix Server

Edite no arquivo zabbix_server.conf:

TLSCAFile=/etc/pki/CA/cacert.pem
TLSCertFile=/etc/zabbix/certs/server.pem
TLSKeyFile=/etc/zabbix/certs/chave.key

Configurando o Agente:

Gerar o certificado:
# mkdir /etc/zabbix/certs
# cd /etc/zabbix/certs
# openssl genrsa -out chave.key 2048
# openssl req -new -key chave.key -out requisicao.csr

Copie o arquivo requisicao.csr para o servidor (por exemplo, na pasta /tmp). Em seguida, execute no servidor:
openssl ca -in /tmp/requisicao.csr
(digite a senha da chave da CA).

Copie o conteúdo do certificado (começa em —–BEGIN CERTIFICATE e vai até —–END CERTIFICATE – incluindo estas linhas) e cole no host(agente) em /etc/zabbix/certs/agente.pem.

Configurar o agente:

Edite no zabbix_agentd.conf:
TLSConnect=cert
TLSAccept=cert
TLSCAFile=/etc/zabbix/certs/cacert.pem
TLSCertFile=/etc/zabbix/certs/agente.pem
TLSKeyFile=/etc/zabbix/certs/chave.key

Configurar a Interface Web

Na configuração do Host, vá em “Encryption”, selecione “Certificate” e configure os itens de acordo com sua configuração:
criptografia no zabbix com certificados

Agora vem o que considero uma bizarrice: O campo “Issuer” deve ser preenchido com a informação de “quem assinou o certificado”, e o campo “Suject” com a informação do certificado. Até aí tudo OK. O detalhe é que para o Zabbix a informação deve ser colocada exatamente contrária  a saída do openssl. Neste teste, por exemplo, a saída do openssl é a seguinte:

Issuer: C=BR, ST=SP, L=Campinas, O=Default Company Ltd, CN=ca-zabbix
Subject: C=BR, ST=SP, O=Default Company Ltd, CN=zabbix-agent.local

No entanto, a implementação do Zabbix pede a sequência contrária: CN,O,L,ST,C. A única forma de arrumar isso sem ter que copiar do erro da Interface web foi utilizando um “script” para inverter os campos:

Issuer:
# openssl x509 -inform PEM -in /etc/zabbix/certs/agente.pem -text | grep “Issuer:” | cut -d “:” -f2 | awk -F, ‘{print $5″,”$4″,”$3″,”$2″,”$1}’ | sed ‘s/ //g’

Subject:
# openssl x509 -inform PEM -in agent.pem -text | grep “Subject:” | cut -d “:” -f2 | awk -F, ‘{print $4″,”$3″,”$2″,”$1}’ | sed ‘s/ //g’

Uma observação é que, caso você tenha colocado algum espaço no preenchimento do certificado observe se o espaço foi suprimido e corrija caso necessário.

E enfim, se tudo estiver OK vai funcionar bem…
criptografia no zabbix com certificados funcionando

Referência

https://www.zabbix.com/documentation/3.0/manual/encryption