Elasticからの記事
前書き
組織が生成する数百万のログ行を理解することは、困難な課題です。 一方では、これらのログ行は、アプリケーションのパフォーマンス、サーバーのパフォーマンスメトリック、およびセキュリティのビューを提供します。 一方、ログの管理と分析は非常に時間がかかり、これらのますます必要なサービスの採用を妨げる可能性があります。
rsyslog、Elasticsearch、Logstashなどのオープンソースソフトウェアは、ログデータを送信、変換、および保存するためのツールを提供します。
このチュートリアルでは、複数のシステムからのログファイルを保存するための集中型rsyslogサーバーを作成し、Logstashを使用してそれらをElasticsearchサーバーに送信する方法を学習します。 そこから、データを分析する最適な方法を決定できます。
目標
このチュートリアルでは、syslogによって生成または受信されたログ、特にrsyslogとして知られるバリアントを一元化する方法を説明します。 Syslog、およびrsyslogなどのsyslogベースのツールは、UNIXライクなサーバーの実行を維持するために実行されるカーネルと多くのプログラムから重要な情報を収集します。 syslogは単なるプログラムではなく標準であるため、多くのソフトウェアプロジェクトはsyslogへのデータ送信をサポートしています。 このデータを一元化することにより、セキュリティをより簡単に監査し、アプリケーションの動作を監視し、その他の重要なサーバー情報を追跡できます。
集中化された、または集約されたrsyslogサーバーから、データをLogstashに転送できます。Logstashは、Elasticsearchに送信する前にログデータをさらに解析および強化できます。
このチュートリアルの最終目的は次のとおりです。
-
単一のクライアント(または転送)rsyslogサーバーをセットアップする
-
rsyslogクライアントからログを受信するために、単一のサーバー(または収集)rsyslogサーバーをセットアップします。
-
Logstashインスタンスをセットアップして、rsyslog収集サーバーからメッセージを受信します
-
Logstashからデータを受信するようにElasticsearchサーバーをセットアップします
前提条件
same DigitalOcean data centerで、private networking enabledを使用して次のドロップレットを作成します。
-
rsyslog-clientという名前のUbuntu 14.04ドロップレット
-
集中ログが保存され、Logstashがインストールされるrsyslog-serverという名前のUbuntu 14.04ドロップレット(1 GB以上)
-
How To Install and Configure Elasticsearch on Ubuntu 14.04からElasticsearchがインストールされたUbuntu 14.04 Droplet
また、これらの各サーバーに対してsudo特権を持つ非rootユーザーも必要です。 Initial Server Setup with Ubuntu 14.04は、これを設定する方法を説明しています。
[.note]#Note:パフォーマンスを最大化するために、Logstashはデフォルトで1ギガバイトのメモリを割り当てようとするため、集中型サーバーインスタンスのサイズがそれに応じていることを確認してください。
#
ドロップレットの作成中にプライベートネットワークを有効にする方法については、How To Set Up And Use DigitalOcean Private Networkingを参照してください。
プライベートネットワークなしでドロップレットを作成した場合は、How To Enable DigitalOcean Private Networking on Existing Dropletsを参照してください。
[[step-1 -—- determining-private-ip-addresses]] ==ステップ1—プライベートIPアドレスの決定
このセクションでは、各プライベートIPアドレスを各ドロップレットに割り当てるかどうかを決定します。 この情報は、チュートリアルを通じて必要になります。
各ドロップレットで、ifconfig
コマンドを使用してそのIPアドレスを見つけます。
sudo ifconfig -a
-a
オプションは、すべてのインターフェイスを表示するために使用されます。 プライマリイーサネットインターフェイスは通常、eth0
と呼ばれます。 ただし、この場合、eth1
からのIP、privateのIPアドレスが必要です。 これらのプライベートIPアドレスはインターネット経由でルーティング可能ではなく、プライベートLANでの通信に使用されます。この場合、同じデータセンター内のサーバー間でセカンダリインターフェイスを介して通信します。
出力は次のようになります。
ifconfig -aからの出力
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つのドロップレットすべてについて、この手順を必ず繰り返してください。 これらのプライベートIPアドレスを安全な場所に保存してください。 これらは、このチュートリアル全体で使用されます。
[[step-2 -—- setting-the-bind-address-for-elasticsearch]] ==ステップ2—Elasticsearchのバインドアドレスを設定する
前提条件の一部として、独自のドロップレットでElasticsearchをセットアップします。 How To Install and Configure Elasticsearch on Ubuntu 14.04チュートリアルでは、バインドアドレスをlocalhost
に設定して、他のサーバーがサービスにアクセスできないようにする方法を示します。 ただし、Logstashがプライベートネットワークアドレスを介してデータを送信できるように、これを変更する必要があります。
ElasticsearchをプライベートIPアドレスにバインドします。 Elasticsearch will only listen to requests to this IP address.
Elasticsearchサーバーで、構成ファイルを編集します。
sudo nano /etc/elasticsearch/elasticsearch.yml
network.bind_host
を含む行を見つけます。 コメントアウトされている場合は、行の先頭にある#
文字を削除してコメントを解除します。 値をElasticsearchサーバーのプライベートIPアドレスに変更して、次のようにします。
/etc/elasticsearch/elasticsearch.yml
network.bind_host: private_ip_address
最後に、Elasticsearchを再起動して変更を有効にします。
sudo service elasticsearch restart
[.warning]#Warning:信頼できるサーバーのみにElasticsearchへの接続を許可することが非常に重要です。 iptablesを使用することを強くお勧めします。 このチュートリアルでは、Logstashが実行されているrsyslog-serverドロップレットのプライベートIPアドレスのみを信頼する必要があります。
#
[[step-3 -—- configuring-the-centralized-server-to-receive-data]] ==ステップ3—データを受信するように集中型サーバーを構成する
このセクションでは、rsyslog-serverドロップレットを、ポート514で他のsyslogサーバーからデータを受信できるcentralizedサーバーとして構成します。
他のsyslogサーバーからデータを受信するようにrsyslog-serverを構成するには、rsyslog-serverドロップレットで/etc/rsyslog.conf
を編集します。
sudo nano /etc/rsyslog.conf
rsyslog.conf
ですでにコメントアウトされている次の行を見つけます。
/etc/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
はinputmoduleudpを表し、imtcp
はinputmoduletcpを表します。 これらのモジュールは、他のsyslogサーバーからの着信データをリッスンします。
各セクションの2行目($UDPSerververRun 514
および$TCPServerRun 514
)は、rsyslogがポート514(syslogのデフォルトポート)でリッスンしているこれらのプロトコルのそれぞれのUDPサーバーとTCPサーバーを起動する必要があることを示しています。
これらのモジュールとサーバーを有効にするには、行のコメントを解除して、ファイルに次のものが含まれるようにします。
/etc/rsyslog.conf
# 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を含む)インスタンスからのメッセージをリッスンするように構成されました。
[.tip]#Tip: rsyslog構成ファイルを検証するには、sudo rsyslogd -N1
コマンドを実行します。
#
[[step-4 -—- configuring-rsyslog-to-send-data-remotely]] ==ステップ4—データをリモートで送信するようにrsyslogを構成する
このセクションでは、前の手順で構成したryslog-serverドロップレットにログデータを送信するようにrsyslog-clientを構成します。
Ubuntuのデフォルトのrsyslogセットアップでは、/etc/rsyslog.d
に2つのファイルがあります。
-
20-ufw.conf
-
50-default.conf
rsyslog-clientで、デフォルトの構成ファイルを編集します。
sudo nano /etc/rsyslog.d/50-default.conf
ファイルの先頭のlog by facility
セクションの前に次の行を追加し、private_ip_of_ryslog_server
をcentralizedサーバーのprivateIPに置き換えます。
/etc/rsyslog.d/50-default.conf
*.* @private_ip_of_ryslog_server:514
ファイルを保存して終了します。
行の最初の部分(.)は、すべてのメッセージを送信することを意味します。 このチュートリアルの範囲外ですが、特定のメッセージのみを送信するようにrsyslogを構成できます。 行の残りの部分では、データの送信方法とデータの送信先について説明します。 この場合、IPアドレスの前の@
記号は、UDPを使用してメッセージを送信するようにrsyslogに指示します。 TCPを使用するには、これを@@
に変更します。 この後に、rsyslogとLogstashがインストールされたrsyslog-serverのプライベートIPアドレスが続きます。 コロンの後の番号は、使用するポート番号です。
rsyslogを再起動して、変更を有効にします。
sudo service rsyslog restart
おめでとうございます。 これで、syslogメッセージを中央サーバーに送信しています!
[.tip]#Tip: rsyslog構成ファイルを検証するには、sudo rsyslogd -N1
コマンドを実行します。
#
[[step-5 --- formating-the-log-data-to-json]] ==ステップ5—ログデータをJSONにフォーマットする
Elasticsearchでは、受信するすべてのドキュメントがJSON形式である必要があり、rsyslogはテンプレートを使用してこれを実現する方法を提供します。
このステップでは、JSONテンプレートを使用してLogstashに送信する前にログデータをフォーマットするように集中型rsyslogサーバーを構成し、その後、別のサーバーのElasticsearchに送信します。
rsyslog-serverサーバーに戻り、Logstashに送信する前に、メッセージをJSON形式にフォーマットするための新しい構成ファイルを作成します。
sudo nano /etc/rsyslog.d/01-json-template.conf
次の内容を、示されているとおりにファイルに正確にコピーします。
/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構造を維持するためです。andは、すべてをきちんと並べることでファイルを読みやすくします。 このテンプレートは、ElasticsearchとLogstashが受信を期待する方法でメッセージをフォーマットします。 これは、彼らがどのように見えるかです:
JSONメッセージの例
{
"@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"
}
[.tip]#Tip:ログデータをカスタマイズする場合、rsyslog.com docsはrsyslogから利用可能な変数を示します。 ただし、JSON形式でLogstashに送信してから、Elasticsearchに送信する必要があります。
#
送信中のデータはまだこの形式を使用していません。 次の手順は、このテンプレートファイルを使用するようにサーバーを構成することを示しています。
[[step-6 -—- configuring-the-centralized-server-to-send-to-logstash]] ==ステップ6—集中型サーバーをLogstashに送信するように構成する
適切なJSON形式を定義するテンプレートファイルが用意できたので、データをこのチュートリアルの同じドロップレットにあるLogstashに送信するように集中型rsyslogサーバーを設定しましょう。
起動時に、rsyslogは/etc/rsyslog.d
内のファイルを調べ、それらから構成を作成します。 独自の構成ファイルを追加して、構成を拡張しましょう。
rsyslog-serverで、/etc/rsyslog.d/60-output.conf
を作成します。
sudo nano /etc/rsyslog.d/60-output.conf
このファイルに次の行をコピーします。
/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サーバーが同じドロップレットにインストールされているため、rsyslog-serverにプライベートIPアドレスを使用しています。 This must match the private IP address you configure Logstash to listen on in the next step.
ポート番号は次です。 このチュートリアルでは、ポート10514を使用します。 Logstashサーバーは、同じプロトコルを使用して同じポートでリッスンする必要があることに注意してください。 最後の部分は、データを渡す前にフォーマットする方法を示すテンプレートファイルです。
まだrsyslogを再起動しないでください。 まず、メッセージを受信するようにLogstashを構成する必要があります。
[[step-7 -—- configure-logstash-to-receive-json-messages]] ==ステップ7—JSONメッセージを受信するようにLogstashを構成する
このステップでは、Logstashをインストールし、rsyslogからJSONメッセージを受信するように設定し、ElasticsearchにJSONメッセージを送信するように設定します。
LogstashにはJava 7以降が必要です。 Elasticsearch tutorialのStep 1からの指示を使用して、rsyslog-serverのドロップレットにJava7または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
[.note]#Note:上記のecho
メソッドを使用して、Logstashリポジトリを追加します。 deb-src
エントリも追加されるため、add-apt-repository
は使用しないでください。ただし、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
に追加します。
/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であるため、この構成はその標準を反映しています。
入力ブロックで、logstashprivateipをrsyslog-serverのプライベートIPアドレスに置き換えてLogstashホストアドレスを設定します。このプライベートIPアドレスにもLogstashがインストールされています。
入力ブロックは、ポート10514
でリッスンするようにLogstashを構成して、同じマシン上のsyslogインスタンスと競合しないようにします。 1024未満のポートでは、Logstashをrootとして実行する必要がありますが、これはセキュリティ上の良い方法ではありません。
必ずelasticsearchprivateipをElasticsearch Dropletのprivate IP addressに置き換えてください。 出力ブロックは、単純なconditional構成を示しています。 その目的は、一致するイベントのみを許可することです。 この場合、それは「タイプ」が「rsyslog」のイベントのみです。
Logstash構成の変更をテストします。
sudo service logstash configtest
構文エラーがない場合は、Configuration OK
が表示されます。 そうでない場合は、エラー出力を読んで、Logstash構成の何が問題なのかを確認してください。
これらのすべての手順が完了したら、次を実行してLogstashインスタンスを開始できます。
sudo service logstash start
また、今転送するLogstashインスタンスがあるため、同じサーバーでrsyslogを再起動します。
sudo service rsyslog restart
Logstashがポート10514でリッスンしていることを確認するには:
netstat -na | grep 10514
このようなものが見えるはずです。
netstatの出力
udp6 0 0 10.128.33.68:10514 :::*
rsyslog-serverのプライベートIPアドレスと、rsyslogデータのリッスンに使用している10514ポート番号が表示されます。
[。ヒント]##
Tip: 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}
[[step-8 -—- verifying-elasticsearch-input]] ==ステップ8—Elasticsearch入力の検証
以前に、プライベートIPアドレスでリッスンするようにElasticsearchを構成しました。 これで、Logstashからメッセージを受信するはずです。 このステップでは、Elasticsearchがログデータを受信していることを確認します。
rsyslog-clientおよびrsyslog-serverドロップレットは、すべてのログデータをLogstashに送信する必要があり、LogstashはElasticsearchに渡されます。 Elasticsearchが実際にこれらのメッセージを受信していることを確認するためのセキュリティメッセージを生成しましょう。
rsyslog-clientで、次のコマンドを実行します。
sudo tail /var/log/auth.log
出力の最後にローカルシステムのセキュリティログが表示されます。 次のようになります。
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'
出力には、次のようなものが表示されます。
curlの出力
{
"_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メッセージを生成したドロップレットの名前がログ(rsyslog-client)にあることに注意してください。
この簡単な検証手順により、一元化されたrsyslogセットアップが完了し、完全に機能します!
結論
ログは現在Elasticsearchにあります。 次は何ですか? 線グラフや棒グラフ、円グラフ、地図など、Elasticsearchにあるデータを視覚化するためにKibanaで何ができるかを読むことを検討してください。 How To Use Logstash and Kibana To Centralize Logs On Ubuntu 14.04は、KibanaWebインターフェースを使用してログを検索および視覚化する方法を説明しています。
おそらく、解析とトークン化をさらに進めることで、データの価値が高まるでしょう。 もしそうなら、Logstashについてもっと学ぶことはあなたがその結果を達成するのを助けるでしょう。