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は多彩な設定ができますが、また別の機会に記事にしたいと思います。