Ubuntu 14.04でログを中央集約するためのLogstashとKibanaの使い方
注意: このチュートリアルは古いバージョンのELKスタックに関するものであり、最新バージョンとは互換性がありません。このチュートリアルの最新バージョンは「Ubuntu 14.04にElasticsearch、Logstash、Kibana(ELKスタック)をインストールする方法」で入手できます。
紹介
このチュートリアルでは、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をインストールします。これらのサーバーを合わせてサーバーと呼びます。
前提条件
このチュートリアルを完了させるには、Ubuntu 14.04 VPSへのルートアクセスが必要です。それを設定するための手順は、こちらにあります(ステップ3と4):Ubuntu 14.04での初期サーバー設定。
Logstashサーバーに必要なCPU、RAM、ストレージの量は、収集するログの量によって異なります。このチュートリアルでは、以下のスペックのVPSをLogstashサーバーとして使用します:
- OS: Ubuntu 14.04
- RAM: 4GB
- CPU: 2
あなたのLogstashサーバーに加えて、ログを収集するためにいくつかの他のサーバーも必要になるでしょう。
Logstashサーバーのセットアップを始めましょう!
Java 7をインストールする
Elasticsearch と Logstash は Java 7 を必要とするので、今それをインストールします。Elasticsearch が推奨するのは Oracle Java 7 です。しかし、OpenJDK で進むことに決めた場合でも、問題なく動作するはずです。
Oracle Java PPAをaptに追加します:
sudo add-apt-repository -y ppa:webupd8team/java
aptパッケージデータベースを更新します:
sudo apt-get update
このコマンドを使ってOracle Java 7の最新の安定版をインストールし、表示されるライセンス契約に同意してください。
sudo apt-get -y install oracle-java7-installer
Java 7がインストールされたので、ElasticSearchをインストールしましょう。
Elasticsearchをインストールする
注意: Logstash 1.4.2 は Elasticsearch 1.1.1 を推奨しています。
次のコマンドを実行して、Elasticsearchの公開GPGキーをaptにインポートします:
wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
Elasticsearchのソースリストを作成してください:
echo 'deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main' | sudo tee /etc/apt/sources.list.d/elasticsearch.list
aptパッケージデータベースを更新します:
sudo apt-get update
このコマンドでElasticsearchをインストールします:
sudo apt-get -y install elasticsearch=1.1.1
Elasticsearchがインストールされました。設定を編集しましょう:
sudo vi /etc/elasticsearch/elasticsearch.yml
動的スクリプトを無効にするために、次の行をファイルのどこかに追加してください:
script.disable_dynamic: true
Elasticsearchインスタンス(ポート9200)への外部アクセスも制限したいので、外部の人があなたのデータを読み取ったり、HTTP APIを通じてElasticsearchクラスターをシャットダウンできないようにしてください。network.hostを指定している行を見つけて、次のようにコメントを解除してください:
network.host: localhost
elasticsearch.yml を保存して終了します。
Elasticsearchを今すぐ起動します:
sudo service elasticsearch restart
次に、Elasticsearchを起動時に開始するために以下のコマンドを実行します:
sudo update-rc.d elasticsearch defaults 95 10
Elasticsearchが稼働しているので、Kibanaをインストールしましょう。
Kibanaをインストールする
注意: Logstash 1.4.2 は Kibana 3.0.1 を推奨します。
次のコマンドを使用して、Kibanaをホームディレクトリにダウンロードします:
cd ~; wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz
tarを使用してKibanaアーカイブを抽出します:
tar xvf kibana-3.0.1.tar.gz
Kibanaの設定ファイルを編集のために開いてください。
sudo vi ~/kibana-3.0.1/config.js
Kibanaの設定ファイルで、elasticsearchを指定する行を見つけ、デフォルトのポート番号(9200)を80に置き換えます。
elasticsearch: "http://"+window.location.hostname+":80",
これは、私たちがポート80(つまり、http://logstash_server_public_ip/)でKibanaにアクセスする計画を立てているため、必要です。
私たちはKibanaのインストールを提供するためにNginxを使用しますので、ファイルを適切な場所に移動しましょう。以下のコマンドでディレクトリを作成します:
sudo mkdir -p /var/www/kibana3
新しく作成したディレクトリにKibanaファイルをコピーしてください:
sudo cp -R ~/kibana-3.0.1/* /var/www/kibana3/
Kibanaのウェブインターフェースを使う前に、Nginxをインストールする必要があります。今、それを行いましょう。
Nginxをインストールする
Nginxをインストールするにはaptを使用します:
sudo apt-get install nginx
KibanaがユーザーをElasticsearchに接続する方式のため(ユーザーはElasticsearchに直接アクセスできる必要があります)、Nginxを設定してポート80の要求をポート9200(Elasticsearchがデフォルトでリッスンするポート)にプロキシする必要があります。幸運なことに、Kibanaはこの設定のほとんどを行うサンプルNginx設定を提供しています。
KibanaのgithubリポジトリからサンプルのNginx設定を自宅のディレクトリにダウンロードしてください:
cd ~; wget https://gist.githubusercontent.com/thisismitch/2205786838a6a5d61f55/raw/f91e06198a7c455925f6e3099e3ea7c186d0b263/nginx.conf
サンプル設定ファイルを編集のために開いてください。
vi nginx.conf
FQDN(ドメイン名を使用していない場合はlocalhost)にserver_nameの値を変更し、Kibanaをインストールした場所にrootの値を変更します。次のようなエントリになります:
server_name FQDN;
root /var/www/kibana3;
保存して終了します。次に、次のコマンドでNginxのデフォルトサーバーブロック上にコピーします:
sudo cp nginx.conf /etc/nginx/sites-available/default
これから apache2-utils をインストールして、htpasswd を使ってユーザー名とパスワードのペアを生成できるようにします:
sudo apt-get install apache2-utils
次に、Kibana でダッシュボードを保存して共有するために使用するログインを生成します(自分のユーザー名に置き換えてください):
sudo htpasswd -c /etc/nginx/conf.d/kibana.myhost.org.htpasswd user
次に、パスワードを入力して確認します。作成したばかりのhtpasswdファイルは、最近設定したNginxの設定で参照されています。
今、Nginxを再起動して変更を適用します:
sudo service nginx restart
Kibana は、FQDN またはあなたの Logstash サーバーのパブリック IP アドレス、つまり http://logstash_server_public_ip/ を介してアクセスできるようになりました。ウェブブラウザでそこに行くと、ダッシュボードを表示することができる Kibana のウェルカムページが表示されますが、まだ Logstash が設定されていないため、表示するログはありません。それを今から行いましょう。
Logstashをインストールする
LogstashパッケージはElasticsearchと同じリポジトリから入手可能で、すでにその公開鍵をインストールしているので、Logstashのソースリストを作成しましょう。
echo 'deb http://packages.elasticsearch.org/logstash/1.4/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash.list
aptパッケージデータベースを更新します:
sudo apt-get update
このコマンドでLogstashをインストールします:
sudo apt-get install logstash=1.4.2-1-2c0f5a1
Logstashはインストールされていますが、まだ設定されていません。
SSL証明書を生成する
私たちは、サーバーからLogstashサーバーにログを送信するためにLogstash Forwarderを使用するので、SSL証明書とキーのペアを作成する必要があります。この証明書は、Logstash ForwarderがLogstashサーバーのアイデンティティを確認するために使用されます。次のコマンドを使用して、証明書と秘密鍵を保存するディレクトリを作成します。
sudo mkdir -p /etc/pki/tls/certs
sudo mkdir /etc/pki/tls/private
これで、SSL証明書を生成するための2つのオプションがあります。クライアントサーバーがLogstashサーバーのIPアドレスを解決できるDNS設定がある場合は、オプション2を使用してください。そうでない場合は、オプション1を使用することでIPアドレスを使用できます。
オプション1: IPアドレス
DNSが設定されていない場合—つまり、ログを収集するサーバーがLogstashサーバーのIPアドレスを解決できない場合—生成するSSL証明書のsubjectAltName(SAN)フィールドにLogstashサーバーのプライベートIPアドレスを追加する必要があります。そのためには、OpenSSLの設定ファイルを開いてください:
sudo vi /etc/ssl/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/ssl/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: FQDN (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という設定ファイルを作成し、Logstash Forwarderが使用する“lumberjack”入力を設定しましょう:
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サーバーに送信したい各サーバーについて、これらの手順を実行してください。Red Hat系のLinuxディストリビューション(例:RHEL、CentOSなど)にLogstash Forwarderをインストールする手順については、このチュートリアルのCentOS版の「Logstash Forwarderのビルドとパッケージ」セクションを参照してください。
SSL証明書とLogstash Forwarderパッケージをコピーする
Logstashサーバーで、SSL証明書をサーバーにコピーします(自分のログインに置き換えてください):
scp /etc/pki/tls/certs/logstash-forwarder.crt user@server_private_IP:/tmp
Logstash Forwarderパッケージをインストールする
サーバー上で、Logstash Forwarderのソースリストを作成します:
echo 'deb http://packages.elasticsearch.org/logstashforwarder/debian stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
それはまた、このコマンドでインストールできるElasticsearchと同じGPGキーを使用しています:
wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -
次に、Logstash Forwarderパッケージをインストールします:
sudo apt-get update
sudo apt-get install logstash-forwarder
注意: 32ビット版のUbuntuを使用していて、“logstash-forwarderパッケージを見つけることができません”というエラーが出た場合は、Logstash Forwarderを手動でインストールする必要があります:
wget https://assets.linux-console.net/articles/logstash/logstash-forwarder_0.3.1_i386.deb
sudo dpkg -i logstash-forwarder_0.3.1_i386.deb
次に、Logstash Forwarderのinitスクリプトをインストールして、起動時に自動的に開始されるようにします:
cd /etc/init.d/; sudo wget https://raw.githubusercontent.com/elasticsearch/logstash-forwarder/a73e1cb7e43c6de97050912b5bb35910c0f8d0da/logstash-forwarder.init -O logstash-forwarder
sudo chmod +x logstash-forwarder
sudo update-rc.d logstash-forwarder defaults
今、SSL証明書を適切な場所(/etc/pki/tls/certs)にコピーしてください。
sudo mkdir -p /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/syslog",
"/var/log/auth.log"
],
"fields": { "type": "syslog" }
}
]
}
保存して終了します。これは、Logstash Forwarder を設定して、ポート 5000 で Logstash サーバーに接続し、以前に作成した SSL 証明書を使用します。paths セクションは、送信するログファイルを指定します(ここでは syslog と auth.log を指定します)、そして type セクションは、これらのログが "syslog* のタイプであることを指定します(これは私たちのフィルターが探しているタイプです)。
これは、Logstash Forwarderを使ってポート5000でLogstashに他のログファイルを送信するために、さらにファイル/タイプを追加する場所であることに注意してください。
今、変更を適用するためにLogstash Forwarderを再起動してください:
sudo service logstash-forwarder restart
今、Logstash Forwarderがsyslogとauth.logをあなたのLogstashサーバーに送信しています!ログを収集したい他のすべてのサーバーについてこのプロセスを繰り返してください。
Kibanaに接続する
ログスタッシュフォワーダーの設定が完了したら、以前インストールしたウェブインターフェイスであるKibanaを見てみましょう。
ウェブブラウザで、あなたのLogstashサーバーのFQDNまたはパブリックIPアドレスにアクセスしてください。Kibanaのウェルカムページが表示されるはずです。
Logstash ダッシュボードをクリックして、作成済みのダッシュボードに移動します。ログイベントのヒストグラムが表示され、下にはログメッセージが表示されるはずです(イベントやメッセージが表示されない場合、4つの Logstash コンポーネントのうちの1つが正しく構成されていません)。
ここで、ログを検索したり、ブラウズしたりできます。また、ダッシュボードをカスタマイズすることもできます。これは、あなたのKibanaインスタンスがどのように見えるかのサンプルです:
次のことを試してみてください:
- 「root」を検索して、誰かがあなたのサーバーにrootとしてログインしようとしているかどうかを確認してください。
- 特定のホスト名を検索する
- ヒストグラム上の領域や上のメニューから選択することで、時間枠を変更してください。
- ヒストグラムの下にあるメッセージをクリックして、データがどのようにフィルタリングされているかを確認してください。
Kibana にはグラフ作成やフィルタリングなど、多くの他の機能がありますので、ぜひ自由に探ってみてください!
結論
Logstashを介してシスログが集中管理され、Kibanaで視覚化できるようになったので、重要なログの集中管理の良いスタートを切ることができています。ほぼすべての種類のログをLogstashに送信できることを忘れないでくださいが、データはgrokを使って解析され構造化されると、さらに便利になります。
あなたのKibanaダッシュボードは、サーバーにアクセスできる誰でもアクセス可能であることに注意してください。そのため、htaccessのようなもので保護することをお勧めします。

