ウェブサイト検索

CentOS 6でログを中央集約するためのLogstashとKibanaの使用方法


ステータス: 廃止済み

この記事は、もはやサポートされていないCentOSのバージョンについて説明しています。現在、CentOS 6を実行しているサーバーを運用している場合は、サポートされているバージョンのCentOSにアップグレードまたは移行することを強くお勧めします。

理由: CentOS 6は2020年11月30日にサポート終了(EOL)となり、以降セキュリティパッチやアップデートが提供されません。このため、このガイドはもはや維持されていません。

代わりに見る: このガイドはリファレンスとしては役に立つかもしれませんが、他のCentOSリリースでは動作しない可能性があります。利用可能な場合は、使用しているCentOSのバージョン用に書かれたガイドを使用することを強くお勧めします。

次のDigitalOceanのチュートリアルシリーズは、CentOS 7サーバー上でLogstashとKibanaを使用してログを集中管理する方法を説明しているため、すぐに興味を持たれるかもしれません。

  • CentOS 7上でのLogstashとKibanaによる集中ログ管理

紹介

このチュートリアルでは、Logstash 1.4.2とKibana 3のインストール、およびそれらを構成してシステムのsyslogを集中管理された場所で収集・可視化する方法について説明します。Logstashは将来の使用のためにログを収集、解析、保存するためのオープンソースツールです。Kibana 3は、Logstashがインデックスしたログを検索して表示するために使用できるウェブインターフェースです。この2つのツールはどちらもElasticsearchに基づいています。Elasticsearch、Logstash、Kibanaを合わせて使用することをELKスタックと呼びます。

集中型ログは、サーバーやアプリケーションの問題を特定する際に非常に便利です。すべてのログを一か所で検索できるためです。また、特定の時間枠内におけるログを相関させることで、複数のサーバーにまたがる問題を特定することもできるため、非常に役立ちます。

Logstashを使用してすべてのタイプのログを収集することは可能ですが、このチュートリアルの範囲はsyslogの収集に制限します。

私たちの目標

このチュートリアルの目標は、複数のサーバーのsyslogを収集するためにLogstashを設定し、収集したログを視覚化するためにKibanaを設定することです。

私たちのLogstash/Kibanaのセットアップには4つの主要なコンポーネントがあります。

  • Logstash: ログを処理するLogstashのサーバーコンポーネント
  • Elasticsearch: すべてのログを保存します
  • Kibana: ログを検索し視覚化するためのウェブインターフェース
  • Logstash Forwarder: Logstashにログを送信するサーバーにインストールされ、Logstash Forwarderはlumberjackネットワークプロトコルを使用してLogstashと通信するログ転送エージェントとして機能します。

最初の3つのコンポーネントを1台のサーバーにインストールします。このサーバーをLogstashサーバーと呼ぶことにします。ログを収集したいすべてのサーバーにはLogstash Forwarderをインストールします。これらのサーバーを合わせてサーバーと呼びます。

前提条件

このチュートリアルを完了させるには、CentOS 6.5 VPSへのルートアクセスが必要です。それを設定するための手順は、こちらにある(ステップ3と4):CentOS 6による初期サーバー設定で見つけることができます。

Logstashサーバーに必要なCPU、RAM、ストレージの量は、収集するログの量によって異なります。このチュートリアルでは、以下のスペックのVPSをLogstashサーバーとして使用します:

  • OS: CentOS 6.5
  • RAM: 2GB
  • CPU: 2

あなたのLogstashサーバーに加えて、ログを収集するためにいくつかの他のサーバーも必要になるでしょう。

さあ、私たちのLogstashサーバーの設定を始めましょう!

Java 7をインストールする

ElasticsearchとLogstashはJava 7を必要とするため、今それをインストールします。OpenJDK 7をインストールします。

このコマンドで最新の安定版OpenJDK 7をインストールします:

sudo yum -y install java-1.7.0-openjdk

Java 7がインストールされたので、ElasticSearchをインストールしましょう。

Elasticsearchをインストールする

注意: Logstash 1.4.2 は Elasticsearch 1.1.1 を推奨しています。

次のコマンドを実行して、Elasticsearchの公開GPGキーをrpmにインポートします:

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

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

sudo vi /etc/yum.repos.d/elasticsearch.repo

次のリポジトリ構成を追加します:

[elasticsearch-1.1]
name=Elasticsearch repository for 1.1.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.1/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

保存して終了します。

このコマンドでElasticsearch 1.1.1をインストールしてください:

sudo yum -y install elasticsearch-1.1.1

Elasticsearchがインストールされました。設定を編集しましょう:

sudo vi /etc/elasticsearch/elasticsearch.yml

動的スクリプトを無効にするために、次の行をファイルのどこかに追加してください:

script.disable_dynamic: true

Elasticsearch インスタンスへの外部アクセスを制限したいでしょう。これにより、外部の人があなたのデータを読み取ったり、HTTP API を通じて Elasticsearch クラスターをシャットダウンしたりできなくなります。network.host を指定している行を見つけて、それをコメント解除して次のようにします:

network.host: localhost

次に、discovery.zen.ping.multicast.enabled項目を見つけてコメントアウトを解除することでマルチキャストを無効にします。次のようになります:

discovery.zen.ping.multicast.enabled: false

elasticsearch.ymlを保存して終了します。

Elasticsearchを今すぐ起動します:

sudo service elasticsearch restart

次に、Elasticsearchを起動時に開始するために以下のコマンドを実行します:

sudo /sbin/chkconfig --add elasticsearch

Elasticsearchが稼働しているので、Kibanaをインストールしましょう。

Kibanaをインストールする

注: Logstash 1.4.2はKibana 3.0.1を推奨します。

次のコマンドを使用して、Kibanaをホームディレクトリにダウンロードします:

cd ~; curl -O https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz

tarコマンドでKibanaアーカイブを抽出する:

tar xvf kibana-3.0.1.tar.gz

Kibanaの設定ファイルを編集のために開いてください。

vi ~/kibana-3.0.1/config.js

Kibanaの設定ファイルで、elasticsearchサーバーのURLを指定している行を見つけ、ポート番号(デフォルトは9200)を80に置き換えてください。

   elasticsearch: "http://"+window.location.hostname+":80",

これは、私たちがポート80(つまり、http://logstash_server_public_ip/)でKibanaにアクセスする計画を立てているため、必要です。

私たちはKibanaのインストールを提供するためにNginxを使用しますので、ファイルを適切な場所に移動しましょう。以下のコマンドでディレクトリを作成します:

sudo mkdir -p /usr/share/nginx/kibana3

新しく作成したディレクトリにKibanaファイルをコピーしてください:

sudo cp -R ~/kibana-3.0.1/* /usr/share/nginx/kibana3/

Kibanaのウェブインターフェースを使う前に、Nginxをインストールする必要があります。今、それを行いましょう。

Nginxをインストールする

Nginxを含むYumリポジトリを追加します:

sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

Yumを使ってNginxをインストールします:

sudo yum -y install nginx

KibanaがユーザーをElasticsearchに接続する方式のため(ユーザーはElasticsearchに直接アクセスできる必要があります)、Nginxを設定してポート80の要求をポート9200(Elasticsearchがデフォルトでリッスンするポート)にプロキシする必要があります。幸運なことに、Kibanaはこの設定のほとんどを行うサンプルNginx設定を提供しています。

KibanaのgithubリポジトリからサンプルのNginx設定を自宅のディレクトリにダウンロードしてください:

cd ~; curl -OL https://gist.githubusercontent.com/thisismitch/2205786838a6a5d61f55/raw/f91e06198a7c455925f6e3099e3ea7c186d0b263/nginx.conf

サンプル設定ファイルを編集のために開いてください。

vi nginx.conf

サーバー名のserver_nameの値をFQDN(またはドメイン名を使用していない場合はパブリックIPアドレス)に変更し、rootをKibanaをインストールした場所に変更してください。以下のようなエントリになります:

  server_name FQDN;
  root  /usr/share/nginx/kibana3;

保存して終了します。次に、次のコマンドでNginxのデフォルトサーバーブロック上にコピーします:

sudo cp ~/nginx.conf /etc/nginx/conf.d/default.conf

これから apache2-utils をインストールして、htpasswd を使ってユーザー名とパスワードのペアを生成できるようにします:

sudo yum install httpd-tools-2.2.15

次に、Kibana でダッシュボードを保存して共有するために使用するログインを生成します(自分のユーザー名に置き換えてください):

sudo htpasswd -c /etc/nginx/conf.d/kibana.myhost.org.htpasswd user

次に、パスワードを入力して確認します。作成したhtpasswdファイルは、最近設定したNginxの設定で参照されています。

今、Nginxを再起動して変更を適用します:

sudo service nginx restart

また、Nginxが起動時に開始するように設定します。

sudo chkconfig --levels 235 nginx on

Kibana は、FQDN またはあなたの Logstash サーバーのパブリック IP アドレス、つまり http://logstash_server_public_ip/ を介してアクセスできるようになりました。ウェブブラウザでそこに行くと、ダッシュボードを表示することができる Kibana のウェルカムページが表示されますが、まだ Logstash が設定されていないため、表示するログはありません。それを今から行いましょう。

Logstashをインストールする

LogstashパッケージはElasticsearchと同じGPGキーを共有しており、その公開鍵はすでにインストール済みですので、Logstash用の新しいYumリポジトリファイルを作成して編集しましょう:

sudo vi /etc/yum.repos.d/logstash.repo

以下のリポジトリ構成を追加します:

[logstash-1.4]
name=logstash repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/logstash/1.4/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

保存して終了します。

このコマンドを使用して Logstash 1.4.2 をインストールします:

sudo yum -y install logstash-1.4.2

Logstashはインストールされていますが、まだ設定されていません。

SSL証明書を生成する

私たちのサーバーからLogstashサーバーにログを送信するためにLogstash Forwarderを使用するので、SSL証明書と鍵ペアを作成する必要があります。この証明書は、Logstash ForwarderがLogstashサーバーのIDを確認するために使用されます。

これで、SSL証明書を生成するための2つのオプションがあります。クライアントサーバーがLogstashサーバーのIPアドレスを解決できるDNS設定がある場合は、オプション2を使用してください。そうでない場合は、オプション1を使用することでIPアドレスを利用できます。

オプション1: IPアドレス

DNSが設定されていない場合—つまり、ログを収集するサーバーがLogstashサーバーのIPアドレスを解決できない場合—生成するSSL証明書のsubjectAltName(SAN)フィールドにLogstashサーバーのプライベートIPアドレスを追加する必要があります。そのためには、OpenSSLの設定ファイルを開いてください:

sudo vi /etc/pki/tls/openssl.cnf

ファイル内の[ v3_ca ]セクションを見つけ、その下にこの行を追加します(LogstashサーバーのプライベートIPアドレスを置き換えてください):

subjectAltName = IP: logstash_server_private_ip

保存して終了します。

次に、次のコマンドを使用して、適切な場所(/etc/pki/tls/)にSSL証明書と秘密鍵を生成します:

cd /etc/pki/tls
sudo openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

logstash-forwarder.crtファイルは、Logstashにログを送信するすべてのサーバーにコピーされますが、それは後で行います。まずはLogstashの設定を完了させましょう。このオプションを選択した場合は、オプション2をスキップして、Logstashの設定に進んでください。

オプション2: 完全修飾ドメイン名 (DNS)

プライベートネットワークでDNSの設定がある場合、LogstashサーバーのプライベートIPアドレスを含むAレコードを作成する必要があります。このドメイン名は、次のコマンドでSSL証明書を生成する際に使用されます。別の方法として、サーバーのパブリックIPアドレスを指すレコードを使用することもできます。収集するログからサーバー(Logstashサーバーとして解決可能なもの)がこのドメイン名を解決できることを確かめてください。

次のコマンドを使用して、適切な場所(/etc/pki/tls/...)にSSL証明書と秘密鍵を生成します(LogstashサーバーのFQDNに置き換えてください):

cd /etc/pki/tls
sudo openssl req -subj '/CN=<^>logstash_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

logstash-forwarder.crt ファイルは、Logstash にログを送信するすべてのサーバーにコピーされますが、それは少し後で行います。まずは、Logstash の設定を完了させましょう。

Logstashを設定する

Logstashの設定ファイルはJSON形式であり、/etc/logstash/conf.dにあります。設定は、inputs、filters、outputsの3つのセクションで構成されています。

設定ファイルを作成しましょう。名前は01-lumberjack-input.confとし、私たちの“lumberjack”入力(Logstash Forwarderが使用するプロトコル)を設定します:

sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

次の入力設定を挿入してください:

input {
  lumberjack {
    port => 5000
    type => "logs"
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

保存して終了します。これは、tcpポート5000でリッスンするlumberjack入力を指定しており、先に作成したSSL証明書と秘密鍵を使用します。

では、10-syslog.confという設定ファイルを作成し、そこにsyslogメッセージ用のフィルターを追加しましょう:

sudo vi /etc/logstash/conf.d/10-syslog.conf

次のsyslog フィルター構成を挿入してください:

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

保存して終了します。このフィルターは「syslog」タイプ(Logstash Forwarderによってラベル付けされた)のログを探し、incoming syslogログを解析するために「grok」を使用して構造化可能でクエリ可能にしようとします。

最後に、30-lumberjack-output.confという設定ファイルを作成します:

sudo vi /etc/logstash/conf.d/30-lumberjack-output.conf

次の出力構成を挿入してください:

output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
}

保存して終了します。この出力は基本的にLogstashを設定して、ログをElasticsearchに保存するものです。

この構成では、Logstashはフィルターに一致しないログも受け入れますが、データは構造化されません(例えば、フィルターされていないNginxやApacheのログは、HTTPレスポンスコード、ソースIPアドレス、提供されたファイルなどでメッセージを分類するのではなく、フラットなメッセージとして表示されます)。

Logstash Forwarder入力を使用する他のアプリケーションにフィルタを追加したい場合は、ファイルの名前を、入力と出力の設定の間(つまり、01と30の間)でソートされるように付けることを忘れないでください。

設定変更を有効にするためにLogstashを再起動します:

sudo service logstash restart

私たちのLogstashサーバーが準備できたので、次にLogstashフォワーダーの設定に進みましょう。

Logstash Forwarderを設定する

注意: ログをLogstashサーバーに送信したい各サーバーについて、これらの手順を実行してください。DebianベースのLinuxディストリビューション(例: Ubuntu、Debianなど)にLogstash Forwarderをインストールする手順については、このチュートリアルのUbuntuバリエーションのLogstash Forwarderの設定セクションを参照してください。

SSL証明書とLogstash Forwarderパッケージをコピーする

Logstashサーバーで、SSL証明書をサーバーにコピーします(自分のログインに置き換えてください):

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

Logstash Forwarderパッケージをインストールする

サーバーにて、Logstash Forwarder RPM をホームディレクトリにダウンロードします:

cd ~; curl -O http://download.elasticsearch.org/logstash-forwarder/packages/logstash-forwarder-0.3.1-1.x86_64.rpm

次に、Logstash Forwarderパッケージをインストールします:

sudo rpm -ivh ~/logstash-forwarder-0.3.1-1.x86_64.rpm

次に、Logstash Forwarderのinitスクリプトをインストールして、起動時に自動的に開始されるようにします。logstashbook.comが提供したinitスクリプトを使用します:

cd /etc/init.d/; sudo curl -o logstash-forwarder http://logstashbook.com/code/4/logstash_forwarder_redhat_init
sudo chmod +x logstash-forwarder

初期化スクリプトは /etc/sysconfig/logstash-forwarder というファイルに依存しています。サンプルファイルはダウンロード可能です:

sudo curl -o /etc/sysconfig/logstash-forwarder http://logstashbook.com/code/4/logstash_forwarder_redhat_sysconfig

編集のために開いてください:

sudo vi /etc/sysconfig/logstash-forwarder

そして、LOGSTASH_FORWARDER_OPTIONSの値を次のように変更します:

LOGSTASH_FORWARDER_OPTIONS="-config /etc/logstash-forwarder -spool-size 100"

保存して終了します。

今、SSL証明書を適切な場所(/etc/pki/tls/certs)にコピーしてください。

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

Logstashフォワーダーを設定する

サーバー上で、JSON形式のLogstash Forwarder設定ファイルを作成および編集します:

sudo vi /etc/logstash-forwarder

次に、以下の行をファイルに追加し、logstash_server_private_IPをあなたのLogstashサーバーのプライベートIPアドレスに置き換えてください:

{
  "network": {
    "servers": [ "logstash_server_private_IP:5000" ],
    "timeout": 15,
    "ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt"
  },
  "files": [
    {
      "paths": [
        "/var/log/messages",
        "/var/log/secure"
       ],
      "fields": { "type": "syslog" }
    }
   ]
}

保存して終了します。これにより、Logstash Forwarderがポート5000であなたのLogstashサーバーに接続するように設定されます(これは以前に入力を指定したポートです)、そして以前に作成したSSL証明書を使用します。pathsセクションでは、送信するログファイルを指定します(ここではmessagesとsecureを指定します)、typeセクションでは、これらのログが「syslog*」タイプであることを指定します(これは私たちのフィルターが探しているタイプです)。

これは、Logstash Forwarderを使ってポート5000でLogstashに他のログファイルを送信するために、さらにファイル/タイプを追加する場所であることに注意してください。

次に、chkconfigを使用してLogstash Forwarderサービスを追加します:

sudo chkconfig --add logstash-forwarder

今、変更を適用するためにLogstash Forwarderを起動してください。

sudo service logstash-forwarder start

現在、Logstash Forwarderはメッセージとauth.logをあなたのLogstashサーバーに送信しています!ログを収集したい他のすべてのサーバーについてもこのプロセスを繰り返してください。

Kibanaに接続する

ログスタッシュフォワーダーの設定が完了したら、以前インストールしたウェブインターフェイスであるKibanaを見てみましょう。

ウェブブラウザで、LogstashサーバーのFQDNまたはパブリックIPアドレスにアクセスします。Kibanaのウェルカムページが表示されるはずです。

Logstash ダッシュボードをクリックして、作成済みのダッシュボードに移動します。ログイベントのヒストグラムが表示され、下にはログメッセージが表示されるはずです(イベントやメッセージが表示されない場合、4つの Logstash コンポーネントのうちの1つが正しく構成されていません)。

ここで、ログを検索したり、ブラウズしたりできます。また、ダッシュボードをカスタマイズすることもできます。これは、あなたのKibanaインスタンスがどのように見えるかのサンプルです:

次のことを試してみてください:

  • 「root」を検索して、誰かがあなたのサーバーにrootとしてログインしようとしているかどうかを確認してください。
  • 特定のホスト名を検索する
  • ヒストグラム上の領域や上のメニューから選択することで、時間枠を変更してください。
  • ヒストグラムの下にあるメッセージをクリックして、データがどのようにフィルタリングされているかを確認してください。

Kibana にはグラフ作成やフィルタリングなど、多くの他の機能がありますので、ぜひ自由に探ってみてください!

結論

Logstashを介してシスログが集中管理され、Kibanaで視覚化できるようになったので、重要なログの集中管理の良いスタートを切ることができています。ほぼすべての種類のログをLogstashに送信できることを忘れないでくださいが、データはgrokを使って解析され構造化されると、さらに便利になります。

あなたのKibanaダッシュボードは、サーバーにアクセスできる誰もがアクセス可能であるため、htaccessのようなものでセキュリティを確保することをお勧めします。

関連記事: