カテゴリー: Linux Page 1 of 67

ピボット旅行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

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の再起動というだけで相応の調整が必要になります。

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

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

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

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 による公式版への一時ロールバックを選択したことで、即座に脆弱性を塞ぎつつサービスの正常稼働を維持することができました。

PHP「php2shell」脆弱性への緊急暫定対応:PHP-FPMのSession Upload Progress無効化(追記に恒久的対応策を記載)(更に追記:CVE-2026-115560にも有効)

更に更に追記 2026/10/23 22:21

本記事でのUpload Progress無効化は、CVE-2026-115560にも有効だという点を添えておきます。

更に追記 2026/10/22 4:02

修正版にアップデートしました。

追記2026/10/21 18:25

2026/10/21 18:25現在、筆者vpsでは念には念を入れてphp-fpmを暫定停止しています。

これは付け焼き刃では対処できないと判断。

sudo systemctl stop php8.3-fpm

で止めています。

→ 修正版が出たために再開しています

概要

2026年10月21日、PHPの重大な脆弱性として報じられた「php2shell」(CVE-2026-109618、CVE-2026-109619)への暫定対応として、PHP-FPMのSession Upload Progress機能を無効化します。

本対応では、session.upload_progress.enabled を Off に設定し、PHP-FPMへ反映しますが、これは本当に緩和策でしかないようでしたが……

CVE-2026-115560の暫定措置としては依然として推奨される策のようです。

2026/10/21 20:27 追記

以下、Geminiによる要約

1. 一体どういう攻撃なのか?

「細工したHTTPリクエストをWebサイトに送るだけで、外部からサーバーのOSコマンドを実行されてしまう」攻撃です。

  • 攻撃の手口:
    攻撃者がWebブラウザやツール経由で特殊なパラメータ(セッション管理やマルチパートフォームの処理に関わるリクエスト)を送信します。
  • 発生する問題:
    PHPコア(C言語で書かれたエンジン部分)内部でメモリ破壊が発生し、Webサーバーの権限で任意のプログラム(シェルなど)を遠隔実行されます。
  • 結果:
    サーバーが丸ごと乗っ取られ、ランサムウェアの設置、データ漏洩、他サイトへの踏み台攻撃などに悪用されます。

2. 大騒ぎしている理由

主に以下の4つの理由から、世界中のエンジニアやセキュリティ企業(watchTowr、各国のCERT等)が大騒ぎしています。

  1. 深刻度スコアが最大級(CVSS 9.2 〜 10.0)
    認証(ログイン)不要、事前の権限不要で、外部ネットワークから直接狙えるため、危険度が最高レベルに設定されています。
  2. 影響範囲が広すぎる
    PHP 5系から8系に至るまで非常に幅広いバージョンが影響を受け、WordPress、Laravel、EC-CUBEなど、Web上の膨大なシステムが標的になり得ます。
  3. アプリ側の改修や設定変更では防ぎきれない
    PHPスクリプト(WordPressやPHPコード自体)の書き方で防げる問題ではなく、PHPエンジンそのもののバグです。php.ini で session.upload_progress.enabled を無効化するなどの緩和策も議論されましたが、完全な遮断には至らず「パッチ適用以外に根本解決がない」と判明したためです。
  4. PoC(実証コード)がパッチ前に出回り始めた
    公式パッチの公開直前(ゼロデイ/準ゼロデイ状態)の段階で、すでに悪用を試みる検証コードや解析情報がネット上に出回り始め、攻撃の自動ボット化が危惧されたためです。

上記理由により、本設定変更は暫定的な緩和策であり、脆弱性そのものの修正を保証するものではありません。正式な修正版PHPが提供されたら、対象バージョンと修正状況を確認したうえで更新します。

また、今回の対応前にApacheのModSecurity CRSが不審なリクエストをHTTP 403で遮断したことを確認しています。WAFによる防御とPHP実行環境の対策を重ね、複数の防御層を維持します。

環境

  • OS:Ubuntu 24.04 LTS
  • Webサーバー:Apache
  • PHP:8.3
  • PHP実行方式:PHP-FPM
  • PHP-FPM設定ファイル:/etc/php/8.3/fpm/php.ini
  • 対象設定:session.upload_progress.enabled
  • 対応目的:脆弱性に対する暫定的なリスク低減

14:00の時点で実施した、さっくりとした手順

  1. PHP-FPMの現在の設定値を確認します。
  2. PHP-FPMの設定ファイルをバックアップします。
  3. session.upload_progress.enabled を Off に変更します。
  4. PHP-FPMの設定を検査します。
  5. PHP-FPMを再読み込みします。
  6. 設定値とサービスの状態を確認します。
  7. Web経由での設定反映とアップロード機能を確認します。
  8. 正式な修正版PHPの公開状況を確認し、更新します。

詳細手順

1. 現在の設定値を確認します

PHP-FPMの設定値を確認します。

sudo php-fpm8.3 -i | grep -i 'session.upload_progress.enabled'

今回の確認結果は以下のとおりでした。

session.upload_progress.enabled => On => On

設定ファイル上では該当行がコメントアウトされていました。

;session.upload_progress.enabled = On

先頭の ; はコメントを示すため、この行自体は設定として適用されません。PHPのデフォルト値が On であるため、コメントアウトされていても機能が無効化されているとは限りません。

実際の設定値を確認し、無効化が必要であることを判断します。

2. 設定ファイルをバックアップします

変更前に、PHP-FPMの設定ファイルをバックアップします。

sudo cp -a /etc/php/8.3/fpm/php.ini /etc/php/8.3/fpm/php.ini.bak-20261021

バックアップファイルが作成されたことを確認します。

ls -l /etc/php/8.3/fpm/php.ini.bak-20261021

設定変更により問題が発生した場合は、このバックアップから元の設定へ切り戻します。

3. Session Upload Progressを無効化します

設定ファイルを編集します。

sudoedit /etc/php/8.3/fpm/php.ini

以下の設定項目を探します。

;session.upload_progress.enabled = On

コメントアウトを解除するだけではなく、値を Off に変更します。

session.upload_progress.enabled = Off

同じ設定項目を重複して追加しないようにします。

変更後、差分を確認します。

sudo diff -u /etc/php/8.3/fpm/php.ini.bak-20261021 /etc/php/8.3/fpm/php.ini

意図した設定項目だけが変更されていることを確認します。

4. PHP-FPMの設定を検査します

設定ファイルの構文を検査します。

sudo php-fpm8.3 -t

正常な場合は、設定ファイルのテストに成功した旨が表示されます。

エラーが表示された場合は、PHP-FPMを再読み込みせず、設定ファイルを修正します。

5. PHP-FPMへ設定を反映します

設定検査に成功したら、PHP-FPMを再読み込みします。

sudo systemctl reload php8.3-fpm

続いてサービスの状態を確認します。

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

サービスが正常に稼働していることを確認します。

6. 設定値を再確認します

PHP-FPMの設定値を再確認します。

sudo php-fpm8.3 -i | grep -i 'session.upload_progress.enabled'

期待する結果は以下のとおりです。

session.upload_progress.enabled => Off => Off

ただし、このコマンドは新しく起動したPHP-FPMプロセスの設定を確認するものであり、稼働中のWebリクエストが使用する設定値を直接保証するものではありません。

必要に応じて、Web経由でPHPの設定値を確認します。確認用スクリプトを公開する場合は、外部からアクセスできないように制限し、確認後は必ず削除します。

7. Webアプリケーションの動作を確認します

設定反映後、対象のWebアプリケーションが正常に動作することを確認します。

  • Webサイトの表示
  • ログインとセッション維持
  • ファイルアップロード
  • アップロード後のファイル処理
  • ApacheとPHP-FPMのエラーログ

通常のファイルアップロード自体は、この設定変更によって原則として無効になりません。ただし、PHPのSession Upload Progress機能に依存した進捗表示などには影響する可能性があります。

作業上の注意

影響範囲

session.upload_progress.enabled = Off にすると、PHPがセッションにアップロード進捗情報を記録する機能が無効になります。

通常のファイルアップロード、ログイン、セッション管理などは、この設定変更だけで通常は影響を受けません。ただし、進捗情報を利用するアプリケーションについては動作確認が必要です。

切り戻し

変更後にアプリケーションの動作不良などが発生した場合は、バックアップから設定を復元します。

sudo cp -a /etc/php/8.3/fpm/php.ini.bak-20261021 /etc/php/8.3/fpm/php.ini

復元後、設定を検査します。

sudo php-fpm8.3 -t

検査に成功したら、PHP-FPMを再読み込みします。

sudo systemctl reload php8.3-fpm

最後にサービスの状態とWebアプリケーションの動作を確認します。

なお、切り戻しによって設定値が On に戻る場合、暫定緩和策も解除されます。切り戻しは必要な場合に限り、影響とリスクを確認して実施します。

根本対策

本対応は暫定的な緩和策です。正式な修正版PHPが公開されたら、PHP公式およびUbuntuのセキュリティ情報を確認します。

Ubuntuでは修正がバックポートされる場合があるため、バージョン番号だけで判断せず、使用中のリリースに対する修正状況を確認します。

修正版が提供されたら、実際にWebアプリケーションが使用しているPHP実行環境を更新し、動作確認を実施します。

まとめ

PHPの設定ファイルで該当項目がコメントアウトされていても、機能が無効になっているとは限りません。PHPのデフォルト値が On であれば、コメントアウトされた状態でも機能は有効です。

今回の対応では、設定ファイルの記述だけで判断せず、実際の設定値を確認したうえで Off を明示し、PHP-FPMへの反映と動作確認を行います。

WAFによるリクエスト遮断、PHP実行環境の暫定対策、修正版への更新を組み合わせ、単一の防御機構に依存しない構成を維持します。

GROWI 8.0のAI AgentにGeminiを組み込む:月10ドルの特典を活用してみる(初回課金あり。結果は要観察)

Google One AI Proに付帯する、月10ドル相当のGoogle Cloudクレジット。

これを何かに使えないかと考えていたところ、自前でホスティングしているWiki「GROWI」のAI Agentと組み合わせることを思いつきました。

GROWIのAI Agentは、Wiki内の複数ページを横断して検索し、得られた情報をもとに回答を生成してくれる機能です。これが実用になるなら、過去に蓄積したナレッジを探し出す手間を減らせます。

そして、手元には毎月付与されるGoogle Cloudクレジットがある。

ならば、これを活用しない手はありません。

実際に設定してみたところ、GROWIからGemini APIを呼び出し、Wiki内の情報を横断検索して回答を生成するところまでは確認できました。

ただし、ここで一つ注意点があります。

AI Agentが動いたことと、月10ドルの特典だけで運用できていることは、別の話です。

今回は、そこに至るまでの設定手順と、実際に課金される金額について、今後も確認していく必要がある点をまとめます。

例によって前置きは長いです。

1. 取り組もうとしたきっかけ:WikiのナレッジをAIから引き出したい

GROWIのAI Agentは、Wikiに蓄積された情報を横断して調べる用途に向いています。

例えば、過去の旅行記や技術メモを複数ページにわたって検索し、その内容をまとめさせる、といった使い方です。

人間がページ名を思い出し、検索語を考え、一つずつ開いていく手間を考えると、かなり魅力的な機能です。

一方、Gemini APIを無料枠のまま利用しようとすると、レート制限に引っかかることがあります。

特に、複数ページの検索や要約など、一つの質問に対して複数回のAPI呼び出しが発生する処理では、無料枠の制限がボトルネックになる可能性があります。

そこで、従量課金側の利用設定を行い、Google Cloudのクレジットを活用できないか試してみることにしました。

月10ドル相当のクレジットが利用でき、実際のAPI利用料がその範囲に収まるのであれば、個人運用のWikiとしては十分に魅力的です。

ただし、これはあくまで期待値の話。

利用料が月10ドル以内に収まることと、その利用料に特典クレジットが適用されることは、それぞれ確認しなければなりません。

この二つを一緒にしてしまうと、後から請求額を見て慌てることになります。

2. 最初の関門:APIは呼び出せるのに、前払い残高がない

Google Cloud側で請求先アカウントを用意し、Google AI StudioでAPIキーを発行。GROWI側にも設定を入れて、いざ動作確認。

ところが、次のエラーが返ってきました。

Your prepayment credits are depleted. Please go to AI Studio at ... to manage your project and billing.

メッセージの内容は、事前入金したクレジットが枯渇している、というものです。

ここで問題になったのが、Google Cloud側にクレジットがあることと、Google AI Studio側でGemini APIを利用できる状態になっていることが、必ずしも同じではないという点でした。

今回の環境では、AI Studio側で前払い残高を購入する操作が必要になりました。

ただし、ここで注意したいのは、前払い残高を購入すれば、その金額がそのまま保証金として残り、APIの利用料は必ずGoogle Cloudの特典から優先的に引き落とされる、とまでは確認できていないことです。

請求先アカウントにクレジットが表示されていることだけでは、実際のAPI利用料にどのクレジットが適用されるかまでは判断できません。

このあたりは、設定画面の表示だけで安心せず、実際の利用明細と残高の推移を追う必要があります。

3. 作業前に確認しておくこと

今回の作業では、次の点に注意しました。

  • Google Cloudの請求先アカウントと、支払い方法の設定が必要になる。
  • Google AI Studio側で、前払い残高の購入を求められる場合がある。
  • Google Cloudのプロモーションクレジットと、AI Studio側の前払い残高は、同じものとして扱わない。
  • クレジットが付与されていることと、そのクレジットが実際のAPI利用料に適用されることは別途確認する。
  • Google側の料金体系、クレジットの適用条件、画面表示は変更される可能性がある。

なお、今回の手順は、筆者の環境で動作確認できた構成をもとにしたものです。

APIが正常に動くところまでは確認していますが、最終的な請求額とクレジットの消費順序については、引き続き経過観察が必要です。

「月10ドルの特典があるから大丈夫」と考えて作業を進めるのではなく、課金の仕組みを確認しながら利用することを前提にしています。

4. 今回の環境

項目設定
WikiGROWI v8.0.7
実行環境Node.js 24 / pnpm / Docker不使用
AI基盤Google AI Studio / Gemini API
クレジットGoogle Developer Programの月10ドル相当の特典
モデルGemini APIで利用可能なFlash系モデル

モデル名については、実際にAI Studioのモデル一覧に表示され、利用可能なものを選択してください。モデルの提供状況や名称は変更されるため、特定のモデル名を固定して手順を進めるのは避けたほうがよさそうです。

5. さっくりとしているがすんなりはいかない設定手順

Step 1. Google Cloudの請求先アカウントを用意する

まず、Google Cloud側の請求先アカウントを用意します。

  1. Google Cloud Console にアクセスする。
  2. 「お支払い」から請求先アカウントを作成、または既存のアカウントを確認する。
  3. 必要に応じて支払い方法を登録する。
  4. Google Developer Programの特典ページ にアクセスする。
  5. 月10ドル相当の生成AI・Cloudクレジットの特典が利用可能であれば、案内に従って請求先アカウントに適用する。
  6. Google Cloud Consoleのクレジット画面で、特典の適用状況と有効期限を確認する。

ここで確認したいのは、単に特典の申し込みが完了していることではありません。

実際にどの請求先アカウントに、どの種類のクレジットが、いつまで有効なものとして付与されているかです。

後から利用明細を確認するときにも必要になるため、この時点で記録しておくとよいでしょう。

Step 2. Google AI StudioでAPIキーを発行する

続いて、Gemini APIを利用するためのAPIキーを用意します。

  1. Google AI StudioのAPIキー管理画面 を開く。
  2. 必要に応じてプロジェクトを作成する。
  3. APIキーを発行する。
  4. 対象プロジェクトの請求設定と利用可能な課金階層を確認する。
  5. APIキーを安全な場所に保管する。

課金設定については、画面上の案内に従ってください。

なお、APIキーを発行できたことだけでは、課金設定が完了していることや、特典クレジットが利用料に適用されることまでは確認できません。

Step 3. AI Studio側の前払い設定を確認する

今回、実際にエラーの解消に関係したのがこの部分です。

Google AI StudioのBilling画面を開き、前払い残高と購入に関する表示を確認します。

Google AI Studio Billing

今回の環境では、前払い残高の購入が必要でした。

ただし、購入金額や購入が必要となる条件は、画面上の案内と利用環境に従ってください。最低購入額を含め、すべての環境で同じ条件になるとは限りません。

そして、ここが今回の重要なポイントです。

前払い残高を購入した場合は、その金額がどのように扱われるのかを確認してから利用を続けてください。

前払い残高が表示されていることだけを根拠に、追加の持ち出しが発生しないとは判断できません。

Google Cloud側の特典残高、AI Studio側の前払い残高、APIの利用明細をそれぞれ確認し、実際の利用料がどこに計上されるのかを追う必要があります。

Step 4. GROWIのAI設定を行う

ここからはGROWI側の設定です。

  1. GROWIに管理者アカウントでログインする。
  2. /admin/ai を開く。
  3. AI機能を有効にする。
  4. プロバイダーとしてGoogleを選択する。
  5. 発行したGemini APIキーを設定して保存する。
  6. モデルカタログを更新する。
  7. 利用可能なモデルから、使用するFlash系モデルを選択して保存する。

画面の項目名や利用できるモデルは、GROWIのバージョンやGemini API側の変更によって異なる場合があります。

モデル一覧が更新できない場合は、APIキーや課金設定、利用可能なモデルを順番に確認してください。

Step 5. AI AgentからWiki内の情報を検索する

設定が完了したら、GROWIの通常画面に戻り、AI Agentに質問してみます。

例えば、次のような質問です。

「ピボット旅行」と名付けられた記事一覧から、
なぜそう名づけたのかを要約してください。

今回の環境では、AI AgentがWiki内の複数ページを参照し、それらの内容を踏まえた回答を生成するところまで確認できました。

これは、今回の設定で得られた成果です。

単にGemini APIに接続できただけではなく、GROWIに蓄積された情報を検索し、その結果を使って回答を生成するという、本来やりたかった動作が成立しました。

一方で、この動作確認によって分かるのは、あくまでAI Agentが機能しているということです。

利用料が特典クレジットから差し引かれているのか、前払い残高がどのように消費されるのか、最終的な請求額がいくらになるのかは、別途確認する必要があります。

6. ここからが本当の経過観察

今回の設定で、GROWI AI AgentとGemini APIの連携自体は成立しました。

しかし、これで「月10ドルの特典を使って、実質無料で運用できる環境が完成した」と結論づけるのは、まだ早いと考えています。

今後、確認したいのは次の点です。

  • Google Cloud側の特典クレジットが、実際のAPI利用料に適用されているか。
  • AI Studio側の前払い残高が、どのタイミングで、どのように変化するか。
  • API利用料がどの請求項目に計上されるか。
  • 一定期間利用した後、実際に追加の支払いが発生していないか。
  • 月10ドル相当の特典の有効期限や適用条件に変更がないか。

特に重要なのは、設定直後の残高表示だけで判断しないことです。

利用直後には明細への反映に時間がかかる場合もあるため、利用記録と請求情報を継続して確認する必要があります。

また、今回のように前払い残高を購入する仕組みでは、購入した金額と、最終的に消費された金額を分けて考えなければなりません。

「残高がある」「特典が付与されている」「APIが動いている」。

この三つがそろっていても、最終的な支払いがゼロになるとは限りません。

実際にいくら課金されるかは、別問題です。

ここは、しばらく利用実績を追ってから判断することにします。

7. まとめ:便利な環境はできた。あとは請求を確認する

今回、GROWI 8.0.7のAI AgentにGemini APIを組み込み、Wiki内の複数ページを横断検索して回答を生成するところまで確認できました。

蓄積したナレッジを、ページ名や検索語を思い出すことなく引き出せるようになるのは、個人運用のWikiとしても大きな利点です。

毎月付与されるGoogle Cloudクレジットを活用できるなら、なおさら魅力的な構成になります。

ただし、現時点で確認できているのは、連携と動作の成功までです。

月10ドル相当の特典が実際の利用料にどのように適用されるのか、前払い残高がどう扱われるのか、最終的に追加の請求が発生するのか。

このあたりは、実際の利用明細を見ながら確認していく必要があります。

便利だからといって、課金の仕組みまで都合よく解釈してはいけません。

ひとまず、GROWI AI Agentを使える環境は整いました。

あとは、実際に使いながら請求の推移を観察していきます。

Page 1 of 67

次

Powered by WordPress & Theme by Anders Norén