自己証明書を使ったSplunk ForwarderのSSL転送設定方法


はじめに

  • Fowarderからデータ転送する通信をセキュアに(データ転送をSSL暗号)
  • 圧縮してトラフィック負荷を軽減(転送データを1/8程度に圧縮)
  • Splunk社のデフォルト証明書を使うよりも、自己証明書でもっとセキュアにしたい
    • ※デフォルト証明書は3年でExpireします。期限が切れた場合、インデクサーとのSSLコネクションを作ることができずにログ転送が失敗する仕様なので注意。
  • セットアップのおすすめ方法は先にSplunk社のデフォルト証明書を使うを使ってSSL転送できることを確認した後で、自己証明書を用いた以下手順を実施したほうが、着実に問題切り分けや成功イメージがつくのでオススメです

更新履歴

  • 2020.06.12 FWDの以下パスを修正
outputs.conf
clientCert = $SPLUNK_HOME/etc/auth/mycerts/mySplunkForwarderCertificate.pem
↓
clientCert = $SPLUNK_HOME/etc/apps/100_ssl/default/mySplunkForwarderCertificate.pem

自己証明書を用意するパターン

検証構成イメージ

HowTo

1. Root CAの公開鍵(自己署名ルート証明書)を作成

鍵、証明書の作成自体はすべてIDXサーバ(またはsplunkインスタンスならどこでも※)上でまとめてやります
※Splunkのopensslコマンドを使って証明書を作成するため

setting

①証明書を配置するフォルダを作成
# mkdir /opt/splunk/etc/auth/mycerts/ && cd /opt/splunk/etc/auth/mycerts/

②まずは、Root CAの秘密鍵(myCAPrivateKey.key)を作成
# /opt/splunk/bin/splunk cmd openssl genrsa -aes256 -out myCAPrivateKey.key 2048

③次に、CSR(myCACertificate.csr)を作成
# /opt/splunk/bin/splunk cmd openssl req -new -key myCAPrivateKey.key -out myCACertificate.csr

-少なくともCommon Nameはユニークな名前にしてください※--
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

※今回は利用していませんが、FWDとIDX間でCommon Nameを元にした認証を行うオプションもあるため
- sslCommonNameToCheck
- requireClientCert
-------------------------------------------------

④そして、CSRを利用しRootCAの10年有効な公開鍵(myCACertificate.pem)を作成
# /opt/splunk/bin/splunk cmd openssl x509 -req -in myCACertificate.csr -signkey myCAPrivateKey.key -out myCACertificate.pem -days 3650

2. FWDの秘密鍵とFWDの証明書を作成

ここでも鍵、証明書の作成自体はすべてIDXサーバ上でまとめてやります

setting
①FWDの秘密鍵(myFWDPrivateKey.key)を作成
# /opt/splunk/bin/splunk cmd openssl genrsa -aes256 -out mySplunkFWIPrivateKey.key 2048

ややこしいポイント:
↑のmySplunkFWIPrivateKey.keyを使ってIDXとFWDそれぞれの公開鍵も作ります。

②CSR(mySplunkForwarderCert.csr)を作成
# /opt/splunk/bin/splunk cmd openssl req -new -key mySplunkFWIPrivateKey.key -out mySplunkForwarderCert.csr

-少なくともCommon Nameはユニークな名前にしてください。--
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
-------------------------------------------------

③CSRを利用しFWDの3年有効な証明書(mySplunkForwarderCert.pem)を作成
# /opt/splunk/bin/splunk cmd openssl x509 -req -in mySplunkForwarderCert.csr -CA myCACertificate.pem -CAkey myCAPrivateKey.key -CAcreateserial -out mySplunkForwarderCert.pem -days 1095

3. IDXサーバの証明書を作成

ここでも鍵、証明書の作成自体はすべてIDXサーバ上でまとめてやります

setting

①CSR(myIDXCertificate.csr)を作成 ※←ここでFWDの秘密鍵を使用
# /opt/splunk/bin/splunk cmd openssl req -new -key mySplunkFWIPrivateKey.key -out mySplunkIndexerCert.csr

-少なくともCommon Nameはユニークな名前にしてください。--
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
-------------------------------------------------

②CSRを利用しIDXの3年有効な証明書(myIDXCertificate.pem)を作成
# /opt/splunk/bin/splunk cmd openssl x509 -req -in mySplunkIndexerCert.csr -CA myCACertificate.pem -CAkey myCAPrivateKey.key -CAcreateserial -out mySplunkIndexerCert.pem -days 1095

4. 証明書、秘密鍵、RootCA(自己署名ルート証明書)を1つのファイルにマージ

ここでも鍵、証明書の作成自体はすべてIDXサーバ上でまとめてやります

settinng

①これまで作成した鍵をまとめて1つのSplunk用のIDX証明書を作成
# cat mySplunkIndexerCert.pem mySplunkFWIPrivateKey.key myCACertificate.pem > mySplunkIndexerCertificate.pem

②これまで作成した鍵をまとめて1つのSplunk用のFWD証明書を作成
# cat mySplunkForwarderCert.pem mySplunkFWIPrivateKey.key myCACertificate.pem > mySplunkForwarderCertificate.pem

5. IDXサーバの設定

ここではIDXサーバ上作業

setting
①inputs.confの編集
# vi /opt/splunk/etc/system/local/inputs.conf
------------------------------------------------
[splunktcp-ssl:9997]

[SSL]
serverCert = /opt/splunk/etc/auth/mycerts/mySplunkIndexerCertificate.pem
sslPassword = (IDX証明書作成時に指定したパスワード)

requireClientCert = false
------------------------------------------------

②server.confの追記
# vi /opt/splunk/etc/system/local/server.conf(IDXがWindows以外の時)
------------------------------------------------
sslRootCAPath = /opt/splunk/etc/auth/mycerts/myCACertificate.pem
------------------------------------------------

③設定の反映
# splunk restart

6. FWDの設定

ここではFWD上で作業

  • 本手順ではDeployment-Server(DS)機能を使って、100_sslというappフォルダを用意し、その配下に必要な証明書とconfを配備して、DS機能を使って複数windowsに配る方法を想定した手順になっています
  • 一台のwindowsPCにテストインストールする場合はFowarderインストール後に手動でetc/apps/100_sslフォルダを作成する必要があります。
setting

①ファイルの配置(# $SPLUNK_HOME/etc/apps/100_ssl/default/配下に)
・mySplunkForwarderCertificate.pem
・myCACertificate.pem

※auth/mycertsフォルダを作成しその配下にpemを設置した際にファイルアクセス権のエラーが出たため、既存のauth配下に直接置きました。

②outputs.confに追記
# vi $SPLUNK_HOME/etc/apps/100_ssl/default/outputs.conf
------------------------------------------------
[tcpout]
defaultGroup = default-autolb-group

[tcpout:default-autolb-group]
server = 192.168.xxx.xxx:9997

clientCert = $SPLUNK_HOME/etc/apps/100_ssl/default/mySplunkForwarderCertificate.pem
sslPassword = (FWD証明書作成時に指定したパスワード)

[tcpout-server://192.168.246.185:9997]
------------------------------------------------

②server.confの追記
# vi $SPLUNK_HOME/etc/apps/100_ssl/default/server.conf
------------------------------------------------
[sslConfig]
caCertFile = myCACertificate.pem
caPath = $SPLUNK_HOME/etc/apps/100_ssl/default
------------------------------------------------

③テストでwindowsセキュリティイベントが取れるか確認(inputs.confの設定)
------------------------------------------------
[WinEventLog://Security]
disabled = 0
------------------------------------------------

④設定の反映
# splunk restart

動作確認

①sslがtrueになっていることを確認

②FWDのsplundログにSSL設定の有効化メッセージが出ていることを確認

③収集対象のログも取得出来ていることを確認

まとめ

  • まずはデフォルト証明書で試す。成功した場合、configの設定方法は問題ないことが分かる
  • 次に自己証明書で試す。成功した場合、証明書が正確に作成できており、必要な場所に配置できていることが分かる。
  • やや混乱しますが、Windowsに配置するFWDのconfig内に記載するパス指定で、「\, ¥」を使ったほうがいいのかと思っていましたが、↑の例のようにlinuxでも使える「/」をつかって記載してもWindowsで正常に認識されます

はまったポイント

証明書のパス記載ミス/アクセス権のミス?

  • FWDに配置した証明書へのアクセス権がない/またはパスの記載が間違っている

  • 私はTroubleshootingを見ながら、FWD上で以下コマンドopenssl s_client -connect {server}:{port}を試した際に以下Windowsのメッセージが出たため、一度FWD自体を再インストールし直しました。結果、opensslコマンドを実行できたので、ファイルアクセス権の問題?と一旦理解して終えました。

outputs.confをDSから配る際の注意点

最初からsslPassword=$7$ndko3cuCHLRLd/6WMv0kV4P2ryc6+aTlHRBKDOERU1qN2uLW1/SCPA==
とhash化されたままFWDに配ると、復号できず以下エラーで失敗するので注意。

splunkdに出るerror
ERROR AesGcm - error:00000000:lib(0):func(0):reason(0)
ERROR AesGcm - AES-GCM Decryption failed!
ERROR Crypto - Decryption operation failed: AES-GCM Decryption failed!
WARN  ConfigEncryptor - Decryption operation failed: AES-GCM Decryption failed!

参考情報

Should I include indexer's 3rd party cert AND private key in forwarder configuration

About configuration in forwarding by using SSL.

How do I set up SSL forwarding with new, self-signed certificates and authentication?

Community:Splunk2Splunk SSL DefaultCerts