カテゴリー: ガジェット Page 1 of 113

ピボット旅行2026-27『il vento d’oro』

はじめに

このタイトルを聞いて、ピンとくる方は多いと思います。

アニメ『ジョジョの奇妙な冒険 黄金の風』、そのイタリア語タイトルが『Vento Aureo』。そして『il vento d'oro』といえば、敵へのトドメで流れる、いわゆる「処刑用BGM」として知られるあの曲です。

MLBオールスターでも大谷翔平選手が入場曲としてリクエストしたことで話題になりました。そんな曲が、今回のエントリーの鍵となります。

……鍵というよりは、契機と呼んだ方が正確でしょうか。なにしろ、今回立ち向かう相手は敵スタンド使いではありません。自分自身が溜め込んだ、ある種の負債です。

記録負債という言葉

筆者には、日課と呼べるものがいくつかあります。

  • 毎日のWordPress公開
  • ほぼ日手帳への記録
  • ZENタイルの記録

こう並べると、いかにも毎日きっちりと記録をこなしているように見えるかもしれません。しかし、実態は少し違います。

大事なのは、必ずしもその日のうちに全部を終わらせることではありません。最終的に帳尻が合えばいい、というのが筆者のスタンスです。記録を溜めておいて、後からまとめて処理することもあります。

その結果として発生するのが、記録負債。記録するべき事柄がなくなるわけではありません。単に未来の自分へ仕事を先送りしているだけです。

そして、未来の自分は大抵、別のことをしています。こうして発生した負債を返済するため、筆者は定期的に時間を設けています。

お金の記録は、ライフログである

今回の返済対象は、旅行中のお金の記録です。宿に戻ったら、まずは大事な記帳作業が待っています。お金といっても、ここで記録するのは入出金です。

お金の動きは、単なる家計簿の数字ではなく、自分がどのように生活していたかを物語るライフログでもあります。

  • 臨時収入。めったにありません。
  • 衝動買い。こちらは、とてもよくあります。
  • 急遽、病院に行くことになった記録。

普段の生活で何にお金を使い、何が予定外に発生し、どこで判断を変えたのか。そうした出来事が、金額とともに残ります。下手に感情だけを記録するよりも、よほど生々しいものが見えてくることもあります。

筆者がこの記録に使っているのが、セルフホストしている家計管理アプリのFirefly IIIです。

比較的シンプルな操作で記帳でき、検索も速い。口座単位で管理できるため、現金で支払ったのか、カードを使ったのかといった違いも追跡できます。今回の旅行では、これが実に重要な意味を持ちます。

  • どこで、何に、いくら使ったのか。
  • それだけでなく、いつ使ったのか。

記録を積み上げていけば、旅行中のお金の動きを完全に物語る指標になります。 ……問題は、その物語に登場する数字を、自分自身で支払っていることです。

自分の血液が流出する瞬間

旅行中の出費を記録するということは、レシートや領収証を確認しながら、自分が使った金額を改めて直視するということです。言い換えなくても:お金という自分の血液が流出した事実を、わざわざ自分の手で再確認する作業でもあります。

精神にくる作業です。一泊や二泊程度の旅行であれば、帰宅してからまとめて記録しても何とかなります。しかし、三泊ともなると話が変わります。

レシートも領収証も増えます。記録する項目も増えます。何より、時間が経過するほど「これは何の支払いだったか」を思い出す負担が増していきます。

どこかで、途中で、やらなくてはいけません。しかし、やりたくない。

この二つは、何の矛盾もなく両立します。

そして、両方やらなくっちゃあいけないのが辛いところです。

覚悟はいいか? 俺はできてる

それならば、なぜ朝一番でやらなかったのでしょうか。

旅行記を書いているときには、筆者はしばしば「自動書記」とでも呼ぶべき状態に入ります。記憶が新鮮なうちに、思い出したことを勢いのまま文章へ変換していくのです。

ならば、朝のうちに記帳も済ませてしまえばよかった。ところが、お金の記録は勝手が違います。

旅行記ならば、多少の感情の揺れや記憶の細部が前後したところで、文章としての勢いを優先できます。金額はそうはいきません。

  • レシートに書かれた金額と入力した金額が一致するか。
  • 現金で払ったのか、カードで払ったのか。
  • 記録した取引に抜けがないか。

起き抜けの頭で、これらを正確に突き合わせるのは無理があります。自動書記の勢いだけでは乗り切れない。かといって、先延ばしにすれば負債が膨らんでいく。

そこで必要になるのが、作業を始めるためのスイッチです。

「覚悟はいいか? 俺はできてる」

ここで選ばれたのが、『il vento d'oro』でした。

ミュージックスタート。

トラベラーズノート、マスキングテープ、そしてFirefly III

曲を流しながら、レシートと領収証を一気にまとめていきます。

この作業で役に立ったのが、前回の記事でも登場したトラベラーズノートです。レシートを貼り付け、必要に応じて簡単なメモを残し、それを確認しながらFirefly IIIへ記帳していく。

単にレシートを保管するだけではありません。旅先での支出を振り返り、記録と記憶を結びつけるための作業台として機能してくれました。そして、ここでもう一つ、思わぬ援軍が登場します。

マスキングテープです。

今回、輪行を諦めたことで、当初の予定とは少し違う荷物を携行することになりました。その中に入っていたマスキングテープ群が、ここで役に立ったのです。

レシートを貼り付け、整理し、必要な情報を残す。旅先での記録という観点では、非常に相性のよい組み合わせでした。もっとも、これらを持ってこなかったとしても、筆者はおそらくロフトでほぼ日手帳と一緒に買っていたでしょう。

必要な道具がなければ、現地調達すればいい。旅先での買い物には、そういう側面もあります。

……そして、そうやって増えていく出費もまた、いずれFirefly IIIに記録されるわけです。

無駄無駄無駄ラッシュ、そして17時

『il vento d'oro』の勢いを借りて、次々とレシートを処理していきます。金額を確認し、支払い方法を確認し、取引を登録する。

無駄無駄無駄無駄無駄無駄無駄無駄ッ!

もちろん、ここで言う「無駄」は、記帳作業そのものを指しているわけではありません。あくまで、積み上がった消費金額に対する感想です。

曲の勢いに乗って、記録負債を一気に返済していきます。

そして、作業開始から約一時間。

ついに、旅行中の支出記録が完成しました。

これで、どこで、何に、いくら使ったのかを振り返るための記録が揃いました。レシートも整理され、Firefly IIIへの入力も完了。先送りにしていた仕事が、ようやく片付きました。

そして時計を見ると、17時。

「つけの…… 領収証だぜ」

と言いながらの次の出費へ向かうため、財布を持って宿を後にしました。

...To Be Continued

ピボット旅行2026-断章『自分へのマウント』

はじめに

この旅行の0日目、つまりフェリーに乗った日に、トラベラーズノートを購入しました。

そして、「あるのがいけない!」でお茶を買っても、高松商店街の探索は続きます。

ルピシアからそう遠くないところにロフトがある。せっかくだから行ってみよう。そうして立ち寄った店内で、筆者はほぼ日手帳を見つけました。翌年分のアベック版です。

そこで、ふと思ったわけです。

「これ、旅先で買うの?」

いや、旅先だから買うのです。トラベラーズノートに続いて、ほぼ日手帳まで旅先で購入する。今回は、そんなお話です。

未来の自分にマウントを取る

筆者は2021年1月から、ほぼ日手帳の全日付を埋め続けています。

毎日欠かさず書いているわけではありません。ある程度たまったところでまとめて消化する、いわば積み残しの一括処理方式です。それでも、日付に空白を残さず続けていることには変わりありません。

そんな性分ですから、毎年の手帳購入は、いつしか楽しみではなくなっていました。

翌年版の発売に合わせて購入する。毎年決まった時期に発生する、避けては通れない定例作業です。たとえるなら、サブスクリプションの更新でしょうか。必要なのはわかっている。やらなければ困る。しかし、いざその時期が来ると、なんとなく面倒くさい。

筆者にとって、ほぼ日手帳の購入はそんな作業の筆頭になっていました。しかし、高松のロフトで商品を眺めているうちに、考えが変わりました。

これ、未来の自分にどや顔を決められるのでは?毎年、翌年のほぼ日手帳が発売されるたびに、筆者はこう考えることができます。

  • 「2026年の俺は、旅先で新しいものを買ったぞ?」
  • 「お前はどうなんだ?」
  • 「その時の自分に負けていいのか?」

……これは強い。毎年の手帳購入という、どうしても発生するイベント。そのたびに、過去の自分から挑戦状を突きつけられるわけです。

しかも、相手は自分自身。勝ち負けを決める審判も自分自身です。いくらでも言い訳はできますが、いくらでも言い返されます。

これほど面倒で、これほど長続きしそうな仕掛けもありません。

ほぼ日以外の選択肢

とはいえ、今回の買い物は、ほぼ日手帳から別の手帳へ乗り換えようという話ではありません。

筆者が当初考えていたのは、ほぼ日以外にも、ある程度規格化されていて、商品としての姿が明確で、さらに自分好みにカスタマイズできる手帳を持つことでした。

もうひとつ、忘れてはいけない条件があります。母が作ってくれた、特製の手帳ポーチです。これがある以上、手帳だけを別のものに替えれば済むというわけにはいきません。今さら、このポーチを使わない選択肢は端っからありません。

今回は、翌年分のほぼ日手帳アベック版を購入しました。ついでに、カスタマイズ用のパーツも。

いつもの手帳を、いつもとは違う場所で買う。

たったそれだけのことですが、筆者にとっては毎年の定例作業に、新しい意味を与える買い物になりました。

記憶にフックを仕込む

ここで重要なのは、単に翌年分の手帳を早めに手に入れたことではありません。

その手帳を、どこで、どんな経緯で買ったのか。

この記憶こそが、今回の買い物の本体です。心理学には、エピソード記憶という概念があります。自分が経験した出来事を、そのときの状況や場所、感情などと結びつけて覚える記憶です。

今回の手帳には、高松の商店街を歩き、ルピシアの近くにあるロフトへ立ち寄り、そこで「旅先だから買う」という結論に至った一連の出来事が付随しています。

毎年、決まった時期に購入する手帳とは違います。

2026年の手帳には、2026年の旅先で買ったという固有のエピソードがあるのです。そして、この記憶は、手帳を使い続ける限り、何度も思い出す機会があります。

  • 翌年分の手帳を購入するとき。
  • 分冊になっているアベック版を切り替える、半年ごとのタイミング。
  • 何より、文章を書いていて筆が止まってしまったとき。

今回の買い物は、そんな場面で記憶を呼び起こすフックになるはずです。

手帳を開けば、高松で買ったことを思い出す。高松で買ったことを思い出せば、あのときの自分が、未来の自分に向けて仕掛けを施したことも思い出す。そして、あの言葉が蘇ります。

「2026年の俺は、旅先で新しいものを買ったぞ?」

毎年の手帳購入を、単なる義務的な更新作業で終わらせない。過去の自分が、未来の自分を動かすための仕組みを作っておく。手帳という、日常的に使う道具だからこそ、この仕掛けには意味があります。

おわりに

筆者は今回、翌年分のほぼ日手帳を買いました。ただ、それだけではありません。

未来の自分に向けて、挑戦状を残しました。来年、手帳を更新するとき。半年後、新しい冊子を開くとき。あるいは、何も書けずに机の前で固まっているとき。

そこには、高松で手帳を買った自分がいます。

「2026年の俺は、旅先で新しいものを買ったぞ?」

さて、未来の筆者は、この問いにどう答えるのでしょうか。

Linuxカーネルの脆弱性 CVE-2026-98432 続報:nftablesによる暫定緩和策と永続化

概要

先日、Linuxカーネルの脆弱性「CVE-2026-98432」について、原因と暫定対策を記事にしました。

その後、2026年10月30日付で、Red HatおよびCIQからnftablesを利用した緩和策が公開されました。

今回の脆弱性は、IPv4 TCP接続の処理中に解放済みメモリへアクセスするUse-After-Free(UAF)に起因するものです。

攻撃者がIPv4オプションを含むTCPパケットを送信することで、問題のある処理経路に到達する可能性があります。

そこで、IPv4オプション付きTCPパケットをカーネルのTCP処理に到達する前に破棄するというのが、今回の緩和策です。

参考資料:

CIQの資料では、MPTCPを無効化した状態でも通常のTCP通信から脆弱な処理経路に到達できることが確認されています。そのため、MPTCPの無効化だけに頼らず、nftablesによる通信制御を追加することにしました。

今回は、実際に運用しているサーバに暫定ルールを追加し、systemdによる永続化の設定まで行った記録です。

環境

  • OS:Ubuntu 24.04 LTS
  • Webサーバ:Apache
  • ファイアウォール:UFW
  • IPアドレス制御:ipset
  • 不正アクセス対策:fail2ban
  • iptables:v1.8.10(nf_tables)
  • 作業日:2026年10月31日

筆者環境では、UFWとipsetを組み合わせたアクセス制御を行っています。

今回の作業前に、nftablesのルールセットを確認しました。

sudo nft list ruleset | wc -l

結果は、

6089

6,089行。

この時点で、今回の作業方針はほぼ決まりました。既存のファイアウォールには、できる限り手を加えないことです。

実際、iptablesのバージョンを確認すると、

sudo iptables -V
iptables v1.8.10 (nf_tables)

となっていました。また、nftablesのテーブル一覧は以下のとおりです。

sudo nft list tables
table ip6 filter
table ip filter
table ip nat
table ip6 nat
table ip raw
table inet f2b-table

UFWなどがiptables-nftを通じて管理しているテーブルに加え、fail2ban用の独立したテーブルも存在しています。

今回の緩和策は、これらとは別に専用テーブルを作成する方針としました。

フェイズゼロ:政治交渉

以前の記事でも触れましたが、システムの保守作業には技術的な準備だけでなく、作業時間の確保や関係者との調整が必要です。

今回も例外ではありません。

ただし、今回の作業では、もう一つ交渉相手がいました。

自分自身です。

既に稼働しているファイアウォールの設定を変更するのは、できれば避けたい作業です。

しかも、SSHで接続しているサーバのネットワーク制御を変更するとなれば、設定を間違えた瞬間に自分自身を締め出す可能性があります。

そこで、今回の作業では以下を徹底しました。

  • 既存のUFW・ipset・fail2banの設定は変更しない。
  • nftablesにCVE対策専用のテーブルを作成する。
  • 変更前のルールセットを保存する。
  • シリアルコンソールを確保する。
  • 問題が発生した場合は、専用テーブルだけを削除する。

特に重要なのが、シリアルコンソールです。

SSH接続を失った場合でも、ネットワーク経由ではない復旧手段を確保してから作業に入りました。

退路を確保してから前進する。

今回は、これが最も重要な準備でした。

さっくりとした手順

  1. 作業ディレクトリへ移動 cd /home/hoge/work/cve-2026-98432

任意のディレクトリを指定します。

  1. 既存ルールセットをバックアップ sudo nft -a list ruleset > nftables-before-cve-2026-98432.txt
  2. テーブル一覧をバックアップ sudo nft list tables > nftables-tables-before.txt
  3. 既存のCVE対策用テーブルを確認 sudo nft list table inet cve_2026_98432
  4. 暫定ルールの設定ファイルを作成 nano cve-2026-98432.nft
  5. 構文チェック sudo nft --check --file cve-2026-98432.nft
  6. 暫定ルールを適用 sudo nft --file cve-2026-98432.nft
  7. 適用結果を確認 sudo nft -a list table inet cve_2026_98432
  8. 永続化用の設定ファイルを作成 sudo nano /etc/nftables/cve-2026-98432.nft
  9. systemdユニットを作成 sudo nano /etc/systemd/system/cve-2026-98432-nft.service
  10. 永続化用設定の構文チェック sudo nft --check --file /etc/nftables/cve-2026-98432.nft
  11. systemdユニットの検証 sudo systemd-analyze verify /etc/systemd/system/cve-2026-98432-nft.service
  12. systemdの設定を再読み込み sudo systemctl daemon-reload
  13. 自動起動を有効化 sudo systemctl enable cve-2026-98432-nft.service
  14. 自動起動の登録状態を確認 systemctl is-enabled cve-2026-98432-nft.service
  15. 既存の防御機構を確認 sudo ufw statussudo ipset list -namesudo fail2ban-client status

作業詳細

1. 既存のルールセットをバックアップ

まずは、作業ディレクトリを用意しました。

今回の作業ディレクトリは以下です。任意のディレクトリを指定してください。

cd /home/hoge/work/cve-2026-98432

現在のルールセットを保存します。

sudo nft -a list ruleset > nftables-before-cve-2026-98432.txt

続いて、行数を確認しました。

wc -l nftables-before-cve-2026-98432.txt
6089 nftables-before-cve-2026-98432.txt

既存の6,089行を保存できています。

次に、テーブル一覧も保存します。

sudo nft list tables > nftables-tables-before.txt

ファイルの状態は以下でした。

nftables-before-cve-2026-98432.txt  239547 bytes
nftables-tables-before.txt              94 bytes

これで、変更前の状態を記録できました。なお、これらのファイルは復旧時の参照用です。

iptables-nftで管理されているテーブルも含まれるため、バックアップ全体を無条件に読み戻すことはしません。

2. nftablesの専用テーブルを作成

まず、同名のテーブルが存在しないことを確認します。

sudo nft list table inet cve_2026_98432

続いて、作業ディレクトリに設定ファイルを作成しました。

nano cve-2026-98432.nft

内容は以下です。

table inet cve_2026_98432 {
    chain prerouting {
        type filter hook prerouting priority -300; policy accept;
        ip hdrlength > 5 meta l4proto tcp counter drop
    }
}

それぞれの意味は以下のとおりです。

  • table inet cve_2026_98432:今回のCVE対策専用テーブル
  • hook prerouting:受信パケットの早い段階で評価
  • priority -300:raw優先度
  • ip hdrlength > 5:IPv4ヘッダーが通常の20バイトを超えるパケットを対象
  • meta l4proto tcp:TCP通信を対象
  • counter drop:該当パケットをカウントして破棄

ここで重要なのは、IPv4のIPオプションとTCPオプションは異なるという点です。

今回のルールは、TCPタイムスタンプなどの一般的なTCPオプションを一律に遮断するものではありません。

一方、IPv4オプションを使用する正当なTCP通信は遮断されるため、適用先の通信要件を考慮する必要があります。

3. 構文チェック

設定ファイルを保存したら、構文チェックを実施します。

sudo nft --check --file cve-2026-98432.nft

エラーは表示されませんでした。終了ステータスも確認します。

echo $?
0

構文チェック成功です。この段階では、まだ通信制御は変更されていません。

4. シリアルコンソールを確保

実際に適用する前に、vpsのシリアルコンソールへ接続しました。

今回の作業で最も避けたいのは、SSH接続を失ってサーバへアクセスできなくなることです。

現在のUFWでは、以下のポートを許可しています。

80/tcp
443/tcp
22/tcp

今回のnftablesルールはポート番号による判定ではないため、これらのポートにも条件が一致すれば適用されます。

そのため、SSHセッションを維持したまま作業し、必要になればシリアルコンソールから切り戻せるようにしました。

5. 暫定ルールを適用

準備ができたところで、設定を適用します。その前に:深く深呼吸を3回ぐらいしましょう。ここから先、タイポ、コマンド忘れ、全てが致命的になり得ます。

sudo nft --file cve-2026-98432.nft

エラーは表示されませんでした。続いて、適用結果を確認します。

sudo nft -a list table inet cve_2026_98432

結果は以下です。

table inet cve_2026_98432 { # handle 10
        chain prerouting { # handle 1
                type filter hook prerouting priority raw; policy accept;
                ip hdrlength > 5 meta l4proto tcp counter packets 0 bytes 0 drop # handle 2
        }
}

設定ファイルではpriority -300と指定しましたが、表示上はpriority rawとなっています。これはnftablesが数値を定義済みの優先度名で表示しているためです。

また、

counter packets 0 bytes 0

となっています。この時点では、遮断条件に一致したパケットはありませんでした。

6. Webサイトの動作確認

適用後、自サイトへアクセスし、記事の登録まで行いました。

HTTPSによるアクセス、ログイン状態の維持、記事の登録と保存が正常に行えています。

単純なHTTP応答だけでなく、普段利用しているWebアプリケーションの操作が継続できることを確認しました。

少なくとも、今回確認した範囲ではWebサイトの利用に支障は発生していません。

永続化

1. 永続化用の設定ファイルを作成

暫定ルールの動作を確認できたため、再起動後にも読み込めるようにします。ただし、既存のUFWやipsetを管理している仕組みには手を加えません。

今回は、CVE対策専用の設定ファイルとsystemdユニットを作成しました。

sudo mkdir -p /etc/nftables
sudo nano /etc/nftables/cve-2026-98432.nft

内容は以下です。

add table inet cve_2026_98432
delete table inet cve_2026_98432

table inet cve_2026_98432 {
    chain prerouting {
        type filter hook prerouting priority -300; policy accept;
        ip hdrlength > 5 meta l4proto tcp counter drop
    }
}

冒頭の、

add table inet cve_2026_98432
delete table inet cve_2026_98432

は、既存の専用テーブルが存在する場合でも、同じ名前のテーブルを作り直せるようにするためのものです。

削除対象はcve_2026_98432テーブルに限定しています。

UFWやfail2banのテーブルには触れません。

2. systemdユニットを作成

続いて、専用のsystemdユニットを作成します。

sudo nano /etc/systemd/system/cve-2026-98432-nft.service

内容は以下です。

[Unit]
Description=Temporary nftables mitigation for CVE-2026-98432
Wants=network-pre.target
Before=network-pre.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/nft -f /etc/nftables/cve-2026-98432.nft
ExecStop=-/usr/sbin/nft delete table inet cve_2026_98432

[Install]
WantedBy=multi-user.target

このユニットでは、起動時に専用のnftables設定ファイルを読み込みます。停止時には、今回追加したテーブルだけを削除します。

RemainAfterExit=yesを指定しているため、ルールの読み込みが完了した後もsystemd上ではサービスを有効な状態として扱います。

3. 設定ファイルの構文チェック

まず、nftables設定ファイルを検証します。

sudo nft --check --file /etc/nftables/cve-2026-98432.nft

終了ステータスを確認しました。

echo $?
0

正常終了です。

続いて、systemdユニットも検証します。

sudo systemd-analyze verify /etc/systemd/system/cve-2026-98432-nft.service

4. systemdに登録

ユニット定義を再読み込みします。この作業の前に、もう4回ほど深呼吸をして、飲み物を何か飲みましょう。お茶菓子などがあれば更に最高です。

システムをいじる作業は全て自分の指先に全責任が伴います。

sudo systemctl daemon-reload

続いて、自動起動を有効化します。

sudo systemctl enable cve-2026-98432-nft.service

ここでは--nowを付けませんでした。

既に手動で適用したルールが動作しているため、現時点で専用テーブルを作り直す必要がないからです。

最後に、自動起動の登録状態を確認します。

systemctl is-enabled cve-2026-98432-nft.service

結果は、

enabled

となりました。

これで、systemdによる自動起動の登録まで完了です。

なお、再起動後に実際にルールが復元されるかは、まだ確認していません。

既存の防御機構を確認

今回の作業で最も気になっていたのは、既存のUFW・ipset・fail2banへの影響です。

設定ファイルを作成し、自動起動を登録した後、改めて状態を確認しました。

1. nftables

sudo nft list table inet cve_2026_98432
table inet cve_2026_98432 {
        chain prerouting {
                type filter hook prerouting priority raw; policy accept;
                ip hdrlength > 5 meta l4proto tcp counter packets 0 bytes 0 drop
        }
}

専用テーブルは維持されています。

2. UFW

sudo ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
22/tcp                  ALLOW       Anywhere

UFWはアクティブのままです。

既存の許可ポートにも変更はありません。

3. ipset

sudo ipset list -name
ufw-blocklist

既存のipsetが存在していることを確認できました。

4. fail2ban

sudo fail2ban-client status
Status
|- Number of jail:      2
`- Jail list:   sshd, ufw

fail2banも、既存の2つのjailを維持しています。

これらの確認から、少なくともサービスの状態と設定の一覧については、作業前の構成が維持されていることを確認できました。

切り戻し

今回の暫定ルールに問題が発生した場合は、専用テーブルを削除します。

一時的にルールを撤去する場合

sudo nft delete table inet cve_2026_98432

この操作で、今回追加したテーブルとチェーンを削除できます。

ただし、systemdの自動起動設定は残るため、次回起動時には再び読み込まれます。

永続化設定も撤去する場合

まず、自動起動を無効化します。

sudo systemctl disable cve-2026-98432-nft.service

続いて、専用テーブルを削除します。

sudo nft delete table inet cve_2026_98432

systemdユニットを削除します。

sudo rm /etc/systemd/system/cve-2026-98432-nft.service

nftables設定ファイルも削除します。

sudo rm /etc/nftables/cve-2026-98432.nft

最後に、systemdの設定を再読み込みします。

sudo systemctl daemon-reload

今回追加した設定だけを撤去するため、既存のUFW・ipset・fail2banの設定はそのまま維持できます。

今後の確認事項

今回の作業では、以下まで完了しています。

  • 既存ルールセットのバックアップ
  • シリアルコンソールによる復旧経路の確保
  • nftables専用テーブルの追加
  • 設定ファイルの構文チェック
  • Webサイトの動作確認
  • systemdユニットの作成
  • 自動起動の有効化
  • UFW・ipset・fail2banの状態確認

残っているのは、再起動後の動作確認です。

次回の再起動後には、以下を確認します。

systemctl is-active cve-2026-98432-nft.service
sudo nft list table inet cve_2026_98432

activeと表示されるだけでなく、実際に専用テーブルが存在していることを確認します。

また、今回のルールはIPv4オプション付きTCPパケットを遮断する暫定措置です。

CIQが公開した検証結果はRocky Linux系の環境を対象としており、筆者環境のUbuntu 24.04 LTSで同等の攻撃パケットを用いた遮断試験までは実施していません。

そのため、今回確認できたのはルールの登録と通常通信の継続までです。

修正済みカーネルが提供された段階で更新を行い、不要になった暫定ルールを撤去する予定です。

おわりに

今回の作業で、最も神経を使ったのはnftablesの設定そのものではありません。

既に稼働している防御機構を壊さずに、新しい防御を追加することでした。

筆者環境では、UFW・ipset・fail2banを組み合わせてアクセス制御を行っています。その結果、nftablesのルールセットは6,089行に達していました。

そこへ緊急の脆弱性対策を追加するのですから、作業を始める前から気が重くなるのも無理はありません。

そこで、今回は既存のルールセットを編集せず、専用テーブルを追加する方式を採用しました。

さらに、シリアルコンソールを確保し、問題が発生した場合には今回追加したテーブルだけを削除できるようにしています。

結果として、既存のUFW・ipset・fail2banの設定を変更することなく、暫定緩和策の導入と永続化の登録まで進められました。

今回の作業で改めて感じたのは、システムの保守とは、何かを変更する技術だけでなく、変更しなくてよいものを見極める判断でもあるということです。

脆弱性を塞ごうとして、既存の防御機構を壊してしまっては意味がありません。

そして、その判断を支えるのがバックアップであり、切り戻し手順であり、シリアルコンソールという最後の退路です。

作業を終えた後の感想を一言で表すなら、

「心臓に悪い作業だった」

でしょうか。

とはいえ、これで修正済みカーネルが提供されるまでの間、攻撃経路を減らすための対策を一つ追加できました。

今後もカーネルの修正状況を確認しながら、必要な対応を続けていきます。

Linuxカーネルの脆弱性 CVE-2026-98432:原因と暫定対策(nftablesの暫定緩和策へのリンクあり)

2026/10/31 9:44 追記

以下、本件の続いての対応策を記しています

概要

2026年10月15日、LinuxカーネルのIPv4 TCP処理に関する脆弱性 CVE-2026-98432 が公表されました。

CVSS 3.1の評価は9.8(Critical)。認証を必要とせず、ネットワーク経由で攻撃が成立する可能性がある脆弱性です。

今回の問題は、TCP接続の確立処理において、使用中のメモリ領域を適切なタイミングで解放できていなかったことに起因します。

筆者のように公開サーバーを運用している方は、カーネルの更新が必要になるため、対応状況を確認しておきたいところです。

今回は、脆弱性の原因と影響を整理したうえで、Ubuntuにおける修正カーネルの適用方法と、パッチが提供されるまでの暫定的な対応についてまとめます。

筆者環境

  • OS:Ubuntu 24.04 LTS
  • Kernel:Linux(Generic)
  • 対象:IPv4 TCP処理
  • CVE:CVE-2026-98432
  • 公開サーバー:Apache等を運用

1. 脆弱性の概要

今回の脆弱性は、LinuxカーネルのIPv4ネットワーク処理に存在する Use-After-Free(解放済みメモリへのアクセス) です。

問題となったのは、TCP接続の確立処理で使用するソケットオプションの解放タイミングです。

具体的には、tcp_v4_syn_recv_sock()による子ソケットの生成と、再送されたSYNパケットに対するSYN-ACKの生成が並行して実行された場合、同じメモリ領域を参照しているにもかかわらず、先にメモリが解放されてしまう可能性があります。

本来、複数のCPUコアから参照される可能性があるメモリについては、RCU(Read-Copy-Update)の猶予期間を経てから解放する必要があります。

ところが、修正前の処理では通常のkfree()によって即座に解放していました。

修正では、この部分をkfree_rcu()に変更し、参照中の処理が完了するまでメモリの解放を遅らせています。

つまり、今回の問題はメモリを解放する処理そのものではなく、他の処理がまだ参照している可能性を考慮せずに解放していたことにあります。

1.1. 影響とリスク

悪意のある細工を施したTCPパケットによって、この競合状態を発生させられた場合、主に次のような影響が考えられます。

  • サービス停止(DoS) 解放済みのメモリを参照した結果、カーネルパニックが発生し、OS全体が停止する可能性があります。
  • メモリ破壊 解放されたメモリ領域が別の用途に再利用された場合、予期しないメモリアクセスが発生する可能性があります。 メモリ破壊を利用した権限昇格やコード実行もリスクとして考えられます。

今回の問題はアプリケーションのログイン処理などを経由するものではなく、OSのTCP/IP処理層で発生します。

そのため、Webサーバーに認証機能を設けたり、SSHのログイン制限を強化したりするだけでは対処できません。

1.2. CVSS 9.8という評価について

今回の脆弱性はCVSS 3.1で9.8と評価されていますが、ディストリビューションによって評価には差があります。

例えばRed Hatでは、攻撃に必要な競合状態を成立させる難しさを考慮し、CVSS 3.1で5.9と評価しています。

とはいえ、攻撃が成立した場合にOS全体が停止する可能性があること、ネットワーク経由で認証なしに攻撃できる可能性があることは変わりません。

公開サーバーを運用する立場としては、修正パッケージの提供状況を確認し、対応を進めておきたいところです。

2. フェイズゼロ:政治交渉

さて、技術的な対策に入る前に、もう一つ済ませておくべきことがあります。

政治交渉です。

個人で運用しているサーバーであれば、作業時間も再起動のタイミングも自分の裁量で決められます。

しかし、組織で運用しているサーバーとなれば話は変わります。

  • カーネルの脆弱性が公表された
  • 修正済みカーネルへの更新が必要である
  • 更新を反映するためにOSの再起動を伴う
  • その間、サービスが一時的に停止する
  • ついては、○時頃から○分程度の作業時間をいただきたい

といった、利用者への周知という名の政治交渉が必要になります。

このあたりは運用者の政治的な立ち位置、つまり、担当者や担当部門がどこまで強権を振るえるかによっても言い方や手段が変わってきます。

ただし、今回に限っては少々強気に出てもよいのではないかと筆者は考えています。

昨今、サイバー攻撃によるサービス停止や情報漏洩がこれだけ問題になっている状況です。

その中で、CVSS 9.8という重大な脆弱性が公表され、しかもネットワーク経由で攻撃される可能性がある。

ここまで条件が揃っているのであれば、

「業務に影響が出るので作業を控えてほしい」という要求に対して、「脆弱性を放置することによる業務への影響をどう評価するのか」と切り返すだけの材料は十分にあります。

予定した時間にサービスを停止することと、攻撃によって予期しない時間にサービスが停止すること。

どちらが業務に与える影響を制御しやすいかは、考えるまでもないでしょう。

そのため、今回は「作業を実施してよいでしょうか」というお願いよりも、

「重大な脆弱性への対応として、以下の時間帯に緊急メンテナンスを実施します」

という、実施を前提とした周知を提案したいところです。

実際にどこまで踏み込めるかは、組織の権限や運用ルール次第です。緊急変更の手続きが定められているのであれば、それに従って進めます。

ただ、こういうときのために緊急変更という仕組みが存在するのですから、使えるものは使っていきましょう。

※ 検証環境を用意できる程度には時間と予算と環境に余裕がある方は、その環境にいることを感謝しつつ、検証を重ねていきましょう。

また、再起動を伴う作業ですから、実施前には復旧手順や切り戻し方法も確認しておきます。

  • 旧カーネルから起動できるか
  • VPSの管理コンソールから操作できるか
  • バックアップやスナップショットは取得できているか
  • 再起動後にサービスが正常稼働しなかった場合、どう復旧するか

このあたりを押さえたうえで作業に入ります。

以下の手順は、

  • 個人運用なので、そもそも政治交渉が不要
  • 組織内でフェイズゼロをクリアした

方向けのものです。

技術的には数分で終わる作業でも、その数分を確保するために何日もかかる。

サーバー運用とは、往々にしてそういうものです。

ですが、今回のような脆弱性対応では、その何日間をどこまで短縮できるかも、運用者の仕事だと考えています。

3. さっくりとした手順

以下の流れで対応します。

3.1. 事前確認

  1. 現在のカーネルを確認します。 uname -r
  2. MPTCPの設定を確認します。 sysctl net.mptcp.enabled
  3. MPTCPの使用状況を確認します。 sudo ss -Mlnp
  4. TCPリクエスト移行機能の設定を確認します。 sysctl net.ipv4.tcp_migrate_req

3.2. 暫定対応

  1. MPTCPを無効化します。 sudo sysctl -w net.mptcp.enabled=0
  2. 設定ファイルを作成します。 echo "net.mptcp.enabled = 0" | sudo tee /etc/sysctl.d/99-disable-mptcp.conf
  3. 設定を反映します。 sudo sysctl --system
  4. 設定を確認します。 sysctl net.mptcp.enabled

3.3. 修正カーネルの適用

  1. パッケージ情報を更新します。 sudo apt update
  2. カーネルパッケージの更新候補を確認します。 apt-cache policy linux-generic linux-image-generic
  3. 修正済みパッケージが提供されている場合、更新します。 sudo apt install --only-upgrade linux-generic linux-image-generic
  4. OSを再起動します。 sudo reboot
  5. 稼働カーネルを確認します。 uname -r

以上です。

なお、手順5~8はMPTCPを使用していない環境での暫定対応です。

MPTCPの無効化だけでは、今回の脆弱性への対処は完了しません。

また、手順11以降は修正済みカーネルが提供されてから実施します。

4. 詳細手順

4.1. 現在のカーネルを確認

まずは、稼働中のカーネルを確認します。

uname -r

ここで表示されたバージョンを控えておきます。

続いて、インストール済みのカーネルパッケージを確認します。

dpkg -l | grep linux-image

現在使用しているカーネルと、インストール済みのカーネルを把握しておきます。

特に、更新後に問題が発生した場合、旧カーネルで起動できる状態かどうかは重要です。

4.2. MPTCPの使用状況を確認

MPTCP(Multipath TCP)は、複数のネットワーク経路を利用して1つのTCP通信を構成するための拡張プロトコルです。

例えば、Wi-Fiとモバイル回線を併用し、通信経路を切り替えながら接続を維持するような用途で使用されます。

Linuxでは、次のカーネルパラメータでMPTCPの有効・無効を制御できます。

net.mptcp.enabled

現在の設定を確認します。

sysctl net.mptcp.enabled
  • 1:有効
  • 0:無効

続いて、MPTCPを使用している待ち受けソケットを確認します。

sudo ss -Mlnp

MPTCPを使用しているサービスが表示された場合は、そのサービスへの影響を確認します。

特に、Go 1.24以降では、Linux上の待ち受けソケットでMPTCPが利用される場合があります。

意図的にMPTCPを設定していなくても、アプリケーション側の実装によって利用されている可能性があるため、確認しておきます。

4.3. TCPリクエスト移行機能を確認

今回の脆弱性では、TCPリクエストソケットの移行処理にも類似した問題があります。

この機能に関係するカーネルパラメータが、以下のものです。

net.ipv4.tcp_migrate_req

設定を確認します。

sysctl net.ipv4.tcp_migrate_req

通常は0です。

1になっている場合は、TCPリクエスト移行機能を使用している可能性があります。

この機能を意図的に有効化している場合は、使用目的を確認したうえで対応を検討します。

5. 暫定対応:MPTCPの無効化

修正済みカーネルが提供されるまでの間、攻撃対象となる機能を減らす方法として、MPTCPの無効化があります。ただし、ここは少し注意が必要です。

今回の脆弱性の本体はIPv4 TCPのソケット処理にあります。MPTCPを無効化することで、MPTCPを利用した攻撃経路を制限することはできますが、通常のTCP処理に存在する脆弱性そのものが解消されるわけではありません。

また、Red Hatのセキュリティ情報では、この脆弱性に対して、同社の基準を満たす緩和策は提供されていないとされています。

そのため、MPTCPの無効化は、修正パッチが届くまでの攻撃対象領域を減らす措置として扱います。

5.1. MPTCPを無効化

MPTCPを使用していないことを確認したうえで、以下のコマンドを実行します。

sudo sysctl -w net.mptcp.enabled=0

この設定は即時反映されます。MPTCPを使用しているサービスが存在する場合は、サービス側の再起動なども含めて確認が必要です。

5.2. 再起動後も設定を維持

sysctl -wによる設定変更は、OSを再起動すると元に戻ります。

再起動後も無効化した状態を維持する場合は、設定ファイルを作成します。

echo "net.mptcp.enabled = 0" | sudo tee /etc/sysctl.d/99-disable-mptcp.conf

設定を反映します。

sudo sysctl --system

最後に設定値を確認します。

sysctl net.mptcp.enabled

以下のように表示されれば設定完了です。

net.mptcp.enabled = 0

5.3. 設定変更による影響

MPTCPを無効化した場合、影響を受けるのはMPTCPを利用する通信です。

一般的なWebサーバーやSSH、データベースなどで使用される通常のTCP通信は、そのまま利用できます。

対象影響
Apache / Nginx通常のTCP通信に影響なし
SSH通常のTCP通信に影響なし
MySQL / PostgreSQL通常のTCP通信に影響なし
MPTCP対応アプリケーションMPTCPによる通信が利用できなくなる
マルチホーム環境MPTCPを利用した経路制御に影響

一般的なVPSやWebサーバーでは、MPTCPを意図的に利用しているケースは多くありません。

筆者のようにApacheを中心としてWebサービスを公開している環境であれば、通常のTCP通信に対する影響はありません。

ただし、Go製のアプリケーションなどがMPTCPを利用している可能性もあるため、使用状況を確認したうえで設定を変更します。

6. 根本対策:修正済みカーネルへの更新

今回の脆弱性はカーネル内部の処理に起因するため、根本的な対策は修正済みカーネルへの更新です。

Ubuntuでは、上流のLinuxカーネルで修正が公開されていても、Ubuntuの公式パッケージに反映されるまでには時間差があります。

また、Ubuntuでは修正内容が既存のカーネル系列にバックポートされることがあります。

そのため、単純にuname -rの数字だけで修正済みかどうかを判断するのではなく、Ubuntu Security Trackerで対象パッケージの修正状況を確認します。

6.1. パッケージ情報を更新

sudo apt update

続いて、カーネルパッケージの候補を確認します。

apt-cache policy linux-generic linux-image-generic

修正済みパッケージが提供されていることを確認してから、更新作業に進みます。

6.2. カーネルパッケージを更新

Ubuntu 24.04 LTSの標準的なGenericカーネルを使用している場合は、以下のコマンドで更新します。

sudo apt install --only-upgrade linux-generic linux-image-generic

更新時には、インストール対象となるパッケージとバージョンを確認します。

なお、HWEカーネルやクラウド向けカーネルなどを使用している場合は、対象となるパッケージが異なります。

その場合は、現在使用しているカーネル系列に対応したパッケージを更新します。

6.3. OSを再起動

カーネルパッケージの更新が完了したら、OSを再起動します。

sudo reboot

この操作によって、サーバー上で稼働しているサービスは一時的に停止します。

事前に確保した作業時間内で実施します。

6.4. 更新後の確認

再起動後、稼働カーネルを確認します。

uname -r

続いて、インストール済みのカーネルパッケージを確認します。

dpkg -l | grep linux-image

Ubuntu Security Trackerで確認した修正済みパッケージが適用されていることを確認します。また、ApacheやSSHなど、サーバー上で稼働しているサービスについても動作確認を行います。

7. 切り戻し

設定変更後に問題が発生した場合に備え、切り戻し方法もまとめておきます。

7.1. MPTCPの設定を元に戻す

まずは、設定ファイルを削除します。

sudo rm /etc/sysctl.d/99-disable-mptcp.conf

続いて、MPTCPを有効化します。

sudo sysctl -w net.mptcp.enabled=1

設定を確認します。

sysctl net.mptcp.enabled

以下のように表示されれば設定完了です。

net.mptcp.enabled = 1

なお、この手順は変更前の設定が1だった場合のものです。変更前から0だった場合は、その状態を維持します。

また、既存のMPTCPソケットについては、必要に応じてサービスの再起動を行います。

7.2. カーネル更新後に問題が発生した場合

カーネル更新後にOSが正常起動しない場合は、GRUBから旧カーネルを選択して起動します。

VPSの場合は、管理コンソールなどから復旧操作を行います。そのため、作業前には以下を確認しておきます。

  • 旧カーネルが残っていること
  • 管理コンソールから操作できること
  • 必要なバックアップが取得されていること

特に、SSHでしか接続できない環境では、再起動後にネットワークが利用できなくなると復旧が難しくなります。

このあたりは、フェイズゼロで確認しておくべき項目です。

おわりに

今回のCVE-2026-98432は、LinuxカーネルのIPv4 TCP処理に存在するUse-After-Freeの脆弱性です。

対応としては、

  1. 現在のカーネルと修正パッケージの提供状況を確認する
  2. MPTCPを使用していなければ、暫定的な無効化を検討する
  3. 修正済みカーネルが提供され次第、更新と再起動を実施する

という流れになります。

そして、今回改めて意識したのは、技術的な対応そのものよりも、その作業時間をどう確保するかという点です。カーネルの更新は、コマンドだけを見れば難しい作業ではありません。

しかし、組織で運用しているサーバーの場合、OSの再起動というだけで相応の調整が必要になります。

そこで「業務に影響があるから」という理由だけで更新を先送りするのであれば、脆弱性を放置することで発生するリスクも、同じように評価する必要があります。

未来を完全に予測することはできなくても、未来に向けて判断できる状態を維持することはできます。

そのためにも、今回のような脆弱性への対応では、技術的な対策と同じぐらい、迅速に判断して実行できる環境を整えておきたいところです。

ピボット旅行2026-21『自動書記の利用』

はじめに

2026年9月27日。

ようやく、ピボット旅行の3日目が始まりました。この日の天気も雨。尾道に行くというメインイベントは終わりました。では、この日をいかに充実させて過ごすか?

その前に、必須ルーチンが待っていました。

日記です。

ただし、単に日記を書くだけではありません。今回の旅行で筆者が利用したのは、脳内のゴリラルームが持つ、ある種の「自動書記」状態でした。

脳内の自動書記とは

まず、自動書記とは何か。ここで言う自動書記は、何か神秘的な力に導かれて文字を書くという話ではありません。

起き抜けのルーチン。顔を洗い、歯を磨き、ベッド周りを整える。いちいち「さて、次は歯を磨こう」と考えなくても、身体が勝手に動く、あの状態です。

筆者は、これを日記を書くところまで拡張しています。

頭が完全に覚醒する前に、いつもの手順の延長として筆記を始める。そうすると、書くか書かないかを判断する前に、既に手が動いているわけです。

何しろ、人間というものは、やる理由を見つけるのは大変ですが、やらない理由を見つけるのは非常に簡単です。ならば、そもそも「今日は書こうか、どうしようか」という判断を挟まなければいい。

これが、今回利用した自動書記の正体です。

なぜ日記を書くのか

これはもう、筆者の意地みたいなものです。かれこれ、ほぼ日手帳は2020年から再開し(再開、と言うのがポイントです)、2021年1月からは、全ての日付のページを埋めています。

「朝起きて着替えることを習慣とは言わない」

というレベルでやっています。

なぜ日記を書くのか? 生存報告みたいなものです。そのとき何を感じたか、どこへ動いたか、何が起きたか。そのまま記録する。

その時点での自分が何を考え、どう動いたのか。それを残しておけば、後からいくらでも振り返ることができます。そして、一度記録してしまえば、後はどうとでもなる。

旅行記を書くにしても、ブログの記事にするにしても、まずは材料があることが重要です。記憶だけを頼りにして、数日後に「あれ、あのとき何を考えていたんだっけ」となるのは避けたいところ。

だからこそ、「とにかく書いた」という事実が重要なのです。

サボるときはサボるが、書くときは書く

ところが、筆者の日記の書き方は、少々特殊です。

「4日~5日ほどすっ飛ばす」ときがあります。

理由は簡単。

「筆が乗らないから」。

ええ、言い訳としては百点満点ですね。しかし、筆者は「今日は一行書いたから日記にはしよう」とはなりません。なぜなら、「このページは書いていない」という事実を知っている人が確実にいるからです。

ほかならない、筆者自身です。

書いていないものを、書いたことにはできない。そのため、「4日ほどサボったら、5日分書き上げる」ということを半ば習慣にしています。

サボること自体は否定しません。筆が進まないときは進まないのですから、そこは仕方がない。ただし、サボった分は後で回収する。

このあたり、妙に律儀なのか、それとも単に面倒な性格なのか。おそらく両方でしょう。

そこで役立つ自動書記状態

さて、そんな筆者にとって、数日分の日記をまとめて書く作業は、なかなかの難敵です。人間、「やる理由」を見つけるのは大変ですが、「やらない理由」を見つけるのは非常に簡単です。

そして、筆者のサボり癖は、筆者自身が一番よく理解しています。

筆が進まないときは、書く必要がないように思えてしまう。明日でいい、後でいい、今は別のことをしよう。

そうしているうちに、未記入のページが増えていく。しかし、ここまで続けてきた記録の連続(ストリーク)を無駄にするのは、何かに負けるような気がして嫌すぎる。

そこで利用するのが、起き抜けの時間帯です。

頭が完全に覚醒する前なら、余計な判断を挟まずに作業へ入れます。「今日は日記を書くべきか」という議論を脳内で始める前に、既に筆記を始めてしまう。

意志の力で自分を奮い立たせるのではなく、意志の力を使わなくても作業が始まる状態に持ち込むわけです。

脳内のゴリラルームによる、なかなか合理的な時間管理と言えるでしょう。

筆記器具を持ち込んだ理由

もちろん、ただ起き抜けに手帳を開けば、すらすら書けるというものでもありません。

今回の旅行では、筆者が愛用している万年筆を、別便を利用したこともあって一切合切持ち込んでいました。

これにも理由があります。気分によって使いたい色が違う。それに伴って、筆記時の滑り心地も違う。

筆者の脳が「これならすらすら書けるな」と判断する組み合わせがあるのです。

日記を書くという作業そのものを習慣化していても、実際に手を動かすまでの抵抗がゼロになるわけではありません。

だからこそ、道具の力も借りる。

書き始めるまでの障壁を下げ、書き始めた後は勢いに任せる。自動書記状態を利用するのであれば、筆記環境も整えておくに越したことはありません。

こういうところだけは、妙に抜かりがないのです。

動き始めた筆

そして、実際にどうなったのか。9月27日の朝、日記は9月25日で止まっていました。つまり、旅行中の記録が2日目の途中までしか埋まっていなかったわけです。

そこで、脳が完全に動き出す前に書き始める状態へ持ち込みました。結果、1ページあたり約6分のペースで、9月30日分まで書き上げました。

繰り返しますが、これを成し遂げたのは9月27日です。まだ9月27日の朝だというのに、9月30日分まで書いている。

日記の日付を、現実の時間より先回りしてしまったのです。もちろん、未来に起きることを予言して書いたわけではありません。

書いたのは、今回のピボット旅行についてです。何を思ったか。何が起きたか。そこに至るまで、どのような意思決定をしたか。

今回の旅行は、当初の計画からさまざまなピボットを重ねています。そうした判断の経緯まで記録していくと、1日1ページでは到底収まりません。

そこで、ほぼ日手帳の日付の下のスペースに「9/25」などと実際の日付を書き込み、記録を続けていました。

手帳に印刷された日付と、記録している出来事の日付が一致しなくても構わない。

重要なのは、出来事を忘れないうちに記録しておくことです。後でブログにまとめる際にも、このときの記録があれば、旅行中の判断を含めて再構成できます。

何より、数日分をまとめて書くという作業を、旅行中に片付けられたのです。

時間経過

起きたのは、4時50分ごろ。

そこから歯を磨いたり、顔を洗ったり。着替える前に日記を書き終え、着替えや、この時点での荷物チェックまで済ませたのが6時50分でした。

約2時間で、身支度の一部と日記の追いつき、さらに荷物の確認まで完了。我ながら、脳内のゴリラルームのタイムコントロールはいい仕事をしています。

……というよりも、今回は「この時間帯でなければ朝ご飯に間に合わない」という事情がありました。

せっかく高松まで来たのです。うどんの都の名物を、朝からいただきたい。

しかも、目指すのは朝早くから営業しているうどん店です。のんびりと寝坊している余裕はありません。

日記を書くべきか、書かざるべきか。そんな脳内会議を開いている時間もありません。

だからこそ、起き抜けの自動書記を利用し、必要な作業を先に片付けた。

こうして、午前6時50分。筆者は手帳を閉じ、朝の高松へ出発する準備を整えたのでした。

Ubuntu 26.04にMySQLを導入。

概要

Webアプリのお供であるDBを入れます。

環境

  • Ubuntu 26.04

※ローカル運用で実施。いわゆるLAMP環境のため、他のサーバがDBを見に行くことはないという想定です。

さっくりとした手順

  1. パッケージのアップデートを行います。
  2. MySQLをインストールします。
  3. MySQLのrootパスワードを設定します。
  4. mysql_secure_installationにより安全性を高めます。

パッケージのアップデート

sudo aptitude update

筆者の好みでaptitudeを用いています。必要に応じてaptを使ってください。

MySQLインストール

  • パッケージでインストール
sudo aptitude install mysql-server
  • インストール確認
systemctl status mysql

active(running)を確認します。

MySQL設定変更について

MySQL 8.4以降では、長年使われてきた古い認証方式(mysql_native_password)がデフォルトで無効化され、よりセキュアな caching_sha2_password が標準となっています。そのため、設定ファイル(mysqld.cnf)を書き換えて旧プラグインを強制する手順は不要となり、標準の認証方式のまま初期設定を進めます。

また、近年のバージョンではインストール直後の初期セキュリティが強化されていますが、mysql_secure_installation は以下の重要な役割を持つため実行します。

  • パスワード検証コンポーネント(VALIDATE PASSWORD)の導入
  • 匿名ユーザーアカウントを削除
  • リモートからのrootユーザーのログインを無効化
  • testデータベースを削除し、testデータベースへのアクセス権限を持つユーザーを削除

mysql rootパスワード設定

sudo mysql

初期状態ではローカルソケット認証(auth_socket)のため、sudo経由でパスワードなしでログインできます。

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

''のpasswordは任意の、強固なものを入力ください。

標準推奨の caching_sha2_password を用いて強固なパスワードを設定します。

flush privileges;
exit

mysql_secure_installation

sudo mysql_secure_installation

質問事項

Enter password for user root: 
# 上記で設定したパスワードを入力します
​
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
​
Press y|Y for Yes, any other key for No:
# パスワード強度チェックを有効にするためYを入力してEnter
​
There are three levels of password validation policy:
​
LOW   Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
​
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
# ポリシーに合わせて0/1/2を入力(ローカル開発環境なら0または1を推奨)
​
Estimated strength of the password: 50
Change the password for root ? ((Press y|Y for Yes, any other key for No) :
# 既に直前の手順でパスワードを設定済みのため、ここではnを選択します。
​
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
​
Remove anonymous users? (Press y|Y for Yes, any other key for No) :
# anonymousユーザーを削除するためY
​
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
​
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
# rootユーザのリモートログインを禁止するためY
​
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
# テストDBを削除するためY
​
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
# 設定を反映するためY

以上でMySQLの初期設定は完了です。

壁をどう補強するか──ログと決断、そして未来への備え

はじめに

Linuxサーバーを運用していると、セキュリティ対策について考える機会が少なくありません。

  • ファイアウォールを設定する
  • アクセス制御を行う
  • WAFを導入する
  • OSやソフトウェアを更新する
  • 必要に応じて設定を見直す。

こうした作業を続けていると、一つの疑問に行き着きます。

次に、何をすればよいのでしょうか。

防御を強化しようと思えば、できることはいくらでもあります。壁を高くすることも、厚くすることも、別の材料を追加することもできます。

しかし、すべてを実施するには時間も手間もかかります。設定を増やせば、その分だけ管理する対象も増えていきます。だからこそ、必要になるのは判断です。

何を守るべきなのか。現在の防御には何が足りないのか。そして、次に何をするべきなのか。

今回は、サーバーのログを手がかりに、セキュリティ対策における決断と未来への備えについて考えてみます。

壁の補強には、判断が必要です

前回の記事では、セキュリティを「壁を作り、手入れを続けること」として考えました。

壁一枚でも、そこにあることで防げるものがあります。壁が万能ではないからといって、その価値がなくなるわけではありません。

しかし、壁を作り、維持しているだけで十分なのかといえば、そうとも限りません。

時間が経過すれば、周囲の環境が変わります。以前は問題にならなかった経路から侵入を試みる者が現れることもあれば、利用するソフトウェアが変わり、新たな対策が必要になることもあります。

そのとき、壁を補強する必要があるのかを考えなければなりません。

例えば、ファイアウォールで許可する通信を見直す。SSHの接続元を制限する。ModSecurityのルールセットを更新する。認証ログに現れる不審な試行を調査する。

どれも防御を維持するための選択肢です。

しかし、ある場所で問題が発生したからといって、すべての壁を一律に高くすればよいわけではありません。必要なのは、どこが弱く、何を補強すれば、守りたいものをより確実に守れるのかを見極めることです。

防御を増やすことよりも、何を補強するべきかを判断することのほうが重要になる場面があります。

ログは、補強する場所を考えるための材料です

では、その判断を何に基づいて行えばよいのでしょうか。

ここで役立つのが、日々蓄積されていくログです。

アクセスログには、どのようなリクエストが届いたのかが記録されます。認証ログには、ログインの成功や失敗などが残ります。システムログには、サービスの起動や停止、エラーなどが記録されます。

それぞれの記録を確認することで、普段どのような通信が発生しているのか、どのような問題が繰り返されているのかを調べられます。

例えば、特定のURLに対して不審なリクエストが繰り返されているとします。その記録から、WAFのルールで検知できているのか、遮断できているのか、アプリケーションに到達しているのかを確認できます。

また、SSHへの認証失敗が繰り返されている場合には、現在のアクセス制御や認証方式が適切かどうかを見直すきっかけになります。

一件の記録だけでは分からないことも、長期間の記録を比較することで見えてくる場合があります。

ログは、単に過去の出来事を保存するためのものではありません。次にどこを補強するべきかを考えるための材料でもあるのです。

すべての問題に、すぐ対応する必要はありません

ログを確認していると、さまざまな問題や不審な動きが目に入ります。

対処できるものもあれば、調査が必要なものもあります。現在の設定で十分に防げているものもあるでしょう。

ここで重要になるのが、決断の順序です。

見つけた問題に片っ端から対応していけば、一見すると積極的に防御を強化しているように見えます。しかし、変更のたびに検証や影響確認が必要になり、管理する対象も増えていきます。

場合によっては、対策を追加したことで正規の通信まで遮断してしまうこともあります。

だからこそ、問題を発見したときには、まず現状を把握する必要があります。

  • 何が起きているのか
  • 現在の仕組みで防げているのか
  • 放置した場合、どのような影響が考えられるのか
  • 対策を変更した場合、既存のサービスにどのような影響があるのか
  • 変更したことを、後から検証できるのか

こうした点を整理してから、対応する順序を決めます。

すぐに対処するべきものは対処し、継続して観察するものは記録を追い、現状で十分に防げているものはその状態を維持する。

この区別ができれば、目に入った問題すべてに同じだけの時間を費やす必要はなくなります。

判断を先送りすることと、状況を把握したうえで経過を観察することも違います。

何もしないという選択にも、状況を確認したうえで維持するという判断があり得ます。

未来への備えは、未来を完全に予測することではありません

サーバーの運用では、これから何が起きるかを完全に予測することはできません。

新たな脆弱性が発見されるかもしれません。攻撃の傾向が変わるかもしれません。ソフトウェアの更新によって、これまで問題のなかった設定を見直す必要が生じるかもしれません。

そのすべてを事前に予測し、対策を完成させておくことは困難です。

では、未来に備えるとは、どういうことなのでしょうか。

それは、未来に起きることをすべて当てることではなく、変化が起きたときに対応できる状態を維持することだと考えています。

ログを残しておく。設定変更の内容を記録する。変更前の状態に戻せるようにしておく。定期的に更新情報を確認する。必要なときに調査できるよう、基本的な運用手順を整えておく。

こうした準備があれば、問題が発生したときにも、手がかりを探し、影響を確認し、対応を選ぶことができます。

未来への備えとは、すべての問題に対する答えを先に用意することではありません。

問題が起きたときに、考え、判断し、行動できる余地を残しておくことです。

決断コストを減らすために、決断の仕組みを作る

ここで、日々のサーバー運用と決断コストの関係についても考えてみます。

運用を続けていれば、何らかの判断を求められる場面は必ず発生します。

  • どのログを調べるのか。
  • どの設定を変更するのか。
  • どの脆弱性に優先して対応するのか。
  • どこまで対策を追加するのか。

そのたびに、すべてをゼロから考えていては、時間も注意力も消費してしまいます。だからこそ、あらかじめ判断の基準を持っておくことが役立ちます。

例えば、設定を変更するときには、変更の目的、影響範囲、確認方法、切り戻し方法を整理しておく。問題を発見したときには、実際の影響と現在の防御状況を確認する。定期的な更新や点検は、可能な範囲で手順化する。

そうすれば、毎回すべてを考え直す必要がなくなります。

一方で、手順化したからといって、状況を確認せずに機械的に実行すればよいわけでもありません。前提条件が変わっていれば、以前の判断基準が適切でなくなることもあります。

重要なのは、考えることを放棄するのではなく、繰り返し発生する判断を整理し、本当に検討が必要な部分に時間を使えるようにすることです。

壁を作り、点検し、必要に応じて補強する。その一連の仕事に、一定の基準と手順を設けておく。これによって、日々の判断に必要なコストを抑えながら、状況の変化にも対応しやすくなります。

心構えを維持するということ

こうした運用を続けるうえで、もう一つ大切なのが、管理者自身の心構えです。

セキュリティ対策は、一度実施すれば終わる仕事ではありません。ログは日々増え、ソフトウェアは更新され、環境は少しずつ変化していきます。

毎日すべてを完璧に確認することは難しくても、必要な点検を続け、問題があれば調べ、必要な変更を行うことはできます。そのためには、運用を一時的な気合いや緊張感だけに頼らないことも重要です。

  • 作業を手順化する。
  • 変更内容を記録する。
  • 定期的に確認する項目を決める。
  • 問題が発生したときに、どこから調べればよいかを整理しておく。

こうした仕組みがあれば、日々の気分や忙しさだけに左右されず、必要な作業を継続しやすくなります。

すべてを一度に解決しようとしないことも大切です。今日できる点検を行い、必要な修正を加え、次に確認するべきことを残しておく。状況が変われば、そのときに改めて判断する。

これもまた、壁を長持ちさせるための手入れの一つです。

おわりに

サーバーを守るための仕組みは、一度作れば完成するものではありません。

環境の変化に応じて点検し、必要な部分を補強し、役割を果たし続けられるように維持していく必要があります。

そのために、ログがあります。過去の出来事を確認し、現在の状態を理解し、次に何をするべきかを考えるための材料です。

そして、その材料を使って判断するのは、運用者自身です。

すべての問題を予測することはできません。すべての対策を一度に実施することもできません。それでも、状況を記録し、判断の基準を持ち、必要なときに対応できる状態を維持することはできます。

壁を作る。壁を手入れする。ログを読み、必要な場所を補強する。そして、変化に備えて次の判断ができるようにしておく。

その繰り返しが、長く使い続けられるサーバーを支えます。

未来を完全に予測することはできなくても、未来に向けて判断できる状態を維持することはできます。

そういう意味で、筆者が心に留めている言葉があります。『未来戦隊タイムレンジャー』

未来は変えられなくたって自分達の明日ぐらい変えようぜ。
出来るって! だってさ、次の瞬間、何するか決めるの
どう考えたって自分だろ?

このログ(言葉)があるからこそ、筆者は少なくとも未来をちょっとはマシにできると考えています。

さておき、日々の運用とは、そうした小さな決断を積み重ねながら、必要な安全性と安心を保ち続ける仕事なのだと思います。

セキュリティとは、壁を作り、手入れを続けることである

はじめに

Linuxサーバーを運用していると、セキュリティという言葉を目にする機会は少なくありません。

  • ファイアウォール
  • WAF
  • 侵入検知
  • アクセス制御
  • ログ監視

等。攻撃を防ぐための仕組みはいくつもあり、調べれば調べるほど、対策すべき項目は増えていきます。

しかし、そもそもセキュリティとは何のためにあるのでしょうか。

攻撃者を撃退するためでしょうか。脆弱性をゼロにするためでしょうか。それとも、最新の防御技術を導入すること自体が目的なのでしょうか。

私は、セキュリティの本質的な価値は、安心して使えること、そして安全に使い続けられることにあると考えています。

そのために必要なのは、必ずしも巨大な要塞ではありません。壁一枚だって、立派なセキュリティです。

壁一枚にも、意味があります

例えば、外からの侵入を防ぐために壁を設けたとします。

もちろん、その壁だけですべての侵入を防げるわけではありません。壁を越える者もいれば、壁の隙間から入り込む者もいるでしょう。壁そのものが壊される可能性だってあります。

だからといって、壁を設ける意味がないわけではありません。

壁がなければ自由に通り抜けられる場所でも、壁があることで侵入には手間がかかるようになります。壁があることで防げるものがあり、壁があることで守られる範囲があります。

セキュリティ対策も同じだと筆者は考えています。ファイアウォールで通信を制限する。SSHへのアクセスを必要な接続元に限定する。不要なサービスを停止する。WebサーバーにWAFを導入する。

それぞれ単独で、あらゆる脅威を防ぐことは不可能です。しかし、何も設けていない状態と比べれば、そこには確かな違いがあります。

万能ではないことと、役に立たないことは違います。

防げるものを防ぎ、影響を小さくし、必要なときに気づけるようにする。その積み重ねが、システムを守ることにつながるというのが筆者が4年ほどvpsを「育てた」知見です。

壁を作るだけでは、終わりません

ただし、壁は作れば永遠に機能するわけではありません。

時間が経てば劣化します。ひびが入ることもあれば、周囲の環境が変わり、以前は問題のなかった場所が弱点になることもあります。

だからこそ、壁には手入れが必要です。

Linuxサーバーでいえば、OSやソフトウェアの更新、設定の見直し、ログの確認、不要なアカウントやサービスの整理などが該当します。

一度ファイアウォールを設定したからといって、その設定が将来にわたって適切であるとは限りません。導入したWAFも、ルールセットが古くなれば、現在の脅威やアプリケーションの状態に合わなくなる可能性があります。

そして、手入れとは、必ずしも壁を補強することだけではありません。

安全を確保できないと判断したときには、門を閉じることも必要です。

例えば、稼働中のソフトウェアに重大な脆弱性が発見され、既存の防御策や暫定的な設定変更だけでは十分な安全性を確保できない場合。サービスを一時停止すれば、利用者への影響は避けられません。それでも、稼働を続けることによるリスクが大きいのであれば、停止は合理的な選択肢になります。

もちろん、停止すればすべての問題が解決するわけではありません。停止によって何が防げるのか、ほかに残る攻撃経路はないか、どのような条件で再開できるのかを確認する必要があります。

それでも、無理に動かし続けることだけが正解ではありません。

逆に、手入れを続けていれば、問題が大きくなる前に気づけることがあります。

これはセキュリティに限った話ではありません。定期的な点検や保守が必要なのは、システムが動き続ける以上、環境も前提条件も変化するからです。

防御を作ることと、防御を維持することは、表裏一体のお仕事です。

そして、実際の運用では、作った防御を維持する仕事のほうが長く続きます。

ModSecurityは、要塞というより箒とハタキです

以前、Web Application Firewall(WAF)であるModSecurityについて考えていたとき、興味深い説明に出会いました。しかも、その話をしたのがAIというのもまた哲学を感じます。

WAFの本質は、軍事要塞のようにミサイルを撃ち返すことではない。Webサーバーの玄関先に溜まる有害なゴミや、SQLインジェクションの蜘蛛の巣、XSSの不正な泥を、ルールセットという箒とハタキで払い落とすことだ、という説明です。

ModSecurityは、HTTPリクエストをルールに照らして検査し、設定に応じて記録や遮断などを行います。OWASP Core Rule Set(CRS)などのルールセットを組み合わせることで、Webアプリケーションへの攻撃を検知し、防御を補助します。

あくまでも防御の補助ではありますが、それでも、意味があります。

Webサーバーに到達するリクエストを検査し、既知の攻撃パターンに合致する通信を処理する。ルールに任せられるものはルールに任せ、人間は検知内容の確認や誤検知の調査、必要な設定変更に集中する。

毎回、すべての通信を人間が判断する必要はありません。

そして、箒とハタキは一度使えば永久に不要になる道具でもありません。日々の通信がある以上、検査も続きます。ルールセットの更新や設定の見直しも必要になります。

派手な反撃を見せるわけではありませんが、こうした地道な処理によって、Webアプリケーションを安全に運用できる状態を維持するのです。

セキュリティの目的は、対策を増やすことではありません

セキュリティについて調べていると、新しい脅威や新しい防御技術が次々と見つかります。

それらを知ることには意味があります。しかし、対策を増やすこと自体が目的になってしまうと、本来守るべきものを見失いかねません。

設定を複雑にしすぎれば、管理する側の負担が増えます。防御を強化したつもりが、正規の利用者を遮断してしまうこともあります。変更によってサービスが停止すれば、それ自体が運用上の問題になります。

一方で、サービスを動かし続けること自体が目的になってもいけません。

2026年10月、PHPの重大な脆弱性が報じられた際、筆者は当初、設定変更による暫定的な対策を検討しました。しかし、事態を踏まえ、最終的には自分のVPSでPHP-FPMを一時停止する判断をしました。

サービスを止めれば、当然ながら利用者への影響が生じます。それでも、十分な安全性を確保できない状態で稼働を続けるより、いったん停止して状況を見極めるほうが適切だと判断したためです。

セキュリティは、単に攻撃を防げばよいという話ではありません。

必要なサービスが正常に動作し、正規の利用者が安心して使え、管理者が異常を把握して対処できること。そうした状態を継続して維持することが重要です。

ただし、それは、どのような状況でもサービスを動かし続けるという意味ではありません。安全を確保するために停止が必要なら、停止したうえで、再び安全に動かせる状態を目指すことも運用の一部です。

ここで、冒頭の話に戻ります。

セキュリティの本質的な価値は、安心と安全にあります。

利用者が毎回、攻撃を心配しながらサービスを使う必要がないこと。運用者が毎回、同じ種類の通信を手作業で判断しなくてもよいこと。そして、問題が発生したときには、状況を把握して適切に対応できること。

防御の仕組みは、そのために存在します。

決断コストを減らすということ

ここで、もう一つ考えておきたいことがあります。それは、判断にはコストがかかるということです。

  • ログを確認する
  • 通信を調査する
  • ルールを追加する
  • 例外を設定する
  • 設定変更が既存のサービスに与える影響を検討する。

どれも必要な仕事ですが、すべてを毎回、人間がゼロから判断していたら、運用は成り立ちません。だからこそ、機械に任せられる仕事は機械に任せます。

ファイアウォールで不要な通信を遮断する。SSHへの接続元を制限する。WAFでリクエストを検査する。ログを記録し、異常の調査に必要な情報を残す。

これらは、人間の仕事を奪うための仕組みではありません。人間が判断しなければならない場面に、時間と注意力を残すための仕組みです。

人間が判断すべきことと、あらかじめ仕組みに任せられることを分ける。

これもまた、セキュリティ運用の重要な仕事だと考えています。

  • 壁を作る
  • 壁を点検する
  • 壁に任せられることは壁に任せる
  • そして、壁だけでは防げないことに、人間の注意を向ける

この繰り返しによって、日々の運用に必要な判断を減らしながら、必要な安全性を維持していきたいです。

壁を作り替えるために壊すことも必要です

先般、筆者が直面した「php2shell」(CVE-2026-109618、CVE-2026-109619)。

これのために筆者が選んだ方法は「アップデートが確定するまで、php-fpmを止め、アップデートを確認してから再開させる」でした。

これは筆者にとっては矛盾ではなく、「嵐に出航し、難破するよりは安全な港に停泊して嵐が過ぎるのを待つ」方がサーバを守るからです。

言うなれば、古い壁が風雨に耐えられそうにない。なので一度真新しくするため壊すというのもメンテナンスの一つです。

おわりに

セキュリティ対策というと、最新の防御技術や、攻撃者との攻防に目が向きがちです。しかし、セキュリティの価値は、必ずしも派手な出来事の中にあるわけではありません。

何事もなくサービスが動き続けること。利用者が安心して使えること。運用者が異常に気づき、必要な対応を取れること。

それらが維持されているなら、そこにはセキュリティ対策の価値があります。

壁一枚でも、壁があることで防げるものがあります。そして、その壁を長持ちさせるために手入れをすることは、何もしないよりもずっと有用です。

ファイアウォールも、WAFも、アクセス制御も、ログ監視も、それぞれが万能の解決策ではありません。それでも、それぞれが役割を果たし、適切に維持されていれば、システムの安全性を支えるものになります。

セキュリティとは、何があっても破られない壁を夢見ることではなく、必要な壁を作り、その壁が役割を果たし続けるように手入れをすることです。

そして、その先にあるのは、防御そのものを誇ることではありません。

利用者が安心してサービスを使い、運用者が必要な仕事に集中できる、「なんてことないサーバの、なんてことない管理者の」当たり前の日常です。

BOSGAME E5 初期セットアップ記録 ――Ubuntu 26.04 LTS、four-mations出発準備

はじめに

シェイクスピアの悲劇を経て購入した、自宅サーバ用の小型PC、BOSGAME E5。

手元に届いた以上、いつまでも箱の中に置いておくわけにはいきません。

今回の目的地は、自室のローカルサーバ環境です。これまでLet's note CF-XZで運用していたNextcloudとAdGuard Homeを、より余裕のある環境へ移す。そのための第一歩として、まずはOSを入れ替え、SSHで管理できるところまで整えます。

導入するOSはUbuntu 26.04 LTS Desktop。

ホスト名は four-mations としました。

ここから先の作業は、まだ本番サービスの移行ではありません。まずは土台を作り、ネットワークを整え、手元の自宅NWから遠隔操作できる状態にします。

環境

項目設定内容
対象機器BOSGAME E5
CPUAMD Ryzen 3 5300U
メモリ16GB DDR4
ストレージ512GB NVMe SSD
導入OSUbuntu 26.04 LTS Desktop
ホスト名four-mations
有線インターフェースenp2s0
固定IPアドレス192.168.11.21/24
デフォルトゲートウェイ192.168.11.1
DNSサーバー192.168.11.1

さっくりとした手順

  1. Ubuntu 26.04 LTS Desktopをクリーンインストールします。
  2. システムパッケージを最新化します。
  3. OpenSSH Serverを導入し、リモート接続を確認します。
  4. 有線LANのIPアドレスを固定化します。
  5. IPアドレス、ルーティング、外部ネットワークへの疎通を検証します。

1. Windows 11 ProからUbuntuへ

1.1 ブートメディアから起動します

購入時のBOSGAME E5にはWindows 11 Proが導入されていました。

しかし、今回の用途は自室のローカルサーバです。Windows環境をそのまま使うのではなく、Ubuntuをクリーンインストールします。

Ubuntu 26.04 LTS DesktopのインストーラUSBを用意し、本体に接続します。

電源投入時に DEL を押してブートメニューを開き、USBメモリから起動します。キーは機器のファームウェア設定によって異なる場合があります。

1.2 既存のストレージを初期化します

インストーラの画面に従ってインストールを進め、インストールタイプでは「ディスクを削除してUbuntuをインストール」を選択します。

インストール先は、内蔵NVMe SSDの nvme0n1 です。

注意:この操作では既存のWindows環境と、対象ディスク上のデータが消去されます。 必要なデータが残っていないことを確認してから実行します。

1.3 ホスト名を設定します

初期アカウントの設定では、コンピュータ名を次のように指定しました。(本ブログのアイキャッチの顔になっている4パターン、5人のお姉さんたちのユニット名です)

four-mations

ユーザー名とパスワードを設定し、インストール完了後に再起動します。こうして、新しい自室サーバの土台ができました。

2. システムを最新化します

2.0 aptitudeを入れます。

これは完全に筆者の好みの問題。

sudo apt install aptitude

2.1 パッケージリストを更新します

初期起動後、ターミナルを開きます。

sudo aptitude update

2.2 インストール済みパッケージを更新します

sudo aptitude upgrade -y

OSを入れたら、まずはシステムを最新の状態に整えます。この先、SSHやネットワークの設定を行うにしても、最初に基本部分を整えておくのが順序というものです。

3. SSHで遠隔操作できるようにします

3.1 OpenSSH Serverを導入します

自室サーバとして運用する以上、毎回ディスプレイとキーボードを接続して操作するのは避けたいところです。

そこで、OpenSSH Serverを導入します。

sudo apt install -y openssh-server

3.2 SSHサービスを有効化します

sudo systemctl enable --now ssh

これで、システム起動時の自動起動と、現在のサービス起動を設定できます。

3.3 サービスの稼働状態を確認します

systemctl status ssh --no-pager

出力に Active: active (running) と表示されていれば、SSHサービスは稼働しています。

3.4 現在のIPアドレスを確認します

ip -br a

有線インターフェース enp2s0 に割り当てられているIPアドレスを確認します。

この段階ではDHCPによる自動割り当てです。実際に割り当てられたアドレスを確認し、クライアント端末から接続できる状態にします。

3.5 ローカルネットワークからSSH接続します

手元のPCなど、同じLANに接続したクライアント端末から実行します。

ssh <ユーザー名>@<現在のIPアドレス>

Windowsの場合はお好みのターミナルソフトを使ってください。

初回接続時にはホスト鍵の確認が表示される場合があります。接続先が正しいことを確認してから受け入れます。

ログインできれば、ひとまず本体にディスプレイやキーボードをつながなくても操作できるようになりました。

ここから先は、遠隔操作を基本に進められます。

4. 有線LANのIPアドレスを固定化します

4.1 固定IPを設定する前に

多くの企業や組織では、固定IPの競合や管理問題から、最初から固定IPを導入するパターンでしょうが、筆者は違います。「DHCPがリースしたIPは他のNW機器とIPが被りようがない」です。

なので、省力化を果たします。(省力化とは)ただし、ここは作業上の注意点があります。

SSH接続中にネットワーク設定を変更すると、接続が切れる可能性があります。 固定IPへの切り替え前に、現在の接続情報を控え、可能なら本体のローカルコンソールから復旧できる状態を確保しておきます。

4.2 アクティブな接続名を取得します

Ubuntu Desktopでは、NetworkManagerを利用してネットワーク接続を管理できます。

まず、有線インターフェース enp2s0 に対応するアクティブな接続名を取得します。

CON_NAME=$(nmcli -t -f DEVICE,NAME connection show --active | awk -F: '$1=="enp2s0"{print $2}')

取得した値を確認します。

echo "$CON_NAME"

Wired connection 1 や 有線接続 1 など、実際の接続名が表示されることを確認します。

何も表示されない場合は、設定を変更せず、インターフェースと接続状態を確認します。

4.3 固定IPアドレスを設定します

まず、IPアドレスを指定します。

sudo nmcli connection modify "$CON_NAME" ipv4.addresses 192.168.11.21/24

デフォルトゲートウェイを指定します。

sudo nmcli connection modify "$CON_NAME" ipv4.gateway 192.168.11.1

DNSサーバーを指定します。

sudo nmcli connection modify "$CON_NAME" ipv4.dns 192.168.11.1

IPアドレスの取得方式をDHCPから手動設定へ変更します。

sudo nmcli connection modify "$CON_NAME" ipv4.method manual

4.4 設定を反映します

接続設定を再適用します。

sudo nmcli connection up "$CON_NAME"

正常に反映されれば、Connection successfully activated などのメッセージが表示されます。

接続が切れた場合は、固定IPアドレスで再接続します。

ssh <ユーザー名>@192.168.11.21

接続できない場合は、本体のローカルコンソールからネットワーク設定を確認します。DHCPへ戻す場合は、対象の接続名を確認したうえで次の設定を適用します。

sudo nmcli connection modify "$CON_NAME" ipv4.method auto ipv4.addresses "" ipv4.gateway "" ipv4.dns ""
sudo nmcli connection up "$CON_NAME"

なお、これは対象接続のIPv4設定をDHCPへ戻す操作です。実行前に接続名が正しいことを確認します。

5. ネットワーク設定を検証します

5.1 IPアドレスとインターフェース状態を確認します

ip -br a

enp2s0 が UP となり、192.168.11.21/24 が割り当てられていることを確認します。

5.2 ルーティングテーブルを確認します

ip route

出力例は次のとおりです。

default via 192.168.11.1 dev enp2s0 proto static metric 100
192.168.11.0/24 dev enp2s0 proto kernel scope link src 192.168.11.21 metric 100

デフォルトルートが 192.168.11.1 を向き、送信元アドレスとして 192.168.11.21 が使われていることを確認します。

5.3 IPアドレスを指定して疎通を確認します

ping -c 3 1.1.1.1

応答が返れば、少なくとも指定した外部IPアドレスへの通信ができています。

ネットワーク環境によってはICMPが制限される場合もあるため、応答がない場合は、この結果だけでネットワーク全体の障害と判断しないようにします。

5.4 DNSによる名前解決を確認します

getent hosts google.com

IPアドレスが返れば、名前解決ができています。

続けて、必要に応じて次のコマンドでも確認します。

ping -c 3 google.com

こちらは名前解決に加え、相手からICMP応答が返ることも確認するものです。名前解決が成功しても、ICMPが制限されていれば応答が返らない場合があります。

おわりに

これで、BOSGAME E5の初期セットアップはひとまず完了です。

Ubuntu 26.04 LTS Desktopを導入し、ホスト名を four-mations に設定。SSHで遠隔操作できるようにし、有線LANのIPアドレスを固定化しました。

まだNextcloudもAdGuard Homeも移行していません。今回整えたのは、あくまでそのための土台です。

しかし、これで自室の新しいサーバを構築する準備が整いました。

次は、既存環境の設定やデータを確認しながら、サービスの移行と動作検証を進めていきます。

PHP「php2shell」脆弱性への恒久的対応:PHP8.3-FPMを更新した際のondrej/phpの一時的退避とロールバック

前項で書いた

「php2shell」(CVE-2026-109618、CVE-2026-109619)

への恒久的対応として、PPA提供の php8.3(バージョン 8.3.35)から、Ubuntu公式の修正版(8.3.6-0ubuntu0.24.04.13)へとロールバック・パッチ適用したときの作業メモです。

概要

Ubuntu 24.04 LTS(noble)環境において、php2shell 脆弱性への対応として Ubuntu 公式セキュリティリポジトリの PHP 修正版を適用しようとしたところ、サードパーティリポジトリのパッケージが優先され、通常のパッケージ更新では修正版へ切り替わらない事象が発生しました。

原因調査の結果、ppa:ondrej/php の PHP パッケージ(8.3.35)がインストール済みかつ更新候補として選択されていることを確認しました。APTの仕様上、バージョン番号が大きいPPA版が優先されていたため、PPAをパージして Ubuntu 公式パッケージへロールバックすることでパッチ適用を完了させました。

本記事では、発生した問題、原因調査、ロールバック手順、パッチ適用確認および復旧手順を記録します。

環境

  • OS:Ubuntu 24.04 LTS(noble)
  • 対象パッケージ:PHP 8.3
  • サードパーティリポジトリ:ppa:ondrej/php
  • ロールバック先:Ubuntu 公式セキュリティリポジトリ(noble-security)
  • PHP-FPM:php8.3-fpm
  • Webサーバー:Apache
  • 発生日時:2026年10月22日 02:54 JST
  • 関連事象:PHPパッケージ更新時にPPA側で503エラーが発生。PHP更新後にPHP-FPMおよびWebサイトの動作を検証。

さっくりとした手順

  1. PHPの脆弱性対応パッケージが更新されない事象を確認します。
  2. 一時的に Ubuntu 公式セキュリティリポジトリを直接参照する設定を追加して検証します。
  3. apt-cache policy で PHP のインストール済みバージョンと候補バージョンを確認します。
  4. ppa:ondrej/php のパッケージ(8.3.35)が更新を妨げていることを特定します。
  5. ppa-purge を導入し、PHP PPAをパージして公式パッケージへロールバックします。
  6. PHPのバージョンと関連パッケージを確認します。
  7. changelog から該当の CVE 修正パッチが含まれていることを確認します。
  8. PHP-FPMとWebサーバーを再起動します。
  9. PHP-FPMのソケット、拡張モジュール、Webサイトの応答を確認します。
  10. 一時的なAPT設定を整理し、必要に応じてPPAを再登録します。

特記事項

筆者の好みでaptitudeを用いています。必要に応じてaptに切り替えてください。

1. 発生した問題と初期事象

1.1. 脆弱性パッチが適用されない

php2shell 脆弱性への対応として、Ubuntu 公式セキュリティリポジトリ(noble-security)で配信される修正版パッケージを適用しようとしました。

しかし、以下のコマンドを実行しても、期待した PHP の更新が行われませんでした。

sudo aptitude update
sudo aptitude upgrade

一時的に security.ubuntu.com を直接参照する設定を追加して検証しましたが、更新対象として認識されない状態が続きました。

1.2. PPA側の応答遅延と503エラー

パッケージ更新を試みた際、ppa:ondrej/php 側の応答が一時的に滞り、リポジトリへのアクセスで 503 Service Unavailable が発生しました。

※この事象は、運用中のWebサイトで発生したエラーではなく、PHPパッケージの取得元である外部PPAサーバー側の応答遅延に関するものです。

PPA側の修正パッケージ配信を待たずに即時保護を図るため、Ubuntu公式セキュリティリポジトリの修正版へ切り替えるべく、PPAのパージによるロールバックを実施しました。

※これは緊急的な安全確保のための対処です。記事の後半に再び ppa:ondrej/php に戻す手順も記載しています※

2. 原因調査:APTの候補バージョンを確認

2.1. apt-cache policyを実行

apt-cache policy php8.3

実際の出力結果:

php8.3:
  インストールされているバージョン: 8.3.35-1+ubuntu24.04.1+deb.sury.org+1
  候補:               8.3.35-1+ubuntu24.04.1+deb.sury.org+1
  バージョンテーブル:
 *** 8.3.35-1+ubuntu24.04.1+deb.sury.org+1 500
        500 [https://ppa.launchpadcontent.net/ondrej/php/ubuntu](https://ppa.launchpadcontent.net/ondrej/php/ubuntu) noble/main amd64 Packages
        100 /var/lib/dpkg/status
     8.3.6-0ubuntu0.24.04.13 500
        500 [http://security.ubuntu.com/ubuntu](http://security.ubuntu.com/ubuntu) noble-security/main amd64 Packages
        500 [http://archive.ubuntu.com/ubuntu](http://archive.ubuntu.com/ubuntu) noble-updates/main amd64 Packages
     8.3.6-0ubuntu0.24.04.12 500
        500 [http://security.ubuntu.com/ubuntu](http://security.ubuntu.com/ubuntu) noble-security/main amd64 Packages
        500 [http://archive.ubuntu.com/ubuntu](http://archive.ubuntu.com/ubuntu) noble-updates/main amd64 Packages
     8.3.6-0maysync1 500
        500 [http://archive.ubuntu.com/ubuntu](http://archive.ubuntu.com/ubuntu) noble/main amd64 Packages

2.2. 原因を特定

実測結果から、以下の状態を確認しました。

  • インストール済みバージョン:8.3.35-1+ubuntu24.04.1+deb.sury.org+1
  • APTの候補バージョン:同じく 8.3.35-1+ubuntu24.04.1+deb.sury.org+1
  • Ubuntu公式セキュリティ版:8.3.6-0ubuntu0.24.04.13
  • PPA版と公式版のAPT優先度:いずれも 500

PPA版と公式版のAPT優先度は同じ(500)ですが、バージョン番号の比較(8.3.35 > 8.3.6)により、APTはPPA版を「より新しい最新版」と判定し、候補として固定していました。

その結果、Ubuntu公式セキュリティリポジトリに修正版が存在していても、APTからは「古いバージョンへのダウングレード」とみなされ、通常の更新では公式版への切り替えが行われない状態になっていました。

3. PPAのパージと公式パッケージへのロールバック

3.1. ppa-purgeをインストール

sudo aptitude install -y ppa-purge

3.2. PHP PPAをパージ

sudo ppa-purge ppa:ondrej/php

PPAを無効化し、関連パッケージを一括でUbuntu公式リポジトリのバージョン(8.3.6系列)へロールバックします。
※途中でパッケージの置き換えに関する確認([Y/n])が表示されたら、Y を入力して続行します。

3.3. 公式パッケージのインストール・整合性確保

ppa-purge の依存関係解決によって本体や FPM が外れてしまうケースを防ぐため、公式リポジトリから必要な主要パッケージが揃っていることを確実にします。

sudo aptitude install -y php8.3 php8.3-cli php8.3-fpm

→ ただし、実際に必要な PHP 拡張モジュールも別途確認してください。

php -v

実行結果:

PHP 8.3.6 (cli) (built: Oct 19 2026 15:16:58) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies

3.4. PHP関連パッケージの状態を確認

dpkg -l | grep php8.3

PHP本体、PHP-FPM、必要な拡張モジュールがすべて 8.3.6-0ubuntu0.24.04.13 に揃っていることを確認します。

3.5. 脆弱性に対応したパッチであることを確認

外部サーバーへの通信を行わず、ローカルに解凍された変更履歴から該当の CVE 修正を確認します。

zcat /usr/share/doc/php8.3-common/changelog.Debian.gz | grep -C 10 "CVE-2026-109618"

確認結果:

php8.3 (8.3.6-0ubuntu0.24.04.13) noble-security; urgency=medium

  * SECURITY UPDATE: Remote RCE via state corruption issue
    - debian/patches/CVE-2026-109618_109619.patch: Avoid state corruption via
      bailout in Zend/tests/bug40770.phpt, Zend/tests/bug54268.phpt,
      Zend/tests/bug76846.phpt,
...
      tests/basic/oom_rfc1867_upload_progress.phpt,
      tests/output/oom_in_internal_output_handler.phpt.
    - CVE-2026-109618
    - CVE-2026-109619

 -- Marc Deslauriers <marc.deslauriers@ubuntu.com>  Mon, 19 Oct 2026 11:16:58 -0400

パッチ(CVE-2026-109618_109619.patch)が確実に組み込まれていることを確認できました。

4. PHP-FPMとWebサーバーの復旧

4.1. PHP-FPMを再起動

sudo systemctl restart php8.3-fpm

4.2. PHP-FPMの稼働状態を確認

sudo systemctl status php8.3-fpm --no-pager

Active: active (running) となっていることを確認します。

4.3. Apacheを再起動

sudo systemctl restart apache2

Apacheが正常に稼働していることを確認します。

5. 動作検証

5.1. PHP-FPMのソケットを確認

ls -la /run/php/php8.3-fpm.sock

ソケットファイルが存在し、WebサーバーとPHP-FPM間の通信路が正常であることを確認します。

5.2. PHPの拡張モジュールを確認

php -m

アプリケーションで必要な拡張モジュールがロードされていることを確認します(mbstring, mysqli, xml, curl 等)。

※PPA削除時に外れたモジュールがある場合は、公式リポジトリから個別に追加します。

sudo aptitude install php8.3-<module_name>

5.3. Webサイトへのアクセスを確認

curl -I [https://example.com/](https://example.com/)

HTTPレスポンスを確認し、503 Service Unavailable や 502 Bad Gateway が発生せず正常(200 OK など)に応答することを確認します。ブラウザからも主要機能の動作を検証します。

6. PPAの再有効化

6.1. PPAを継続利用する場合の再登録

将来的にPPA側の修正パッケージが配信され、PPA環境へ復帰させる場合は以下の手順で再有効化します。

sudo add-apt-repository ppa:ondrej/php
sudo aptitude update

6.2. 再登録後の候補バージョン確認

apt-cache policy php8.3

PPA側で修正版(CVE対応済みビルド)が提供されていることを確認した上でアップグレードを実施します。

apt list --upgradable 2>/dev/null | grep php8.3
sudo aptitude upgrade

まとめ

今回の事象は、Ubuntu公式セキュリティリポジトリにパッチが配信されていたにもかかわらず、ppa:ondrej/php のパッケージ(8.3.35)がバージョン数値の優先度によってAPTの更新候補を占有していたことが原因でした。

apt-cache policy で優先度と候補を正確に把握し、緊急度に応じて ppa-purge による公式版への一時ロールバックを選択したことで、即座に脆弱性を塞ぎつつサービスの正常稼働を維持することができました。

Page 1 of 113

次

Powered by WordPress & Theme by Anders Norén