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:
- Criptografia no Zabbix utilizando Chaves Pré-Compartilhadas
- Criptografia no Zabbix utilizando Certificados Digitais
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:
Inicie o agente, se estiver tudo correto irá funcionar:
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:
- 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.
- 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:
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…