syslog-ngの導入


ログ情報の管理と不正なサーバへのアクセスを動的に遮断するためSwatchを導入しましたが、その過程でSuSEではsyslog-ngがオプションでサポートされていることが判明しました。syslog-ng(syslog-next generation)は、名前のとおりsyslogに替わる新しいsyslogサーバで、ログの出力先制御やroot以外での実行、更にSwatchのようなログ監視機能などを持っています。
ということで、導入方法を整理してみました。また、RedHat系もRPMがありましたので導入も簡単にできます。

■syslog-ngのインストール

syslog-ngを動かすには、syslog-ng本体とlibolライブラリが必要です。と書きましたが、正確にはビルドするときに必要なだけです。従って、SuSEの場合は、RPMがあるのでsyslog-ngだけYaSTでインストールしてください。RedHat系は検索すればいろいろ見つかりますが、おやじがテストしたのは、こちらにRedHat9/Fedora Core1〜4testでテストされたSRPMがあったので、これをリビルドしました。(参考:RPMなら、こちらにsyslog-nglibolがあります。)

◆SuSEでのインストール

SuSEにはsyslog-ngの RPM があるので、YaST でインストールするだけです。ソースから入れた場合はログローテーションも変更が必要になりますが、SuSEの場合、ログローテーションは起動スクリプトを使ってローテーションしているので自動的にsyslog-ngに切り替わります。

  1. YaST コントロールセンタを起動し、「ソフトウェア」の「ソフトウェアのインストール/削除」を起動する。
  2. 「フィルタ」 を 「検索」 とし検索欄に 「syslog」 と入力し 「検索」 ボタンを押す。
  3. 右側に該当するパッケージが出てくるが、その中の「syslog-ng」にチェックマークを入れて 「了解」 を押しておしまい。

◆RedHat系でのインストール

前述のサイトからsyslog-ngとlibolのSRPMをダウンロードしてきて、RPMの再構築をしてインストールします。ログローテーション関係は、RPMがsyslog-ngに切り替えてくれるので、特に設定不要です。
但し、1点だけ注意が必要なのが、このRPMはインストールの最後の処理で自動的に syslog-ng に切り替わってしまうということです。何もカスタマイズしていないなら問題ないですが、おやじの場合、現状syslogdでルータからのsyslogを受信していますが、syslog-ngのデフォルト設定では受信できないので一時的に停止してしまいます。自分のタイミングで切り替えたいなら、こちらのようにSRPMを展開してspecファイルを書き換えて再構築すれば良いでしょう。

  1. syslog-ngを再コンパイルするにはlibol-develが必要なので、まずlibolの再コンパイルとインストールを行う。(ビルドできたらアンインストールしてもよいが、何かあると面倒なのでそのままでよい。) 再コンパイルするとlibolとlibol-develのRPM(libol-debuginfoも作成されるがインストール不要)が作成されるので、両方とも次の作業前にインストールしておく。

    # cd /usr/src/redhat/SOURCES
    # wget http://gsd.di.uminho.pt/jpo/software/RPMS/libol-0.3.16-1.src.rpm
    # rpmbuild --rebuild libol-0.3.16-1.src.rpm
    # cd ../RPMS/i386
    # rpm -Uvh libol-0.3.16-1.i386.rpm libol-devel-0.3.16-1.i386.rpm

  2. 続けて、syslog-ngを再コンパイルしてインストールを行う。(syslog-ng-debuginfo-1.6.7-2も作成されるがインストール不要)

    # cd ../SOURCES
    # wget http://gsd.di.uminho.pt/jpo/software/RPMS/syslog-ng-1.6.7-2.src.rpm
    # rpmbuild --rebuild syslog-ng-1.6.7-2.src.rpm
    # cd ../RPMS/i386
    # rpm -Uvh syslog-ng-1.6.7-2.i386.rpm

    [自動切換え停止の方法]
    インストール後に、syslog-ngへの自動切換えをしないようにするには、下記のようにspecファイルを編集(赤字の#を追記してコメントアウト)してから再コンパイルする。

    # cd ../SOURCES
    # wget http://gsd.di.uminho.pt/jpo/software/RPMS/syslog-ng-1.6.7-2.src.rpm
    # rpm -Uvh syslog-ng-1.6.7-2.src.rpm
    # cd ../SPECS
    # vi syslog-ng.spec

       (snip)

    %post
    # only rpm -i (not rpm {-U|-F})
    if [ $1 = 1 ]; then
    /sbin/chkconfig syslog off 2> /dev/null || :
    /sbin/chkconfig --add syslog-ng
    #/sbin/service syslog stop 2> /dev/null || :
    #/sbin/service syslog-ng start
    fi

    %preun
    # only rpm -e (not rpm {-U|-F})
    if [ $1 = 0 ]; then
    /sbin/chkconfig syslog reset 2> /dev/null || :
    #/sbin/service syslog-ng stop
    #/sbin/service syslog start 2> /dev/null || :
    /sbin/chkconfig --del syslog-ng
    fi

       (snip)

    [Esc]、[:]、[w]、[q]を押す。

    # rpmbuid -ba syslog-ng.spec
    # cd ../RPMS/i386
    # rpm -Uvh syslog-ng-1.6.7-2.i386.rpm


■syslog-ngの設定

ここでは、syslog-ngを動かすための設定を行います。設定ファイルは、/etc/syslog-ng/syslog-ng.confですが、SuSEの場合は、YaSTで設定を行う部分があります。
SuSEとredHat系では、システムの動かし方が細かいところで異なるため設定もだいぶ異なっていますので、ゼロから設定するのはかなりきつそうです。
syslog-ng.confは下記の5つの項目で構成され、RPMでインストールするとデフォルトの設定がなされています。それを必要に応じて変更することになります。但し、syslogdと同等に動かすだけなら、両デストリともほとんど設定変更は不要です。

No.項 目概 要
1sourcesyslog-ngのログ受信に関する設定(source-driver)
2filtersyslogのフィルタ処理に関する設定
3distnationフィルタリング後のログの出力に関する設定
4logsource、filterとdestnationの関連付けに関する設定
5optionsyslog-ngの動作に関する各種オプション

各項目の設定に関しては、syslog-ngのドキュメントこちらを参考にしてください。情報はほとんど前者にあるので、ここでは記述しません。

◆sorceの設定

sorceのデフォルト設定は、SuSEとRedHat系ではかなり異なりますが、通常はデフォルトのままで問題ありません。SuSEのSocketの設定は、SuSEconfig が /etc/sysconfig/syslogから自動生成したものなので環境によって変ってきます。chrootしているデーモンからのログ収集が特徴的です。(SuSE9.0と9.2では対象デーモンが異なります。)
両デストリともコメントアウトしてある最後の行で外部からのメッセージ受信の設定がありますが、後述のように、今回はここで受信せずに別の専用sorceを設定しました。


◆filterの設定

filterのデフォルト設定は、SuSEとRedHat系でこれもかなり異なりますが、通常はデフォルトのままで問題ありません。両デストリともデフォルトはdestinationとあわせてsyslog.confの内容を継承していますので、現状、特にカスタマイズしていなければそのまま切り替えられます。こちらを参考にしながら、syslog.confの内容とfilterを見比べれば設定方法はすぐにわかるはずです。
SuSEは、levelとfacilityのmixで、RedHat系はfacilityを中心とした設定になっています。自分で後述のようにSwatchのようなログ監視をする場合は、実際のログを見て設定しないと期待している動作をしないかもしれないので注意が必要です。


◆destinationの設定

destinationのデフォルト設定は、filter同様にSuSEとRedHat系でかなり異なりますが、syslogdの設定を引き継いでいるので通常はデフォルトのままで問題ありません。ここでは、ログの出力先をしています。


◆logの設定

logは、上記のsorce、filterとdestinationの関連付けの設定なので、それらの組み合わせになっているだけです。つまり、logで、sourceから受信したメッセージをfilterして、destinationに出力するという流れを設定するようになっており、非常にわかりやすいと思います。


◆optionの設定

optionの設定は、SuSEとRedHat系でかなり異なりますが、大規模ネットワーク用のsyslogサーバとして動作させるなら一気に大量のメッセージを受信しなければならないので、いろいろチューニングが必要でしょうが、自宅サーバなら押さえなければならないポイントは限られます。
おやじが設定が必要と思うのは、「long_hostnames」、「sync」、「stats」ぐらいです。

パラメータ概 要設定値
long_hostnamesログ出力のホスト名の前にsourceで定義した名前(src/s_sys)を付加するかどうかの指定。元もとのホスト名だけにするならoffとする。off
syncログをファイルに書き込む前にバッファするメッセージ数の指定。一気に大量のメッセージを処理するsyslogサーバならいざ知らず、自宅サーバなのでここは、発生の都度書き込むので0とする。0
statssyslog-ng自身が出力するレポートで、syncでログの出力バッファリングした時に出力に失敗したログ数をレポートする。sync(0)でバッファしないならstats(0)で出力停止でよい。0


■ルータのsyslogをロギングするための設定

ここでは、おやじが使用しているBA8000/MN8300Wのsyslogを受信し、ルータ専用のログファイルに出力するようにした例を示します。
今までのsyslogでは、このログはルータ専用ログのほかに同じログがmessagesログにも出力されていましたが、今回はsourceを分離することによりmessagesログには出力されないようにしました。具体例は以下のとおりです。なお、両デストリともTCP Wrapperが使える状態でコンパイルされているので、送信元を制限したほうがいいかもしれません。
# BA8000/MN8300W messages in one filelog
source router { udp(ip("192.168.1.100") port(514)); };
destination d_routerlog { file("/var/log/router"); };
filter f_routerlog { host(192.168.1.1) and level(info..emerg); };
log { source(router); filter(f_routerlog); destination(d_routerlog); };

  1. ルータのsyslogを分離してロギングするため、sourceでは新たに「router」という名前を定義し、udpの514番ポートをサーバが持っている一つのアドレスである192.168.1.100で受信するように設定。(おやじはIPベースのバーチャルホストを動かしているので、アドレスが2つある。通常はデフォルトのように"0.0.0.0"でよい。)
  2. destinationは、「d_routerlog」という名前で「/var/log/router」というファイルに出力するように定義。
  3. filterは、「f_routerlog」という名前で「192.168.1.1」というホストから受信したlevelが「info」から「emerg」までのログを対象にした。「192.168.1.1」はBA8000/MN8300WのLAN側アドレス。内向きDNSやhostsで逆引きできるなら、optionで「use_dns(yes)」とすれば「router」のようにホスト名で記述できる。(内向きDNSやhostsで逆引きできる場合、IPアドレスではマッチングしないので、デフォルトで「use_dns(yes)」となっている可能性大であり、うまくいかない場合は、ホスト名でマッチングをとってみるとよい。それより、use_dnsオプションを明示するほうが間違いない。)
  4. logは上記の組み合わせであり、結果として外部から192.168.1.100のudpの514番ポートで受信した192.168.1.1からのlevelが「info」から「emerg」までのログを「/var/log/router」というファイルに出力する。となる。

■FTPサーバへの不正アクセス防止

ここでは、swatchで行ったようなFTPで指定回数以上ログインに失敗したら当該アドレスからのFTPアクセスをiptablesを使用してロックし、メール通知するようにしてみました。これにはsyslog-ngが有するマッチング機能と外部プログラム起動機能を使います。
# FTP Login failure
destination d_ftp_mail { program("/usr/local/bin/mail.cgi"); };
destination d_ftp_filter { program("/usr/local/bin/filter.cgi"); };
filter f_ftp_login_failure { program("proftpd") and match("Authentication failure"); };
log { source(src); filter(f_ftp_login_failure); destination(d_ftp_mail); };
log { source(src); filter(f_ftp_login_failure); destination(d_ftp_filter); };

  1. destinationは、「d_ftp_mail」という名前で「/usr/local/bin/mail.cgi」というメール送信プログラムを起動する定義と、「d_ftp_filter」という名前で「/usr/local/bin/filter.cgi」というiptablesを制御するプログラムを起動する定義の二つを定義。
  2. filterは、「f_ftp_login_failure」という名前で「proftpd」というプログラムで「Authentication failure」というログが対象。
  3. logは上記の組み合わせであり、「proftpd」というプログラムのログで「Authentication failure」というログがあったら、メール送信プログラムとiptablesの制御用プログラムを起動する。となる。

◆メール送信スクリプト(mail.cgi)

こちらのような、かなり手抜きのメール送信用スクリプトを作成しました。これを、/usr/local/bin/mail.cgiとして設置し、パーミションを700としました。Swatchと異なるのは、syslog-ngでprogram指定で外部プログラム起動すると、ログメッセージを標準入力で受け取るということです。このためプログラムはsyslog-ng起動時に起動された状態になるため、スクリプトを修正したりした場合はsyslog-ngのreloadを忘れないようにしないと変更が反映されないので注意が必要です。
このスクリプトでは、Jcodeの使用をベースにしてますが、jcode.plをこのスクリプトと同じディレクトリに置いてコメント行を切り替えればそれでも大丈夫です。但し、jcode.plは「UTF-8」をサポートしていないので、最近のUTF-8ベースのデストリで試験する(ターミナルでmail.cgiを起動ると入力待ちになるので、適当に入力してEnterすればメールが送信される)場合は、文字化けするので周囲が必要です。
必要に応じて、タイトルや送信先等のパラメータを変更してください。

◆iptables管理用スクリプト(filter.cgi)

メール送信スクリプトと同様に、こちらのような簡単なものです。メール送信用スクリプト同様、ログの受信方法が異なるだけなので使用方法はSwatchを参考にしてください。修正時はsyslog-ngのreloadを忘れないようにしないと変更が反映されないのも同じです。

■syslog-ngへの切替

設定が完了したら、以下によりsyslog-ngに切り替えます。RedHat系でSRPMをリビルドしただけの場合は、既に切り替わっているので設定変更していたら設定ファイルの確認を行い、reloadするだけです。

◆設定ファイルの確認

syslog-ngでは、オプションで設定ファイルの良否を確認できますので、切り替える前に以下で確認を行います。問題が無ければ、プロンプトに戻るだけで何も出力されませんが、エラーが出力されたら見直してください。下記は14行目に問題がある時の例です。

[エラー無しの場合]
# syslog-ng -s
#

[エラー有りの場合]
# syslog-ng -s
syntax error at 14
Parse error reading configuration file, exiting. (line 14)

◆syslo-ngの起動

syslog-ngへの切替方法は、SuSEとRedHat系では異なります。



Top Pageへ