BLOG

Glaylog2によるログ解析サーバーの構築

partygorillasquare

■ Graylog2とは?

いきなりインパクトのあるロゴですが、
Graylog2はオープンソースのログ監視・解析ソフトウェアでブラウザから操作する事ができます。
またsyslogだけでなく、HTTP通信によってアプリケーションログを監視する事も可能です。
NoSQLのMongoDBと全文検索のElasticsearchをバックエンドに用いています。

このソフトウェアの大きな特徴は、TCP514/UDP514番ポートで待ち受けを行うため、
syslogサーバーをログ監視サーバーとして使う事ができます。

最低2GBのメモリが必要、CPU負荷もあり(syslogサーバーと比べて)サーバーの負荷が高いのが難点です。

 

■ ファイアウォールの設定
Graylog2はTCP3000を利用しますので、iptablesで予め解放をしておきます。

vi /etc/sysconfig/iptables (以下行を追加)
--------------------------------------------------
-A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 3000 -j ACCEPT

 

■ 前提パッケージのインストール
CentOS6向けに記述していますが、前提パッケージをインストールします。
Graylog2はrubyで作られていますが、最低バージョンが1.9.2となっています。
残念ながらCentOS6のrubyはバージョンが1.8.7で利用する事ができませんので、手動でインストールを行います。

・前提パッケージのインストール

yum -y install rubygems java-1.7.0-openjdk java-1.7.0-openjdk-devel ruby-devel nc

・Rubyのインストール(yumのRubyはバージョンが古いため使用不可)

wget ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p195.tar.gz
./configure
make
make install

インストール完了後、一度ログアウトして再ログイン後にrubyのバージョンを確認します。
インストールしたバージョンになっていればOKです。

ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-linux]

・rubygemsのアップデート

gem install bundle
gem update --system

 

■ 前提ソフトウェア(ElasticSearch)のインストール
続いてデータ保存&全文検索で利用されるElasticsearchをインストールします。
※/opt/elasticsearchにインストールされます。

cd /opt
wget http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.4.tar.gz
tar -xvzf elasticsearch-0.20.4.tar.gz
mv elasticsearch-0.20.4/ elasticsearch
curl -k -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
mv elasticsearch-elasticsearch-servicewrapper-ae5417e/service elasticsearch/bin/
/opt/elasticsearch/bin/service/elasticsearch install
ln -s `readlink -f elasticsearch/bin/service/elasticsearch` /usr/bin/elasticsearch_ctl
sed -i -e 's|# cluster.name: elasticsearch|cluster.name: graylog2|' /opt/elasticsearch/config/elasticsearch.yml
mkdir /opt/elasticsearch/logs

・elasticsearchの起動

/etc/init.d/elasticsearch start

・elasticsearchの動作確認

curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'

 

■ 前提ソフトウェア(MongoDB)のインストール
NoSQLの一つであるMongoDBはユーザー認証管理に用いられます。

・MongoDBのリポジトリ追加

vi /etc/yum.repos.d/10gen.repo
--------------------------------------------------
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0

・MongoDBのインストール

yum -y install mongo-10gen mongo-10gen-server

・MongoDB設定ファイルの修正

vi /etc/mongod.conf (待ちうけポートの追加とauth=trueをコメントアウトします)
--------------------------------------------------
port=27017
# auth = true

・MongoDBの起動

/etc/init.d/mongod start

・MongoDBのDBセットアップ
続いてgraylog2が用いるユーザー情報を追加します。

# mongo
use admin
 db.addUser('admin', '_adminパスワード_') 
 db.auth('admin', '_adminパスワード_')

use glaylog2
 db.addUser('grayloguser', '_graylogのパスワード_')
 db.auth('grayloguser', '_graylogのパスワード_')
exit

 

■ Graylog2 Serverのインストール
ようやくGraylog2をインストールする事ができるようになりましたが、
Graylog2は「Server」、「web-interface」に分かれており、まずはServerをインストールします。

・前提パッケージのインストール

gem install bson_ext mongo json

・graylog2 serverのインストール
graylog2-serverを/optにダウンロード・解凍した後、/opt/graylog2-serverにリネームします。

cd /opt
wget http://download.graylog2.org/graylog2-server/graylog2-server-0.10.0.tar.gz
tar -xvzf graylog2-server-0.10.0.tar.gz
mv graylog2-server-0.10.0 graylog2-server

・設定ファイルの準備

graylog2-server-0.10.0.tar.gzcp /opt/graylog2-server/graylog2.conf.example /etc/graylog2.conf
cp /opt/graylog2-server/elasticsearch.yml.example /etc/graylog2-elasticsearch.yml

・graylog2の設定

vi /etc/graylog2.conf
--------------------------------------------------
syslog_listen_port = 514
syslog_listen_address = 0.0.0.0
syslog_enable_udp = true
syslog_enable_tcp = true

elasticsearch_shards = 1
elasticsearch_replicas = 0

# MongoDB Configuration (ここは環境に合わせる事)
mongodb_useauth = false
mongodb_user = grayloguser
mongodb_password = _grayloguserに設定したパスワード_
mongodb_host = _サーバーのローカル側IPアドレス_
#mongodb_replica_set = localhost:27017,localhost:27018,localhost:27019
mongodb_database = graylog2
mongodb_port = 27017

・graylog2検索エンジンの設定

vi /etc/graylog2-elasticsearch.yml
--------------------------------------------------
# this must be the same as for your elasticsearch cluster
cluster.name: graylog2

# you could also leave this out, but makes it easier to identify the graylog2 client instance
node.name: "graylog2-server"

# you might need to bind to a certain IP address, do that here (ローカルのIPアドレスにする)
network.host: _サーバーのローカル側IPアドレス_

# 1. Disable multicast discovery (enabled by default): (初期はマルチキャストが有効になってるのでコメントアウトを外して無効化。)
discovery.zen.ping.multicast.enabled: false

# 2. Configure an initial list of master nodes in the cluster (elasticsearchのIPアドレスを指定する)
#    to perform discovery when new nodes (master or data) are started:
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"]

・起動テスト
※syslogと同じポートを使っているため、syslogが514で待ち受けしている場合は停止するのを忘れないようにしてください。

cd /opt/graylog2-server
java -jar graylog2-server.jar --debug

大量のメッセージが出ますが、1分ほど待って最後にTCP/UDP514で待ち受け中と出ればOKです。
抜けるにはCtrl-Cを入力します。

・起動スクリプトの追加

vi /etc/init.d/graylog2-server (755)
--------------------------------------------------
#!/bin/bash
# graylog2-server: graylog2 message collector
# chkconfig: - 98 02
# description: This daemon start graylog2-server
# Source function library.
. /etc/rc.d/init.d/functions

CMD=$1
NOHUP=`which """""""""""""nohup`

STOP_TIMEOUT=30
BINARY=java
PROG=graylog2-server

HOME_DIR=/opt/graylog2-server
LOG_FILE=${HOME_DIR}/log/${PROG}.log
JAR_FILE=graylog2-server.jar
GRAYLOG2_CONFIG_SH=${GRAYLOG2CTL_DIR}/bin/graylog2_config.sh
CONF_FILE=/etc/graylog2.conf
PID_FILE""""""""""""" =/var/run/graylog2.pid

[ -f $GRAYLOG2_CONFIG_SH ] && . $GRAYLOG2_CONFIG_SH

start() {
graylog2_status > /dev/null 2>&1
if [ ${RETVAL} -eq 3 ]
then
echo "Starting ${PROG} ..."
cd ${HOME_DIR}
$NOHUP > /dev/null 2>&1 ${BINARY} -jar ${JAR_FILE} -f ${CONF_FILE} -p ${PID_FILE} >> ${LOG_FILE} &
RETVAL=0
else
echo "${PROG} is already running"
fi
}
stop() {
echo -n $"Stopping $PROG: "
killproc -p ${PID_FILE} -d ${STOP_TIMEOUT} ${PROG}
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${PID_FILE}
}

graylog2_status() {
status -p ${PID_FILE} ${PROG}
RETVAL=$?
}

restart() {
echo "Restarting ${PROG} ..."
stop
start
}
case "$CMD" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
graylog2_status
;;
*)
echo "Usage $0 {start|stop|restart|status}"
RETVAL=1
esac

exit ${RETVAL}

・Graylog2の起動

/etc/init.d/graylog2-server start

■ Graylog2 Web-Interface(ウェブ管理画面)のインストール
さて、ようやく最後のステップ、ウェブ管理画面をインストールします。

・graylog2 web-interfaceのインストール

cd /opt
wget http://download.graylog2.org/graylog2-web-interface/graylog2-web-interface-0.10.2.tar.gz
tar -xvzf graylog2-web-interface-0.10.2.tar.gz
mv graylog2-web-interface-0.10.2 graylog2-web-interface
cd /opt/graylog2-web-interface
bundle update mongo json bson_ext
bundle install --without=development

・web-interface用ユーザーの追加

groupadd rvm
useradd graylog2 -d /opt/graylog2-web-interface -G rvm
chown -R graylog2:graylog2 /opt/graylog2-web-interface
usermod -g rvm root

・web-interfaceの設定

vi /opt/graylog2-web-interface/config/mongoid.yml
--------------------------------------------------
production:
  host: localhost
  port: 27017
  username: grayloguser
  password: _grayloguserのパスワード_
  database: graylog2

・ウェブ管理画面の起動、初期設定

su graylog2
cd /opt/graylog2-web-interface
RAILS_ENV=production script/rails server

これでTCP: 3000でウェブインターフェースが起動しますので、
ブラウザからhttp://SERVER_IP:3000にアクセス、ユーザーの作成を行ってください。

WS000097

ログイン画面では先ほど作成したユーザー名・パスワードを入力します。

WS000098

ログイン後の画面です。情報が無い場合にはこのような内容になります。

WS000099

情報がある場合にはこのような表示がされます。

 

※注意※
 ユーザー作成をし、ログイン後に以下のエラーが出る場合はrubyのバージョンが古いのが原因です。
動作するためには最低でもバージョン1.9.2が必要です。

SyntaxError (/opt/graylog2-web-interface/app/models/message_gateway.rb:95: syntax error, unexpected ',', expecting '='
  def self.universal_search(page = 1, query, opts)
                                            ^
/opt/graylog2-web-interface/app/models/message_gateway.rb:478: syntax error, unexpected kEND, expecting $end):
  app/controllers/messages_controller.rb:50:in `do_scoping'
Tweet about this on TwitterShare on FacebookShare on Google+