私は 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 と名付ける。
リクエストをすると hello, {リクエスト元IP}
を返すだけのサーバーである。
HTTPS で通信したかったので certbot を使って証明書を取得した。
次の公式ドキュメントとブログを参考にした。
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 である。
これは 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 が処理を担っているが)。私が真面目に向き合った最初の言語はシェルスクリプトなので、シェルスクリプトを書くのはやっぱり楽しいですね。