【Splunk】物理サーバーからDockerコンテナ環境への移行

純粋な物理サーバー（という呼称が正しいかは謎ですが？）で運用していたSplunkサーバーを、Dockerコンテナ環境に移行します。
※本記事で示す手順は、筆者が定めた最低限の可動要件を満たす設定と動作確認のみを目的として、自身の備忘用のレベルで記しています。運用性やセキュリティ上の細かな考慮等は省いている場合があります。もし各手順を試される場合には自己責任でお願いいたします。

# Splunk環境の概況

Splunkサーバーの概況としては、主に自宅システムのログ分析用に利用しています。簡単なシステム概要は次の通りです。
- 設置場所：自宅サーバー室（キッチン裏のパントリー）
- 主な用途：一家に一台のSIEM？として、自宅機器のログ収集＆分析を実施（Firewallログなど）
- 稼働開始時期：2016年8月くらい～（長期外出時は、不定期に停電することもあった）

<div align="center">
<img width="500" alt="Splunk" title="Splunk外観" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/fc52f3ef-5984-73a9-f8be-9c5ca7a9d9df.png">
</div>

移行元・先の環境は下表のとおりです。ここ10数年くらいは、たまに売り出されている格安サーバーを乗り換えながら、自宅システムを構築・運用しています。時流的に、そろそろクラウド化した方が良いかとも考えていますが、なんとなく自宅くらいはオンプレ環境を触り続けたいという謎の気持ちもあります。（仕事上では、もう完全にクラウド環境だけを取り扱っているという背景もあるかも）

|項目|筐体|OS|Docker|Splunk|備考|
|---|---|---|---|---|---|
|移行元|HP ProLiant ML115 G1|CentOS release 6.10 (Final)|n/a|バージョン：8.2.5(※移行前にバージョンは揃えた)|筐体が古すぎて電源が壊れたことが、移行の動機|
|移行先|FUJITSU PRIMERGY TX1310 M1|CentOS Linux release 7.9.2009 (Core)|Docker version 20.10.13, build a224086|バージョン：8.2.5|Splunkとは直接関係ないが、GPU関連の簡単な処理も行えるように「GeForce GT 710」を搭載している|

# Dockerコンテナ環境への移行手順
移行元となる物理サーバーと、移行先のDockerコンテナ環境での主な手順を記します。尚、移行時に指定が必要となる各種パラメーターやオプションは、ご利用の環境によって異なるものですので、適宜読み替えを行ってください。
## 移行元（物理サーバー）での作業
移行元では、移行先で必要になるであろう各種設定・データの移行準備を行います。
### 移行用設定・データの準備
念のためSplunkを停止させて、設定関連のファイルを固め、移行先のサーバー（IPアドレス：yyy.yyy.yyy.yyy）に転送します。
```
# /opt/splunk/bin/splunk stop
# tar cvzpf /tmp/_opt_splunk_etc_<yyyymmdd>.tar.gz /opt/splunk/etc/
# scp /tmp/_opt_splunk_etc_<yyyymmdd>.tar.gz <sshuser>@<yyy.yyy.yyy.yyy>:/tmp/
```
## 移行先（Docker環境）での作業
移行先の環境について、インフラとしてのDocker環境は構築済みの状態を前提とし、Splunkのインストールに関する手順から開始します。
### インデックスデータ転送（ホストOS上）
移行元のサーバー（IPアドレス：xxx.xxx.xxx.xxx）にあるSplunkでの取集データそのものであるインデックスデータは、rsyncで気長にデータ移行を行います。
※移行にどのくらい時間がかかるかは、収集済みのデータ量に依存し環境によると思いますが、筆者環境では一晩流しっぱなしくらいのイメージでした。（計測はしていないので詳しい時間は不明です）
```
# rsync -av -e ssh <sshuser>@<xxx.xxx.xxx.xxx>:/opt/splunk/var/lib/splunk/ /<移行先サーバーの任意のディレクトリ>/
```
### Splunkインストール（ホストOS上）
[公式手順](https://splunk.github.io/docker-splunk/SETUP.html#install "install")を参考に、SplunkのDockerイメージをpullしておきます。
```
# docker pull splunk/splunk:latest
# docker images
REPOSITORY      TAG                         IMAGE ID       CREATED       SIZE
splunk/splunk   latest                      c23a898db688   10 days ago   2.03GB
```
### Splunkデプロイ（ホストOS上）
デプロイも、[公式手順](https://splunk.github.io/docker-splunk/SETUP.html#deploy "デプロイ")を参考に実施します。指定するオプションは、環境によって読み替えてください。
```
# docker run -p 20022:22 -p 8000:8000 -p 8089:8089 -p 9997:9997 -p 514:514/udp -p 514:514 -e "SPLUNK_PASSWORD=<xxxxxxxxxxxx>" \
             -e "SPLUNK_START_ARGS=--accept-license" \
             --runtime=nvidia \
             -v <ホストOS上のディレクトリ>:<コンテナ内のマウントポイント> \
             -i -t -d --name="splk01" splunk/splunk:latest
```
### コンテナ内でのシステム設定（コンテナ内）
Splunkのコンテナが起動出来たら、コンテナ内にログインを行い、これからもろもろの変更を加えるであろうSplunkのサービスを停止しておきます。
```
$ sudo /opt/splunk/bin/splunk stop
```
Splunkそのものの設定ではないですが、システム上のタイムゾーン設定をJapanに変更します。
```
$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime
```

### インデックスデータ用ディレクトリの変更（コンテナ内）
本環境では、新サーバーでのディスク構成の都合上、Splunkのインデックスデータ用ディレクトリの配置は変えています。ディレクトリ変更を行わない場合は、本手順はスキップしてください。実施手順は、少し古いですが[マクニカ社のFAQ](https://www.macnica.co.jp/business/security/manufacturers/splunk/faq/techfaq_7388.html "パス変更")などを参考にしました。
インデックスデータが配置されるディレクトリを変更するために、念のため編集予定の設定ファイル（splunk-launch.conf）のバックアップを取得します。
```
$ sudo cp -p /opt/splunk/etc/splunk-launch.conf /opt/splunk/etc/splunk-launch.conf_ORG
```
splunk-launch.confファイルを編集します。
```
$ sudo vi /opt/splunk/etc/splunk-launch.conf
```
```bash:splunk-launch.conf
・・中略・・
# SPLUNK_DB=/opt/splunk-home/var/lib/splunk　←デフォルトのインデックス用のディレクトリはコメント
SPLUNK_DB=/<インデックスデータ用のディレクトリ>/　←新しいインデックスデータ用のディレクトリを指定
・・中略・・
```

インデックスデータ用のディレクトリのオーナーを設定します。
```
$ sudo chown -R splunk:splunk /<インデックスデータ用のディレクトリ>/
```
### 設定ファイル類の移行（コンテナ内）
ホストOS上に転送済みの設定ファイル類をコンテナ内にコピーしておき、コンテナ上でアーカイブを展開します。
```
$ tar xvzf /tmp/_opt_splunk_etc_<yyyymmdd>.tar.gz
```
Splunkインストール時に配置されているデフォルトのappsディレクトリを退避（又は削除）し、移行元から持ってきたappsディレクトリに置き換えます。
```
$ sudo mv /opt/splunk/etc/apps /opt/splunk/etc/apps_ORG
$ sudo cp -rfp /tmp/opt/splunk/etc/apps /opt/splunk/etc/
```
ユーザーデータについては、必要に応じて移行します。ここでは、デフォルトのadminディレクトリを退避（又は削除）し、移行元から持ってきたadminディレクトリに置き換えます。
```
$ sudo mv /opt/splunk/etc/users/admin /tmp/_admin_ORG
$ sudo cp -rfp /tmp/opt/splunk/etc/users/admin /opt/splunk/etc/users/
$ sudo chown -R splunk:splunk /opt/splunk/etc/users/admin
```
一通り、設定とデータの移行が完了したらSplunkを起動します。
```
$ sudo /opt/splunk/bin/splunk start
```
### Dockerイメージの保存（ホストOS上）
最後に、Dockerイメージをシステムバックアップ目的で保存しておきます。
```
# docker commit splk01 splunk/splunk:<yyyymmdd>
```
### Splunkの管理画面にアクセスする
Splunkの管理画面（http://<サーバーIP>:8000）にアクセスし、移行した環境が再現されていることを確認する。
※ 旧環境でフリーライセンスでSplunkを利用していた場合など、Splunkの管理画面にアクセスすると、ライセンス切れの案内が出ることがある。その場合は、画面の指示に従って適切なライセンスを選択すること。

# まとめ
今回は、物理サーバー上で稼働していたSplunkをDockerコンテナ環境に移行する方法を記しておきました。
- Splunk環境の概況
- Docker環境でのSplunkの構築
- Splunkの設定とデータの移行

筆者のSplunk環境は、自宅でのFirewallログ解析などが主な用途ですが、機会があればSplunkのダッシュボードで行っていることなども随時ご紹介していくかもしれません。（たぶん）

# 補記（Tips的に）
### 「ダッシュボードのバージョンがありません」への対応
移行後の環境で、Splunkのダッシュボードの編集を行おうとしたところ、「ダッシュボードのバージョンがありません」という注記が表示され、更新作業を行えない事象が確認されました。原因は不明ですが、「ダッシュボードの編集」から「ソース」を選び、ヘッダ部分に"バージョン情報（今回の場合は、version="1.1"）"を追加することで、ダッシュボードの編集が行えるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/1cc4273a-9951-b97c-6141-de31f485be46.png)

- 修正前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/bffe4df8-1c6c-af6e-5b0d-98268b01f724.png)

- 修正後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507379/8b95661c-a8ef-4d23-ed6f-06e8c189553e.png)


# 参考
- [docker-splunk](https://splunk.github.io/docker-splunk/ "docker-splunk")
- [データ保存先フォルダパスの変更方法：マクニカ社 FAQ](https://www.macnica.co.jp/business/security/manufacturers/splunk/faq/techfaq_7388.html "データ保存先フォルダパスの変更方法")
- [Dashboards and Visualizations:Splunk](https://docs.splunk.com/Documentation/Splunk/9.4.0/Viz/DashboardjQuery)