Estou tentando configurar o encaminhador de logstash, mas estou com problemas para criar um canal seguro adequado. Tentando configurar isso com duas máquinas ubuntu (servidor 14.04) em execução no virtualbox. Eles são 100% limpos (não tocou no arquivo hosts ou instalou outros pacotes além do java, ngix, elastisearch, etc., para logstash)
Eu não acredito que este seja um problema de logstash, mas o manuseio inadequado de certificados ou algo não definido corretamente no ubuntu do logstash ou na máquina do encaminhador.
Gerei as chaves:
sudo openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
Minha conf de entrada no servidor logstash:
input {
lumberjack {
port => 5000
type => "logs"
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
As chaves foram copiadas para o encaminhador host , que possui a seguinte configuração.
{
"network": {
"servers": [ "192.168.2.107:5000" ],
"timeout": 15,
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
"ssl key": "/etc/pki/tls/certs/logstash-forwarder.key"
},
"files": [
{
"paths": [
"/var/log/syslog",
"/var/log/auth.log"
],
"fields": { "type": "syslog" }
}
]
}
Com o servidor logstash em execução, eu 'sudo service logstash-forwarder start' na máquina do encaminhador, dando-me o seguinte erro repetido:
Jul 9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.589762 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul 9 05:06:21 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:21.595105 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs
Jul 9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.595971 Connecting to [192.168.2.107]:5000 (192.168.2.107)
Jul 9 05:06:22 ubuntu logstash-forwarder[1374]: 2014/07/09 05:06:22.602024 Failed to tls handshake with 192.168.2.107 x509: cannot validate certificate for 192.168.2.107 because it doesn't contain any IP SANs
Como mencionei anteriormente, não acredito que seja um problema de logstash, mas um problema de configuração de certificado/máquina. O problema é que não consigo resolver. Espero que algumas mentes inteligentes aqui possam me ajudar?
Obrigado
O SSL precisa de identificação do peer, caso contrário, sua conexão pode ser contra um intermediário que descriptografa + fareja/modifica os dados e os encaminha criptografados novamente para o destino real. A identificação é feita com certificados x509 que precisam ser validados em relação a uma CA confiável e que precisam identificar o destino ao qual você deseja se conectar.
Normalmente, o destino é fornecido como um nome de host e isso é verificado em relação aos nomes alternativos de assunto e assunto do certificado. Neste caso, seu alvo é um IP. Para validar o certificado com sucesso, o IP deve ser fornecido no certificado dentro da seção de nomes alternativos do assunto, mas não como uma entrada DNS (por exemplo, nome do host), mas como IP.
Então o que você precisa é:
Edite seu
/etc/ssl/openssl.cnf
no host do logstash - adicionesubjectAltName = IP:192.168.2.107
na[v3_ca]
seção.Recriar o certificado
Copie o certificado e a chave para ambos os hosts
PS Considere adicionar
-days 365
ou mais à linha de comando de criação do certificado, pois a validade padrão do certificado é de apenas 30 dias e você provavelmente não deseja recriá-lo todos os meses.Existe um script para criar certificados adequados para lenhador que foi mencionado em um tíquete do github do logstash: o handshake SSL falha porque não há IP SANs
Baixe o arquivo:
curl -O https://raw.githubusercontent.com/driskell/log-courier/1.x/src/lc-tlscert/lc-tlscert.go
...construa:
..e corra:
Eu tive um problema real com isso. Não estou usando o logstash, estava simplesmente tentando fazer com que as SANs IP funcionassem com o docker tls. Eu criaria o certificado conforme descrito no artigo do docker em https ( https://docs.docker.com/articles/https/ ), então quando eu me conectaria de um cliente do docker:
Eu receberia este erro:
que estava me deixando louco. Eu admito, eu tropeço em todas as coisas do openssl, então, todo mundo já deve saber o que eu descobri. O exemplo subjectAltName aqui (e em todos os outros lugares) mostra a atualização do arquivo openssl.cnf. Não consegui fazer isso funcionar. Eu localizei no openssl.cnf, copiei-o para um diretório local e fiz as alterações nele. Quando examinei o certificado, ele não continha a extensão:
O comando que está sendo usado para criar esse certificado está aqui (do artigo docker):
Você não pode adicionar uma linha -config openssl.cnf a este comando, ela não é válida. Você também não pode copiar o arquivo openssl.cnf para o diretório atual, modificá-lo e esperar que funcione dessa maneira. Algumas linhas depois, notei que o certificado 'client' usa um -extfile extfile.cnf. Então, eu tentei isso:
e isso resolveu. Então, por alguma razão, minha versão do openssl não estava me permitindo modificar o arquivo openssl.cnf, mas eu poderia especificar o subjectAltName assim. Funciona bem!
Você pode especificar qualquer número de endereços IP, como IP:127.0.0.1,IP:127.0.1.1 (não localhost também).
A partir do OpenSSL 1.1.1, fornecer subjectAltName diretamente na linha de comando ficou muito mais fácil, com a introdução do
-addext
sinalizador paraopenssl req
Exemplo:
Inspirado no link
Por favor, veja a solução de @Steffen Ullrich acima para a solução rápida.
Há também um problema/uma discussão sobre isso no github do projeto logstash-forwarder . Veja-o (em breve, pois atualmente o trabalho está em andamento) para uma solução mais fácil.