FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Splunk その1

第一回目は、Splunk について書いてみたいと思います。

1. Splunk とは?

最近国内でも代理店が増えて、国内での事例も出てきているようですが、まだ名前を聞いたことのない方も多いと思いますので、まずは簡単なご紹介から。

Splunk は、システム上のあらゆるテキストデータをインデックス化して、高速な検索とグラフィカルなレポーティング機能を提供するツールです。イメージとしては Google や Microsoft などのデスクトップ検索のサーバ版といった感じでしょうか。

一般に統合ログ管理の分野に位置付けられる Splunk ですが、ミドルウェアやネットワーク機器のコンフィグを読み込めばコンフィグ管理ツールに、システムの性能情報を読み込めば性能管理ツールになったりもする、非常に用途の広いツールであると言えます。

また、JP1 や HP Software などの統合監視ツールに含まれるいわゆるログ監視との違いとしては、ログ監視が基本的にエージェント側でフィルタをかけて、指定した条件にマッチするログのみをマネージャに通知するのに対して、Splunk は一旦全てのログを取り込んで検索しやすいようインデックス化を行い、ユーザが検索時に指定した条件でフィルタをかけるというところです。

その為、ログ監視ツールの主な用途であるリアルタイムでの障害検知より、障害発生後の原因調査や監査、定期的なレポーティングなどに向くツールになります。

2. ライセンスについて

Splunk には、機能制限のあるフリーライセンスと、インデックス化の対象となるデータの容量に応じた有償のエンタープライズライセンスがあります。いわゆるフリーミアムモデルですね。

有償版と無償版の機能の差分については、こちらを参照してください。

一番大きな違いは、無償版では一日にインデックス化できるデータの容量が 500MB までとなっていることです。

この 500MB という数字は「500MB 以上の入力データを読み込めない」という入力レート制限ではなく、「Splunk が読み込む入力データが 500MB を超えたらライセンス違反状態とみなす」という閾値のようなものです。

一定期間継続してライセンス違反状態が続くと検索が出来なくなるため、入力データを減らすか、有償ライセンスの投入が必要となります(有償版と無償版のバイナリは同じもののため、再インストールは不要)。

ちなみに検索機能が停止している際もインデックス化は行われるため、データが失われることはありません。

その他、無償版ではユーザアカウントを複数設定することができなかったり、監視システム等と連携するためのアラート機能が使えなかったりといった制限があるため、シングルサーバ/ユーザでの利用、具体的にはそのサーバ上で稼動するアプリケーションのログファイルの GUI フロントエンドとしての使い方が主な用途になると思います。

3. システム環境について

2010年12月時点での最新バージョン(4.1)のサポート OS は以下の通りです。

Solaris 9, 10 (x86, SPARC)
Linux Kernel vers 2.6.x and above (x86: 32 and 64-bit)
FreeBSD 6.1 and 6.2 (x86: 32 and 64-bit)
Windows 2003 (64-bit, supported but not recommended on 32-bit)
Windows 2008 (64-bit, supported but not recommended on 32-bit)
WindowsXP (32-bit)
Vista (32-bit, 64-bit)
Windows 7 (32-bit, 64-bit)
MacOSX 10.5 and 10.6 (32-bit & 64bit in one download, 10.6 is only supported in 32-bit mode)
AIX 5.2 and 5.3
HP-UX 11iv2 (11.22) and 11iv3 (11.31) (PA-RISC or Itanium)

※ 最新の情報については、こちらを参照してください。


サーバの必要スペックについては、使い方によって大きく変わってきます。

無償版のライセンスをサーバにインストールして、そのサーバ上の syslog のフロントエンドとして利用するといった用途であれば、基本的にそれほどスペックを気にする必要はないでしょう(とはいえ、起動しただけで数百 MB のメモリを消費するので、それなりのメモリ空き容量は必要ですが)。

逆に有償版のラインセンスを購入して、大規模システムで大量のログを Splunk サーバに集約してインデックス化を行う場合には、インストール環境としてそれなりのスペックのサーバが必要となります。

インストールマニュアル記載のシステム要件では、最小/推奨スペックはそれぞれ以下のようになっています。


非 Windows 環境(Linux/UNIX等)
最小: 1.4 GHz CPU × 1, メモリ 1 GB
推奨: クアッドコア Xeon(3Ghz)× 2, メモリ 8GB, RAID 1+0 もしくは RAID 0 構成のディスク

Windows 環境
最小: Pentium 4 もしくは互換 CPU(2Ghz)× 1, メモリ 2GB
推奨: クアッドコア Xeon(3Ghz)× 2, メモリ 8GB, RAID 1+0 もしくは RAID 0 構成のディスク


ただし、上記スペックは入力データの量などの条件を考慮したものではないので、エンタープライズ環境で実際に環境を構築する場合には、こちらを参考にしてきちんとサイジングを行いましょう。

ちなみに、Splunk はマルチスレッディングに対応しているため、ディスク I/O がボトルネックになるまでは、CPU コアとメモリの追加がそのまま処理速度の向上につながります。また、ディスク I/O がボトルネックになる場合には、分散検索(Distributed Search)によるスケールアウト型の拡張にも対応しています。サイジングの際は、コスト効率と運用負荷の観点から最も適切な構成を検討して下さい。

4. インストールファイルのダウンロード

インストールファイルは Splunk のサイトからダウンロードすることができます。

トップページの右上にある「Free Download」ボタンをクリックして、インストール先の OS 環境に応じて適切なファイルをダウンロードしてください。


splunk_download_01.png

今回は CentOS にインストールするため、「splunk-4.1.6-89596-linux-2.6-x86_64.rpm」を選択します。


splunk_download_02.png

初めてダウンロードする際には、ここでサインアップ画面が開くので、アカウント情報を入力しましょう(Zip/Postal Code 以外の入力項目は必須です)。

なお、既にアカウントを作成済みでブラウザのログイン状態が解除されてしまっている方は、この画面の「Login here」のリンクをクリックして、再度ログインして下さい。


splunk_download_03.png

Submit ボタンをクリックすると以下の画面が表示され、通常はそのまま待っていればダウンロードが始まります。


splunk_download_04.png

ダウンロードが完了したら、ファイルの MD5 チェックサムを確認しておきましょう(正しい MD5 チェックサムは上記画面の「Download MD5」からダウンロードできます)。

なお、ここまでブラウザを使ってファイルをダウンロードする方法を紹介してきましたが、GUI が使えないサーバ上に直接ファイルをダウンロードしたい場合は、一旦上記画面を PC から開き、「Get this URL.」のリンクをクリックして表示されるコマンドをサーバの CLI から実行してみて下さい(インターネットへの接続と wget コマンドが必要です)。

5. Red Hat Enterprise Linux / CentOS へのインストール

RHEL や CentOS では、RPM パッケージをインストールをするだけなので、特に難しいことはありません。

デフォルトのインストール先は /opt/splunk ですので、インストール前に /opt を含むパーティションに十分な空き容量があることを確認してから、以下のコマンドを実行します。

[root@localhost rpm]# rpm -ivh splunk-4.1.6-89596-linux-2.6-x86_64.rpm
warning: splunk-4.1.6-89596-linux-2.6-x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 653fb112
Preparing... ########################################### [100%]
Creating mailbox file: File exists
1:splunk ########################################### [100%]
----------------------------------------------------------------------
Splunk has been installed in:
/opt/splunk

To start Splunk, run the command:
/opt/splunk/bin/splunk start

To use the Splunk Web interface, point your browser at:
http://localhost.localdomain:8000

Complete documentation is at http://www.splunk.com/r/docs
----------------------------------------------------------------------
[root@localhost rpm]#


/opt に空きがない場合や、外部ストレージをマウントした専用パーティションにインストールする場合は、インストールディレクトリを指定することも可能です。

以下の例では、全てのファイルは /external/splunk にインストールされます。

[root@localhost rpm]# rpm -ivh --prefix /external splunk-4.1.6-89596-linux-2.6-x86_64.rpm
warning: splunk-4.1.6-89596-linux-2.6-x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 653fb112
Preparing... ########################################### [100%]
1:splunk ########################################### [100%]
----------------------------------------------------------------------
Splunk has been installed in:
/external/splunk

To start Splunk, run the command:
/external/splunk/bin/splunk start

To use the Splunk Web interface, point your browser at:
http://localhost.localdomain:8000

Complete documentation is at http://www.splunk.com/r/docs
----------------------------------------------------------------------
[root@localhost rpm]#


6. 環境変数の設定と初回起動

インストールが完了したら、Splunk を起動するユーザ(通常は root)のログインスクリプトを編集して、Splunk の bin ディレクトリにパスを通しておきましょう。

以下は、/root/.bash_profile の編集例です(再ログインするか source コマンドで設定を有効化します)。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

export SPLUNK_HOME=/opt/splunk

PATH=$PATH:$HOME/bin:$SPLUNK_HOME/bin

export PATH
unset USERNAME


パスが通った状態では、以下のコマンドで Splunk の起動/停止/状態確認が可能です。

[root@localhost ~]# splunk start
[root@localhost ~]# splunk stop
[root@localhost ~]# splunk status


初回起動時にはライセンス条項への同意が必要となりますが、以下のコマンドを実行すると自動的に同意したものとして処理を継続できます。1台だけなら普通に同意してもよいのですが、多数のサーバにスクリプトを使ってインストールする際にはこちらを使用しましょう。

[root@localhost ~]# splunk start --accept-license


なお、起動時に以下のようなメッセージが表示される場合は、SELINUX を無効化する必要があります。


Checking for SELinux.

Command error: Splunk will not run with SELinux enabled.
If you have adjusted Splunk's security level with chcon, you can bypass this check by setting the 'SPLUNK_IGNORE_SELINUX' environment variable.


SELINUX を無効化するには、/etc/selinux/config を以下のように編集して下さい。

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted


7. サーバ起動時の自動起動設定

サーバ起動時に自動的に Splunk が起動するよう設定するには、以下のコマンドを実行します。

[root@localhost ~]# splunk enable boot-start


Init script installed at /etc/init.d/splunk.
Init script is configured to run at boot.


このコマンドを実行すると、/etc/init.d の下に起動スクリプトが作成され、chkconfig の設定もあわせて実施されます。以下のコマンドを実行して確認しておきましょう。

[root@localhost ~]# chkconfig --list splunk
splunk 0:off 1:off 2:on 3:on 4:on 5:on 6:off


8. 非 root ユーザでの Splunk の起動

Splunk サーバを外部ユーザ向けに公開する場合には、セキュリティを強化するために Splunk を非 root ユーザで動作させることも可能です。RPM パッケージでインストールした場合、splunk ユーザが自動で作成されるため、通常はこのユーザを使えばよいでしょう。

ちなみに、Splunk を非 root ユーザで動作させる場合には以下の点に注意が必要となります。

・ 一般ユーザは 1023 番以下の特権ポートにバインドすることができないため、標準の syslog ポートである 514/udp を直接バインドして syslog メッセージを取り込むことができなくなります。

・ Splunk の起動ユーザは、データ入力で指定されたディレクトリやファイルの読み込み権限、データ入力やアラートで使用するスクリプトの実行権限を持つ必要があります。


splunk ユーザで起動する場合、まずは準備段階として root ユーザで以下のコマンドを実行して下さい(/opt/splunk 以外のディレクトリにインストールしている場合は、適宜読み替えて下さい)。

[root@localhost ~]# chown -R splunk:splunk /opt/splunk


また、先ほど紹介した splunk enable boot-start コマンドに -user オプションを付けて実行することで、サーバ起動時にも splunk ユーザでプロセスを起動するよう /etc/init.d/splunk を更新します。

[root@localhost ~]# splunk enable boot-start -user splunk


上記の設定をした後は、root ユーザで splunk を起動する場合は必ず /etc/init.d/splunk start もしくは service splunk start を、一般ユーザで起動する場合は $SPLUNK_HOME/bin/splunk start を実行するようにして下さい。

root ユーザが $SPLUNK_HOME/bin/splunk start を実行すると、pid ファイルやログファイルなど Splunk が作成する各種ファイルの所有者が root になってしまい、次回 splunk ユーザで起動する際に問題になります。



とりあえず今回はインストールまでということで、Web GUI からの設定や App の作り方などは次回以降説明していきたいと思います。
スポンサーサイト

テーマ : おすすめソフトウェア
ジャンル : コンピュータ

Splunk その2

前回で Splunk のインストールが完了していると思いますので、今回はその他 OS 周りの設定から。

9. iptables の設定

iptables が動作している環境に Splunk をインストールする場合、Splunk サーバの管理画面へのクライアントからの接続要求や、分散検索などで発生する Splunk サーバ同士の通信、あるいはログの送信元デバイスからの syslog や FTP などの通信を許可するよう、ルールの追加が必要になります。

また、Free ライセンスで運用する場合には、管理画面を開く際のログイン認証が無くなってしまうため、iptables で接続元を制限しておいた方がよいでしょう。

CentOS 5.5 の初期状態のルールは以下のようになっていました。

[root@localhost ~]# iptables -nvL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 74 4888 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT 102 packets, 13800 bytes)
num pkts bytes target prot opt in out source destination

Chain RH-Firewall-1-INPUT (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 255
3 0 0 ACCEPT esp -- * * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT ah -- * * 0.0.0.0/0 0.0.0.0/0
5 0 0 ACCEPT udp -- * * 0.0.0.0/0 224.0.0.251 udp dpt:5353
6 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:631
7 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
8 74 4888 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
10 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited


設定ファイルはこんな感じです。

[root@localhost ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT


それでは、Splunk のプロセスが使用するポート(8000/tcp, 8089/tcp)を許可していきましょう。

[root@localhost ~]# iptables -I RH-Firewall-1-INPUT 11 -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT
[root@localhost ~]# iptables -I RH-Firewall-1-INPUT 12 -m state --state NEW -m tcp -p tcp --dport 8089 -j ACCEPT
[root@localhost ~]# iptables -nvL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 354 26348 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT 330 packets, 37132 bytes)
num pkts bytes target prot opt in out source destination

Chain RH-Firewall-1-INPUT (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 255
3 0 0 ACCEPT esp -- * * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT ah -- * * 0.0.0.0/0 0.0.0.0/0
5 0 0 ACCEPT udp -- * * 0.0.0.0/0 224.0.0.251 udp dpt:5353
6 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:631
7 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
8 354 26348 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
10 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8000
11 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8089

12 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited


また、追加で標準の syslog ポート(514/udp)と Forwarder で使用する任意の TCP ポート(今回は 9997/tcp を使用)の許可設定も追加しておきます。この辺は環境に応じて適切なルールを設定しましょう。

[root@localhost ~]# iptables -I RH-Firewall-1-INPUT 13 -m state --state NEW -m tcp -p tcp --dport 9997 -j ACCEPT
[root@localhost ~]# iptables -I RH-Firewall-1-INPUT 14 -m udp -p udp --dport 514 -j ACCEPT
[root@localhost ~]# iptables -nvL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1059 82838 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT 972 packets, 106K bytes)
num pkts bytes target prot opt in out source destination

Chain RH-Firewall-1-INPUT (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 255
3 0 0 ACCEPT esp -- * * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPT ah -- * * 0.0.0.0/0 0.0.0.0/0
5 1 69 ACCEPT udp -- * * 0.0.0.0/0 224.0.0.251 udp dpt:5353
6 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:631
7 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
8 1057 82540 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
10 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8000
11 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8089
12 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:9997
13 0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:514

14 1 229 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited


最終的な設定ファイルはこんな感じです。

[root@splunk ~]# service iptables save
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[ OK ]
[root@splunk ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.3.5 on Mon Jan 10 16:05:17 2011
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [59481:53861677]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8000 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 8089 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 9997 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 514 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Jan 10 16:05:17 2011


今回は検証ということで、特にアドレスでの制限はかけていませんが、実環境では -s オプションで信頼できる送信元セグメントを指定しておきましょう。

ちなみに今回の場合、許可すべきセグメントとポート番号の対応は以下のようになります。

8000/tcp: Web GUI のクライアント
8089/tcp: 他の Splunk サーバ
9997/tcp: Forwarder/Light Weight Forwarder
514/udp: syslog の送信元デバイス


10. syslog-ng

syslog については標準の syslogd をそのまま使ってもいいのですが、facility や severity でフィルタをかけるためにマクロを使いたいので、rsyslog に入れ換えます。

※ syslog-ng は以前に使ったことがあるので、今回は勉強がてら rsyslog を使うことにしました。

ちなみに CentOS の yum で入る rsyslog のバージョンは 2011/01/10 現在 3.22.1 (v3 の最新は 3.22.3)のようです。公式ホームページを見るとサポートの終了しているバージョンみたいですが、v5 は CentOS 5 環境へのインストールが面倒そうですし、検証だからまあいいかということで yum で入れてしまいます。

[root@splunk rpm]# service syslog stop
カーネルロガーを停止中: [ OK ]
システムロガーを停止中: [ OK ]
[root@splunk rpm]# chkconfig syslog off
[root@splunk rpm]# chkconfig --list syslog
syslog 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@splunk rpm]# yum install rsyslog
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: www.ftp.ne.jp
* base: www.ftp.ne.jp
* extras: www.ftp.ne.jp
* updates: www.ftp.ne.jp
addons | 951 B 00:00
base | 2.1 kB 00:00
extras | 2.1 kB 00:00
updates | 1.9 kB 00:00
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package rsyslog.x86_64 0:3.22.1-3.el5_5.1 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================
Package Arch Version Repository Size
==========================================================================================
Installing:
rsyslog x86_64 3.22.1-3.el5_5.1 updates 380 k

Transaction Summary
==========================================================================================
Install 1 Package(s)
Upgrade 0 Package(s)

Total download size: 380 k
Is this ok [y/N]: y
Downloading Packages:
rsyslog-3.22.1-3.el5_5.1.x86_64.rpm | 380 kB 00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : rsyslog 1/1

Installed:
rsyslog.x86_64 0:3.22.1-3.el5_5.1

Complete!


設定ファイルを修正して、rsyslog.conf で v3 ネイティブの書式を使うようにします。

[root@splunk rpm]# cat /etc/sysconfig/rsyslog
# Options to syslogd
# -m 0 disables 'MARK' messages.
# -rPortNumber Enables logging from remote machines. The listener will listen to the specified port.
# -x disables DNS lookups on messages recieved with -r
# See syslogd(8) for more details
SYSLOGD_OPTIONS="-c3"
# Options to klogd
# -2 prints all kernel oops messages twice; once for klogd to decode, and
# once for processing with 'ksymoops'
# -x disables all klogd processing of oops messages entirely
# See klogd(8) for more details
KLOGD_OPTIONS="-x"


514/udp でリモートからのロギングを許可するよう、rsyslog.conf を修正します。

[root@splunk rpm]# cat /etc/rsyslog.conf
# Use traditional timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Provides kernel logging support (previously done by rklogd)
$ModLoad imklog
# Provides support for local system logging (e.g. via logger command)
$ModLoad imuxsock
# Provides support for remote system logging (via 514/udp)
$ModLoad imudp
$UDPServerRun 514


# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages

# The authpriv file has restricted access.
authpriv.* /var/log/secure

# Log all the mail messages in one place.
mail.* -/var/log/maillog


# Log cron stuff
cron.* /var/log/cron

# Everybody gets emergency messages
*.emerg *

# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler

# Save boot messages also to boot.log
local7.* /var/log/boot.log


設定が完了したら、rsyslogd を起動します。

[root@splunk rpm]# service rsyslog start
システムロガーを起動中: [ OK ]
[root@splunk rpm]# chkconfig rsyslog on
[root@splunk rpm]# chkconfig --list rsyslog
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@splunk rpm]# netstat -na | grep 514
udp 0 0 0.0.0.0:514 0.0.0.0:*
udp 0 0 :::514 :::*
[root@splunk rpm]# tail /var/log/messages
Jan 10 19:50:50 splunk kernel: imklog 3.22.1, log source = /proc/kmsg started.
Jan 10 19:50:50 splunk rsyslogd: [origin software="rsyslogd" swVersion="3.22.1" x-pid="26600" x-info="http://www.rsyslog.com"] (re)start


あとは logger コマンドで実際にログを出してみて、問題なければ次に進みましょう。

マクロ等の細かい設定は App の設定と一緒に後ほど追加していきます。

11. Web GUI へのログインと基本設定

以下の URL にアクセスし、デフォルトの管理者ID: admin、パスワード: changeme でログインします。

http://<サーバの IP アドレス>:8000/


ログイン画面はこんな感じ。

splunk_setup_01.png

ログイン後には、ランチャー画面が表示されます(ユーザの設定で変更可能)。

splunk_setup_02.png

Splunk サーバの設定を行うには、右上の「管理」をクリックします。

設定メニューの一覧が表示されるので、まずは「システム設定」をクリックしてみましょう。

splunk_setup_03.png

「一般設定」をクリックします。

splunk_setup_05.png

Splunk が使用するホスト名やポート番号を指定するための設定画面が表示されるので、必要に応じて修正してください。

ちなみに今回は、インデックス設定のデフォルトホスト名が FQDN (splunk.example.jp)になっていたところをホスト名(splunk)に変更しています。単一ドメインのシステムを管理する想定のためですが、複数ドメインにまたがるシステムを管理する場合には、FQDN のままにしておいたほうがよいでしょう。

splunk_setup_06.png

※1 ポート番号を変更する場合は、iptables の設定もあわせて変更してください。
※2 HTTPS を有効化する手順については別の回で詳しく解説する予定です。

ちなみに、この Web GUI 全体のことを Splunk Web、設定画面を Splunk Manager と呼びますが、Splunk の設定変更を行う手段としては、他に splunk コマンドの実行や設定ファイルの編集があります。設定項目にもよりますが、Splunk Manager で設定できることはある程度限られており、詳細な設定を行うには設定ファイルの直接編集が必要になるケースが多々あるということは覚えておいてください。

また、Splunk Manager からシステム全体にかかわる設定を行った場合、通常は「$SPLUNK_HOME/etc/system/local」の下にあるファイルに設定が追加されます。

システム関連の設定ファイルのディレクトリ構成は以下のようになっていますので、デフォルトの値を確認したい場合や、ファイルを直接編集して設定を行う場合には、ここにあるファイルを参照・編集してください。

$SPLUNK_HOME/etc/system/default
デフォルトの設定値が記載された設定ファイルが格納されているディレクトリ。
通常、このディレクトにあるファイルは直接編集しません。

$SPLUNK_HOME/etc/system/local
デフォルトから変更したい設定値を記載したファイルを格納するディレクトリ。
ここでの設定は、default ディレクトリにある同名のファイルの設定値を上書きします。

$SPLUNK_HOME/etc/system/README
設定ファイルに記載できるパラメータの詳細や設定例を記述したファイルが格納されているディレクトリ。
※ 残念ながら英語のみです。


12. ユーザの新規作成・設定変更(オプション)

すぐに Free ライセンスに切り換える予定の方は、認証機能が無くなるためユーザ設定を行う必要はありませんが、少なくともしばらくは Enterprise ライセンスで使用する場合は、admin ユーザのパスワードを変更しておきましょう。

ユーザ設定を行うには、管理メニューの「アクセス制御」をクリックします。

splunk_setup_03.png

「ユーザー」をクリックします。

splunk_setup_08.png

「admin」をクリックします。

splunk_setup_11.png

アラートで使用するメールアドレス(要 Enterprise ライセンス)やログイン時に表示する App を選択し、デフォルトパスワードを変更して、「保存」ボタンをクリックします。

splunk_setup_12.png

新規にユーザを作成する場合は、一つ前の画面で「新規」ボタンをクリックして同様の情報を入力します。

ちなみに、管理メニューの中に「ユーザーオプション」という項目がありますが、これはログインしたユーザが自分のアカウント情報を変更するためのものです。権限以外は「アクセス制御 >> ユーザー」と同様の項目が設定できるので、自アカウントの設定を変えるだけなら通常はこちらを使えばよいでしょう。

13. Free ライセンスへの切り替え(オプション)

Splunk はインストールから 60 日間は評価版の Enterprise ライセンスで動作します。

現在の有効なライセンスや利用状況は管理メニューの「ライセンス」から確認できます。

splunk_setup_07.png

評価期間中はそのまま Enterprise ライセンスで使用してもよいのですが、もともと Free ライセンスでの利用を想定している個人ユーザの方などは、いつでもライセンスを切り替えることができます。

…できるはずなのですが、現在のバージョン(4.1.6)では Weg GUI のライセンス管理画面に、切り替えのためのリンクが表示されません。messages.po を覗いてみると「Finally ~」以下の一文が翻訳から抜け落ちているのが原因のようです(原文では「switch to a free license」の部分がリンクになっています)。

原文:

This is a Splunk Enterprise Trial license. It gives you access, for a limited time, to all the features of Splunk. While you're using this trial, be sure to try our advanced alerting and user customization before your trial expires. If you would like to extend your Trial or get a quote we would be happy to assist you. Finally, you may switch to a free license at any time.


翻訳文:

これはSplunkのエンタープライズライセンスです。期間限定でSplunkのすべての機能が利用できます。評価期間の有効期限が切れる前に、設定のカスタムや応用的なアラート機能などを十分にお試しください。 もし評価ライセンスの再入手もしくはお見積りをご希望される場合、遠慮くなくご相談ください。


まあ、単なる翻訳漏れで製品の機能自体が変わっているわけではないようなので、以下の URL を直接参照すればライセンスの切り替え画面を表示させることができます。

http://<サーバ IP アドレス>:8000/ja-JP/licensing/


この画面で Continue ボタンをクリックし、Splunk の再起動を行うと Free ライセンスへの切り換えが完了します。

splunk_setup_22.png

切換え完了後は、ライセンス画面の表示を確認しておきましょう。

splunk_setup_10.png



それでは、今回はここまで。
次回はデータ入力についての解説と、簡単な App の作成くらいまでいきたいと思います。

テーマ : おすすめソフトウェア
ジャンル : コンピュータ

Splunk その3

今回は Splunk にデフォルトでインストールされている Search App を使って、/var/log ディレクトリにあるログの検索を行っていきます。

14. データ入力の追加とローカル syslog メッセージの検索

① Launcher 画面の App 一覧にある「検索」をクリックするか、画面右上の App プルダウンメニューから「Search」を選択します。

splunk_setup_24.png

② Search App の画面が表示されたら、右上の「管理」をクリックして Splunk Manager を開きます。

splunk_setup_23.png

③ Splunk Manager のメニューから、「データ入力」をクリックします。

splunk_setup_25.png

④ 「ファイルとディレクトリ」をクリックします。

splunk_setup_13.png

ここに表示されている通り、Unix / Linux 版の Splunk Manager で設定可能なデータ入力の形式には、以下の4種類があります(実際には、この他にも inputs.conf の編集でのみ設定が可能な FS change 等もありますが、そちらの説明についてはひとまず割愛します)。

ファイルとディレクトリ
Splunk サーバ上の特定のファイルやディレクトリ配下の全てのファイルを取り込みます。
また、インデックス化したいファイルをローカル PC からアップロードすることもできます。

TCP
Splunk サーバ上の任意の TCP ポートをリッスンし、送信されてきたデータを取り込みます。
例えば 514/tcp をリッスンすることで、同ポート宛に送られてくる TCP syslog のデータを直接取り込むことができます。

※1 1023 番以下の特権ポートをリッスンするためには、Splunk を root で起動する必要があります(Splunk を一般ユーザで起動している環境で特権ポートのデータを取り込むには、iptables の NAT 設定が必要になります)。

※2 ここで指定するポートが Splunk サーバ上で使用されていないことを確認してください。例えば rsyslog サーバが既に 514/tcp を使用している場合には、Splunk で同じポートをリッスンすることはできません。

UDP
Splunk サーバ上の任意の UDP ポートをリッスンし、送信されてきたデータを取り込みます。
UDP syslog を取り込むのに使用できます。
その他注意点は同上。

Scripts
指定したスクリプトの標準出力を取り込みます。
Unix / Linux 環境ではシェルや Perl、Python など、任意のスクリプトを実行できます。
Windows 環境ではバッチ(.bat)か Python スクリプト(.py)を指定できます。Perl スクリプト等を実行する場合は一旦バッチを噛ませるようにしましょう。


今回使う「ファイルとディレクトリ」以外のデータ入力形式の詳しい設定方法については、今後 App の設定の中で説明する予定です。

③ 「新規」ボタンをクリックします。

splunk_setup_14.png

④ /var/log 配下のログファイルを取り込むよう指定します。

splunk_setup_16.png

今回は「サーバ上のフルパス」のみを設定して、あとはデフォルトのままで保存します。ここで保存した設定は、「$SPLUNK_HOME/etc/apps/search/local/inputs.conf」に保存されます。

いちおう、各項目の簡単な説明です。


ソース
Splunk に取り込むファイルや、ファイルが配置されているディレクトリを指定します。

ソースのセット:
特定のファイルやディレクトリを継続的にモニタする場合は、「ファイルまたはディレクトリをモニタ」を指定します。

オフラインのサーバ上のファイルを CD-ROM 等の媒体に格納して送付し、受け取ったファイルを Splunk サーバに読み込ませる、あるいはテスト用のサンプルログを読み込ませるといった場合には、「ローカルファイルをアップロード」や「Splunkサーバ上にあるファイルをインデックス」を指定します(直接クライアント PC からファイルをアップロードするか、最初に Splunk サーバにファイルをアップロードしておくかの違いです)。

サーバー上のフルパス:
モニタ対象のファイルをフルパスで指定します。

ここでのパスの指定に正規表現は使用できませんが、代わりに「...」や「*」といったワイルドカードが使えます。基本的には、「...」は全てのサブディレクトリに再帰的に適用されるワイルドカード、「*」は 1 階層のディレクトリにのみ適用されるワイルドカードと覚えておけばよいでしょう。詳細についてはマニュアルに具体的な例が出ているので、参照してみてください。

また、パスの指定にどうしても正規表現を使いたい場合は、ホワイトリストやブラックリストを使いましょう。

ホスト
Splunk が取り込んだデータをインデックス化する際には、後から検索がしやすいように様々な属性を自動的に付与します(ユーザが任意の属性を設定することも可能)。ここでは、ソースから取り込んだデータの host フィールドにどのような値をセットするかを指定します。

ホストのセット:
【継続した値】
特定のサーバが出力したファイルをソースに指定する際に使用します。「ホストフィールドの値」で指定したホスト名が host フィールドの値に設定されます。

Syslog サーバなどで、複数のサーバからのログが格納されているディレクトリをソースに指定すると、全てのログのソースが「ホストフィールドの値」で指定した名前に上書きされてしまうので注意してください。

【パスの正規表現】
複数のサーバからのログをそれぞれのサーバごとのログファイルに分けて書き込んでいる環境で、ファイル名の一部にサーバのホスト名が含まれている場合に使用します。

例えば、Syslog サーバでネットワーク機器の syslog を以下のようなファイルに書き込んでいるとします。

/var/log/networks/ROUTER01.log
/var/log/networks/SWITCH01.log
/var/log/networks/FIREWALL01.log

この場合に「ホストのセット: パスの正規表現」、「正規表現: /var/log/networks/(.*)\.log」を指定すると、それぞれのファイルに書き込まれたログをインデックス化する際に、host フィールドの値として ROUTER01 / SWITCH01 / FIREWALL01 が自動でセットされます。

【パス上のセグメント】
基本的には「パスの正規表現」と同じように複数サーバからログを受けている環境で使いますが、こちらはファイルのパスの一部にサーバのホスト名が含まれている場合に使用します。

例えば、Syslog サーバでネットワーク機器の syslog を以下のようなファイルに書き込んでいるとします。

/var/log/networks/BIGIP01/ltm
/var/log/networks/BIGIP01/gtm
/var/log/networks/ROUTER01/messages
/var/log/networks/FIREWALL01/accesslog
/var/log/networks/FIREWALL01/messages

この場合に「ホストのセット: パス上のセグメント」、「セグメント #: 4」を指定すると、それぞれのファイルに書き込まれたログをインデックス化する際に、host フィールドの値として BIGIP01 / ROUTER01 / FIREWALL01 が自動でセットされます。


ソースタイプ
sourcetype フィールドには通常、出力元のアプリケーションやログのカテゴリを表すような値が格納され、検索条件として利用されます。

/var/log など、様々なタイプのログが格納されるディレクトリをソースに指定する場合は、「ソースタイプのセット」を「自動」にしておけば Splunk が自動的にログを識別し、syslog や dmesg といった値をセットしてくれます。

また、自動で識別できないログがあった場合は、「ソースタイプのセット」を「リストから」にして一覧から選択するか、「手動」で値を直接入力することもできます。

インデックス
データの格納先となるインデックスを指定します。インデックスは検索条件として指定でき、バックアップやデータ削除などのメンテナンス操作の適用単位にもなるので、データボリュームが大きくなりそうな場合には独立したインデックスを使うとよいでしょう。

ちなみに、データ入力を追加する際に指定するインデックスは、その時点で作成済みである必要があります。まだ作成していない場合は、Splunk Manager の「インデックス」メニューから作成しておきましょう。

なお、今回のように「default」を指定した場合の動作ですが、ここでは Search App の画面から設定を追加しているため、まず Search App のデフォルトインデックスが格納先の候補になります。ただし、初期状態の Search App の設定ではデフォルトのインデックスを指定していないため、システムのデフォルトが検索され、最終的には main インデックスが格納先となります。

高度なオプション
各種オプションの設定を行います。

末尾の追跡:
既存のサイズの大きなファイルをソースに指定する際に、ファイルの中身を先頭から取り込む代わりに、今後追記されたデータのみを取り込むよう指定できます。ライセンス違反を回避したい場合や、既存の内容が不要な場合に設定するとよいでしょう。

ホワイトリスト (オプション):
指定した正規表現にマッチするファイルのみをデータ入力の対象として扱います。例えば、「\.log$」と指定した場合、ファイル名が「.log」で終わるファイルだけが対象になります。

ブラックリスト (オプション):
指定した正規表現にマッチするファイル以外をデータ入力の対象として扱います。例えば、「\.([0-9]+|gz)$」と指定した場合、ファイル名が「.1」「.2」「.gz」などで終わるファイルはデータ入力の対象外になります。


⑤ 画面左上の「Search に戻る」をクリックします。

splunk_setup_17.png

⑥ Search App のダッシュボードに表示される「インデックスされたすべてのデータ」に、取り込んだログの情報が表示されていることを確認します。

splunk_setup_19.png

⑦ 検索用のテキストボックスに適当なキーワード(ここでは「error」)を入力してリターンキーを押します。

splunk_setup_20.png

⑧ 検索結果が表示されます。

splunk_setup_26.png

ログに含まれる検索キーワードは黄色でハイライトされます。この画面で「error」というキーワードが「Error」にマッチしていることからわかる通り、検索条件で大文字・小文字は区別されません。

⑨ さらに絞込み検索を行いたい場合は、検索用のテキストボックスにキーワードを手動で追加するか、検索結果に含まれる単語をマウスでクリックします。ここでは先ほどの検索結果から、「sshd」という単語をクリックしてみます。

splunk_setup_27.png

⑩ 検索キーワードに「sshd」が追加され、「error」と「sshd」を含むログのみが検索結果に表示されます。

splunk_setup_28.png

ここまでの操作で一通りローカルの syslog メッセージの検索ができるようになりました。

同様の手順で Splunk サーバ上で動作する様々なアプリのログを監視することができますので、各自でデータ入力を追加してみて下さい。


本当はもっと進んでいる予定だったのですが、長くなったので一旦ここで区切ります。
次回はネットワーク機器からのリモート syslog の取り込みについてです。

テーマ : おすすめソフトウェア
ジャンル : コンピュータ

Splunk その4

15. リモート syslog の受信設定

今回は Cisco の Firewall アプライアンスである ASA の syslog を Splunk サーバで受信するよう設定を行っていきます。

【Splunk サーバ側の設定】

iptables の syslog 受信設定は前々回に実施済みですので、今回は rsyslogd の設定からです。

ここではリモート syslog の管理要件として、以下の 3 点を満たすこととします。

・リモートデバイスからの syslog メッセージは /var/log/remote ディレクトの下に「<ホスト名>.log」というファイルを作成して書き込む。
・メッセージには、facility と severity を書き込む。
・メッセージのタイムスタンプは、リモートとローカルの両方を書き込む。

/etc/rsyslog.conf に赤字の行を追記します。

# Use traditional timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Provides kernel logging support (previously done by rklogd)
$ModLoad imklog
# Provides support for local system logging (e.g. via logger command)
$ModLoad imuxsock
# Provides support for remote system logging (514/udp)
$ModLoad imudp
$UDPServerRun 514


# Templates
$template RemoteFile,"/var/log/remote/%fromhost%.log"
$template RemoteFormat,"%timegenerated% %fromhost% %syslogfacility-text%.%syslogseverity-text%: %rawmsg:::drop-last-lf%\n"


# Rules for remote messages
:fromhost-ip, !isequal, "127.0.0.1" -?RemoteFile;RemoteFormat
& ~
# Rules for local messages



# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console


# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages


# The authpriv file has restricted access.
authpriv.* /var/log/secure


# Log all the mail messages in one place.
mail.* -/var/log/maillog


# Log cron stuff
cron.* /var/log/cron


# Everybody gets emergency messages
*.emerg *


# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler


# Save boot messages also to boot.log
local7.* /var/log/boot.log

追加した行についての簡単な説明です。


$template RemoteFile,"/var/log/remote/%fromhost%.log"
RemoteFile という名前の動的ファイル名テンプレートを作成します。今回の例では %fromhost% の部分がメッセージの送信元ホスト名に置き換えられます。

$template RemoteFormat,"%timegenerated% %fromhost% %syslogfacility-text%.%syslogseverity-text%: %rawmsg:::drop-last-lf%\n"
RemoteFormat という名前の出力フォーマットテンプレートを作成します。今回の例では、%timegenerated% が rsyslogd がログを受け取った時間、%fromhost% が送信元ホスト名、%syslogfacility-text%.%syslogseverity-text% が local0.warn のような PRI のテキスト出力、%rawmsg:::drop-last-lf%\n が生ログの末尾の改行コードを \n に置き換えたものになります。

:fromhost-ip, !isequal, "127.0.0.1" -?RemoteFile;RemoteFormat
fromhost-ip が 127.0.0.1 以外のログを RemoteFormat の書式で RemoteFile に書き込みます。また、その際バッファリングを有効にします("-" オプション)。

& ~
「:fromhost-ip, !isequal, "127.0.0.1" ~」と同じ。条件にマッチするログ(=リモートデバイスから受け取ったログ)を破棄することで、続くローカルログのマッチング条件の適用対象外とします。

rsyslog.conf の書式についてもっと詳しく知りたい方は、rsyslog.conf の man ページや rpm パッケージインストール時に併せてインストールされる HTML マニュアル(パスは rpm -ql rsyslog で確認できます)を参照してください。

なお、ASA のログを監視する場合、rsyslog のバージョンや ASA 側の設定によっては %hostname% の置き換えが上手くいかなかったり、%msg% に含まれるタイムスタンプが中途半端だったりするため、テンプレートでのこれらのプロパティの使用は控えたほうがよいと思います。

ファイルを変更したら、rsyslogd の再起動を行います。
[root@splunk ~]# service rsyslog restart
システムロガーを停止中: [ OK ]
システムロガーを起動中: [ OK ]

/etc/logrotate.d/syslog を編集して、新たに作成するログファイルを logrotate によるローテートの対象に追加します。

CentOS のデフォルトの設定では、syslog 関連のファイルは週時でローテートされ、過去4世代分のファイルがディスク上に保存されます。過去のログについては Splunk 側でも生データとして保持しているため、保存期間については基本的に Splunk 側のリテンションポリシーで指定することとして、ここでは過去 1 世代分のみをディスクに保存するよう設定します。

/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
/var/log/remote/*\.log {
rotate 1
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

また、/etc/hosts に ASA の名前解決のためのエントリを追加します。

192.168.100.254 asa.example.jp asa


以上で Splunk サーバ側での準備は完了です。

【ASA 側の設定】

次は ASA 側の設定です。今回は informational 以上の重要度を持つ全てのログを splunk サーバ(IPアドレス:192.168.100.100)に転送し、自身のバッファログにも書き込むため、以下のようなコマンドを投入します。

logging enable
logging timestamp
logging buffer-size 128000
logging buffered informational
logging trap informational
logging host inside 192.168.100.100


重要度が informational のログは不要ということで、logging trap コマンドで notifications 以上の重要度を指定する場合、トラフィックの permit / deny ログを監視するためには指定したものと同等かそれ以上の重要度をアクセスリストの log オプションの後に付加する必要がある点に注意してください(トラフィックログのデフォルトの重要度が informational のため)。

通知対象メッセージの重要度を notifications 以上に設定する場合の例です。

access-list outside extended deny ip any any log notifications

logging trap notifications


なお、ASA 側で特に指定しなかった場合、メッセージの facility は local4 になります。この値は logging facility コマンドで変更できますが、IOS ベースのルータやスイッチと異なり、コマンドで指定する引数は local0 ~ local8 の facility に割り当てられた code の値であるため、実際に設定を行うコマンドとしては以下のいずれかになります。

logging facility 16   ! facility = local0
logging facility 17   ! facility = local1
logging facility 18   ! facility = local2
logging facility 19   ! facility = local3
logging facility 20   ! facility = local4 (default)
logging facility 21   ! facility = local5
logging facility 22   ! facility = local6
logging facility 23   ! facility = local7
logging facility 24   ! facility = local8


ASA で上記コマンドを投入したら、show logging コマンドで動作確認を行い、設定を保存して下さい。

【Splunk サーバでの確認】

設定が完了したら、Splunk サーバ側でログが出力されていることを確認しましょう。

ログの出力例はこんな感じです。

[root@splunk ~]# tail /var/log/remote/asa.log
Jan 30 06:40:03 asa local4.info: <166>Jun 30 2011 06:39:58: %ASA-6-106100: access-list inside denied tcp inside/192.168.100.1(54442) -> outside/172.16.0.1(8000) hit-cnt 1 first hit [0xd820e56a, 0x0]


ちなみに、今回の例で作成されるログファイルの所有者は root、パーミッションはディレクトリ(remote)が 700、ファイル(asa.log)が 600 になります。Splunk を一般ユーザで起動している場合には権限不足で読み取りができませんので、ログファイルの読み取り権限を与えるよう rsyslog.conf に設定追加が必要となります。

なお、rsyslog を RPM でインストールしている場合の注意事項として、/etc/sysconfig/rsyslog に SYSLOG_UMASK 環境変数が設定されていない場合、起動スクリプトの中で自動的に「077」が設定されるため、rsyslog.conf の中で「$FileCreateMode 0644」と指定しても実際のパーミッションが 600 になってしまいます。この問題を回避するには、$FileOwner / $FileGroup でファイルの所有者を変更するか、/etc/sysconfig/rsyslog に「SYSLOG_UMASK=022」を追加した上で rsyslog.conf 内でパーミッションを適切に設定するといった方法があります(誤って既存のファイルの所有者/パーミッションまで変更してしまわないように十分に注意してください)。

テーマ : おすすめソフトウェア
ジャンル : コンピュータ

Splunk その5

# バージョン 4.1.7 がリリースされたため、今回から使用している Splunk のバージョンが上がっています。

16. App とは

App の作成に入る前に、「そもそも App ってなに?」という方のために簡単に解説しておくと、Splunk の App というのは特定の用途向けにカスタマイズされたビューやデータ入力、各種 Web コンテンツのパッケージです。よく使われるものとして、例えば UNIX や Linux システムを管理するための Splunk for Unix and Linux(*NIX)、Windows システムを管理するための Splunk for Windows などがあります。

Splunk には初期状態で Search や Launcher などいくつかの App がインストールされていますが、そうした非常に汎用的、もしくは単機能の App では必要な機能要件を満たせない場合には、ユーザが自分で App を作成するか、Splunkbase という Web サイトから Splunk や 3rd Party ベンダー、あるいは個人が作成したものをダウンロードして使用することになります(Splunkbase で公開されている App は基本的に無償のものが多いですが、一部は有償です)。

17. App の作成

それでは、Splunk サーバ上のログファイルに書き込まれた ASA の Firewall ログを表示するための簡単な App を作成していきましょう。今回作成する App の機能要件は以下とします。

・検索条件の入力なしに Firewall ログの表示が可能
・ホスト名や送信元/宛先アドレス、ポート番号、インターフェース名によるフィルタが可能

※ ここで言っている Firewall ログの中身については、後ほど詳しく説明します。

① Syslog App を作成する

まずは管理メニューから「Apps」をクリックします。

splunk_setup_5-1.png

「新規Appの作成」ボタンをクリックします。

splunk_setup_5-2.png

新規追加画面で必要事項を入力し、「保存」ボタンをクリックします。

splunk_setup_5-3.png

Apps 画面に戻ったら、画面上部の「管理から再起動するには、ここをクリックしてください。」をクリックします。

splunk_setup_5-4.png

「Splunkの再起動」をクリックします。

splunk_setup_5-5.png

「OK」をクリックします。

splunk_setup_5-6.png

再起動完了後、Launcher もしくは画面右上の App メニューから、先ほど作成した Syslog App を選択します。

splunk_setup_5-7.png

Syslog App の初期画面として検索画面が表示されるので、試しにそのままリターンキーを押すか、テキストボックスの右側にある緑色の検索ボタンをクリックしてみましょう。

splunk_setup_5-7-1.png

※ ここでは検索条件を指定していないため、デフォルトのインデックスである main インデックスに格納されている全てのログが表示されています。また、表示形式は元のログをそのまま表示するイベントリスト形式になっています。

ここまでの操作で、App の雛形が出来ました。

② フィールド抽出

App を作成した後は、そこに載せるビューを作成していくことになるのですが、その前に今回管理対象となるログについて少し考えてみましょう。

まず、第一の要件である「検索条件の入力なしに Firewall ログの表示が可能」を実現するには、最初から Firewall ログのみを表示する検索条件を指定しておく必要があります。それでは、この検索条件は具体的にどのようなものになるでしょうか。

ここで言う Firewall ログとは、ASA の ACL によってトラフィックが許可もしくは拒否された時に出力されるもので、具体的には以下の 2 種類のログを指します。

Feb 13 00:11:27 asa local4.warn: <164>Jul 04 2011 19:24:26: %ASA-4-106023: Deny udp src inside:192.168.100.1/1900 dst identity:239.255.255.250/1900 by access-group "inside" [0xd820e56a, 0x0]

Feb 13 01:40:26 asa local4.info: <166>Jul 04 2011 20:53:23: %ASA-6-106100: access-list inside denied udp inside/192.168.100.1(1900) -> NP Identity Ifc/239.255.255.250(1900) hit-cnt 18 300-second interval [0xd820e56a, 0x0]

上段のログは、特別な設定をしなくてもアクションが拒否(deny)の ACE にマッチするトラフィックがあった時に常に出力されるもので、下段は許可・拒否に関わらず、ACL にログオプションを付けた際に出力されるログになります。なお、アクションが拒否の ACE にログオプションを指定した場合は、下段のフォーマットが優先となります。

それぞれのログの種別をユニークに識別可能なキーワードとしては、syslogtag の「%ASA-4-106023」および「%ASA-6-106100」がありますが、4 や 6 といった中央の数字は Syslog の priority であり、ASA の設定によって変化する可能性があるため、実際の検索ワードは「%ASA-*-106023」および「%ASA-*-106100」(* は任意の文字列にマッチ)になります。

それでは、2 番目の要件はどうでしょうか。ログの出力形式を見てみると、「ホスト名や送信元/宛先アドレス、ポート番号、インターフェース名によるフィルタが可能」という要件については、検索条件を細かく指定するだけでは対応が難しいことがわかります。というのも、送信元と宛先の情報を区別するための情報は、メッセージ内での出現位置だけだからです。例えば検索条件としてポート番号を「(1900)」と指定しても、それが送信元ポートなのか、宛先ポートなのかを指定することはできません。

こうした状況に対処するため、Splunk は正規表現によるフィールド抽出の機能を提供しています。フィールド抽出とは、ログを意味のあるブロック単位に切り出してユーザが定義したフィールドに値を格納することで、切り出した値を検索条件に使用したり、テーブル形式で表示を行う際のカラムとして使用するための機能です。

例えば、下段のログは以下のようなフォーマットで構成されています。

[timestamp] [hostname] [facility].[priority]: <PRE>[timestamp]: [syslogtag]: access-list [acl-name] [action] [protocol] [source_if]/[source_address]([source_port]) -> [dest_if]/[dest_address]([dest_port]) hit-cnt [hit_count] [misc]

ここで、[syslogtag] の位置にある文字列を syslogtag というフィールドに格納することができれば、検索条件として「syslogtag=%ASA-*-106100」という指定が可能になるわけです。

今回の App のためにフィールド抽出を行うには、以下の 2 つのファイルを作成してエントリを追加します。

$SPLUNK_HOME/etc/apps/syslog/local/props.conf
[syslog]
REPORT-asa = asa-106023 asa-106100

$SPLUNK_HOME/etc/apps/syslog/local/transforms.conf
[asa-106100]
REGEX = \s(\w+)\.(\w+): \<\d+\>(\w{3} \d{2} \d{4} \d{2}:\d{2}:\d{2}): (%ASA-\d-106100): access-list (\S+) (\S+) (\S+) (\S+)/(\S+)\((\d+)\) -> (\S+)/(\S+)\((\d+)\) hit-cnt (\d)
FORMAT = facility::$1 priority::$2 timegenerated::$3 syslogtag::$4 acl::$5 action::$6 protocol::$7 src_if::$8 src_addr::$9 src_port::$10 dst_if::$11 dst_addr::$12 dst_port::$13 hit_count::$14

[asa-106023]
REGEX = \s(\w+)\.(\w+): \<\d+\>(\w{3} \d{2} \d{4} \d{2}:\d{2}:\d{2}): (%ASA-\d-106023): Deny (\S+) src (\S+):(\S+)/(\S+) dst (\S+):(\S+)/(\S+) by access-group "(\S+)"
FORMAT = facility::$1 priority::$2 timegenerated::$3 syslogtag::$4 action::denied protocol::$5 src_if::$6 src_addr::$7 src_port::$8 dst_if::$9 dst_addr::$10 dst_port::$11 acl::$12

上記 2 つのファイルで具体的に何をしているかについては、きちんと説明するとかなり長くなってしまうので、後日まとめて解説します。基本的には、transforms.conf で定義したフィールド抽出の定義を props.conf で source=syslog のイベントに対して適用するという動作になるのですが、この説明だけではイメージがつきにくいと思いますので、とりあえずここではそういう設定が必要なんだ、と思っていていただければ結構です。

③ ビューの作成

Splunk の用語で、ビューとは App を構成する一つ一つの画面を意味します。各ビューの実体は XML ファイルであり、ブラウザのアドレスバーに表示されているURL の末尾に「?showsource=1」を付け足すことでソースコードを参照することが可能です。例えば、Search App のダッシュボードの XML ソースは下記 URL から参照することが可能です。

http://<hostname>:8000/ja-JP/app/search/dashboard?showsource=1


上記 URL にアクセスすると、以下のようなソースが表示されます。

<view autoCancelInterval="90" isPersistable="true" isSticky="true" isVisible="true" objectMode="viewconf" onunloadCancelJobs="true" stylesheet="dashboard2.css" template="dashboard.html">
<label>Summary</label>
<module name="AccountBar" layoutPanel="appHeader"/>
<module name="AppBar" layoutPanel="navigationHeader"/>
<module name="Message" layoutPanel="messaging">
<param name="filter">*</param>
<param name="clearOnJobDispatch">False</param>
<param name="maxSize">1</param>
</module>
<module name="TitleBar" layoutPanel="viewHeader">
<param name="actionsMenuFilter">dashboard</param>
</module>
<module name="SearchBar" layoutPanel="splSearchControls-inline">
<param name="useOwnSubmitButton">False</param>
<param name="useTypeahead">true</param>
<param name="useAssistant">true</param>
<module name="TimeRangePicker">
<param name="searchWhenChanged">False</param>
<param name="selected">All time</param>
<module name="SubmitButton">
<param name="allowSoftSubmit">True</param>
<module name="ViewRedirector" layoutPanel="viewHeader">
<param name="viewTarget">flashtimeline</param>
</module>
</module>
</module>
</module>
<module name="HiddenSearch" layoutPanel="panel_row1_col1" group="Global summary" autoRun="true">
<param name="groupLabel">グローバルサマリー</param>
<param name="search">| metadata type=hosts</param>
<param name="maxCount">100000</param>
<module name="HiddenPostProcess">
<param name="search">| stats sum(totalCount)</param>
<module name="SingleValue">
<param name="beforeLabel">Events indexed</param>
<param name="format">number</param>
</module>
</module>
<module name="HiddenPostProcess">
<param name="search">| stats min(firstTime) as min | convert ctime(min)</param>
<module name="SingleValue">
<param name="beforeLabel">Earliest event</param>
<param name="format">unixtime</param>
</module>
</module>
<module name="HiddenPostProcess">
<param name="search">| stats max(lastTime) as max | convert ctime(max)</param>
<module name="SingleValue">
<param name="beforeLabel">Latest event</param>
<param name="format">unixtime</param>
</module>
</module>
</module>
<module name="StaticContentSample" layoutPanel="panel_row2_col1" group="All indexed data">
<param name="text">This lists all of the data you have loaded into your default indexes, based on data recency. <a href="/manager/search/datainputstats"> Add more data</a> via Manager.</param>
<param name="groupLabel">インデックスされたすべてのデータ</param>
</module>
<module name="HiddenSearch" layoutPanel="panel_row2_col1_grp1" autoRun="true">
<param name="search">| metadata type=sources | search totalCount>0</param>
<param name="maxCount">100000</param>
<module name="SimpleResultsHeader">
<param name="entityName">results</param>
<param name="headerFormat">Sources (%(count)s)</param>
</module>
</module>
<module name="Sorter" layoutPanel="panel_row2_col1_grp1">
<param name="fields">
<list>
<param name="value">source</param>
<param name="label">Source</param>
</list>
<list>
<param name="value">totalCount</param>
<param name="label">Total Count</param>
</list>
<list>
<param name="value">lastTime</param>
<param name="label">Last Updated</param>
</list>
</param>
<param name="sortDir">desc</param>
<param name="sortKey">lastTime</param>
<module name="Paginator">
<param name="count">10</param>
<param name="entityName">settings</param>
<param name="maxPages">10</param>
<module name="SearchLinkLister">
<param name="settingToCreate">list1</param>
<param name="search">| metadata type=sources | search totalCount>0</param>
<param name="searchFieldsToDisplay">
<list>
<param name="value">source</param>
<param name="label">source</param>
</list>
<list>
<param name="labelFormat">number</param>
<param name="label">totalCount</param>
</list>
</param>
<module name="ConvertToIntention">
<param name="settingToConvert">list1</param>
<param name="intention">
<param name="name">addterm</param>
<param name="arg">
<param name="source">$target$</param>
</param>
</param>
<module name="ViewRedirector">
<param name="uriParam.auto_pause">true</param>
<param name="viewTarget">flashtimeline</param>
</module>
</module>
</module>
</module>
</module>
<module name="HiddenSearch" layoutPanel="panel_row2_col1_grp2" autoRun="true">
<param name="search">| metadata type=sourcetypes | search totalCount>0</param>
<param name="maxCount">100000</param>
<module name="SimpleResultsHeader">
<param name="entityName">results</param>
<param name="headerFormat">Sourcetypes (%(count)s)</param>
</module>
</module>
<module name="Sorter" layoutPanel="panel_row2_col1_grp2">
<param name="fields">
<list>
<param name="value">sourcetype</param>
<param name="label">Sourcetype</param>
</list>
<list>
<param name="value">totalCount</param>
<param name="label">Total Count</param>
</list>
<list>
<param name="value">lastTime</param>
<param name="label">Last Updated</param>
</list>
</param>
<param name="sortDir">desc</param>
<param name="sortKey">lastTime</param>
<module name="Paginator">
<param name="count">10</param>
<param name="entityName">settings</param>
<param name="maxPages">10</param>
<module name="SearchLinkLister">
<param name="settingToCreate">list2</param>
<param name="search">| metadata type=sourcetypes | search totalCount>0</param>
<param name="searchFieldsToDisplay">
<list>
<param name="value">sourcetype</param>
<param name="label">sourcetype</param>
</list>
<list>
<param name="labelFormat">number</param>
<param name="label">totalCount</param>
</list>
</param>
<module name="ConvertToIntention">
<param name="settingToConvert">list2</param>
<param name="intention">
<param name="name">addterm</param>
<param name="arg">
<param name="sourcetype">$target$</param>
</param>
</param>
<module name="ViewRedirector">
<param name="uriParam.auto_pause">true</param>
<param name="viewTarget">flashtimeline</param>
</module>
</module>
</module>
</module>
</module>
<module name="HiddenSearch" layoutPanel="panel_row2_col1_grp3" autoRun="true">
<param name="search">| metadata type=hosts | search totalCount>0</param>
<param name="maxCount">100000</param>
<module name="SimpleResultsHeader">
<param name="entityName">results</param>
<param name="headerFormat">Hosts (%(count)s)</param>
</module>
</module>
<module name="Sorter" layoutPanel="panel_row2_col1_grp3">
<param name="fields">
<list>
<param name="value">host</param>
<param name="label">Host</param>
</list>
<list>
<param name="value">totalCount</param>
<param name="label">Total Count</param>
</list>
<list>
<param name="value">lastTime</param>
<param name="label">Last Updated</param>
</list>
</param>
<param name="sortDir">desc</param>
<param name="sortKey">lastTime</param>
<module name="Paginator">
<param name="count">10</param>
<param name="entityName">settings</param>
<param name="maxPages">10</param>
<module name="SearchLinkLister">
<param name="settingToCreate">list3</param>
<param name="search">| metadata type=hosts | search totalCount>0</param>
<param name="searchFieldsToDisplay">
<list>
<param name="value">host</param>
<param name="label">host</param>
</list>
<list>
<param name="labelFormat">number</param>
<param name="label">totalCount</param>
</list>
</param>
<module name="ConvertToIntention">
<param name="settingToConvert">list3</param>
<param name="intention">
<param name="name">addterm</param>
<param name="arg">
<param name="host">$target$</param>
</param>
</param>
<module name="ViewRedirector">
<param name="uriParam.auto_pause">true</param>
<param name="viewTarget">flashtimeline</param>
</module>
</module>
</module>
</module>
</module>
</view>

ユーザが独自のビューを作成する際には、こうした XML コードを自分で書く必要があります。また、ビューを作成するための XML の書式には簡易 XML (Simple XML)と拡張 XML(Advanced XML)という 2 通りの書式があり、それぞれ以下のような特徴があります。

簡易 XML:
出来ることは限られるが、書式が単純。また一部については Splunk Web のダッシュボードの編集画面(UI ビルダー)からコード生成が可能。

拡張 XML:
全ての機能が利用可能だが、書式が複雑。上記 Search App の View も拡張書式で記述されています。


今回は基本となる簡易 XML を使用して App を作成していきます。

【ダッシュボードの作成】

まずはイベントを表示するだけのシンプルなダッシュボードを作成してみます。

Syslog App の管理メニューから、「ユーザーインターフェース」をクリックします。

splunk_setup_5-8.png

ビューの「新規追加」をクリックします。

splunk_setup_5-9.png

ビュー名に「asa-dashboard」、ビュー XML に以下の内容を貼り付けて、保存ボタンをクリックします。

<dashboard>
<label>ASA Dashboard</label>
<row>
<table>
<searchString>syslogtag="%ASA-*-106100" OR syslogtag="%ASA-*-106023"</searchString>
<title>Firewall Log</title>
<earliestTime></earliestTime>
<latestTime></latestTime>
<fields>timegenerated,host,priority,acl,action,protocol,src_if,src_addr,src_port,dst_if,dst_addr,dst_port,hit_count</fields>
<option name="count">25</option>
<option name="displayRowNumbers">false</option>
<option name="drilldown">all</option>
<option name="showPager">true</option>
</table>
</row>
</dashboard>

splunk_setup_5-10.png

ダッシュボードが作成されたことを確認し、画面左上の「Syslog App に戻る」をクリックします。

splunk_setup_5-11.png

画面上部のナビゲーションメニューから、「Dashboards > ASA Dashboard」をクリックします。

splunk_setup_5-12.png

ASA Dashboard の画面で、Firewall ログの一覧が表形式で表示されることを確認します。

splunk_setup_5-13.png

以上でダッシュボードの作成は完了です。なお、今回はイベントリストを表示していますが、ダッシュボードの用途としては、どちらかというとグラフやタイムチャートの表示が主になると思います(過去 1 時間の CPU / メモリ使用率と重要イベント、といった形でイベントリストが使われることはもちろんありますが)。

というのも、大量のイベントを表示してもダッシュボードではそれを絞り込む手段がないためで、そうした場合には次に説明するフォーム検索を使用するのが一般的です。

【フォーム検索の作成】

ダッシュボードでは、あらかじめ指定された検索条件に適合するログの一覧を表示することができますが、ユーザが同じ画面から検索条件を変更することはできません。

先ほど作成したダッシュボードの例で言うと、「192.168.0.1」という送信元アドレスからのトラフィックに関するログのみが見たい場合、全てのログの中からページを切り替えて src_addr が 192.168.0.1 になっているものを探し出す必要があります。

これに対して、フォーム検索ビューでは、ベースとなる検索条件式に対してテキストボックスやプルダウンメニュー、チェックボックスなどの形で追加の検索条件を指定することができます。

ここでは、先ほど作成したダッシュボードをベースとして、検索条件を指定するためのテキストボックスを追加したフォームを作成してみましょう。

まず、先ほどと同じ手順で「asa-form」という名前のビューを作成します。ビュー XML には、以下の内容を貼り付けます。

<form>
<label>ASA Form</label>
<fieldset>
<input type="text" token="searchword">
<label>Search Word</label>
<default>*</default>
</input>
</fieldset>

<row>
<table>
<searchString>$searchword$ syslogtag="%ASA-*-106100" OR syslogtag="%ASA-*-106023"</searchString>
<title>Firewall Log</title>
<fields>timegenerated,host,priority,acl,action,protocol,src_if,src_addr,src_port,dst_if,dst_addr,dst_port,hit_count</fields>
<option name="count">25</option>
<option name="displayRowNumbers">false</option>
<option name="drilldown">all</option>
<option name="showPager">true</option>
</table>
</row>
</form>

splunk_setup_5-14.png

画面上部のナビゲーションメニューから、「ビュー > ASA Form」をクリックします。

splunk_setup_5-15.png

フォーム検索画面が表示されたら、まずはテキストボックスに何も入力せずに検索ボタンをクリックし、全ての Firewall ログが表示されることを確認します。

splunk_setup_5-17.png

次に、テキストボックスに「protocol=icmp」と入力して検索ボタンをクリックし、ICMP のエントリのみが表示されることを確認します。

splunk_setup_5-18.png

以上でフォーム検索ビューの作成は完了です。

今回はひとまずここまでにして、今回作成したビューを使った簡易 XML の構文の説明を次回以降で行っていきます。

テーマ : おすすめソフトウェア
ジャンル : コンピュータ

プロフィール

米麹

筆者: 米麹
某社に勤務する SE です。
ここでは本職とは関係のない趣味的な検証情報などを書いていきます。

注意事項とお願い
記事の内容は掲載時点のもので、現在は異なる可能性があります。情報に誤りや不適切な事項があった場合には、コメントやメールフォームでご指摘下さい。
また、本サイトの情報を利用することによって生じたいかなる損害についても、筆者は責任を負いかねますのでご了承下さい。
カレンダー
09 | 2018/10 | 11
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
最新記事
月別アーカイブ
カテゴリ
全記事表示リンク

全ての記事を表示する

検索フォーム
メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。