【Proxmox】Graylog(syslog)サーバーの構築

Linux

Linuxは標準でsyslogサーバー機能を持っているのですが、Webインタフェースがないためログ監視を行う上では非効率です。

Windows Server用のKIWI Syslogなども市販されているのですが、さすがに中小企業が導入できる金額ではありません。

そこで、Webインタフェースを有するOSSであるGraylogを新たに構築して運用することにしました。

環境

今回は超絶便利な仮想サーバーProxmox VE8上にGraylogを構築しました。

OSはRockyLinux9を使いました。(AlmaLinux9でも同様に構築できると思います)

Red Hat系はportリダイレクト設定が容易ですので、このような単機能サーバーにはおすすめです。

Debian系(ubuntu20.04/22.04)も構築サポートされるようになりましたが、portリダイレクト設定が少々面倒のため、今回は見送りさせていただきました。

  • 仮想サーバ:Proxmox VE 8
  • OS: RockyLinux9
  • RAM: 4G
  • Storage: 100G
  • 構成:シングルノード

本記事の記載時点でのGraylog内モジュールバージョンは以下の通りです。

  • mongodb: 7.0.21
  • graylog-datanode:6.2.4-1
  • graylog-server:6.2.4-1

準備作業

Proxmox上の構築時の注意点

今回はProxmox上でRockyLinux9を構築しましたが重要な注意点があります。

graylogが用いるデータベース「mongodb」は、まだ仮想化環境に対応していないため、Proxmox上のハードウェアCPU種別は"host"に設定する必要があります。

デフォルトの"x86-64-v2-AES"で構築してしまうとmongodbがコアダンプして動きません。

SELinuxを無効化

graylogはイントラ内での動作をしますので、SELinuxはDisableにしておきます。

/etc/selinux/config ファイルを開き、SELINUX=enforcing を SELINUX=disabled に変更してファイルを保存、再起動します。

[root@falcon]# nano /etc/selinux/config
SELINUX=disabled  ←編集する
[root@falcon]# reboot

~再起動後~
[root@falcon]# sestatus
SELinux status:                 disabled

OSをupdate

graylog構築前にOSをアップデートしておき、完了したらもう一度再起動します。

# yum update

~update完了後~
# reboot
または
# shutdown -r now

Firewallはportリダイレクト機能で使いますので、デフォルトの有効化状態のままにしておきます。

インストール作業

インストール方法は公式に詳しく記載されていますが、graylogの初期設定と動作確認のやり方がわからず詰まってしまったので、本記事は初期設定から動作確認まで記載することにしました。

graylogは、graylog本体の他にデータベース(mongodb)、検索エンジン(opensearch)を使用します。

以前のバージョンでは、opensearchを個別にインストールする必要がありましたが、現在はgraylog-datanodeに統合されたため、インストール作業はかなり楽になりました。

mongodbのインストール

timezoneをAsia/Tokyoに設定します。

$ sudo timedatectl set-timezone Asia/Tokyo

mongodbは標準リポジトリにないため追加します。

# nano /etc/yum.repos.d/mongodb-org-7.0.repo

~ファイル内に以下を記載~
[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/9/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://pgp.mongodb.com/server-7.0.asc

リポジトリを有効化し、mongodbをインストールします。

# yum update
# yum install mongodb-org

graylogはmongodbのバージョン依存があるため、versionlockをインストールしてmongodbのバージョンをロックします。

# yum install python3-dnf-plugin-versionlock
# yum versionlock add mongodb-org

mongodbのコンフィグを編集します。

# nano /etc/mongod.conf

~以下編集・追記~
net:
  port: 27017
  bindIpAll: true

mongodbを起動します。

# systemctl daemon-reload
# systemctl enable mongod.service
# systemctl start mongod.service

mongodbのバージョンを確認します。

# mongod --version
db version v7.0.21
Build Info: {
    "version": "7.0.21",
    "gitVersion": "a47b62aff2bae1914085c3ef1d90fc099acf000c",
    "openSSLVersion": "OpenSSL 3.2.2 4 Jun 2024",
    "modules": [],
    "allocator": "tcmalloc",
    "environment": {
        "distmod": "rhel90",
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}

mongodbがcore dumpとなる場合は、proxmoxのCPU設定が間違っています。

一度ゲストOSをシャットダウンし、proxmoxのハードウェア構成を修正してください。

graylog-datanodeのインストール

次に検索エンジンであるgraylog-datanodeをインストールします。

こちらも標準リポジトリにないため、リポジトリを追加してからインストールします。

datanodeは約1.0Gbyteあるため、ダウンロードには少々時間がかかります。

# rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-6.2-repository_latest.rpm
# yum install graylog-datanode

max_map_countを262144にします。

# echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.d/99-graylog-datanode.conf
# sysctl --system

# cat /proc/sys/vm/max_map_count
262144

datanode.confに記載する固有鍵を生成します。

# openssl rand -hex 32
c9c69e582a11c7a9137aca82ff19a87d4907366e3c363bda70125571c6502b34 →これが生成された鍵

datanodeのコンフィギュレーションをするため、datanode.confに各値を追加します。

#nano /etc/graylog/datanode/datanode.conf

~以下を追記~
#56行目 生成したhashパスワード追加
password_secret = c9c69e582a11c7a9137aca82ff19a87d4907366e3c363bda70125571c6502b34

#71行目 デフォルトのままで可
mongodb_uri = mongodb://localhost/graylog

#最終行に追加
opensearch_heap = 2g

graylog-datanodeを起動します。

# systemctl daemon-reload
# systemctl enable graylog-datanode.service
# systemctl start graylog-datanode

graylog-serverのインストール

最後にgraylog-serverをインストールします。

こちらもリポジトリ追加からの作業となります。

# rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-6.2-repository_latest.rpm
# yum install graylog-server

root_password_sha2に記載する鍵(hash値)を生成します。

# echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
Enter Password: hogehoge-pw
ed689236f34e940d467e4030558b0dff1d398f2c540b25a9bd6acba0a5ce121f →これがhash化された鍵

graylog-serverのコンフィギュレーションをするため、server.confに各値を追加します。

534行目のmessage_journal_max_sizeは、到来syslogのボリュームから決める必要がありますが、システムのディスクサイズを超えないように設定してください。

間違うとgraylog-datanodeの初期設定(プロビジョニング)でopensearchが起動できない状態で設定されてしまい、やり直し方法がわからないことから、OSから再インストールすることになります。

sudo nano /etc/graylog/server/server.conf

#57行目 hashパスワード追加
password_secret = c9c69e582a11c7a9137aca82ff19a87d4907366e3c363bda70125571c6502b34

#68行目 hash sha3パスワード追加
root_password_sha2 = ed689236f34e940d467e4030558b0dff1d398f2c540b25a9bd6acba0a5ce121f

#76行目 日本にする
root_timezone = Asia/Tokyo

#106行目 場所制限なしアクセス
http_bind_address = 0.0.0.0:9000

#534行目 #コメントアウト外す
message_journal_max_age = 12h
message_journal_max_size = 5gb

graylog-server.confを編集し、システムメモリサイズを設定します。

# nano /etc/sysconfig/graylog-server

#6行目 メモリサイズを変更(システムメモリの半分に設定)
GRAYLOG_SERVER_JAVA_OPTS="-Xms2g -Xmx2g -server -XX:+UseG1GC -XX:-OmitStackTraceInFastThrow"

graylog-serverを起動します。

# systemctl daemon-reload
# systemctl enable graylog-server.service
# systemctl start graylog-server.service

firewallの設定

graylogのwebアクセスポートの穴あけをします。

# firewall-cmd --add-port=9000/tcp --permanent
# firewall-cmd --reload

syslogは514ポートで受信するため、こちらもアクセス許可します。

また1000番未満のポートは、root権限でしか扱えないため1514ポートにリダイレクトします。

# firewall-cmd --add-port=514/udp
# firewall-cmd --add-port=514/tcp
# firewall-cmd --add-port=1514/tcp
# firewall-cmd --add-port=1514/udp
# firewall-cmd --add-forward-port=port=514:proto=tcp:toport=1514
# firewall-cmd --add-forward-port=port=514:proto=udp:toport=1514
# firewall-cmd --runtime-to-permanent

firewallの設定状態を確認します。

9000, 514, 1514の穴あけ、514->1514へのリダイレクトできていることを確認します。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens18
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 9000/tcp 514/udp 514/tcp 1514/tcp 1514/udp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
        port=514:proto=tcp:toport=1514:toaddr=
        port=514:proto=udp:toport=1514:toaddr=
  source-ports:
  icmp-blocks:
  rich rules:

graylog起動と初期設定

いよいよ起動ですが、graylogの初回起動はdata-nodeの初期設定があります。

graylog-datanodeの初期設定

初回ログイン用のパスワードを確認します。

# tail /var/log/graylog-server/server.log

========================================================================================================

It seems you are starting Graylog for the first time. To set up a fresh install, a setup interface has
been started. You must log in to it to perform the initial configuration and continue.

Initial configuration is accessible at 0.0.0.0:9000, with username 'admin' and password 'AFnmIhUKwR'.
Try clicking on http://admin:AFnmIhUKwR@0.0.0.0:9000

========================================================================================================

別PCからWebシステムにアクセスします。

URL表記は、http://192.168.0.107:9000 のようになります。

初回パスワードはserver.logに記載されているものを入力します。

datanodeの初期設定画面に遷移できたら、Create CAをクリック。

graylogはほぼノーメンテで動かすので、CAは10年に設定(長すぎ??)。

CA生成完了後、resume startupをクリックするとdatanodeの初期設定は完了。

datanodeの初期設定が完了すると、ようやくgraylogに接続できるようになります!

次回からのパスワードは以下になります。

  • ID: admin
  • PW: (root_password_sha2に設定したパスワード)

データインポート設定

起動しただけではgraylogは何もしませんので、inputsを定義してsyslog受信を行うように設定します。

System -> Inputsを選択します。

プルダウンからRaw/Plaintext UDPを選択し、Launch new inputをクリックします。

Grobalにチェックし、各種設定値を入力します。

  • Global : チェックする
  • Bind address:0.0.0.0 (サーバーにアクセスできる全ネットワーク)
  • Port:1514
  • 他はデフォルト値

setup inputをクリックして、データストリームの定義をします。

ここではNextをクリックするだけでした。

Launch input Diagnosisをクリックします。

ステータスが[1 Running」に変われば受信状態に遷移できています。

Searchタブをクリックすると受信できていることが確認できます。

簡単な使い方

Search→検索時間と検索キーワードをいれると、opensearchが該当ログを抽出してくれます。

graylogはopensearchのデータベースから全文検索をするため、本当に秒で検索結果がでてきます

graylogを構築してしまうとlinux標準のsyslogサーバーには戻れません。

syslog送信側の設定例

graylogにsyslogを送信するためには、各スイッチ、サーバー側の送信設定が必要です。

L2スイッチのsyslog送信設定

Aruba L2スイッチ(2530シリーズ)のsyslog送信設定です。

宛先サーバーは192.168.10.107にした場合です。

L2スイッチ(aruba 2530)の場合
(config)# logging 192.168.10.107
(config)# logging severity info

L2スイッチは電断するとsyslogが消えますので、送信レベルはinfoにしておくようにします。

Linux(ubuntu)のsyslog送信設定

ubuntuはrsyslogに送信先を記載します。

以下は、ログイン、ログアウト情報のみを送信する場合になります。

# nano /etc/rsyslog.d/50-default.conf

~以下追記~
auth,authpriv.*  @192.168.10.107:514
# systemctl restart rsyslog

auth,authpriv.*を *.*に変えると、自マシンのsyslogデータと同じものがgraylogに送信されることになります。

rsyslogの設定とリスタート後は、送信側から任意の文字列を送ることも可能です。

$ logging "test-data"

Windowsのsyslog送信設定

Windows Server/11/10の場合は、nxlogというソフトを使ってwindowsイベントログをsyslogサーバーに送信する形が手っ取り早いです。

nxlogはここからダウンロードでき、コミュニティエディションはほぼフリーソフト的な扱いで使えます。

msiファイルのダブルクリックでインストーラが起動します。

「C:\Program Files\nxlog\conf」フォルダ内にある「nxlog.conf」を編集します。

以下はnxlog.confの設定例です。

define ROOT     C:\Program Files\nxlog
define LOGFILE  %ROOT%\data\nxlog.log

Moduledir %ROOT%\modules
CacheDir  %ROOT%\data
Pidfile   %ROOT%\data\nxlog.pid
SpoolDir  %ROOT%\data
LogFile   %LOGFILE%

<Extension _syslog>
   Module xm_syslog
</Extension>

#<Extension charconv>
#Module xm_charconv
#AutodetectCharsets shift_jis, utf-8
#</Extension>

#<Extension json>
#Module xm_json
#</Extension>

<Input in>
    Module im_msvistalog
    Query <QueryList><Query Id="0"><Select Path="Security">*[System[(EventID=4625 or EventID=4648 or EventID=4634 or EventID=4647 or EventID=4778 or EventID=4779)]]</Select></Query></QueryList>
</Input>

<Output out>
    Module om_udp
    Host 192.168.10.107
    Port 514
    Exec to_syslog_bsd();
</Output>

<Route 1>
    Path in => out
</Route>

設定が完了したら、WindowsマークからWindows PowerShell(管理者)を起動し、nxlog.confの設定を有効化します。

PS C:\WINDOWS\system32> net stop nxlog

nxlog サービスは正常に停止されました。

PS C:\WINDOWS\system32> net start nxlog
nxlog サービスを開始します.
nxlog サービスは正常に開始されました。

nxlogは多彩な設定ができますが、また別の機会に記事にしたいと思います。