サーバなどのログ調査では、欲しい情報を得るためにいくつものコマンドを組み合わせたり、複数のログファイルを確認しなければならなかったりと手間がかかります。
しかし、SIEM(Security Information and Event Management)を使うことで、これらの手間を軽減することができます。
今回はGraylogというOSS(Open Source Software)を使用して、SIEMサーバを構築していきます。
機器の構成について
Graylogサーバ
OS:AlmaLinux9.2
CPU:2コア
メモリ:4GB
ストレージ:500GB
Pleskサーバ
OS:AlmaLinux8.8
Plesk:Plesk Obsidian 18.0.53.2
構成図
今回の構成では図の通りFW(Firewall)があり、FWで外部からGraylogサーバへのアクセスを制限するため、Graylogサーバ側のセキュリティ機能は無効化しています。
また、PleskサーバからGraylogサーバへのログの転送にはFilebeatを使用します。
Graylogサーバの構築
Graylogのインストールには下記が必要となります。
なお、Graylogのバージョンは5.1です。
- MongoDB 5.x~6.x
- OpenSearch2.xのいずれか(またはElasticsearch 7.10.2)
- OpenJDK 17
Elasticsearchはサポートされるバージョンが7.10.2のみなので、OpenSearchを使用します。
また、OpenJDKについてはGraylog本体に含まれているため、個別にインストールする必要はありません。
これらはGraylogのドキュメントで公開されています。
インストール手順もこちらのドキュメントに沿って進めていきます。
MongoDBインストール
MongoDBのインストール手順は次の通りです。
リポジストリ追加
# vi /etc/yum.repos.d/mongodb-org.repo
—————————————-
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
—————————————-
MongoDBインストール
# dnf -y install mongodb-org
MongoDB起動
# systemctl start mongod
# systemctl enable mongod
MongoDBのインストールは以上です。
OpenSearchインストール
OpenSearchのインストール手順は次の通りです。
リポジストリ追加
# curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/opensearch-2.x.repo -o /etc/yum.repos.d/opensearch-2.x.repo
OpenSearchインストール
# dnf -y install opensearch
続いて、ドキュメントに従い設定変更していきます。
# vi /etc/opensearch/opensearch.yml
—————————————-
↓変更
cluster.name: graylog
node.name: ${HOSTNAME}
network.host: 0.0.0.0
↓追加
discovery.type: single-node
action.auto_create_index: false
plugins.security.disabled: true
—————————————-
jvmのXmsとXmxをシステムメモリの半分に設定
# vi /etc/opensearch/jvm.options
—————————————-
-Xms1g
-Xmx1g
↓変更
-Xms2g
-Xmx2g
—————————————-
RHEL9の場合、/usr/lib/tmpfiles.d/opensearch.confの「/var/run/opensearch」を「/run/opensearch」に変更します。
AlmaLinux9なので、同じように設定します。
# vi /usr/lib/tmpfiles.d/opensearch.conf
—————————————-
d /var/run/opensearch 0755 opensearch opensearch – –
↓変更
d /run/opensearch 0755 opensearch opensearch – –
—————————————-
カーネルパラメータを設定
# sysctl -w vm.max_map_count=262144
# echo ‘vm.max_map_count=262144’ >> /etc/sysctl.conf
OpenSearch起動
# systemctl start opensearch
# systemctl enable opensearch
OpenSearchのインストールは以上です。
Graylogインストール
準備ができたのでGraylog本体をインストールします。
Graylogのインストール手順は次の通りです。
リポジストリ追加
# rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-5.1-repository_latest.rpm
Graylogインストール
# dnf -y install graylog-server
①root_password_sha2生成
# echo -n “Enter Password: ” && head -1 </dev/stdin | tr -d ‘\n’ | sha256sum | cut -d” ” -f1
—————————————-
Enter Password:[パスワード]
—————————————-
②password_secret生成
# < /dev/urandom tr -dc A-Z-a-z-0-9 | head -c${1:-96};echo;
Graylog設定ファイル修正
# vi /etc/raylog/server/server.conf
—————————————-
root_password_sha2 = ①で生成した文字列
password_secret = ②で生成した文字列
root_timezone = Asia/Tokyo
http_bind_address = 0.0.0.0:9000
—————————————-
Graylog起動
# systemctl start graylog-server
# systemctl enable graylog-server
Graylogが起動したら、ブラウザから「http://GraylogサーバのIPアドレス:9000」で接続できます。
デフォルトユーザ名は「admin」、パスワードは①で設定したものになっています。
ログ転送設定
ここまででGraylogをサーバ上で動作させることができるようになりましたが、それだけでは何も起きません。
Graylogに何かしらのログを受信させる必要があります。
ログ受信設定
まずはGraylog側でログの受け入れ態勢を整えておきます。
今回はPleskサーバからFilebeatを使用してGraylogにログを転送するため、それに合わせた設定となります。
「System/Inputs」→「Inputs」を開く
「Select input」→「Beats」を選択
「Title」→任意の名前を設定
「Bind address」→0.0.0.0を設定
「Port」→任意のポート番号を設定(今回は5044)
これでGraylog側のログを受け入れる設定は完了です。
ログ転送設定
ログの転送元となるPleskサーバからはFilebeatを使用して、Graylogサーバにログを転送します。
今回はApacheのログをGraylogに転送します。
まずはFilebeatをインストールします。
GPGキーのインポート
# rpm –import https://artifacts.elastic.co/GPG-KEY-elasticsearch
リポジストリ追加
# vi /etc/yum.repos.d/elastic.repo
————————————–
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
————————————–
Filebeatインストール
# dnf -y install filebeat
続いて、ログの転送設定をしていきます。
# vi /etc/filebeat/filebeat.yml
Elasticsearch Outputセクション
————————————–
#output.elasticsearch: ←コメントアウト
# Array of hosts to connect to.
# hosts: [“localhost:9200”] ←コメントアウト
————————————–
Logstash Outputセクション
————————————–
output.logstash: ←コメントアウト解除
# The Logstash hosts
hosts: [“GraylogサーバのIPアドレス:5044”] ←コメントアウト解除、Graylogサーバを指定
————————————–
ApacheモジュールにPleskのApacheログを設定
# cd /etc/filebeat/module.d
# cp -a apache.yml.disable apache.yml
# vi apache.yml
————————————–
# Module: apache
# Docs: https://www.elastic.co/guide/en/beats/filebeat/8.8/filebeat-module-apache.html
– module: apache
# Access logs
access:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths:
– /var/www/vhosts/system/*/logs/access_log
– /var/www/vhosts/system/*/logs/access_ssl_log
– /var/www/vhosts/system/*/logs/proxy_access_log
– /var/www/vhosts/system/*/logs/proxy_access_ssl_log
# Error logs
error:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths:
– /var/www/vhosts/system/*/logs/error_log
– /var/www/vhosts/system/*/logs/proxy_error_log
————————————–
Filebeat起動
# systemctl start filebeat
# systemctl enable filebeat
これでGraylogにログが転送されるようになります。
GraylogのSearchを開くと、下図のように転送されてきたログが表示されるはずです。
ログから情報を抽出
GraylogでPleskサーバから送られてきたログを見られるようになりましたが、Graylogの本領発揮はこれからです。
Graylogには受信したログの加工や集計、グラフ化などの機能があり、これらを駆使してこそGraylogサーバを構築する意味があります。
例としてExtractorを使用してログから接続元のIPアドレスを抽出して集計してみます。
今回Pleskサーバから送られてきているアクセスログでは、ログの先頭に接続元のIPアドレスがあるので、正規表現でこれを抽出します。
抽出したIPアドレスは「IP_FROM」というフィールドを新しく作って、そちらに格納します。
抽出した「IP_FROM」を集計させると
このように、接続元IPアドレス毎にログに出現している件数を集計することができます。
今回はApacheのログで試しましたが、Apache以外にも多様なログから様々な情報を得ることができます。
まとめ
サーバなどのログ調査はよくある作業ですが、地味に大変な作業でもあります。
利用環境を整えるまでは大変ですが、今回構築したGraylogのようなSIEMがあると、直感的で簡単な操作でログ調査ができるようになったりします。
ただ、実際に80ドメインくらい入っているPleskサーバ1台からApacheのログを受信してみた感じだと、今回のGraylogサーバだとスペック不足な感じがしました。
一方、ログを送信していたPleskサーバ側は、ログ送信にそれほど負荷がかかっているようには見られませんでした。
安定して稼働させるためは、Graylogサーバの方のマシンスペックを十分確保する必要がありそうです。