2012年11月7日水曜日

rsyslog でリモートホストにログを転送管理する

こんにちは、サイオステクノロジーの小川です。

今回は rsyslog でリモートホストにログを転送する設定と TIPS のご紹介です。

まず、syslog はカーネルやアプリケーションが出力したメッセージをファイルに記録するプログラムですが、今回ご紹介する rsyslog には頭文字に「r」がついています。この「r」は何を示しているのかというと、「reliable」の頭文字で信頼性のある syslog という意味があります。

信頼性があるといえる理由の一つとして、rsyslog はリモートホストに TCP でログメッセージを転送できるという点があります。

syslog のデーモンプログラム syslogd では、ログを別のホストに転送する際に UDP 通信を行うので、送信したログメッセージが相手に届くという保証はありませんが、rsyslog では TCP も使用できるため、ログメッセージの転送を保障します。

障害発生で原因を追跡する際に大事なログが欠落していた、なんて事になったら致命的ですよね。今回はまず、TCP でログメッセージを別のホストに転送する設定を紹介をします。本設定はログのバックアップやログの集中管理を行いたい場合に有効です。

本記事では CentOS 6.3 64 bit、CentOS 同梱の rsyslog 5.8.10 使用しています。なお、CentOS 6.3 では標準で rsyslog はインストールされます。(最小構成でインストールした場合も rsyslog のパッケージが入り、自動的に起動されます。)


  • TCP でログメッセージをリモートホストに転送する設定

  • [転送元ホストの設定]

    まず、転送元ホストが転送先ホストに TCP でログメッセージを転送する設定について説明します。

    ログを転送するための /etc/rsyslog.conf の書式は以下のようになります。

    書式
    Facility.Severity               @@hostname
    
    * "Facility" はログの種類です。利用できる Facility の一覧を以下に記載します。

    Facility 用途
    auth,authpriv,security(authと同じ) 認証メッセージ
    cron cron のメッセージ
    daemon Facility の指定がないデーモンのメッセージ
    kern カーネルのメッセージ
    lpr ラインプリンタデーモンのメッセージ
    mail メールサービス関連のメッセージ
    news ニュースサービス関連のメッセージ
    syslog syslogd の内部メッセージ
    user 任意のユーザのプロセスのメッセージ
    uucp UUCP を利用したプログラムのメッセージ
    local0 ~ local7 任意の用途で利用できる。

    なお、以下の rsyslog.conf のマニュアルページにも記載があるとおり、security は authpriv と同じ 用途の Facility であり非推奨の設定なので、認証に関する Facility を設定する場合は、authpriv を使いましょう

    man 5 rsyslog.conf より抜粋
    The keyword security should not be used anymore and mark is only for  inter-nal  use and therefore should not be used in applications.
    
    * "Severity" はログの重要度です。利用できる Severity の一覧を以下に記載します。

    Severity 用途
    emerg システムが使用できない状態
    alert 直ぐに対処が必要な状態
    crit 深刻な状態
    err エラーが発生している状態
    warn 警告が発生している状態
    notice 正常であるが重要な通知が発生する状態
    info 通常の状態
    debug デバッグするときに使う

    * "@@" は TCP でログを転送する為の設定です。man ページには以下のように記載されています。

    man 5 rsyslog.conf より抜粋
    To forward it via plain tcp, prepend two at signs ("@@").
    
    * "@@" 以降は転送先ホストの FQDN やホスト名、IP アドレスを指定できます。


    [転送先ホストの設定]

    次に、転送先ホストが転送元ホストからのログメッセージを TCP 514 番ポートで受信する設定について説明します。

    転送先の /etc/rsyslog.conf の主な設定は以下の項目になります。

    書式
    $ModLoad imtcp 
    $InputTCPServerRun 514
    $Allowedsource TCP, hostname, IPアドレス
    
    * $ModLoad
    この行のコメントアウトを外し imtcp モジュールを有効にします。

    * $InputTCPServerRun
    この行のコメントアウトを外し、TCP で受信するポート番号を指定します。

    * $AllowedSender TCP, hostname, IPアドレス
    ログメッセージの受信を許可する転送元ホスト名または IP アドレスを指定します。


    それでは、それぞれのホストで実際に設定してみましょう。

    転送元ホスト名: source
    転送先ホスト名: destination

    1. source で /etc/rsyslog.conf の設定例。

    authpriv.*                      @@destination:514
    
    ※ destination のホスト名は名前解決できる状態にしています。

    2. destination で /etc/rsyslog.conf の設定例。

    $ModLoad imtcp
    $InputTCPServerRun 514
    $Allowedsource TCP, source
    authpriv.*                       /var/log/secure
    
    ※ source のホスト名は名前解決できる状態にしています。

    3. 両ホストの rsyslog を再起動。

    # service rsyslog restart

  • 動作確認

  • 以下の結果より、source の認証ログメッセージが destination に転送されていることを確認できました。

    source の /var/log/secure より抜粋
    Oct 19 10:31:34 source sshd[8164]: Accepted password for root from 10.1.1.239 port 3775 ssh2
    Oct 19 10:31:34 source sshd[8164]: pam_unix(sshd:session): session opened for user root by (uid=0)
    
    destination の /var/log/secure より抜粋
    Oct 19 10:31:34 source sshd[8164]: Accepted password for root from 10.1.1.239 port 3775 ssh2
    Oct 19 10:31:34 source sshd[8164]: pam_unix(sshd:session): session opened for user root by (uid=0)
    



  • TIPS のご紹介

  • 次に OSS よろず相談室にお問い合わせ頂いた質問の中から rsyslog に関する TIPS をご紹介しましょう。

    以下のような条件で rsyslog を設定したいという場合はどのように設定すれば良いでしょうか。

    転送元ホスト名: source
    中継ホスト名: relay_host
    転送先ホスト名: destination

    条件1.
    source のログを relay_host に TCP 514 番ポートで転送し、さらに destination に TCP 514 で転送する。

    条件2.
    source から relay_host に TCP 514 番ポートで転送されたログメッセージ は relay_host のローカルの /var/log/secure に出力しない。

    条件3.
    relay_host の認証ログはローカルの /var/log/secure に出力する。


    答えは簡単、「:property, [!]compare-operation, "value"」というプロパティベースのフィルタリング設定を行う事で実現できます。以下に設定例と動作結果を記載します。

    [relay_host の設定]

    1. /etc/rsyslog.conf を編集し、以下のように設定。

    /etc/rsyslog.conf より抜粋
    $ModLoad imtcp
    $InputTCPServerRun 514
    $Allowedsource TCP, source
    authpriv.*                           @@destination
    :fromhost-ip, !isequal, "127.0.0.1"  ~
    authpriv.*                           /var/log/secure
    
    * fromhost-ip
    転送元の IP アドレスを条件に指定できるプロパティです。

    * isequal
    "value" の値と比較します。今回は "!isequal" なので否定となり "127.0.0.1" と一致しない場合を意味します。

    * ~ (チルダ)
    以降の処理は対象外にします。

    つまり、source から relay_host に TCP 514 番ポートで送られてきたログは destination に転送し、source が 127.0.0.1 の IP アドレスと一致しないため relay_host のローカルの /var/log/secure にログを出力しません。

    2. 設定を反映するため rsyslog を再起動。

    # service rsyslog restart

    [動作結果]

    1. source の /var/log/secure に認証メッセージが記録されていることを確認。

    source の /var/log/secure より抜粋
    Oct 22 14:00:26 source sshd[18484]: Accepted password for root from 10.1.1.239 port 4147 ssh2
    Oct 22 14:00:26 source sshd[18484]: pam_unix(sshd:session): session opened for user root by (uid=0)
    
    2. relay_host の /var/log/secure に source の認証メッセージが記録されていないことを確認。

    relay_host の /var/log/secure
    Oct 22 13:59:15 relay_host polkitd(authority=local): Registered Authentication Agent for session /org/freedesktop/ConsoleKit/Session2 (system bus name :1.54 [/usr/libexec/polkit-gnome-authentication-agent-1], object path /org/gnome/PolicyKit1/AuthenticationAgent, locale ja_JP.UTF-8)
    
    3. destination の /var/log/secure に source の認証メッセージが記録されていることを確認。

    destination の /var/log/secure
    Oct 22 14:00:26 source sshd[18484]: Accepted password for root from 10.1.1.239 port 4147 ssh2
    Oct 22 14:00:26 source sshd[18484]: pam_unix(sshd:session): session opened for user root by (uid=0)
    
    上記のログより、要件を満たす事が出来ることを確認できました。rsyslog のプロパティは便利ですので、是非活用してみてください。

    最後に参考になる rsyslog のサイトを記載します。

    [参考]
    The Property Replacer
    http://www.rsyslog.com/doc/property_replacer.html


    以上です。次回は rsyslog のログをデータベースで管理する方法について紹介します。

    0 件のコメント:

    コメントを投稿