ログをrsyslogからtls経由でgraylogに転送しようとしています。
# make gtls driver the default
$DefaultNetstreamDriver gtls
#
# # certificate files
$DefaultNetstreamDriverCAFile /etc/ssl/rsyslog/ca.pem
$DefaultNetstreamDriverCertFile /etc/ssl/rsyslog/rsyslog-cert.pem
$DefaultNetstreamDriverKeyFile /etc/ssl/rsyslog/rsyslog-key.pem
#
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer graylog.mydomain.com
$ActionSendStreamDriverMode 1 # run driver in TLS-only mode
*.* @@graylog.mydomain.com:6514 # forward everything to remote server
Rsyslogのドキュメントに記載されているように、必要な証明書を生成しました。
certtool --pkcs8 --generate-privkey --outfile ca-key.pem
certtool --pkcs8 --generate-self-signed --load-privkey ca-key.pem --outfile ca.pem
certtool --pkcs8 --generate-privkey --outfile graylog.key.pem
certtool --pkcs8 --generate-request --load-privkey graylog.key.pem --outfile graylog.request.pem
certtool --pkcs8 --generate-certificate --load-request graylog.request.pem --outfile graylog.cert.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem
certtool --pkcs8 --generate-privkey --outfile rsyslog.key.pem
certtool --pkcs8 --generate-request --load-privkey rsyslog.key.pem --outfile rsyslog.request.pem
certtool --pkcs8 --generate-certificate --load-request rsyslog.request.pem --outfile rsyslog.cert.pem --load-ca-certificate ca.pem --load-ca-privkey ca-key.pem
すべての証明書ファイルは/ etc/ssl/Graylog/input-ca /にあります
グレイログ入力は次のように構成されます。
TLS cert file: /etc/ssl/graylog/input-ca/graylog-cert.pem
TLS private key file: /etc/ssl/graylog/input-ca/graylog-key.pem
TLS Client Auth Trusted Certs: /etc/ssl/graylog/input-ca
しかし、rsyslogがログメッセージをgarylogにプッシュすると、次のエラーが発生します。
2016-10-06T13:19:27.734+02:00 WARN [AbstractNioSelector] Failed to initialize an accepted socket.
Java.security.cert.CertificateParsingException: signed fields invalid
at Sun.security.x509.X509CertImpl.parse(X509CertImpl.Java:1791) ~[?:1.8.0_91]
at Sun.security.x509.X509CertImpl.<init>(X509CertImpl.Java:195) ~[?:1.8.0_91]
at Sun.security.provider.X509Factory.parseX509orPKCS7Cert(X509Factory.Java:469) ~[?:1.8.0_91]
at Sun.security.provider.X509Factory.engineGenerateCertificates(X509Factory.Java:354) ~[?:1.8.0_91]
at Java.security.cert.CertificateFactory.generateCertificates(CertificateFactory.Java:462) ~[?:1.8.0_91]
at org.graylog2.plugin.inputs.transports.util.KeyUtil.loadCertificates(KeyUtil.Java:90) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.util.KeyUtil.loadCertificates(KeyUtil.Java:100) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.util.KeyUtil.initTrustStore(KeyUtil.Java:73) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.AbstractTcpTransport$1.createSslEngine(AbstractTcpTransport.Java:199) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.AbstractTcpTransport$1.call(AbstractTcpTransport.Java:186) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.AbstractTcpTransport$1.call(AbstractTcpTransport.Java:182) ~[graylog.jar:?]
at org.graylog2.plugin.inputs.transports.NettyTransport$1.getPipeline(NettyTransport.Java:110) ~[graylog.jar:?]
at org.jboss.netty.channel.socket.nio.NioServerBoss.registerAcceptedChannel(NioServerBoss.Java:134) [graylog.jar:?]
at org.jboss.netty.channel.socket.nio.NioServerBoss.process(NioServerBoss.Java:104) [graylog.jar:?]
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.Java:337) [graylog.jar:?]
at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.Java:42) [graylog.jar:?]
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.Java:108) [graylog.jar:?]
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.Java:42) [graylog.jar:?]
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142) [?:1.8.0_91]
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617) [?:1.8.0_91]
at Java.lang.Thread.run(Thread.Java:745) [?:1.8.0_91]
何が問題になるのか考えてみませんか?
Keytoolを使用して、証明書をJavaキーストアにインポートする必要があります。
keytool -import -alias mygraylogcertificate -file mygraylogcertificate.cer -keystore examplekeystore
キーストアの場所は、インストールによって異なります。
Graylogプロセスが証明書ファイルとキーを読み取れることを確認してください。 (通常、rootではなく「graylog」ユーザーとして実行されます。)「受け入れられたソケットの初期化に失敗しました」は、Graylogがこれらのファイルを読み取れないように見えるエラーです。
通常、キー、証明書、およびその他のファイルは/etc/graylog
(私は/etc/graylog/keys
を使用)の下にあり、graylog
ユーザーが所有します。キーがグループやその他に読み取れないことを確認してください。
最終的に、クライアントがTLSを介してrsyslogを使用してログを収集サーバー上のrsyslogにプッシュし、収集サーバー上のrsyslogがそれらをgraylog2に転送するようにすることでこれを解決しました。
概略:開発マシン1-> rsyslog-> TLS->収集サーバー:rsyslog-> Graylog2