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

はじめに
---
- Fowarderからデータ転送する通信をセキュアに（データ転送をSSL暗号）
- 圧縮してトラフィック負荷を軽減（転送データを1/8程度に圧縮）
- Splunk社の[デフォルト証明書を使う](https://docs.splunk.com/Documentation/Splunk/8.0.3/Security/ConfigureSplunkforwardingtousethedefaultcertificate)よりも、自己証明書でもっとセキュアにしたい
    - ※デフォルト証明書は3年でExpireします。期限が切れた場合、インデクサーとのSSLコネクションを作ることができずにログ転送が失敗する仕様なので注意。
- セットアップのおすすめ方法は先にSplunk社の[デフォルト証明書を使う](https://docs.splunk.com/Documentation/Splunk/8.0.3/Security/ConfigureSplunkforwardingtousethedefaultcertificate)を使って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
```

自己証明書を用意するパターン
---
#### 検証構成イメージ
<img width="1321" alt="スクリーンショット 2020-05-09 11.35.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/d90f0d30-3a01-c966-c1d2-64321e557041.png">


- FWDとIDX間のSSL暗号は事前に秘密鍵をFWDとIDXで共有して暗号/復号処理を行う**共通鍵暗号方式**を元にしたデータ転送


- 参考元の本家ドキュメントは以下
    - 手順①：自己証明書の作成方法
        - https://docs.splunk.com/Documentation/Splunk/8.0.3/Security/Howtoself-signcertificates

    - 手順②：証明書をIDXとFWDに設定する方法
        - https://docs.splunk.com/Documentation/Splunk/8.0.3/Security/ConfigureSplunkforwardingtousesignedcertificates


## 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

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

②これまで作成した鍵をまとめて１つの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
```

動作確認
---
- Validationは以下ドキュメントを参考
    - https://docs.splunk.com/Documentation/Splunk/8.0.3/Security/Validateyourconfiguration


**①sslがtrueになっていることを確認**
![スクリーンショット 2020-05-09 9.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/2f7fef59-fb01-101d-c5c8-6d85a860106f.png)

**②FWDのsplundログにSSL設定の有効化メッセージが出ていることを確認**
![スクリーンショット 2020-05-09 20.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/72f8130c-c712-dd4b-8162-f6af4532a9fd.png)


**③収集対象のログも取得出来ていることを確認**
![スクリーンショット 2020-05-09 10.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/f1389386-0105-265f-0150-10aa61e8105f.png)


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

はまったポイント
---

#### 証明書のパス記載ミス/アクセス権のミス？
- FWDに配置した証明書へのアクセス権がない/またはパスの記載が間違っている
![スクリーンショット 2020-05-09 10.25.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/24ed5ea2-366e-3290-f7a0-ebc823bf5afa.png)

- 私は[Troubleshooting](https://docs.splunk.com/Documentation/Splunk/8.0.3/Security/Troubleshootyouforwardertoindexerauthentication)を見ながら、FWD上で以下コマンド`openssl s_client -connect {server}:{port}`を試した際に以下Windowsのメッセージが出たため、一度**FWD自体を再インストール**し直しました。結果、opensslコマンドを実行できたので、ファイルアクセス権の問題？と一旦理解して終えました。

![スクリーンショット 2020-05-09 10.52.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/bb0c7c3c-47b7-53d2-2ff5-344a0cd3fca7.png)


#### 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](https://answers.splunk.com/answers/34901/should-i-include-indexers-3rd-party-cert-and-private-key-in-forwarder-configuration.html)

[About configuration in forwarding by using SSL.
](https://answers.splunk.com/answers/754875/about-configuration-in-forwarding-by-using-ssl.html)

[How do I set up SSL forwarding with new, self-signed certificates and authentication?
](https://answers.splunk.com/answers/7164/how-do-i-set-up-ssl-forwarding-with-new-self-signed-certificates-and-authentication.html)

[Community:Splunk2Splunk SSL DefaultCerts
](https://wiki.splunk.com/Community:Splunk2Splunk_SSL_DefaultCerts)