はじめに
Splunk インスタンスでは、任意のポートで受信 syslog メッセージをリスニングできます。設定は簡単ですが、これは Splunk で syslog メッセージを取得する方法として最適とは言えません。splunkd プロセスが停止すると、停止中に送信されたすべての syslog メッセージが失われるためです。また、すべての syslog トラフィックを 1 つの Splunk インスタンスに集めるよりも、syslog データをインデクサー間で分散させたいことの方が多いでしょう。
では、Splunk で syslog メッセージを取得するには、どのような方法が最適でしょうか。それは、専用 syslog サーバーを設置することです。
この記事では、Splunk 用の syslog サーバーとして、syslog-ng をインストール、設定、使用する方法について説明します。
Syslog-ng:
syslog-ng は、Unix と Unix 系システム向けの syslog プロトコルのオープンソース実装です。オリジナルの syslogd モデルをベースとして、コンテンツベースのフィルタリング、豊富なフィルタリング機能、柔軟な設定オプションや、TCP での syslog 転送などの重要機能が追加されています。現時点で、syslog-ng は Balabit IT Security 社によって開発が進められ、共通のコードベースに基づく 2 つのエディションが提供されています。その 1 つが、LGPL ライセンスを採用した syslog-ng オープン ソース エディション (OSE)、もう 1 つが、プロプライエタリライセンスの下でプラグイン (モジュール) を追加したプレミアムエディション (PE) です。
インストール:
syslog-ng は、一部のバージョンの Linux ではあらかじめパッケージ化されています。次の wget コマンドを使ってダウンロードし、インストールすることもできます。
# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install –enablerepo=epel syslog-ng
yum によって、必要な依存パッケージがダウンロードされ、依存関係が解決されて、syslog-ng 3.2.5-3.el6 がインストールされます。
syslog-ng サービスが起動すると、次のような、プラグインモジュールが見つからないという警告メッセージが表示されることがあります。
Plugin module not found in ‘module-path’; module-path=’/lib64/syslog-ng’, module=’afsql’
Starting syslog-ng: Plugin module not found in ‘module-path’; module-path=’/lib64/syslog-ng’, module=’afsql’
Starting syslog-ng: Plugin module not found in ‘module-path’; module-path=’/lib64/syslog-ng’, module=’afsql’
syslog-ng-libdbi モジュールがなくても syslog-ng は機能しますが、syslog-ng を起動するたびにこのメッセージが表示されるため、インストールすることをお勧めします。
# rpm -i libdbi-0.8.3-4.el6.x86_64.rpm
# yum install syslog-ng-libdbi
rsyslog を無効にする
rsyslog を停止して、ブート時に rsyslog サービスが起動しないように設定します。
# service rsyslog stop
# chkconfig rsyslog off
syslog-ng を有効にする
syslog-ng をブート時に起動し、syslog-ng サービスが起動するように設定します。
# service syslog-ng start
# chkconfig syslog-ng on
iptables を編集して UDP トラフィックを許可する
iptables で、開いているポートを確認します (-L オプションでサービス、n オプションでポート番号ごとにリスト表示)。
# iptables –L –n
iptables にポート 514 (root での syslog のデフォルトポート) を追加する必要があります。
UDP ポート 514 を /etc/sysconfig/iptables に追加するには、次のコマンドを実行します。
# iptables -A INPUT -p udp -m udp –dport 514 -j ACCEPT
syslog-ng.conf を編集する
編集前に、既存の syslog-ng.conf ファイルを syslog-ng.conf.sav にコピーします。次の syslog-ng.conf ファイルの例は、Splunk 6 で使用したものです。/home/syslog/logs の下に、データ ソース タイプごとにディレクトリを作成します。そのために、create_dirs 属性を yes に設定し、destination オプションで指定しています。
@version:3.2
# syslog-ng configuration file.
#
#
options {
chain_hostnames(no);
create_dirs (yes);
dir_perm(0755);
dns_cache(yes);
keep_hostname(yes);
log_fifo_size(2048);
log_msg_size(8192);
perm(0644);
time_reopen (10);
use_dns(yes);
use_fqdn(yes);
};
source s_network {
udp(port(514));
};
#Destinations
destination d_cisco_asa { file(“/home/syslog/logs/cisco/asa/$HOST/$YEAR-$MONTH-$DAY-cisco-asa.log” create_dirs(yes)); };
destination d_palo_alto { file(“/home/syslog/logs/paloalto/$HOST/$YEAR-$MONTH-$DAY-palo.log” create_dirs(yes)); };
destination d_all { file(“/home/syslog/logs/catch_all/$HOST/$YEAR-$MONTH-$DAY-catch_all.log” create_dirs(yes)); };
# Filters
filter f_cisco_asa { match(“%ASA” value(“PROGRAM”)) or match(“%ASA” value(“MESSAGE”)); };
filter f_palo_alto { match(“009401000570” value(“PROGRAM”)) or match(“009401000570” value(“MESSAGE”)); };
filter f_all { not (
filter(f_cisco_asa) or
filter(f_palo_alto)
);
};
# Log
log { source(s_network); filter(f_cisco_asa); destination(d_cisco_asa); };
log { source(s_network); filter(f_palo_alto); destination(d_palo_alto); };
log { source(s_network); filter(f_all); destination(d_all); };
syslog-ng を再起動する
syslog-ng を再起動するには、/etc/init.d 内のスクリプトを実行するか、次のように service syslog-ng stop | start | restart コマンドを実行します。
# service syslog-ng stop
Stopping syslog-ng: [ OK ]
# service syslog-ng start
Starting syslog-ng: [ OK ]
# /etc/init.d/syslog-ng restart
Stopping syslog-ng: [ OK ]
Starting syslog-ng: [ OK ]
SELinux を設定する
destination で指定したディレクトリに syslog-ng からファイルを書き込めない場合は、SELinux (Security-Enhanced Linux) モジュールが syslog デーモンの書き込みをブロックしている可能性があります。その場合は、/var/log/audit/audit.log に、ブロックのログが記録されているはずです。getenforce コマンドを実行して、SELinux のステータスとモードを確認します。
# /usr/sbin/getenforce
Enforcing
注:SELinux を無効にするか permissive モードに設定する場合は、システム管理者に確認してください。
システム管理者が、代わりに SELinux ポリシーに例外を追加する場合もあります。
SELinux 設定ファイルを編集して (vi /etc/selinux/config)、モードを permissive に変更します。
その後、sestatus コマンドを実行して、設定ファイルが正しく編集されたことを確認します (次に示すように、モードが「permissive」になっている必要があります)。
# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: permissive
Policy version: 24
Policy from config file: targeted
次の setenforce コマンドを実行して、現在のモードを enforcing から permissive に変更します。実行後、syslog-ng から /home/syslog/logs に書き込めるようになるはずです。
# setenforce 0
# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: permissive
syslog-ng サーバーから古いログファイルを削除する
サーバーの領域が syslog-ng のログファイルでいっぱいにならないようにするために、作成後 x 日経過した古いログファイルを毎日午前 5 時に削除する cron ジョブを作成します。次の例では、7 日経過したファイルを毎朝 5 時に削除するように指定しています。
# crontab –e
0 5 * * * /bin/find /home/syslog/logs/ -type f -name \*.log -mtime +7 -exec rm {} \;
crontab –l コマンドを実行すると、他の既存の cron ジョブを確認したり、cron ジョブのスケジュールが正しく設定されていることを確認したりできます。
syslog-ng サーバーで UF の収集機能を使用する
syslog-ng サーバーがインストールされているコンピューターに、ユニバーサルフォワーダー (UF) をインストールします。
syslog-ng サーバーに UF をインストールすると、Cisco ASA や Palo Alto 社製ファイアウォールデバイスによって書き込まれたログファイルからイベントを収集できます。次の monitor スタンザでは、指定したファイルシステム以下をすべて監視するように指定しています。
この例では、host_segment 属性を使用し、完全パスで左から何番目のフィールドにホスト名があるかを指定して、ホスト名を示しています。
# Cisco ASA
[monitor:///home/syslog/logs/cisco/asa/*/*.log]
sourcetype = cisco:asa
index = cisco
disabled = false
host_segment = 6
Splunk によってファイルシステムパスの 6 番目のフィールドが確認され、イベントのホスト名がそのフィールドの値に設定されます。
/home/syslog/logs/cisco/asa/<hostname>/2014-09-10-cisco-asa.log
----------------------------------------------------
Thanks!
Kanad Sharma
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。