NginxのログをGoAccessでアクセス解析【2020/07】

2020年7月27日

サーバー
Tools
Nginx
Security

GoAccessを導入してNginxのリアルタイムアクセス解析をした話

どうも、テック備忘LOGのYuki(@tech_bibo_log)です!!

今回はNginxのログを可読性を挙げて解析を可能にするためGoAccessを導入したときのお話をしていこうと思います。


みなさんはブログやサイト、もしくは開発用のWebサーバーを立てたからこの記事を読まれていることかと思います。
Webサイトへのアクセスで自分なりに解析をしてみたいな~って思われているのではないでしょうか?


もしくはGoAccessの導入を試みては、途中で躓いているのかもしれませんね。。

Yuki

この記事ではこんな人にオススメです。

  • どの記事にアクセスかあるのか知りたい
  • 悪意のあるユーザーからのアクセス有無を確認したい
  • どんな人たちがどこからアクセスしているのか知りたい
  • Nginxのログを可視化したい
  • GoAccessがうまく導入できない


この記事では筆者が実際にGoAccessを導入してみて感じたことや、導入した時の手順について紹介していきたいと思います!

実はGoAccessだけでは物足りないと感じたのですが、その理由についても触れていきたいと思います。

▽▽▽ Djangoでブログを構築した時のお話し ▽▽▽


ではみていきましょう!!

[ 目次 (開く) ]

GoAccessとは?

GoAccessの公式サイトでは以下のように説明されています。

GoAccessは、Unixライクなオペレーティングシステム向けのオープンソースのウェブ解析アプリケーションです。
テキストベースとWebアプリケーションの両方のユーザーインターフェイスがあります。
Webサーバーのログを継続的に監視することで、リアルタイムの分析を提供できます。
by [ GoAccess.io ]


要するに、簡単に言うと「GoAccess」とはLinuxのターミナル上、更にはWebアプリのようにブラウザ上でも表示できる Webサーバーのログ解析を行ってくれるアプリケーションです。

Webサーバー(今回はNginx)のログはシンプルですが、ただ文字が羅列されているだけなので、目視での解析が非常に大変です...
GoAccessを使えばグラフでログを可視化できるので、まじで最高です!!!

Yuki



それでは、実際にGoAccessでNginxのログを可視化するとどんな感じなのか見てみましょう!
以下は、GoAccess公式サイトにて公開されているWeb解析のDEMOページです。
URL: https://rt.goaccess.io/?20200714222654
LIVEデモ

GoAccessを導入

それでは、導入編に移りましょう!
下記の手順通りに進めていってください。

1.GoAccessをダウンロードしよう!

# cd /usr/local/src

# curl -O https://tar.goaccess.io/goaccess-1.4.tar.gz


2-1.圧縮ファイルを展開しよう!

goaccessのdirectoryを作成しておきます。

# mkdir /opt
# mkdir /opt/goaccess


先ほどダウンロードしたファイルを展開します。

# tar -xzvf goaccess-1.4.tar.gz
# mv goaccess-1.4 /opt/goaccess


2-2.インストールに必要な依存関係モジュールを取得しておきましょう!

# yum install ncurses-devel geoip-devel


3.インストールしよう!

先ほど作成した /opt/goaccess/に移動して作業します。

# cd /opt/goaccess/

# ./configure --enable-utf8 --enable-geoip=legacy
 ※最低限のオプションにしています。詳細はこちら(https://goaccess.io/man)

# make
# make install

# sudo ln -s /usr/local/bin/goaccess /usr/bin/goaccess
 ※goaccessコマンドを使えるようにシンボリックリンクを貼ります。


4.インストールを確認します。

バージョンの情報などが確認出来ましたのでインストールは成功です。

# goaccess --version

GoAccess - 1.4.
For more details visit: http://goaccess.io
Copyright (C) 2009-2020 by Gerardo Orellana

Build configure arguments:
  --enable-utf8
  --enable-geoip=legacy



5.設定ファイルを編集しよう!

goaccess.conf.orgをコピーして、バックアップを取っておきましょう。
そして設定ファイルを編集します。

# cp /usr/local/etc/goaccess/goaccess.conf /usr/local/etc/goaccess/goaccess.conf.org
# vim /usr/local/etc/goaccess/goaccess.conf

 time-format %H:%M:%S
 date-format %d/%b/%Y
 log-format COMBINED
 ※上記三箇所のコメントアウトを外す。
 ※ログフォーマットをいじらず、COMBINED形式で出力させたログ解析を想定しています。
 ここは環境に合わせて設定してください。


6.ポートを解放しよう!

GoAccessのWebレポートを自動更新させるのにWebSocketに7890番ポートを使用するため、FWを開放しておきましょう。
・iptablesを設定
・ファイヤーウォールを設定

# vim /etc/sysconfig/iptables

 以下を記載
 # goaccess
 -A INPUT -p tcp -m state --state NEW -m tcp --dport 7890 -j ACCEPTdate-format %d/%b/%Y

 firewalldを設定
# firewall-cmd --add-port=7890/tcp --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all ←※設定を確認


7.Nginxの設定をしよう!

HTMLレポートをwebブラウザで確認するため、Nginxの設定を行います。
今回は "ドメイン名/goaccess"でのアクセスとします。
※IPで使用する場合は、置き換えてください。

# vim /etc/nginx/conf.d/hogehoge.conf
/etc/yum.repos.d/nginx.repo
server {
    listen       80;
    listen       [::]:80;
    server_name  example.com;
    charset      utf-8;
    client_max_body_size 75M;
    
    ...
    location /goaccess {
        root  /opt;
        index  logviewer.html;
    }
    ...


8.HTMLレポートを作成しよう!

ここで一旦、goaccessコマンドでhtmlレポートを出力してみましょう。
下記コマンドを実行して、先程設定してURLへアクセスてください。 例)example.com/goaccess

# sudo goaccess /var/log/nginx/access.log -o /opt/goaccess/logviewer.html --real-time-html --log-format=COMBINED


9.goaccessをサービス化しよう!

先ほどのコマンドを常時打つわけにはいかないので、サービス化していきましょう。
systemctl start goaccessというコマンドでサービスを常時利用できるようになります。

# vim /etc/systemd/system/goaccess.service
/etc/yum.repos.d/nginx.repo
[Unit]
Description=Goaccess daemon.
After=network.target

[Service]
Type=simple
User=root
Group=root
Restart=always
ExecStart=/usr/local/bin/goaccess -a -g -f /var/log/httpd/access_log -o /var/www/html/goaccess/index.html --real-time-html --log-format=COMBINED --ws-url goaccess
StandardOutput=null
StandardError=null
[Install] WantedBy=multi-user.target

サービスの起動と確認をします。これでGoAccessを常時稼働させることが出来ました。

# systemctl enable goaccess
# systemctl start goaccess
# systemctl status goaccess



リアルタイム更新がうまくいかない場合...!

先ほど登録したサービスをcronに設定して1分毎に更新してしまうという手もあります。
私はWebSocketの通信がうまくいかずリアルタイム更新が実装できていないので、今は取り急ぎこの方法でレポートを更新しています。
この問題が解決でき次第、情報を更新いたします。

# crontab -e

 *  * *  systemctl restart goaccess ← これを追加

導入手順の説明は以上です。
少し作業が多くて大変だったかもしれません。お疲れ様でした。

次はNginxを使用した感想と物足りないと感じた点について話したいと思います。

GoAccessを使用した感想と物足りない点...

GoAccessを使用した感想

ここまでの手順でGoAccessの導入できた方は少し触ってみたかもしれませんが、UIはとてもオシャレですよね。

ログがグラフ化されて可読性が上がり解析もしやすくなったと思いますし、グラフのテーマやグラフの表示方法も複数用意されており ログ解析ツールの一つとしては十分に有用なものだと思います!!!

実際に使用してみて、怪しいアクションが行われていたことも簡単に目視できたので更にセキュリティー対策を取ることもできました。 その点では大変気に入っています。

ただGoAccessだけでは不十分に感じる点もあったので次で説明していきたいと思います。

1.GoAccessの物足りない点

セキュリティー観点で悪意のあるアクションを行うユーザーや、お問合せフォームから営業メールをしつこく送り付けてくるユーザーなど様々なユーザーがいます。
そんな招かれざるユーザーへ対応するために情報を取得したいとき、GoAccessだけでは力不足でした。

それは、『悪意あるアクションとそれを行ったユーザーの情報が結びついていない』という点です。


次の画像で説明します。
REQUESTED FILES (URLS)グラフ

このグラフは当ドメイン”yuki-yamashita.site”に対してアクセスのあったURLが表示されています。

例えば...
・/MyAdmin/scripts/setup.php
・/wp-login.php
・/config/getuser?index=0
などです。

これらは当ドメイン(今回の場合はこのブログ)に対して、URLアタックというハッキングの一つを試みていることが分かります。
例えばWordPressのログイン情報に簡単なパスワードを設定している場合や、Webサーバーの設定が甘い場合はサイトを乗っ取られてしまうこともあります。

それではこれらのアクションに対しての対策を取りたいとします。
欲しいのは悪意あるURLアタックの内容や、それを行ったユーザーのIPアドレスです。

ですが、それは出来ません。なぜなら”アクションとIPが紐づいていないから!”です。

VISITOR HOSTNAMES AND IPSグラフ

なぜだああああああああああああああああああああああああああああああ!!

おしい、、惜しすぎます、GoAccess。

これではアクセスのあるURLに対しての対策しかできません。
どうしよう...

あ、それなら『structlog』がおススメだよ!!
ユーザー情報とアクションが紐づいたログを残せるよ!

次の記事で紹介しています!

Yuki


ということで興味のある方は是非読んでみてください。

▽▽▽ django-structlogとJupyter NoteBookでセキュリティー対策する方法を紹介 ▽▽▽



▽▽▽ django-structlogでDjangoのログを取る方法を紹介 ▽▽▽



まとめ

今回はGoAccessを紹介しました。
とてもオシャレなグラフでログを可視化できるので、セキュリティー対策の一つとして導入を検討されている方にはオススメです!!
うん、かっこいい。。。

ただセキュリティー対策としては、これだけでは役不足なのでstructlog(Djangoを使用している方にはdjango-structlog)と併用して対策を行っていくのを推奨します。

こうやって少しずつ、でも確実にサーバーや自分のWebサイトを守っていきましょう!

それでは今回はこれで終わらせてい頂きます。
最後まで読んで頂きありがとうございました!