お金をかけずにサーバーの勉強をしよう

WindowsのログをLinuxサーバーに集約

2023年2月19日

メニューへ戻る

余りニーズがあるようには思えませんが、Windows Server 2022 のイベントログを Ubuntu Server 22.04 に転送する構成を作ってみます。

Windowsサーバーに限らず、複数のサーバーがあってそのログを見なければいけない仕事で、複数のサーバーに一々ログインして見ていくのは面倒なので、一箇所に纏めてしまえば手間が減るという寸法です。

fluentdなど高機能なものも存在しますが、ここではなるべくOSにある機能を使う、インストールするものをなるべく減らす、そういう観点で、以下の構成でやってみます。

rsyslogは、Linux OS内で発生するログを集約してテキストファイルに出力しています。

rsyslogの仕組みについては、さくらインターネットのブログに分かりやすく書かれていて、昔お世話になりました。
多機能なログ管理システム「rsyslog」の基本的な設定

ただこれでも難しいので以下の絵で。
さくらのブログにも似た絵があったと思います。

rsyslogは大まかに 3つの機能に分かれているというのはこういうことです。
入力方法(機能1)にいくつものものが用意されていて、入力されたものを編集(機能2)し、出力方法(機能3)にもいくつものものが用意されています。

これらを好きに組み合わせて、入ってきたデータ(ログ)を編集してから出してやることができます。
rsyslogの仕組み 1

rsyslogは OSインストール直後はこんな組み合わせで、あるプログラム(journald)からの出力を拾って、[/var/log/syslog]ファイルに書き出しています。
rsyslogの仕組み 2

ところで、syslogというのは RFC5424 で定義されていまして、基本的には 1件のログが 1行のテキストであると考えて下さい。
syslogの書式は「6. Syslog Message Format」に定義されていますので、詳しく知りたい方は読んでみて下さい。

とりあえずは、日時とホスト名とログ自体、が入ってる 1行くらいに捉えておけば良かろうと思います。

Windowsサーバーには、NXLogというツールをインストールします。
これはアメリカ製の Windows版 rsyslogのようなものです。
NXLog

NXLogには有償の Enterprise Edition と無償で使える Community Edition がありますので、Community Edition をインストールします。

ダウンロードはこちら
Download

こちらに各OS用のインストールファイルが並んでいますので、Windows用で最新のバージョンを入手しましょう。
2022年6月10日時点では [nxlog-ce-3.0.2284.msi] が最新のものでした。

入手したファイルは Windows Server 2022にコピーしておいて下さい。


まず受け側の rsyslogの方(Ubuntu Server 22.04)から作っていきます。
rsyslogは LinuxOS自体が使っていて、Ubuntuを始めほとんどのディストリビューションで起動時から動いていると思います。

次のファイルが、rsyslogの設定ファイル [/etc/rsyslog.conf] です。
デフォルトではネットワークからのデータ受信をするようになっていないので、[514/udp] で待ち受けるようにするため、ピンク色の箇所のコメントアウトを解除(#を取る)します。

# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf


#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
#module(load="immark")  # provides --MARK-- message capability

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
  ↓
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")

# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")

###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# Filter duplicated messages
$RepeatedMsgReduction on

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

rsyslogを再起動します。

subro@Ubuntu2204:~$ sudo systemctl restart rsyslog

これで rsyslog側は OKです。

Windows Server 2022の設定に入ります。

Windows Server 2022のインストールについては「Windows Server 2022 インストール」に書いています。

Window Server 2022には Administratorでログオンします。

先程ダウンロードしてコピーしておいた [nxlog-ce-3.0.2284.msi] をダブルクリックして実行します。

Nextを押します。
NXLog Community Edition インストール 1

[I accept the terms in the Licnese Agreement] にチェックを入れ、Nextを押します。
NXLog Community Edition インストール 2

Nextを押します、
NXLog Community Edition インストール 3

Installを押します。
NXLog Community Edition インストール 4

Finishを押します。
NXLog Community Edition インストール 5

インストールできました。

NXLogの設定ファイルは [C:¥Program Files¥nxlog¥conf¥nxlog.conf] です。
これを以下のように書き換えます。
海外のサイトからパクったものですがオリジナルがどこだったか忘れてしまいました。

黄色の所が イベントログに関する記述で、昔の Windowsからあった Application/Security/System の各イベントログが対象になっていますが、他のイベントログも対象にすることができます。
ピンク色の所が Ubuntu Server の rsyslogへネットワーク経由で転送する部分です。

Panic Soft
#NoFreeOnExit TRUE

define ROOT     C:\Program Files\nxlog
define CERTDIR  %ROOT%\cert
define CONFDIR  %ROOT%\conf
define LOGDIR   %ROOT%\data
define LOGFILE  %LOGDIR%\nxlog.log
LogFile %LOGFILE%

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

# Include fileop while debugging, also enable in the output module below
#<Extension fileop>
# Module xm_fileop
#</Extension>

<Extension json>
  Module xm_json
</Extension>

<Extension syslog>
  Module xm_syslog
</Extension>

<Input internal>
  Module im_internal
  Exec $Message = to_json();
</Input>

# Windows Event Log
<Input eventlog>
  # Uncomment im_msvistalog for Windows Vista/2008 and later
  Module im_msvistalog
  Query <QueryList>\
    <Query Id="0">\
      <Select Path="Application">*[System[(Level=1 or Level=2 or Level=3)]]</Select>\
      <Select Path="System">*[System[(Level=1 or Level=2 or Level=3)]]</Select>\
      <Select Path="Security">*[System[(Level=1 or Level=2 or Level=3)]]</Select>\
    </Query>\
  </QueryList>

  #Uncomment im_mseventlog for Windows XP/2000/2003
  #Module im_mseventlog
  Exec $Message = to_json();
</Input>

<Processor buffer>
  Module pm_buffer
  # 100Mb disk buffer
  MaxSize 102400
  Type disk
</Processor>

<Output out>
  Module om_udp
  Host 192.168.1.150
  Port 514

  Exec to_syslog_ietf();
  Exec $raw_event =~ s/(\[.*])//g; $raw_event = replace($raw_event, '{', '[tag="windows"] {', 1);

  #Use the following line for debugging (uncomment the fileop extension above as well)
  #Exec file_write("C:\\Program Files\\nxlog\\data\\nxlog_output.log", $raw_event);
</Output>

<Route 1>
  Path internal, eventlog => buffer => out
</Route>

[nxlog]サービスを再起動します。
コマンドプロンプトで以下を実行します。

C:\Users\Administrator>sc stop nxlog

SERVICE_NAME: nxlog
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

C:\Users\Administrator>sc start nxlog

SERVICE_NAME: nxlog
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 2  START_PENDING
                                (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x7d0
        PID                : 4140
        FLAGS              :

再起動しました。

この結果、Windows Server側の NXLogと Ubuntu Server側の rsyslogの関係はこんな感じになります。
rsyslogの仕組み 3

この結果出てきた /var/log/syslogの例がこちら。

Jun 12 11:45:25 ubuntuserver2204 kernel: [ 2339.805863] perf: interrupt took too long (5729 > 5408), lowering kernel.perf_event_max_sample_rate to 34750
Jun 12 11:47:54 Win2022 nxlog-ce[4140] [tag="windows"] {"EventTime":"2022-06-12 11:47:54","Hostname":"Win2022","SeverityValue":2,"Severity":"INFO","SourceName":"nxlog-ce","ProcessID":4140,"Message":"nxlog-ce-3.0.2284 started","EventReceivedTime":"2022-06-12 11:47:54","SourceModuleName":"internal","SourceModuleType":"im_internal"}

1行目は Ubuntu Server 22.04のカーネルメッセージで Windowsのものではありませんが、これも rsyslogを経由して出てきたものです。。

2行目が Windows Server 2022の SYSTEMイベントログで、NXLogが syslogフォーマット(かつメッセージ部分を JSONにしている)にしてネットワーク越しに転送してきたものです。

Windows Serverのイベントログファイルはツリー構造のデータを持つバイナリファイルですが、テキスト化・JSON化・syslogフォーマット化を NXLogで行い、UDPで Ubuntu Server 22.04の IPである [192.168.1.150] へ送信しています。

この例では、Ubuntu Server 22.04の rsyslogの出力先はデフォルトの [/var/log/syslog] のままにしているので、Ubuntu Server 22.04のログも、Windows 2022のイベントログも一緒になってしまっていますが、rsyslogの設定でマシン名毎に別ファイルにすることもできます。


rsyslog・NXLogともに便利な機能を多く持っており、また入力元/出力先とも色々なものと連携することができます。
NXLogについては、英語ですがドキュメントが充実しているのでそちらを参照されると良いと思います。

NXLog Documentation

Windowsイベントログを syslog形式にして、Linuxの rsyslogに集約しようと思ったのは、Windowsサーバーと Linuxサーバーが混在している環境で、一元的なログ管理やログ監視をしたかったからです。

今回は Windows → Linux への集約で設計してみましたが、NXlogがあれば逆のパターンも行けそうです。


問題は Windowsイベントログがバイナリ形式の構造化ログであり、Linuxの syslogが 1行のテキストログであるということです。

この表現方法の異なるログをどう一元管理するかを説明した例が余り無く、鉄板的な方法論も確立していないと思われ、個々の運用エンジニアの力量に任せられているところなので工夫のし甲斐があるのですが、難しい所とも言えますね。

ワタクシ個人的には、ここで書いた方法が好きです。


rsyslogの本はこれだけ。なくならない内にゲットしないと。