CentOS 7でPacketbeatとELKを使用してインフラストラクチャメトリックを収集する方法

前書き

Packetbeatを使用すると、HTTPやMySQLなどのアプリケーションレベルのプロトコル、およびDNSやその他のサービスのリアルタイムネットワークトラフィックを監視できます。

これを行うには、ネットワークトラフィックのスニッフィングと解析を行い、メッセージをトランザクションにマッピングするクライアントマシンに「配送業者」と呼ばれるエージェントを構成します。 これらの配送業者は、各アクションのレコードを生成し、ElasticsearchまたはLogstashに送信します。 データを取得したら、Kibanaでデータを検索、分析、および視覚化できるため、インフラストラクチャに関する情報に基づいた意思決定や問題のトラブルシューティングを行うことができます。

このチュートリアルでは、ELKスタックでPacketbeatを構成して使用し、インフラストラクチャメトリックを収集して視覚化します。

前提条件

  • チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stackで説明されているELK Stackセットアップで構成された4GBのRAMを備えた1台のCentOS 7サーバー-on-centos-7 [Elasticsearch、Logstash、およびKibanaをCentOS 7にインストールする方法]。 チュートリアルに従ってELKスタックを構成し、Kibanaダッシュボードをインストールしますが、クライアントマシンは構成しないでください。

  • クライアントマシンとして機能する任意の量のRAMを備えた1台のCentOS 7サーバー。

  • `+ sudo +`権限を持つ*各サーバーの標準ユーザーアカウント*。 CentOS 7での初期サーバーセットアップチュートリアルに従って、標準アカウントをセットアップできます。

ステップ1-ElasticsearchでPacketbeat Indexテンプレートをロードする

Packetbeatを使用してElasticsearchにログを送信することを計画しているため、最初にPacketbeatインデックステンプレートをロードします。これは、Elasticsearchが着信Packetbeatフィールドをインテリジェントな方法で分析するように構成します。

まず、ELKサーバーにログインします。

ssh @

ログインしたら、Packetbeatインデックステンプレートをホームディレクトリにダウンロードします。

cd ~
curl -O https://raw.githubusercontent.com/elastic/beats/master/packetbeat/packetbeat.template-es2x.json

次に、次のコマンドでテンプレートをロードします。

curl -XPUT 'http://localhost:9200/_template/packetbeat' [email protected]

テンプレートが正常にロードされた場合、出力が表示されます。

Output{"acknowledged":true}

ELKサーバーがPacketbeatからデータを受け入れる準備ができたので、クライアントサーバーに配送業者を設定しましょう。

手順2-クライアントサーバーでPacketbeatを設定する

Packetbeat Shipperをセットアップするには、前提条件のチュートリアルで作成したSSL証明書をクライアントサーバーに取得する必要があります。 クライアントサーバーとELKサーバー間の通信を確立する必要があります。

クライアントサーバーのIPアドレスを見つけます。 次に、* ELKサーバー上で、 `+ scp +`コマンドを使用してSSL証明書をクライアントサーバーにコピーします。

scp /etc/pki/tls/certs/logstash-forwarder.crt :/tmp

パスワードを入力した後、証明書のコピーが成功したことを確認してください。

次に、*クライアントサーバー*にログインします。

ssh

ログインしたら、ELKサーバーのSSL証明書を `++`ディレクトリにコピーします。

sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/

次に、Packetbeat自体をインストールする必要があります。 クライアントサーバーで、次のコマンドを実行してElasticsearch公開GPGキーをrpmにインポートします。

sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

Packetbeatの新しいリポジトリファイルを作成および編集します。

sudo vi /etc/yum.repos.d/elastic-beats.repo

ファイルに次の行を追加します。

/etc/yum.repos.d/elastic-beats.repo

[beats]
name=Elastic Beats Repository
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1

次に、ファイルを保存してエディターを終了します。

次に、Packetbeatパッケージをインストールします。

sudo yum update
sudo yum -y install packetbeat

Packetbeatはインストールされましたが、使用する前に設定する必要があります。

手順3-クライアントでPacketbeatを構成する

Packetbeatは、何をログに記録し、どこにデータを送信するかを知る必要があります。 ELKサーバー上のLogstashに接続するように設定し、監視するトラフィックの種類を定義しましょう。 これを行うには、Packetbeatに付属のデフォルトの構成ファイルを変更します。

クライアントサーバーで、Packetbeat構成ファイルを編集します。

sudo vi /etc/packetbeat/packetbeat.yml

ファイルの上部近くに、ELKサーバーに送信するメトリックスと統計を指定できる「+ input」セクションがあります。 デフォルトの入力設定を使用しますが、ニーズに合わせて自由に変更してください。

トラフィックをキャプチャするネットワークインターフェイスを選択します。 Linuxでは、Packetbeatは、Packetbeatがインストールされているサーバーによって送受信されるすべてのメッセージのキャプチャをサポートしています。 これには、デバイスとして「++」を使用します。

packetbeat.yml

# Select the network interfaces to sniff the data. You can use the "any"
# keyword to sniff on all connected interfaces.
interfaces:
 device:

`+ protocols +`セクションで、Packetbeatが各プロトコルを見つけることができるポートを設定します。 非標準ポートを使用する場合は、ここに追加します。 それ以外の場合、デフォルト値で十分です。

packetbeat.yml

protocols:
 dns:
   ports:

   include_authorities: true
   include_additionals: true

 http:
   ports:

 memcache:
   ports:

 mysql:
   ports:

 pgsql:
   ports:

 redis:
   ports:

 thrift:
   ports:

 mongodb:
   ports:

次に、Packetbeatにデータの送信先を指示する必要があります。

`+ output `セクションの下で、 ` elasticsearch:`で始まる行を見つけます。これはElasticsearch出力セクションを示します。 このセクションは使用しないので、 `#logstash:+`と書かれた行まで、Elasticsearch出力セクション全体を削除またはコメントアウトしてください*)。

ここから削除を開始します。

packetbeat.yml

 ### Elasticsearch as output
 elasticsearch:
   # Array of hosts to connect to.
   # Scheme and port can be left out and will be set to the default (http and 9200)

   ...

そして、次の行が見つかるまで削除を続けます。

packetbeat.yml

 ### Logstash as output

データをElasticsearchに送信する代わりに、Logstashに送信します。 そのため、 `#logstash:。`で始まる行で示される、コメントアウトされたLogstash出力セクションを見つけます。前の `#`を削除して、その行のコメントを解除します。 次に、「+」行のコメントを解除し、「 localhost +」をELKサーバーのプライベートIPアドレスに変更します。 構成ファイルのセクションは次のようになります。

packetbeat.yml

 ### Logstash as output
 logstash:
   # The Logstash hosts
   hosts: [":5044"]

これにより、PacketbeatがELKサーバーのLogstashにポート + 5044 +(前提条件チュートリアルでLogstash入力用に指定したポート)に接続するように構成されます。

次に、「+ tls 」セクションを見つけ、「 tls:」の前にあるコメントを削除します。 次に、「 certificate_authorities 」を指定する行のコメントを解除し、その値を「+」に変更します。

packetbeat.yml

   tls:
     # List of root certificates for HTTPS server verifications
     certificate_authorities: []

これにより、ELKサーバーからコピーした証明書を使用するようにPacketbeatが構成されます。 これがないと、クライアントは接続を確立できません。

構成ファイルを再確認したい場合は、読みやすくするために不要なコメントのほとんどを省略したこの例を比較してください。

packetbeat.yml

############################# Sniffer #########################################
interfaces:
 device: any

############################# Protocols #######################################
protocols:
 dns:
   ports:

   include_authorities: true
   include_additionals: true

 http:
   ports:

 memcache:
   ports:

 mysql:
   ports:

 pgsql:
   ports:

 redis:
   ports:

 thrift:
   ports:

 mongodb:
   ports:

############################# Output ##########################################
output:

 ### Logstash as output
  logstash:
   hosts: [":5044"]

   tls:
     certificate_authorities: []

############################# Logging #########################################
logging:

 files:
   rotateeverybytes: 10485760 # = 10MB

設定を確認したら、ファイルを保存してテキストエディターを終了します。

次に、Packetbeatを起動して、変更を所定の場所に配置します。

sudo systemctl start packetbeat

サーバーの再起動時にPacketbeatが起動するように設定します:

sudo systemctl enable packetbeat

監視する他のサーバーについてこのセクションを繰り返します。

これで、Packetbeatはネットワークトラフィックをリッスンし、Logstashに送信するはずです。 動作するかどうか見てみましょう。

手順4-Packetbeatインストールのテスト

この時点で、クライアントサーバー上のPacketbeatは、ネットワークトラフィックのログをELKサーバー上のLogstashに送信しているはずです。 Logstashは、 `+ packetbeat-YYYY.MM.DD +`と呼ばれる日付が刻印されたインデックスでPacketbeatデータをElasticsearchにロードする必要があります。 クライアントマシンで簡単なHTTPリクエストを作成し、ELKサーバーのElasticsearchでそのリクエストを探すことで、これが機能することをテストしてみましょう。

クライアントサーバーで、 + curl`を使用して + http:// www.elastic.co`にリクエストを送信します。

curl http://www.elastic.co/ > /dev/null

次に、ELKサーバーで、次のコマンドでPacketbeatインデックスを照会することにより、Elasticsearchが実際にデータを受信して​​いることを確認します。

curl -XGET 'http://localhost:9200/packetbeat-*/_search?pretty'

次のような出力が表示されます。

Output{
 "hits" : {
   "total" : 3,
   "max_score" : 1.0,
   "hits" : [ {
     "_index" : "packetbeat-2016.11.13",
     "_type" : "dns",
     "_id" : "AVheUqX0CSBq6gd6x-Oj",
     "_score" : 1.0,
     "_source" : {
       "direction" : "out",
       "server" : "",
       "responsetime" : 49,
       "resource" : "www.elastic.co",
       "dns" : {
         "additionals_count" : 0,
         "answers" : [ {
           "class" : "IN",
           "data" : "2406:da00:ff00::6b16:f086",
           "name" : "www.elastic.co",
           "ttl" : 59,
           "type" : "AAAA"
         }, {
           "class" : "IN",
           "data" : "2406:da00:ff00::b849:ab0e",
           "name" : "www.elastic.co",
           "ttl" : 59,
           "type" : "AAAA"
         }, {
           "class" : "IN",
           "data" : "2406:da00:ff00::ccec:d96c",
           "name" : "www.elastic.co",
           "ttl" : 59,
           "type" : "AAAA"
         } ],
         "answers_count" : 3,
         "authorities_count" : 0,
         "flags" : {
           "authoritative" : false,
           "recursion_allowed" : true,
           "recursion_desired" : true,
           "truncated_response" : false
         },
         "id" : 26078,
         "op_code" : "QUERY",
         "question" : {
           "class" : "IN",
           "name" : "www.elastic.co",
           "type" : "AAAA"
         },
         "response_code" : "NOERROR"
       },
       "method" : "QUERY",
       "count" : 1,
       "client_ip" : "",
       "proc" : "",
       "transport" : "udp",
       "status" : "OK",
       "ip" : "8.8.8.8",
       "client_port" : 52505,
       "client_server" : "",
       "port" : 53,
       "@timestamp" : "2016-11-13T15:33:43.500Z",
       "type" : "dns",
       "query" : "class IN, type AAAA, www.elastic.co",
       "client_proc" : "",
       "beat" : {
         "hostname" : "",
         "name" : ""
       },
       "bytes_in" : 32,
       "bytes_out" : 116,
       "@version" : "1",
       "host" : "",
       "tags" : [ "beats_input_raw_event" ]
     }
   ...
   ...
   } ]
 }
}

出力に合計ヒット数が0と表示される場合、Elasticsearchは検索したインデックスの下にPacketbeatデータをロードしていません。データが取得されるまでに少し時間がかかる可能性があるため、数秒後に再試行する必要があります。 待機しても結果が表示されない場合は、セットアップのエラーを確認してください。 転送した証明書でPacketbeatの設定ファイルを指定していることを確認してください。パスが正しくない場合、これはサイレントに失敗します。

予想される出力を受け取ったら、次のステップに進み、Kibanaを使用してネットワークトラフィックのチャートとグラフを表示する方法を学習できます。

ステップ5-Kibanaでデータを視覚化する

システムの統計情報を収集するすべてのサーバーでPacketbeatの設定が完了したら、Kibanaを見てみましょう。

Webブラウザーで、ELKサーバーのドメイン名またはパブリックIPアドレスに移動します。 ELKサーバーの資格情報を入力すると、Kibana Discoverページが表示されます。

ページ上部の[設定]タブをクリックします。 次に、インターフェースの左側にある* Index Patterns メニューから packetbeat-**を選択し、それをデフォルトのインデックスとして設定します。

image:https://assets.digitalocean.com/articles/packetbeat_elk_centos7/Gcd1SSE.png [パケットビートインデックスパターンの選択]

次に、画面上部の[検出]タブを選択して、このデータを表示します。 画面に次のように表示されます。

image:https://assets.digitalocean.com/articles/packetbeat_elk_centos7/bZCVRhh.png [Packetbeatログエントリ]

ここから、使用可能なフィールドでフィルタリングすることにより、さまざまなPacketbeatエントリを表示できます。 これらのフィールドをクリックして追加したり、集計(カウント、合計、最小、最大、中央値など)を使用して視覚化したりできます。

Kibanaは、データの分析に使用できる幅広い視覚化も提供します。 画面の上部にある[視覚化]タブをクリックして、視覚化を一覧表示するか、保存した視覚化を開きます。

image:https://assets.digitalocean.com/articles/packetbeat_elk_centos7/7BTCiY2.png [Packetbeat Visualizations]

次に、このチュートリアルの最初にロードしたサンプルPacketbeatダッシュボードを確認しましょう。 画面上部の[ダッシュボード]タブをクリックし、画面の右側にある[保存済みダッシュボードの読み込み]アイコンをクリックします。 ページ分割された提案としてダッシュボードフィルターのリストが表示されます。

image:https://assets.digitalocean.com/articles/packetbeat_elk_centos7/hqDKrjo.png [Packetbeatダッシュボードタイプの例を表示]

提案のリストから* Packetbeat-Dashboard *を選択します。 インデックスにはドキュメントとして少数のWeb要求しかないため、ダッシュボードの結果は、DB、キャッシュ、RPCトランザクション、またはその他の結果に対して*結果が見つかりません*になります。

image:https://assets.digitalocean.com/articles/packetbeat_elk_centos7/HTaDImJ.png [Packetbeatダッシュボードトップの例を表示]

ただし、下にスクロールすると、Packetbeatをインストールしたクライアントサーバーから収集されたさまざまなメトリックが表示されます。

image:https://assets.digitalocean.com/articles/packetbeat_elk_centos7/UVh2GIH.png [Packetbeatダッシュボードの例を見る]

ここから、インデックスデータに基づいてグラフを作成できます。 たとえば、応答時間に基づいてHTTPクエリの内訳を示すグラフを作成できます。これは、Webアプリケーションからの遅い応答を追跡するのに役立ちます。 また、サブアグリゲーションを使用して各コードの応答時間、アクセスしたドメインなどを見つけることにより、さらにドリルダウンできます。

詳細については、https://www.elastic.co/guide/en/beats/packetbeat/current/visualizing-data-packetbeat.html [Packetbeat documentation]をご覧ください。

結論

システムメトリックがElasticsearchとLogstashによって一元化され、Kibanaでそれらを視覚化できるようになったので、サーバーの状態を一目で確認できるはずです。 ここから、Filebeat、Topbeatなどを含む他の配送業者を調査できます。 利用可能な配送業者の詳細については、https://www.elastic.co/products/beats [Beats]ページをご覧ください。