NginxのログをGoAccessでアクセス解析【2020/07】
2020年7月27日
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
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
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
[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だけでは力不足でした。
それは、『悪意あるアクションとそれを行ったユーザーの情報が結びついていない』という点です。
次の画像で説明します。
このグラフは当ドメイン”yuki-yamashita.site”に対してアクセスのあったURLが表示されています。
例えば...
・/MyAdmin/scripts/setup.php
・/wp-login.php
・/config/getuser?index=0
などです。
これらは当ドメイン(今回の場合はこのブログ)に対して、URLアタックというハッキングの一つを試みていることが分かります。
例えばWordPressのログイン情報に簡単なパスワードを設定している場合や、Webサーバーの設定が甘い場合はサイトを乗っ取られてしまうこともあります。
それではこれらのアクションに対しての対策を取りたいとします。
欲しいのは悪意あるURLアタックの内容や、それを行ったユーザーのIPアドレスです。
ですが、それは出来ません。なぜなら”アクションとIPが紐づいていないから!”です。
なぜだああああああああああああああああああああああああああああああ!!
おしい、、惜しすぎます、GoAccess。
これではアクセスのあるURLに対しての対策しかできません。
どうしよう...
あ、それなら『structlog』がおススメだよ!!
ユーザー情報とアクションが紐づいたログを残せるよ!
次の記事で紹介しています!
Yuki
ということで興味のある方は是非読んでみてください。
▽▽▽ django-structlogとJupyter NoteBookでセキュリティー対策する方法を紹介 ▽▽▽
▽▽▽ django-structlogでDjangoのログを取る方法を紹介 ▽▽▽
まとめ
今回はGoAccessを紹介しました。
とてもオシャレなグラフでログを可視化できるので、セキュリティー対策の一つとして導入を検討されている方にはオススメです!!
うん、かっこいい。。。
ただセキュリティー対策としては、これだけでは役不足なのでstructlog
(Djangoを使用している方にはdjango-structlog
)と併用して対策を行っていくのを推奨します。
こうやって少しずつ、でも確実にサーバーや自分のWebサイトを守っていきましょう!
それでは今回はこれで終わらせてい頂きます。
最後まで読んで頂きありがとうございました!