Elasticからの記事

序章

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

rsyslog Elasticsearch Logstash などのオープンソースソフトウェアは、ログデータを送信、変換、保存するためのツールを提供します。

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

目標

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

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

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

  1. 単一のクライアント(または転送)rsyslogサーバーをセットアップします
  2. rsyslogクライアントからログを受信するために、単一のサーバー(または収集)rsyslogサーバーをセットアップします
  3. rsyslog収集サーバーからメッセージを受信するようにLogstashインスタンスを設定します
  4. Logstashからデータを受信するようにElasticsearchサーバーをセットアップします

前提条件

同じDigitalOceanデータセンターで、プライベートネットワークを有効にしたで次のドロップレットを作成します。

また、これらのサーバーごとにsudo権限を持つroot以外のユーザーが必要になります。 Ubuntu 14.04を使用したサーバーの初期設定では、これを設定する方法について説明しています。

注:パフォーマンスを最大化するために、Logstashはデフォルトで1ギガバイトのメモリを割り当てようとするため、集中型サーバーインスタンスのサイズがそれに応じていることを確認してください。

ドロップレットの作成中にプライベートネットワークを有効にする方法については、DigitalOceanプライベートネットワークの設定と使用方法を参照してください。

プライベートネットワークなしでドロップレットを作成した場合は、既存のドロップレットでDigitalOceanプライベートネットワークを有効にする方法を参照してください。

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

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

各ドロップレットで、そのIPアドレスを ifconfig 指図:

  1. sudo ifconfig -a

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

ステップ2—Elasticsearchのバインドアドレスを設定する

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

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

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

  1. sudo nano /etc/elasticsearch/elasticsearch.yml

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

/etc/elasticsearch/elasticsearch.yml
network.bind_host: private_ip_address

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

  1. sudo service elasticsearch restart

警告:信頼できるサーバーのみにElasticsearchへの接続を許可することが非常に重要です。 iptablesを使用することを強くお勧めします。 このチュートリアルでは、Logstashが実行されているrsyslog-serverドロップレットのプライベートIPアドレスのみを信頼する必要があります。

ステップ3—データを受信するように集中型サーバーを構成する

このセクションでは、 rsyslog-server ドロップレットを、ポート514で他のsyslogサーバーからデータを受信できる集中型サーバーとして構成します。

他のsyslogサーバーからデータを受信するようにrsyslog-serverを構成するには、次のように編集します。 /etc/rsyslog.conf rsyslog-server ドロップレット:

  1. 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)ロード imudpimtcp それぞれモジュール。 The 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
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

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

次のコマンドを実行してrsyslogを再起動します。

  1. sudo service rsyslog restart

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

ヒント: rsyslog構成ファイルを検証するには、次のコマンドを実行します。 sudo rsyslogd -N1 指図。

ステップ4—データをリモートで送信するようにrsyslogを構成する

このセクションでは、前の手順で構成したryslog-serverドロップレットにログデータを送信するようにrsyslog-clientを構成します。

Ubuntuのデフォルトのrsyslogセットアップでは、2つのファイルがあります。 /etc/rsyslog.d:

  • 20-ufw.conf
  • 50-default.conf

rsyslog-client で、デフォルトの構成ファイルを編集します。

  1. sudo nano /etc/rsyslog.d/50-default.conf

ファイルの先頭の前に次の行を追加します log by facility セクション、交換 private_ip_of_ryslog_server 集中型サーバーのプライベートIPを使用:

/etc/rsyslog.d/50-default.conf
*.*							@private_ip_of_ryslog_server:514

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

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

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

  1. sudo service rsyslog restart

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

ヒント: rsyslog構成ファイルを検証するには、次のコマンドを実行します。 sudo rsyslogd -N1 指図。

ステップ5—ログデータをJSONにフォーマットする

Elasticsearchでは、受け取るすべてのドキュメントがJSON形式である必要があり、rsyslogはテンプレートを使用してこれを実現する方法を提供します。

このステップでは、JSONテンプレートを使用してログデータをフォーマットしてからLogstashに送信し、Logstashが別のサーバーのElasticsearchに送信するように、集中型rsyslogサーバーを構成します。

rsyslog-server サーバーに戻り、Logstashに送信する前に、メッセージをJSON形式にフォーマットするための新しい構成ファイルを作成します。

  1. 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"
}

ヒント: rsyslog.com docs には、ログデータをカスタマイズする場合に、rsyslogから利用できる変数が表示されます。 ただし、JSON形式でLogstashに送信してからElasticsearchに送信する必要があります。

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

ステップ6—Logstashに送信するように集中型サーバーを構成する

適切なJSON形式を定義するテンプレートファイルができたので、このチュートリアルの同じドロップレットにあるLogstashにデータを送信するように集中型rsyslogサーバーを構成しましょう。

起動時に、rsyslogは次のファイルを調べます /etc/rsyslog.d それらから構成を作成します。 独自の構成ファイルを追加して、構成を拡張してみましょう。

rsyslog-server で、 /etc/rsyslog.d/60-output.conf:

  1. 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

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

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

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

ステップ7—JSONメッセージを受信するようにLogstashを構成する

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

LogstashにはJava7以降が必要です。 Elasticsearchチュートリアルステップ1の手順を使用して、rsyslog-serverドロップレットにJava7または8をインストールします。

次に、Logstashリポジトリのセキュリティキーをインストールします。

  1. wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

リポジトリ定義をに追加します /etc/apt/sources.list ファイル:

  1. 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リポジトリを含めます。

  1. sudo apt-get update

最後に、Logstashをインストールします。

  1. sudo apt-get install logstash

Logstashがインストールされたので、rsyslogからのメッセージをリッスンするようにLogstashを構成しましょう。

Logstashのデフォルトのインストールでは、で構成ファイルが検索されます /etc/logstash/conf.d. メイン構成ファイルを編集します。

  1. 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であるため、この構成はその標準を反映しています。

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

入力ブロックは、ポートでリッスンするようにLogstashを構成します 10514 そのため、同じマシン上のsyslogインスタンスと競合することはありません。 1024未満のポートでは、Logstashをrootとして実行する必要がありますが、これは適切なセキュリティ対策ではありません。

必ずelasticsearch_private_ipをElasticsearchドロップレットのプライベートIPアドレスに置き換えてください。 出力ブロックは、単純な条件付き構成を示しています。 その目的は、一致するイベントのみを許可することです。 この場合、それは「rsyslog」の「タイプ」を持つイベントのみです。

Logstash構成の変更をテストします。

  1. sudo service logstash configtest

表示されるはずです Configuration OK 構文エラーがない場合。 それ以外の場合は、エラー出力を読んで、Logstash構成の何が問題になっているのかを確認してください。

これらの手順がすべて完了したら、次のコマンドを実行してLogstashインスタンスを起動できます。

  1. sudo service logstash start

また、今転送するLogstashインスタンスがあるため、同じサーバーでrsyslogを再起動します。

  1. sudo service rsyslog restart

Logstashがポート10514でリッスンしていることを確認するには:

  1. netstat -na | grep 10514

次のように表示されます。

netstatの出力
udp6       0      0 10.128.33.68:10514     :::*  

rsyslog-serverのプライベートIPアドレスとrsyslogデータのリッスンに使用している10514ポート番号が表示されます。

ヒント: Logstashのトラブルシューティングを行うには、次のコマンドでサービスを停止してください sudo service logstash stop そして、詳細なメッセージを使用してフォアグラウンドで実行します。

  1. /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入力の確認

以前、プライベートIPアドレスをリッスンするようにElasticsearchを設定しました。 これで、Logstashからメッセージを受信するはずです。 このステップでは、Elasticsearchがログデータを受信していることを確認します。

rsyslog-clientおよびrsyslog-serverドロップレットは、すべてのログデータをLogstashに送信する必要があります。その後、LogstashはElasticsearchに渡されます。 セキュリティメッセージを生成して、Elasticsearchが実際にこれらのメッセージを受信していることを確認しましょう。

rsyslog-client で、次のコマンドを実行します。

  1. sudo tail /var/log/auth.log

出力の最後に、ローカルシステムのセキュリティログが表示されます。 次のようになります。

テール/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を構成したものでもある必要があります。

  1. 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メッセージを生成したドロップレットの名前がログ( rsyslog-client )にあることに注意してください。

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

結論

現在、ログはElasticsearchにあります。 次は何ですか? Kibana が、Elasticsearchにあるデータを視覚化するために何ができるかを読むことを検討してください。これには、折れ線グラフ、棒グラフ、円グラフ、マップなどが含まれます。 LogstashとKibanaを使用してUbuntu14.04でログを一元化する方法では、KibanaWebインターフェイスを使用してログを検索および視覚化する方法について説明しています。

おそらく、さらに解析とトークン化を行うことで、データの価値が高まるでしょう。 もしそうなら、 Logstash についてもっと学ぶことは、その結果を達成するのに役立ちます。