Unengineered Weblog

PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND

さくらインターネットで VPS を立てて遊び、 ログを数える Mackerel プラグインを作った

私は Web アプリケーションエンジニアを自称しているが、実は VPS で遊んだことのない怪しい人間なので、土日で VPS で一通り遊んでみた。

サーバーを建てる

さくらの VPS の 1G プランを選んだ。 OS は Ubuntu 24.04 amd64

サーバーを立てたら SSH でパスワードログインを禁止したりと一般的な作業を行った。

さてこの作業をしているうちに私は初めて知ったのだが、 GitHub に登録している公開鍵のリストは次の URL にダウンロードできるみたいだ。

https://github.com/{username}.keys

次のようにすれば、普段使っている公開鍵をサーバーに保存できてしまう。とても便利だ。

$ curl https://github.com/{username}.keys >> ~/.ssh/authorized_keys 

Mackerel Agent をインストールする

はてなのエンジニアなので当然 Mackerel Agent をインストールした。

HTTP サーバーを建てる

今回は ngnix など使わず直接 Go で HTTP サーバーを建てた。以下 hello と名付ける。

github.com

リクエストをすると hello, {リクエスト元IP} を返すだけのサーバーである。 HTTPS で通信したかったので certbot を使って証明書を取得した。 次の公式ドキュメントとブログを参考にした。

eff-certbot.readthedocs.io

maku.blog

certbot で証明書を取得すると「今後自動的に証明書の更新をするよ!」とメッセージがでてくる。はてどうやって? crontab みてもそんなのなさそうだが…と思ったが、今は systemd-timer を使うらしい。

さくらのVPS はパケットフィルターというものがあり、はじめは 22 しか開放していない。HTTP サーバーを建てるため 443 を開ける必要がある。

ログを見て楽しむ

サーバーとしての作業はこれ以上特に何もやってない。

知らない人が SSH でログインを試行してくるログとかHTTP サーバーの変なパスへのリクエストのログを眺めて楽しんでいた。

たとえば次のようなパスへアクセスしてくるログを見ていたりした。

url=/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh
url="/index.php?lang=../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/&/<?echo(md5(\"hi\"));?>+/tmp/index1.php

ログをメトリックにして楽しむ

たまに変なログが出てきて面白いが、ほとんどは面白くないログばかりだ。 変なログが来たときだけ見たい。ということでログの数を Mackerel へメトリックとして投稿することにした。 journalctl を定期的に叩いて特定のログの数える plugin が欲しかった。が、探してみても手頃なものがなかったので自作した。 名付けて mackerel-plugin-journal-count である。

github.com

これは systemd の service unit の名前と正規表現を引数にとり、その unit が吐き出したログのうち正規表現にマッチする数を metric として Mackerel に投稿するプラグインである。

例えば mackerel-agent.conf につぎのような設定をする。

[plugin.metrics.journal-count-ssh]
command = "/usr/local/bin/mackerel-plugin-journal-count -u ssh -g 'invalid user .* from'"

すると sshd のログのうち次の行の数をメトリックとして Mackerel に投稿してくれる。

Invalid user XXX from XXX.XXX.XXX.XXX port XXXX

次の画像は HTTP サーバー(hello)のリクエスト数 と sshd の invalid user のログの数のメトリックのグラフである。 HTTP サーバーのリクエスト数を INFO request にマッチするログの数、 sshd の invalid user のログイン試行回数を invalid user .* from にマッチするログの数としてメトリックにしている。sshd の invalid user を数える正規表現はこれよりももっと良さそうなのがありそうだ。

この mackerel-plugin-journal-count はシェルスクリプトで書いた(ほとんど awk が処理を担っているが)。私が真面目に向き合った最初の言語はシェルスクリプトなので、シェルスクリプトを書くのはやっぱり楽しいですね。