Elasticの記事

前書き

組織が生成する数百万のログ行を理解することは、困難な課題です。 一方では、これらのログ行は、アプリケーションのパフォーマンス、サーバーのパフォーマンスメトリック、およびセキュリティのビューを提供します。 一方、ログの管理と分析は非常に時間がかかり、これらのますます必要なサービスの採用を妨げる可能性があります。

http://rsyslog.com [rsyslog]、https://www.elastic.co/products/elasticsearch [Elasticsearch]、https://www.elastic.co/products/logstash [などのオープンソースソフトウェアLogstash]は、ログデータを送信、変換、および保存するためのツールを提供します。

このチュートリアルでは、複数のシステムからのログファイルを保存する集中型rsyslogサーバーを作成し、Logstashを使用してそれらをElasticsearchサーバーに送信する方法を学習します。 そこから、データを分析する最適な方法を決定できます。

目標

このチュートリアルでは、syslogが生成または受信したログ、特にhttp://rsyslog.com [rsyslog]として知られるバリアントを集中化する方法を説明します。 Syslog、およびrsyslogなどのsyslogベースのツールは、UNIXライクなサーバーの実行を維持するために実行されるカーネルと多くのプログラムから重要な情報を収集します。 syslogは単なるプログラムではなく標準であるため、多くのソフトウェアプロジェクトはsyslogへのデータ送信をサポートしています。 このデータを一元化することにより、セキュリティをより簡単に監査し、アプリケーションの動作を監視し、その他の重要なサーバー情報を追跡できます。

集中化された、または集約されたrsyslogサーバーから、データをLogstashに転送できます。Logstashは、Elasticsearchに送信する前にログデータをさらに解析および強化できます。

このチュートリアルの最終目的は次のとおりです。

  1. 単一のクライアント(または転送)rsyslogサーバーをセットアップする

  2. rsyslogクライアントからログを受信するために、単一のサーバー(または収集)rsyslogサーバーをセットアップします。

  3. Logstashインスタンスをセットアップして、rsyslog収集サーバーからメッセージを受信します

  4. Logstashからデータを受信するようにElasticsearchサーバーをセットアップします

前提条件

*同じDigitalOceanデータセンター*で、*プライベートネットワークが有効になっている*以下のドロップレットを作成します。

  • * rsyslog-client *という名前のUbuntu 14.04ドロップレット

  • 集中ログが保存され、Logstashがインストールされる* rsyslog-server という名前のUbuntu 14.04ドロップレット( 1 GB *以上)

  • Elasticsearchがhttps://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-14-04からインストールされたUbuntu 14.04ドロップレット[Ubuntu 14.04でElasticsearchをインストールおよび構成する方法]

また、これらの各サーバーに対してsudo特権を持つ非rootユーザーも必要です。 Ubuntu 14.04での初期サーバー設定は、これを設定する方法を説明しています。

プライベートネットワーキングを有効にする方法については、https://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [DigitalOcean Private Networkingを設定および使用する方法]を参照してください。ドロップレットの作成中。

プライベートネットワーキングなしでドロップレットを作成した場合は、https://www.digitalocean.com/community/tutorials/how-to-enable-digitalocean-private-networking-on-existing-droplets [DigitalOceanプライベートネットワーキングを有効にする方法]を参照してください。既存のドロップレット]。

ステップ1-プライベートIPアドレスの決定

このセクションでは、各プライベートIPアドレスを各ドロップレットに割り当てるかどうかを決定します。 この情報は、チュートリアルを通じて必要になります。

各ドロップレットで、 `+ ifconfig +`コマンドでIPアドレスを見つけます:

sudo ifconfig -a

`+ -a `オプションは、すべてのインターフェースを表示するために使用されます。 プライマリイーサネットインターフェイスは通常、「 eth0 」と呼ばれます。 ただし、この場合、_private_ IPアドレスである ` eth1 +`の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:  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アドレスを安全な場所に保存してください。 これらは、このチュートリアル全体で使用されます。

ステップ2-Elasticsearchのバインドアドレスの設定

前提条件の一部として、独自のドロップレットでElasticsearchをセットアップします。 Ubuntu 14.04でElasticsearchをインストールおよび構成する方法チュートリアルでは、他のサーバーがサービスにアクセスできないように、バインドアドレスを「+ localhost +」に設定します。 ただし、Logstashがプライベートネットワークアドレスを介してデータを送信できるように、これを変更する必要があります。

ElasticsearchをプライベートIPアドレスにバインドします。 * Elasticsearchは、このIPアドレスへのリクエストのみをリッスンします。*

Elasticsearchサーバーで、構成ファイルを編集します。

sudo nano /etc/elasticsearch/elasticsearch.yml

`+ network.bind_host `を含む行を見つけます。 コメントアウトされている場合は、行の先頭にある「#+」文字を削除してコメント解除します。 値をElasticsearchサーバーのプライベートIPアドレスに変更して、次のようにします。

/etc/elasticsearch/elasticsearch.yml

network.bind_host:

最後に、Elasticsearchを再起動して変更を有効にします。

sudo service elasticsearch restart

手順3-データを受信するための集中型サーバーの構成

このセクションでは、* rsyslog-server *ドロップレットを、ポート514で他のsyslogサーバーからデータを受信できる_centralized_サーバーに設定します。

  • rsyslog-server を設定して他のsyslogサーバーからデータを受信するには、 rsyslog-server *ドロップレットで `+ / etc / rsyslog.conf +`を編集します。

sudo nano /etc/rsyslog.conf

`+ rsyslog.conf +`ですでにコメントアウトされている次の行を見つけます。

/etc/rsyslog.conf

# provides UDP syslog reception



# provides TCP syslog reception

各セクションの最初の行( + $ ModLoad imudp +`と `+ $ ModLoad imtcp +)は、それぞれ `+ imudp `と ` imtcp `モジュールをロードします。 ` imudp `は** i ** nput ** m ** odule * udp *を表し、 ` imtcp +`は i nput m odule * tcp *を表します。 これらのモジュールは、他のsyslogサーバーからの着信データをリッスンします。

各セクションの2行目( + $ UDPSerververRun 514 +`および `+ $ TCPServerRun 514 +)は、rsyslogがポート514(syslogのデフォルトポート)でリッスンしているこれらのプロトコルのそれぞれのUDPおよびTCPサーバーを起動することを示しています。

これらのモジュールとサーバーを有効にするには、行のコメントを解除して、ファイルに次のものが含まれるようにします。

/etc/rsyslog.conf

# provides UDP syslog reception



# provides TCP syslog reception

rsyslog構成ファイルを保存して閉じます。

次を実行してrsyslogを再起動します。

sudo service rsyslog restart

これで、中央のrsyslogサーバーは、リモートsyslog(rsyslogを含む)インスタンスからのメッセージをリッスンするように構成されました。

手順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に置き換えます。

/etc/rsyslog.d/50-default.conf

*.*                         @:514

ファイルを保存して終了します。

行の最初の部分(.)は、すべてのメッセージを送信することを意味します。 このチュートリアルの範囲外ですが、特定のメッセージのみを送信するようにrsyslogを構成できます。 行の残りの部分では、データの送信方法とデータの送信先について説明します。 この場合、IPアドレスの前の「+ @ 」記号はrsyslogにUDPを使用してメッセージを送信するように指示します。 TCPを使用するには、これを「 @@ +」に変更します。 これには、rsyslogとLogstashがインストールされた* rsyslog-server *のプライベートIPアドレスが続きます。 コロンの後の番号は、使用するポート番号です。

rsyslogを再起動して、変更を有効にします。

sudo service rsyslog restart

おめでとうございます。 これで、syslogメッセージを中央サーバーに送信しています!

ステップ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構造を維持し、すべてをきれいに並べることでファイルを読みやすくするためです。 このテンプレートは、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"
}

送信中のデータはまだこの形式を使用していません。 次の手順は、このテンプレートファイルを使用するようにサーバーを構成することを示しています。

手順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

*.*                         @:10514;json-template

先頭の `+ `は、すべてのログメッセージの残りの行を処理することを意味します。 「 @ 」記号はUDPを使用することを意味します(代わりにTCPを使用するには「 @@ 」を使用します)。 ` @ +`の後のIPアドレスまたはホスト名は、メッセージを転送する場所です。 この例では、rsyslog集中サーバーとLogstashサーバーが同じドロップレットにインストールされているため、* rsyslog-server にプライベートIPアドレスを使用しています。 *これは、Logstashが次のステップでリッスンするように設定するプライベートIPアドレスと一致する必要があります。

ポート番号は次です。 このチュートリアルでは、ポート10514を使用します。 Logstashサーバーは、同じプロトコルを使用して同じポートでリッスンする必要があることに注意してください。 最後の部分は、データを渡す前にフォーマットする方法を示すテンプレートファイルです。

まだrsyslogを再起動しないでください。 まず、メッセージを受信するようにLogstashを構成する必要があります。

ステップ7-JSONメッセージを受信するためのLogstashの構成

このステップでは、Logstashをインストールし、rsyslogからJSONメッセージを受信するように設定し、ElasticsearchにJSONメッセージを送信するように設定します。

LogstashにはJava 7以降が必要です。 Elasticsearch tutorialの*ステップ1 *の手順を使用して、Javaをインストールします。 * rsyslog-server *ドロップレットの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

パッケージリストを更新して、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 => ""
   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 => [ ":9200" ]
   }
 }
}

syslogプロトコルは定義上UDPであるため、この構成はその標準を反映しています。

入力ブロックで、Logstashがインストールされている* rsyslog-server *のプライベートIPアドレスに置き換えることにより、Logstashホストアドレスを設定します。

入力ブロックは、ポート `+ 10514 +`でリッスンするようにLogstashを設定し、同じマシン上のsyslogインスタンスと競合しないようにします。 1024未満のポートでは、Logstashをrootとして実行する必要がありますが、これはセキュリティ上の良い方法ではありません。

Elasticsearch Dropletの*プライベートIPアドレス*に必ず置き換えてください。 出力ブロックには、単純なhttps://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html#conditionals [条件付き]構成が表示されます。 その目的は、一致するイベントのみを許可することです。 この場合、それは「タイプ」が「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ポート番号が表示されます。

ステップ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アドレスに置き換えます。 このIPアドレスは、このチュートリアルの前の部分でElasticsearchをリッスンするように設定したものでなければなりません。

curl -XGET 'http://: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メッセージを生成したDropletの名前がログ(* rsyslog-client *)にあることに注意してください。

この簡単な検証手順により、一元化されたrsyslogセットアップが完了し、完全に機能します!

結論

ログは現在Elasticsearchにあります。 次は何ですか? Kibanaを使用して、折れ線グラフや棒グラフ、円グラフ、地図など、Elasticsearchにあるデータを視覚化することを検討してください。 https://www.digitalocean.com/community/tutorials/how-to-use-logstash-and-kibana-to-centralize-and-visualize-logs-on-ubuntu-14-04#connect-to-kibana [ LogstashとKibanaを使用してUbuntu 14.04でログを集中化する方法]は、Kibana Webインターフェイスを使用してログを検索および視覚化する方法を説明しています。

おそらく、解析とトークン化をさらに進めることで、データの価値が高まるでしょう。 その場合、https://www.elastic.co/products/logstash [Logstash]の詳細を知ることで、その結果を得ることができます。