Ubuntu 14.04でRsyslog、Logstash、およびElasticsearchを使用してログを中央集約する方法
Elasticに関する記事
紹介
あなたの組織が生成する数百万のログ行を理解することは、非常に困難な課題です。一方では、これらのログ行はアプリケーションのパフォーマンス、サーバーのパフォーマンスメトリクス、そしてセキュリティの視点を提供します。他方では、ログの管理と分析は非常に時間がかかる可能性があり、これらのますます必要とされるサービスの採用を妨げることがあります。
rsyslog、Elasticsearch、Logstashなどのオープンソースソフトウェアは、ログデータを送信、変換、保存するためのツールを提供します。
このチュートリアルでは、複数のシステムからのログファイルを保存するための中央集中的なrsyslogサーバーを作成し、その後Logstashを使ってElasticsearchサーバーに送信する方法を学びます。そこから、データをどのように分析するかを決定できます。
目標
このチュートリアルでは、syslogによって生成または受信されたログを中心化する方法、特にrsyslogとして知られるバリアントについて説明します。Syslog、およびrsyslogのようなsyslogベースのツールは、カーネルやUNIX系サーバーを運営するために実行される多くのプログラムから重要な情報を収集します。Syslogは標準であり、単なるプログラムではないため、多くのソフトウェアプロジェクトがデータをsyslogに送信することをサポートしています。このデータを中心化することで、セキュリティの監査、アプリケーションの挙動の監視、その他の重要なサーバー情報の追跡が容易になります。
中央集約型のrsyslogサーバーから、データをLogstashに転送でき、Logstashはログデータをさらに解析・強化した後、Elasticsearchに送信することができます。
このチュートリアルの最終目標は:
- 単一のクライアント(またはフォワーディング)rsyslogサーバーを設定する
- 単一のサーバー(または収集用の)rsyslogサーバーを設定し、rsyslogクライアントからログを受信する。
- rsyslog収集サーバーからメッセージを受信するためにLogstashインスタンスを設定します。
- Logstashからデータを受信するためのElasticsearchサーバーを設定します。
前提条件
同じDigitalOceanデータセンター内で、プライベートネットワーキングを有効にした以下のDropletsを作成してください:
- Ubuntu 14.04 のドロップレット名は rsyslog-client です。
- 中央集約ログが保存され、Logstashがインストールされるrsyslog-serverという名前の1 GB以上のUbuntu 14.04 Droplet
- ElasticsearchがインストールされたUbuntu 14.04のDroplet(ドロップレット)を、Ubuntu 14.04にElasticsearchをインストールして構成する方法から。
これらのサーバーそれぞれにsudo権限を持つ非rootユーザーが必要です。初期サーバー設定に関するUbuntu 14.04の説明では、これを設定する方法が記載されています。
注意: パフォーマンスを最大化するために、Logstashはデフォルトで1ギガバイトのメモリを割り当てようとしますので、中央サーバーインスタンスのサイズを適切に設定してください。
Dropletを作成する際にプライベートネットワークを有効にする方法については、「DigitalOceanのプライベートネットワーキングの設定と使用方法」を参照してください。
プライベートネットワーキングなしでDropletsを作成した場合は、「既存のDropletsでDigitalOceanプライベートネットワーキングを有効にする方法」を参照してください。
ステップ 1 — プライベート IP アドレスの特定
このセクションでは、各DropletにどのプライベートIPアドレスが割り当てられているかを確認します。この情報はチュートリアルを通じて必要になります。
各Dropletでifconfigコマンドを使用してIPアドレスを見つけます。
- sudo ifconfig -a
-aオプションはすべてのインターフェースを表示するために使用されます。主要なイーサネットインターフェースは通常、eth0と呼ばれます。しかし、この場合、私たちはeth1からのIP、すなわちプライベートIPアドレスを求めています。これらのプライベートIPアドレスはインターネット上でルーティングできず、プライベートLAN内で通信するために使用されます — この場合、同じデータセンター内のサーバー間でセカンダリインターフェースを介して通信します。
出力は次のようになります:
eth0 Link encap:Ethernet HWaddr 04:01:06:a7:6f:01
inet addr:123.456.78.90 Bcast:123.456.78.255 Mask:255.255.255.0
inet6 addr: fe80::601:6ff:fea7:6f01/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:168 errors:0 dropped:0 overruns:0 frame:0
TX packets:137 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:18903 (18.9 KB) TX bytes:15024 (15.0 KB)
eth1 Link encap:Ethernet HWaddr 04:01:06:a7:6f:02
inet addr:10.128.2.25 Bcast:10.128.255.255 Mask:255.255.0.0
inet6 addr: fe80::601:6ff:fea7:6f02/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:468 (468.0 B) TX bytes:398 (398.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
ここで注意すべきセクションはeth1であり、その中のinet addrです。この場合、プライベートネットワークアドレスは10.128.2.25です。このアドレスは、プライベートネットワーキングが有効な同じリージョン内の他のサーバーからのみアクセス可能です。
このステップを3つのDropletすべてに対して繰り返してください。これらのプライベートIPアドレスを安全な場所に保存してください。このチュートリアル全体で使用されます。
ステップ2 — Elasticsearchのバインドアドレスの設定
前提条件の一環として、独自のDropletにElasticsearchをセットアップします。「Ubuntu 14.04にElasticsearchをインストールして構成する方法」というチュートリアルでは、他のサーバーがサービスにアクセスできないように、バインドアドレスをlocalhostに設定する方法を説明しています。しかし、Logstashがそのプライベートネットワークアドレスを介してデータを送信できるように、これを変更する必要があります。
私たちはElasticsearchをそのプライベートIPアドレスにバインドします。ElasticsearchはこのIPアドレスへのリクエストのみに応答します。
Elasticsearchサーバーで、設定ファイルを編集します:
- sudo nano /etc/elasticsearch/elasticsearch.yml
network.bind_hostを含む行を見つけます。それがコメントアウトされている場合は、行の先頭にある#文字を削除してコメントを解除します。値をElasticsearchサーバーのプライベートIPアドレスに変更します。次のようになります:
network.bind_host: private_ip_address
最後に、変更を有効にするためにElasticsearchを再起動してください。
- sudo service elasticsearch restart
警告: Elasticsearch に接続するのを許可するサーバーは信頼できるものである必要があります。iptablesを使用することを強くお勧めします。このチュートリアルでは、Logstashが実行されているrsyslog-serverドロップレットのプライベートIPアドレスのみを信頼したいと考えています。
ステップ3 — 中央サーバーのデータ受信設定
このセクションでは、他のsyslogサーバーからポート514でデータを受信できるようにrsyslog-server Dropletを集中型サーバーとして設定します。
rsyslog-serverが他のsyslogサーバーからデータを受信するように設定するには、rsyslog-serverのDroplet上の/etc/rsyslog.confを編集します:
- sudo nano /etc/rsyslog.conf
rsyslog.confで既にコメントアウトされているこれらの行を見つけてください:
provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
各セクションの最初の行($ModLoad imudp および $ModLoad imtcp)は、それぞれ imudp と imtcp モジュールをロードします。 imudp は input module udp の略で、 imtcp は input module tcp の略です。これらのモジュールは、他の syslog サーバーからのデータを受信するためにリッスンします。
各セクションの二行目($UDPServerRun 514 および $TCPServerRun 514)は、rsyslogがこれらのプロトコルに対してそれぞれのUDPおよびTCPサーバーをポート514でリッスンするように開始する必要があることを示しています(これはsyslogのデフォルトポートです)。
これらのモジュールとサーバーを有効にするには、行のコメントを解除してファイルに次の内容を含めます:
provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
rsyslogの設定ファイルを保存して閉じてください。
次のコマンドを実行してrsyslogを再起動します:
- sudo service rsyslog restart
あなたの集中型rsyslogサーバーは、リモートsyslog(rsyslogを含む)インスタンスからのメッセージを受信するように設定されました。
ヒント: rsyslog 設定ファイルを検証するには、sudo rsyslogd -N1 コマンドを実行できます。
ステップ4 — rsyslogの設定をリモートでデータ送信するために
このセクションでは、前のステップで設定したrsyslog-serverドロップレットにログデータを送信するためのrsyslog-clientを構成します。
Ubuntuのデフォルトのrsyslog設定では、/etc/rsyslog.dに2つのファイルがあります:
20-ufw.conf50-default.confrsyslog-clientで、デフォルトの設定ファイルを編集します:
- sudo nano /etc/rsyslog.d/50-default.conf
ファイルの先頭に以下の行を追加してください。log by facilityセクションの前に、private_ip_of_ryslog_serverをあなたのプライベートIPに置き換えた集中型サーバーのものにします:
*.* @private_ip_of_ryslog_server:514
ファイルを保存して終了します。
行の最初の部分(.)は、すべてのメッセージを送信することを意味します。このチュートリアルの範囲外ですが、rsyslogを設定して特定のメッセージのみを送信することもできます。行の残りの部分は、データをどのように送信するか、そしてどこに送信するかを説明しています。私たちの場合、IPアドレスの前にある@記号は、rsyslogにメッセージを送信するためにUDPを使用することを指示します。これを@@に変更すると、TCPを使用することになります。次に、rsyslogとLogstashがインストールされたrsyslog-serverのプライベートIPアドレスが続きます。コロンの後の数値は使用するポート番号です。
変更を有効にするためにrsyslogを再起動します:
- sudo service rsyslog restart
おめでとうございます!あなたは今、syslogメッセージを集中サーバーに送信しています!
ヒント: rsyslog 設定ファイルを検証するには、sudo rsyslogd -N1 コマンドを実行できます。
ステップ5 — ログデータをJSON形式にフォーマットする
Elasticsearchは、受け取るすべてのドキュメントがJSON形式であることを要求し、rsyslogはテンプレートを使用してこれを実現する方法を提供します。
このステップでは、中央集権的なrsyslogサーバーを構成して、ログデータをLogstashに送信する前にJSONテンプレートを使用してフォーマットします。その後、Logstashはそれを別のサーバーのElasticsearchに送信します。
バックエンドのrsyslog-serverサーバーで、新しい設定ファイルを作成して、メッセージをLogstashに送信する前にJSON形式にフォーマットします:
- sudo nano /etc/rsyslog.d/01-json-template.conf
以下の内容を、示された通りにファイルに正確にコピーしてください:
template(name="json-template"
type="list") {
constant(value="{")
constant(value="\"@timestamp\":\"") property(name="timereported" dateFormat="rfc3339")
constant(value="\",\"@version\":\"1")
constant(value="\",\"message\":\"") property(name="msg" format="json")
constant(value="\",\"sysloghost\":\"") property(name="hostname")
constant(value="\",\"severity\":\"") property(name="syslogseverity-text")
constant(value="\",\"facility\":\"") property(name="syslogfacility-text")
constant(value="\",\"programname\":\"") property(name="programname")
constant(value="\",\"procid\":\"") property(name="procid")
constant(value="\"}\n")
}
最初と最後を除いて、このテンプレートで生成された行は、行の先頭にコンマがあることに注意してください。これは、JSON構造を維持するためと、すべてを整然と並べることでファイルの読みやすさを保つためです。このテンプレートは、ElasticsearchとLogstashが受け取ることを期待する方法でメッセージをフォーマットします。これが彼らの見た目になります:
{
"@timestamp" : "2015-11-18T18:45:00Z",
"@version" : "1",
"message" : "Your syslog message here",
"sysloghost" : "hostname.example.com",
"severity" : "info",
"facility" : "daemon",
"programname" : "my_program",
"procid" : "1234"
}
ヒント: rsyslog.comのドキュメントには、ログデータをカスタマイズするためにrsyslogから利用可能な変数が示されています。ただし、Logstashに送信し、その後Elasticsearchに送信するには、JSON形式で送信する必要があります。
送信されているデータはまだこのフォーマットを使用していません。次のステップでは、このテンプレートファイルを使用するようにサーバーを設定する方法を示します。
ステップ6 — Logstashに送信するための集中サーバーの設定
適切なJSONフォーマットを定義するテンプレートファイルができたので、このチュートリアルのために同じDroplet上にあるLogstashにデータを送信するように、集中型rsyslogサーバーを設定しましょう。
起動時に、rsyslogは/etc/rsyslog.d内のファイルを調べて、それらから設定を作成します。設定を拡張するために、自分の設定ファイルを追加しましょう。
rsyslog-serverで、/etc/rsyslog.d/60-output.confを作成します:
- sudo nano /etc/rsyslog.d/60-output.conf
以下の行をこのファイルにコピーしてください:
This line sends all lines to defined IP address at port 10514,
using the "json-template" format template
*.* @private_ip_logstash:10514;json-template
行の最初にある*.*は、すべてのログメッセージに対して行の残りを処理することを意味します。@記号はUDPを使用することを意味します(TCPを使用する場合は@@を使用します)。@の後のIPアドレスまたはホスト名は、メッセージを転送する場所です。今回のケースでは、rsyslogの中央サーバーとLogstashサーバーが同じDropletにインストールされているため、rsyslog-serverのプライベートIPアドレスを使用しています。これは、次のステップでLogstashがリッスンするように設定したプライベートIPアドレスと一致する必要があります。
次にポート番号です。このチュートリアルではポート10514を使用します。Logstashサーバーは同じプロトコルを使用して同じポートでリッスンしている必要があることに注意してください。最後の部分は、データを渡す前にどのようにフォーマットするかを示すテンプレートファイルです。
まだrsyslogを再起動しないでください。まず、Logstashを設定してメッセージを受信する必要があります。
ステップ7 — Logstashを構成してJSONメッセージを受信する
このステップでは、Logstashをインストールし、rsyslogからのJSONメッセージを受信するように設定し、ElasticsearchにJSONメッセージを送信するように設定します。
Logstash は Java 7 以降が必要です。Step 1 の Elasticsearch チュートリアルの指示を使用して、rsyslog-server ドロップレットに Java 7 または 8 をインストールしてください。
次に、Logstashリポジトリのセキュリティキーをインストールします:
- wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
リポジトリの定義をあなたの/etc/apt/sources.listファイルに追加してください:
- echo "deb http://packages.elastic.co/logstash/2.3/debian stable main" | sudo tee -a /etc/apt/sources.list
注意:上記で説明した echo メソッドを使用して Logstash リポジトリを追加してください。 add-apt-repository を使用しないでください。なぜなら、それにより deb-src エントリも追加されますが、Elastic はソースパッケージを提供していません。これにより、apt-get update を実行しようとした際にエラーが発生します。
Logstashリポジトリを含めるようにパッケージリストを更新してください:
- sudo apt-get update
最後に、Logstashをインストールします。
- sudo apt-get install logstash
Logstashがインストールされたので、rsyslogからのメッセージを受信するように設定しましょう。
Logstashのデフォルトインストールは、設定ファイルを/etc/logstash/conf.dで探します。メイン設定ファイルを編集してください:
- sudo nano /etc/logstash/conf.d/logstash.conf
次に、これらの行を/etc/logstash/conf.d/logstash.confに追加します:
This input block will listen on port 10514 for logs to come in.
host should be an IP on the Logstash server.
codec => "json" indicates that we expect the lines we're receiving to be in JSON format
type => "rsyslog" is an optional identifier to help identify messaging streams in the pipeline.
input {
udp {
host => "logstash_private_ip"
port => 10514
codec => "json"
type => "rsyslog"
}
}
This is an empty filter block. You can later add other filters here to further process
your log lines
filter { }
This output block will send all events of type "rsyslog" to Elasticsearch at the configured
host and port into daily indices of the pattern, "rsyslog-YYYY.MM.DD"
output {
if [type] == "rsyslog" {
elasticsearch {
hosts => [ "elasticsearch_private_ip:9200" ]
}
}
}
syslogプロトコルは定義上UDPであるため、この設定はその標準を反映しています。
入力ブロックでは、rsyslog-serverのプライベートIPアドレスでlogstash_private_ipを置き換えることによって、Logstashホストアドレスを設定します。このサーバーにはLogstashもインストールされています。
入力ブロックは、Logstashがポート10514でリッスンするように設定し、同じマシン上のsyslogインスタンスと競合しないようにします。1024未満のポートでは、Logstashはルートとして実行する必要があるため、良いセキュリティプラクティスではありません。
elasticsearch_private_ip をあなたの Elasticsearch Droplet の プライベート IP アドレス に置き換えることを忘れないでください。出力ブロックはシンプルな条件設定を示しています。その目的は、一致するイベントのみを通過させることです。この場合、「type」が「rsyslog」であるイベントのみです。
Logstashの設定変更をテストします:
- sudo service logstash configtest
構文エラーがなければ、Configuration OKが表示されるはずです。そうでない場合は、エラー出力を読んでLogstashの設定に何が問題か確認してください。
これらのすべてのステップが完了したら、次のコマンドを実行してLogstashインスタンスを開始できます。
- sudo service logstash start
同じサーバーでrsyslogも再起動してください。現在、Logstashインスタンスに転送する必要があります。
- sudo service rsyslog restart
Logstashがポート10514でリッスンしていることを確認するには:
- netstat -na | grep 10514
あなたはこのようなものを見るべきです:
udp6 0 0 10.128.33.68:10514 :::*
あなたはrsyslog-serverのプライベートIPアドレスと、rsyslogデータをリッスンするために使用している10514ポート番号を見ることができます。
ヒント: Logstashのトラブルシューティングを行うには、sudo service logstash stopでサービスを停止し、詳細なメッセージでフォアグラウンドで実行します:
- /opt/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf --verbose
それには、Logstashが使用しているIPアドレスとUDPポートの検証など、通常の情報が含まれます。
Starting UDP listener {:address=>"10.128.33.68:10514", :level=>:info}
ステップ8 — Elasticsearch入力の検証
以前、私たちはElasticsearchをプライベートIPアドレスでリスニングするように設定しました。現在、ElasticsearchはLogstashからメッセージを受信しているはずです。このステップでは、Elasticsearchがログデータを受信しているか確認します。
rsyslog-client と rsyslog-server のDropletは、すべてのログデータをLogstashに送信するべきであり、そこからElasticsearchに渡されます。これらのメッセージがElasticsearchに確実に受信されていることを確認するために、セキュリティメッセージを生成してみましょう。
rsyslog-client で、次のコマンドを実行します。
- sudo tail /var/log/auth.log
出力の最後にローカルシステムのセキュリティログが表示されます。それは次のようになります。
May 2 16:43:15 rsyslog-client sudo: sammy : TTY=pts/0 ; PWD=/etc/rsyslog.d ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
May 2 16:43:15 rsyslog-client sudo: pam_unix(sudo:session): session opened for user root by sammy(uid=0)
簡単なクエリで、Elasticsearchをチェックできます。
Elasticsearchサーバーまたはそれにアクセスできる任意のシステムで次のコマンドを実行します。elasticsearch_ipをElasticsearchサーバーのプライベートIPアドレスに置き換えてください。このIPアドレスは、このチュートリアルの以前の段階でElasticsearchがリッスンするように設定したものと一致している必要があります。
- curl -XGET 'http://elasticsearch_ip:9200/_all/_search?q=*&pretty'
出力には、次のようなものが表示されます:
{
"_index" : "logstash-2016.05.04",
"_type" : "rsyslog",
"_id" : "AVR8fpR-e6FP4Elp89Ww",
"_score" : 1.0,
"_source":{"@timestamp":"2016-05-04T15:59:10.000Z","@version":"1","message":" sammy : TTY=pts/0 ; PWD=/home/sammy ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log","sysloghost":"rsyslog-client","severity":"notice","facility":"authpriv","programname":"sudo","procid":"-","type":"rsyslog","host":"10.128.33.68"}
},
rsyslogメッセージを生成したDropletの名前がログに含まれていることに注意してください(rsyslog-client)。
この簡単な検証ステップで、あなたの集中化されたrsyslog設定は完了し、完全に稼働しています!
結論
あなたのログは現在Elasticsearchにあります。次は何をしますか?Elasticsearchにあるデータを可視化するためにKibanaができることを学ぶことを検討してください。これには、折れ線グラフや棒グラフ、円グラフ、地図などが含まれます。「Ubuntu 14.04でログを集約するためにLogstashとKibanaを使用する方法」では、ログを検索して可視化するためのKibanaウェブインターフェースの使用方法が説明されています。
おそらく、さらなる解析とトークン化を行うことで、あなたのデータはより価値のあるものになるでしょう。その場合、Logstashについてもっと学ぶことが、その結果を達成するのに役立ちます。