2026/06/25(木)自宅サーバーの一部がダウンしたが監視を入れていてよかった話
投稿日:
仕事を終えて自分のサイトを見ると一部がダウンしておりGrafanaを見てみたらディスク使用率が100%になっていた。Mastodonがダウン、Grafanaも不安定な状態だった。
Prometheusのsyslog集めが強すぎてストレージパンクしたかな?と思ってPrometheusを止めてみたが効果はなかった。
ディスク占有しているやつを探す
ひとまずディスクを占有している主を突き止めるため、ディレクトリ単位の容量を出して突き止めることにした。犯人はForgejoだった。
犯人探しに使った軌跡
sudo du -xh --max-depth=1 /
sudo du -xh --max-depth=1 /var
sudo du -xh --max-depth=1 /var/lib
sudo du -xh --max-depth=1 /var/lib/forgejo
sudo du -xh --max-depth=1 /var/lib/forgejo/data
sudo du -xh --max-depth=1 /var/lib/forgejo/data/repo-archive
一次対応としてForgejoへの外部アクセスを遮断
取り敢えずForgejoが攻撃されてると面倒だなと思い、nginxの設定を書き換えてForgejoへの外部接続を拒否した。
次にrepo-archiveはキャッシュらしいのでForgejoの管理画面から消すことにした。すると即座にディスクは空き、全てが元に戻った。
犯人捜し
一旦サーバーは安定状態になったので犯人を捜すことにした。
まずはForgejoのログを見たのだが役に立たなかったので、次に私はGrafanaのLokiからnginxのログを引くことにした。
そしてLokiからnginxのログを見たらすぐに分かった。meta-externalagent、つまり悪名高いFacebookのクローラーだった。過去にこのブログにやってくる海外IPのBOTの挙動を軽く調べたでも出したが、こいつはやたらアクセスしてくる。
しかし何故Facebookのクローラーがなぜ…?と思ったがURLを見てすぐわかった。アーカイブにアクセスしているのだ。
もしかしたらForgejoはアーカイブURLにアクセスされるとその都度.zipや.tar.gzを生成しているのかもしれないと思って調べたらその通りだった。そんなクソみたいな仕様ある…?と思ったが、アーカイブを作るなら他に方法はない。
ForgejoはGitHubと違ってパス単位に作れるため、パスが多いリポジトリほど大量に作れるし、過去のバージョンを参照されたら事実上ほとんど無限に生成できる。そりゃパンクする。
Forgejoはどう思っているのか?
こんなのほとんど脆弱性である。しかもディスククォーターを設定したところでどうにもならない。ダウンロードできなくなって詰むだけだ。定期的にクリアしてもいいがSSDの寿命が縮んでしまう。
そこでForgejoの人たちはどう思っているのか調べてみたら案の定課題が起票されていた。最後の奴に至ってはメインコントリビューターの一人と思われるGusted氏の起票である。
結局どうすることにしたか
リポジトリの中身をzipで落としたい需要というのはどうしても出てくるし、それは仕方がない。しかし世代ごとパスごとに作ってしまうとなると、その数は無数になりすぎてしまう。
そしてダウンロードさせる以上どこかにデータを置く必要はある。仮に定期的に消すとしてもストレージの消耗は避けられない。
結論としてForgejoは撤去し、成果物は配布ページを作ってそこでzip配信するのが無難だなと思った。
簡単なコードについてはゴミ箱みたいな場所を作ってそこに転がしておくのもいいだろう。
明らかに利用者がいるValueDomainの奴とかもあるので、ひとまず土曜日にページを作って配信しようと思った。
meta-externalagentのアクセス推移
全部で何アクセス化までは見れていないが万単位でアクセスされてそうなので無茶苦茶だなと思った。
metaは最早攻撃者にも近いと思う。
経緯とか
18時頃にメトリクスが切れているのは多分書き込めなくて一時的に死んだからと思われる。再開できた理由は不明。この時点でネットワークトラフィックも死んでおりまともにアクセスできない状態だったと思われる。
19時半頃に手当を開始したが、FacebookのクローラーはForgejoを遮断するまでダウンロード不能(statできずにエラーを吐いていた)になったURLにひたすらアクセスしていた。
あとがき
今回の障害はいい勉強になった。
ディスク容量の急増という障害があることを知れたこと、単にログとメトリクスを集めているだけでも解ることがあることが知れた。
勿論、閾値を設定した上での発報や、毎回クエリを叩かなくていいダッシュボードがあればよりよいと思うが、単に監視装置を置いているだけでもこうやって知ることができるのだなというので、いい経験になった。


