Ubuntu 24.04にapache mod_securityを導入。

ApacheのWAFモジュールであるmod_securityを導入します。

  • AWS 時代から早々とインストールしていた
  • 各種不審なIPアドレスを弾くための盾

として機能している、筆者のVPS運用の核となる技術。その2026年版です。

そもそもWAFとは?

WAFとはWeb Application Firewallの略で、Webアプリケーション層の脆弱性を狙った攻撃を防ぐためのセキュリティシステムです。

  • UFWやFail2banがIPアドレスやポート番号といった家の玄関を監視するのに対し、WAFは、Webサーバーへ届く手紙(HTTPリクエスト)の中身を解析し、悪意あるスクリプトやコマンドの有無をチェックします。
  • UFWでは、通常のポート(80番や443番)を通る攻撃は防げませんが、WAFは攻撃の内容を解析し、独自のルールセットに基づき「このアクセスは許可するが、このコードがアクセスすることは許可しない」という、より柔軟で厳しいセキュリティチェックを施します。

この機能により、Webサーバーやアプリケーション本体に脆弱性が見つかったとしても、WAFが前段の盾としてこれをカバーできます。

ModSecurityとは?

ModSecurityは、IIS/Apache/Nginxといった主要なWebサーバープログラムにモジュールとして組み込みが可能なオープンソースのWAFです。

  • 導入コスト: ライセンス費用が不要であり、既存のWebサーバーと連携する形で容易に組み込めます。
  • 柔軟性: OSSであるため、高い柔軟性を持ち、設定(チューニング)次第でピンポイントの防御や包括的な防御を併せ持つことができます。

備考(バージョンの選択):

本稿で導入するModSecurityは、Ubuntu 24.04系のパッケージ管理で提供されるEOL (End-of-Life) となっているv2ですが、機能性は単一VPSの防御としては十分です。

v3への移行は、セキュリティ強度とメンテナンス性を考慮し、パッケージ化ないしはOSアップデートなどのタイミングでまた後日検討していきます。

環境

  • Ubuntu 24.04 (22.04でも動作確認)
  • Apache 2.4

※ パッケージ管理にaptitudeを用いています。必要に応じてaptに読み替えてください。

さっくりとした手順

  1. mod_securityのインストールを行います。
  2. mod_securityの設定を行います。
  3. Apacheのバーチャルサイトにmod_securityを組み込みます。
  4. 設定を反映して動作を確認します。

mod_securityのインストールを行います。

  • パッケージ全体のアップデート
sudo aptitude update
  • mod_securityインストール
sudo aptitude install libapache2-mod-security2
  • インストール確認
sudo apache2ctl -M |grep security
security2_module (shared)

と表示されていることを確認します。

ModSecurityの設定

  • 設定ファイル書き換え
sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

推奨ファイルをそのまま設定ファイルとして書き換えます。

OWASP Core Rule Set (CRS)のインストールと設定

  • ディレクトリ移動
cd /usr/share/modsecurity-crs && pwd
  • ルールセットのダウンロード
sudo git clone https://github.com/coreruleset/coreruleset.git
  • ルールセットの設定書き換え
sudo mv /usr/share/modsecurity-crs/coreruleset/crs-setup.conf.example /usr/share/modsecurity-crs/coreruleset/crs-setup.conf

mod_securityモジュールにCRSを読み込む設定を追記

  • ディレクトリ移動
cd /etc/apache2/mods-available/ && pwd
  • ファイルのバックアップ
sudo cp -pi security2.conf /path/to/backup/directory/security2.conf.$(date +%Y%m%d)

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

  • バックアップ確認
diff -u /path/to/backup/directory/security2.conf.$(date +%Y%m%d) security2.conf

エラーがなければバックアップは成功です。

  • ファイル追記

/etc/apache2/mods-available/security2.confを、以下の差分になるように教義・信仰に沿ったエディタで編集します。(要root権限)

 <IfModule security2_module>
-       # Default Debian dir for modsecurity's persistent data
-       SecDataDir /var/cache/modsecurity
+    # Default Debian dir for modsecurity's persistent data
+    SecDataDir /var/cache/modsecurity

-       # Include all the *.conf files in /etc/modsecurity.
-       # Keeping your local configuration in that directory
-       # will allow for an easy upgrade of THIS file and
-       # make your life easier
-        IncludeOptional /etc/modsecurity/*.conf
+    # Include all the *.conf files in /etc/modsecurity.
+    # Keeping your local configuration in that directory
+    # will allow for an easy upgrade of THIS file and
+    # make your life easier
+    IncludeOptional /etc/modsecurity/*.conf

-       # Include OWASP ModSecurity CRS rules if installed
-       IncludeOptional /usr/share/modsecurity-crs/*.load
+    # --- OWASP Core Rule Set (CRS) の読み込み ---
+
+    # 1. CRSのセットアップファイルを読み込む(必須)
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/crs-setup.conf
+    
+    # 2. CRSのルールファイルを読み込む
+    #    パフォーマンス問題を起こすSQLデータ漏洩検知ルールを除外
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/REQUEST-*.conf
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-950-DATA-LEAKAGES.conf
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-952-DATA-LEAKAGES-JAVA.conf
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-953-DATA-LEAKAGES-PHP.conf
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-954-DATA-LEAKAGES-IIS.conf
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-959-BLOCKING-EVALUATION.conf
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-980-CORRELATION.conf
+    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf

→ 修正後のsecurity2.conf全文

<IfModule security2_module>
    # Default Debian dir for modsecurity's persistent data
    SecDataDir /var/cache/modsecurity

    # Include all the *.conf files in /etc/modsecurity.
    # Keeping your local configuration in that directory
    # will allow for an easy upgrade of THIS file and
    # make your life easier
    IncludeOptional /etc/modsecurity/*.conf

    # --- OWASP Core Rule Set (CRS) の読み込み ---

    # 1. CRSのセットアップファイルを読み込む(必須)
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/crs-setup.conf

    # 2. CRSのルールファイルを読み込む
    #    パフォーマンス問題を起こすSQLデータ漏洩検知ルールを除外
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/REQUEST-*.conf
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-950-DATA-LEAKAGES.conf
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-952-DATA-LEAKAGES-JAVA.conf
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-953-DATA-LEAKAGES-PHP.conf
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-954-DATA-LEAKAGES-IIS.conf
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-959-BLOCKING-EVALUATION.conf
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-980-CORRELATION.conf
    IncludeOptional /usr/share/modsecurity-crs/coreruleset/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
</IfModule>

※ なぜここまで除外するか?

この、RESPONSE-9x系のルールは、ページの内容に機密情報(クレジットカードのデータなど)が入っていないかを精査します。

これは重要なものですが、昨今のAIボットによる過剰なクロールが挟むと、サーバそのものへの負荷を強め、更にログの圧迫(実際にサーバ容量120GB全てを食い尽くしました)とサーバダウンにつながります。

こちらは個人サイト、単一VPSの運用を旨としているため、ここに関するデータはオミットです。 その分、他の設定の補強でセキュリティ強度を担保します。

例外ルールを追記

/usr/share/modsecurity-crs/coreruleset/rules && pwd

配下に

REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.confファイルを作成します。

#
# === CRS Exclusions - Before Rules Execution (Organized) ===
#

# ===================================================================
# 1. 共通ルール・汎用ルール (General/Common Rules)
# ===================================================================

# 1-1. 遅い通信(Slowloris)対策
# 矛盾するConnectionヘッダーを持つリクエストを遮断
SecRule REQUEST_HEADERS:Connection "@rx (?i)(?:keep-alive(?:,\sclose|,\skeep-alive)|close(?:,\skeep-alive|,\sclose))" \
    "id:10001,phase:1,t:none,block,msg:'[CUSTOM RULE] Contradictory Connection header, possible Slowloris probe.',tag:'application-attack',tag:'PROTOCOL_VIOLATION/INVALID_HREQ',setvar:'tx.inbound_anomaly_score_pl1=+%{tx.critical_anomaly_score}'"

# 1-2. IPアドレス直打ちアクセス対策
SecRule REQUEST_HEADERS:Host "@rx ^[\d.]+(:\d+)?$" \
    "id:10002,\
    phase:1,\
    deny,\
    status:404,\
    log,\
    msg:'[CUSTOM RULE] Host header is a numeric IP address (incl port). Blocked immediately.',\
    tag:'application-attack',\
    tag:'PROTOCOL_VIOLATION/INVALID_HREQ'"

# 1-3. Hostヘッダーが存在しない場合は即ブロック
SecRule &REQUEST_HEADERS:Host "@eq 0" \
    "id:10003,\
    phase:1,\
    deny,\
    status:404,\
    log,\
    msg:'[CUSTOM RULE] Missing Host Header. Blocked immediately.'"

なぜこの設定が必要なのか?

「雑なスキャナー/クローラーをまとめてブロックする」にあります。

  • 攻撃者は、 Connection: keep-alive, close という通常ではありえないヘッダーでサーバを枯渇させることが非常に多いです。(Slowloris などのDoS攻撃ツール)
  • 攻撃者のほぼ大半は、ドメイン名ではなくIPアドレスを指定。そして、Hostヘッダーを指定せずに無差別にスキャンを行います。

「ブラウザを用いて実際にアクセスする」方が

  • 矛盾したヘッダー
  • IPアドレス直打ち
  • Hostヘッダー抜きのアクセス

はあり得ません。これら雑なスキャナー/クローラーにWAFの計算力を与える必要はありません。

  • 設定追記の整合性を確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Apache再起動
sudo systemctl restart apache2.service
  • Apache再起動確認
systemctl status apache2.service

active (running) を確認します。

Apacheのバーチャルサイト編集

稼働済みのApacheバーチャルサイトの設定ファイルをいじります。バックアップ確認は入念に行ってください。

  • ディレクトリ移動
cd /etc/apache2/sites-available && pwd
  • バーチャルサイトの設定ファイルバックアップ
sudo cp -pi your_site.conf /path/to/backup/directory/your_site.conf.$(date +%Y%m%d)

.confファイルやバックアップディレクトリは自分の環境を指定します。

  • バックアップ確認
diff -u /path/to/backup/directory/your_site.conf.$(date +%Y%m%d) your_site.conf

エラーがなければバックアップは成功です。

  • ファイル追記

/etc/apache2/sites-available/your_site.confを、以下の差分になるように教義・信仰に沿ったエディタで編集します。(要root権限)

# Mod Security

## ModSecurity有効化
SecRuleEngine On
## ModSecurity検知モード
### 検知モードで動かす場合はSecRuleEngine Onをコメントアウトしてこちらを有効化します
#SecRuleEngine DetectionOnly

## ファイルのアップロードをできるようにします。
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000

## テスト用の検知パラメータを付け加えます。
    SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"
  • ファイル差分
diff -u /path/to/backup/directory/your_site.conf.$(date +%Y%m%d) your_site.conf
+# Mod Security
+
+## ModSecurity有効化
+SecRuleEngine On
+## ModSecurity検知モード
+### 検知モードで動かす場合はSecRuleEngine Onをコメントアウトしてこちらを有効化します
+#SecRuleEngine DetectionOnly
+ 
+## ファイルのアップロードをできるようにします。
+SecRequestBodyInMemoryLimit 524288000
+SecRequestBodyLimit 524288000
+
+## テスト用の検知パラメータを付け加えます。
+    SecRule ARGS:modsecparam "@contains test" "id:4321,deny,status:403,msg:'ModSecurity test rule has triggered'"
+
  • 設定追記の整合性を確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Apache再起動
sudo systemctl restart apache2.service
  • Apache再起動確認
systemctl status apache2.service

active (running) を確認します。

mod_security動作確認

  1. ブラウザで、上記の設定を行ったWebサイトにアクセスし、閲覧できることを確認します。
  2. アドレスバーの末尾に?modsecparam=testを追加してアクセスします。

403 Forbidden

のように、アクセスできないことを確認します。

また、サーバでも

sudo cat /path/to/sites_log/directory/sites_error.log

※ログの格納場所やログの名前は自分の環境に合わせます。

を開き、

ModSecurity: Access denied with code 403 (phase 2). String match "test" at ARGS:modsecparam. [file "/etc/apache2/sites-enabled/your_site.conf"] [line "53"] [id "4321"] [msg "ModSecurity test rule has triggered"] [hostname "host_address"] [uri "/"] [unique_id "xxxxxxx"]

のように、エラーが発生していることを確認します。

備考

WordPress、Redmine等のWebアプリは自身の操作によって「不審なアクセス」として遮断することが極めてよくあります。(偽陽性)

そのため、テストを行った後は

## ModSecurity有効化
#SecRuleEngine On
## ModSecurity検知モード
### 検知モードで動かす場合はSecRuleEngine Onをコメントアウトしてこちらを有効化します
SecRuleEngine DetectionOnly

として検知モードとして動かした方が良いでしょう。

無駄なき同盟。(アプリ版『ガイアプロジェクト』アンバス人チャレンジ)

ゲームの目的が

  • 同盟数
  • 同盟に用いた衛星数(パワートークン)

だったので、アンバス人でセレクトです。

初期位置から受動パワーをガンガンもらえる位置にいたので

  • 鉱石2
  • 2段階改造
  • 知識2

をコンスタントにセレクトできました。

最終的な盤面。全ての施設が何らかの同盟の一部という、一切の無駄がない構成。もちろん、ゲーム目的の「同盟に所属する施設数」「衛星トークン数」は1位。

特筆すべきは、初の同盟タイルが初めて6枚手に入れられたこと。上級タイルも

  • 鉱山×2
  • パスごとに惑星改造をした種類ごとに×1

を取れました。

最終的な得点は182点。研究も盤面もしっかり取れた満足いくゲームでした。

Mod_Securityが検知した「点火テスト」確認

Webサーバを運営していてよかったことの一つは、「悪意ある攻撃」をリアルタイムで見られること、に尽きます。

2026/02/17も、そのようなログを見かけました。どのような攻撃で、どんな悪意があったのかのメモです。

さっくりとした攻撃概要

  1. 攻撃者はNode.js系のサービスが生きているかを確認した。
  2. その上で、サーバ乗っ取りを画策した。

環境・備考

  • Apache 2.4
  • ModSecurity v2 / CRSを利用

以下、ご紹介するログは実際のログですが、

  • IPアドレス
  • どのサイトに来たか

は別のものに置き換えています。これはプライバシー配慮という点ではなく「攻撃者に名前を与えない」から来るものです。

攻撃ログ(抜粋)

攻撃者は、Unix系とWindows系の両方のサーバーを想定し、2回に分けて「点火テスト」を試みています。

A. Unix/Linuxターゲットのペイロード

[Tue Feb 17 03:16:50 2026] [security2:error] [client 192.0.2.55] 
ModSecurity: Access denied with code 403 (phase 2). 
[id "932130"] [msg "Remote Command Execution: Unix Shell Expression Found"]
[id "934100"] [msg "Node.js Injection Attack 1/2"]

[data "Matched Data: var res=process.mainModule.require('child_process').execSync('echo $((40261*44548))').toString().trim(); ..."]

[hostname "sub.example.jp"] [uri "/"]

B. Windowsターゲットのペイロード

[Tue Feb 17 03:16:51 2026] [security2:error] [client 192.0.2.55] 
ModSecurity: Warning. [id "932120"] [msg "Remote Command Execution: Windows PowerShell Command Found"]
[data "Matched Data: var res=process.mainModule.require('child_process').execSync('powershell -c 40261*44548').toString().trim(); ..."]

攻撃の構造解析:何が行われようとしたのか

この攻撃はサーバー乗っ取りを目的としたものです。

「点火テスト」による生存確認

攻撃コードの中にある 40261*44548 という計算式が肝です。

  • 手口:
    • サーバー上でこの計算を実行させ、その結果(1,793,526,428)をレスポンスとして返させようとしています。
  • 意図:
    • もし計算結果が返ってくれば、そのサーバーは「外部からの命令をそのまま実行する状態」にあることが証明され、攻撃者は本格的なマルウェアの設置へ移行します。

Node.jsの深部への侵入

  • 手口:
    • process.mainModule.require('child_process') という、Node.jsの最も強力な権限を持つ命令を呼び出そうとしています。
  • 意図:
    • これが成功すると、サーバー上で任意のOSコマンド(ファイルの削除、パスワードの窃取など)が実行可能になります。

プロトタイプ汚染 (Prototype Pollution)

  • 手口:
    • __proto__ という特殊なプロパティを操作しようとしています。
  • 意図:
    • アプリケーション全体の挙動を「根底から書き換える」手法です。Next.jsの内部ロジックを捻じ曲げ、セキュリティチェックをバイパスしようとしています。

特記事項

今回のログで最も注目すべきは、ModSecurityの異常スコア(Anomaly Score)が 45点〜50点というそこそこ高い数値を叩き出している点です。

  • Unixシェルの構文検知(RCE)
  • Node.jsの危険な関数検知(Injection)
  • プロトタイプ汚染の検知(JavaScript攻撃)
  • PowerShellの使用検知(Windows攻撃)

これら複数のフィルタが同時にに反応したため、ModSecurityはこれは間違いなく脅威であると断定し、即座に遮断しました。

まとめ

攻撃は「いきなり行う」というよりは「どの攻撃が効くか」を確認してからリソースを集中していきます。なので、実際のログを見て「これが攻撃の前段階である」をつかんでおくのは大事。(そのためのログ確認です)

『孫子 虚実篇 六』の

「攻めて必ず取る者は、其の守らざる所を攻むればなり。守って必ず固き者は、其の攻めざる所を守ればなり」

これは、守備側に立たされるサーバ管理者も持っておきたい心構えだと思いました。

2026年2月のボドゲソロプレイ

部屋が格段にきれいになったので、ボドゲを自室で回せるだけの機会が発生です。

カスカディア・ソロプレイ

相当久しぶりだったのでプレイ感覚を忘れるというていたらく。

  • 動物の得点
  • エリアマジョリティ

全てで失敗し、最終結果は59点。クリアの足きりならず。

この手のゲームは継続的なプレイが重要だなと改めて思いました。

しっかりとオーガナイザーで整理されている訳なので。

デッキ調整、トークン一新。(統率者メモ:2026/02/16)

使い始めが2024年という、そこそこ息が長いデッキのマナカーブやシナジーを元に調整を重ねています。

統率者

《リスの将軍、サワギバ/Chatterfang, Squirrel General(MH2)》

デッキ

クリーチャー

  • 《大釜の使い魔/Cauldron Familiar(ELD)》
  • 《骨術師の達人/Osteomancer Adept(BLB)》
  • 《ズーラポートの殺し屋/Zulaport Cutthroat(BLC)》
  • 《ネイディアの夜刃/Nadier's Nightblade(BLC)》
  • 《無情な無頼漢/Ruthless Knave(XLN)》
  • 《実験的な菓子職人/Experimental Confectioner(WOE)》
  • 《悲哀の徘徊者/Woe Strider(BLC)》
  • 《巣穴の魂商人/Warren Soultrader(MH3)》
  • 《無慈悲な略奪者/Pitiless Plunderer(RIX)》
  • 《無情な屍技術師/Ruthless Technomancer(NEC)》
  • 《ヘイゼルの醸造主/Hazel's Brewmaster(BLC)》
  • 《溜め込む親玉/Hoarding Broodlord(MOM)》
  • 《エルフの神秘家/Elvish Mystic(TSR)》
  • 《金のガチョウ/Gilded Goose(MOC)》
  • 《ラノワールのエルフ/Llanowar Elves(_BR)》
  • 《極楽鳥/Birds of Paradise(RVR)》
  • 《森を護る者/Sylvan Safekeeper(MH3)》
  • 《茨越えの餌あさり/Thornvault Forager(BLB)》
  • 《献身のドルイド/Devoted Druid(UMA)》
  • 《裕福な亭主/Prosperous Innkeeper(BLC)》
  • 《小走り樫/Scurry Oak(MH2)》
  • 《不屈の補給兵/Tireless Provisioner(BLC)》
  • 《リスの小走り/Scurry of Squirrels(BLC)》
  • 《ペレグリン・トゥック/Peregrin Took(LTR)》
  • 《秘密を知るもの、トスキ/Toski, Bearer of Secrets(MKC)》
  • 《終わりなき巣網のアラスタ/Arasta of the Endless Web(BLC)》
  • 《永久の証人/Timeless Witness(MH2)》
  • 《深き森の隠遁者/Deep Forest Hermit(BLC)》
  • 《悪魔の職工/Fiend Artisan(IKO)》
  • 《根花のヘイゼル/Hazel of the Rootbloom(BLC)》
  • 《歩行バリスタ/Walking Ballista(AER)》
  • 《アカデミーの整備士/Academy Manufactor(BLC)》
  • 《カルドーサの鍛冶場主/Kuldotha Forgemaster(SOM)》
  • 《マイアの戦闘球/Myr Battlesphere(TDC)》

インスタント

  • 《命取りの論争/Deadly Dispute(BLC)》
  • 《切断マジック/Saw in Half(BLC)》
  • 《新緑の命令/Verdant Command(MH2)》
  • 《蓄え放題/Cache Grab(BLB)》
  • 《召喚の調べ/Chord of Calling(M15)》
  • 《暗殺者の戦利品/Assassin's Trophy(ACR)》
  • 《ウィンドグレイスの裁き/Windgrace's Judgment(BLC)》

ソーサリー

  • 《発掘/Unearth(A25)》
  • 《群がり庭の虐殺/Swarmyard Massacre(BLC)》
  • 《根鋳造の弟子入り/Rootcast Apprenticeship(BLC)》
  • 《大渦の脈動/Maelstrom Pulse(BLC)》

エンチャント

  • 《清掃人の才能/Scavenger's Talent(BLB)》
  • 《アクロゾズの約定/Promise of Aclazotz(LCC)》
  • 《想起の拠点/Bastion of Remembrance(BLC)》
  • 《美食家の才能/Gourmand's Talent(BLC)》
  • 《パンくずの道標/Trail of Crumbs(ELD)》
  • 《殺しのサービス/Killer Service(NCC)》
  • 《イトリモクの成長儀式/Growing Rites of Itlimoc(XLN)》
  • 《似通った生命/Parallel Lives(WOT)》
  • 《陰湿な根/Insidious Roots(MKM)》

アーティファクト

  • 《太陽の指輪/Sol Ring(BLC)》
  • 《恐竜の遺伝子/Dino DNA(REX)》
  • 《魔女のかまど/Witch's Oven(ELD)》
  • 《頭蓋骨絞め/Skullclamp(BLC)》
  • 《アシュノッドの供犠台/Ashnod's Altar(4ED)》
  • 《ヌカコーラ自動販売機/Nuka-Cola Vending Machine(PIP)》
  • 《前兆の時計/Clock of Omens(5DN)》
  • 《旗印/Coat of Arms(EXO)》
  • 《囀り吐き/Chitterspitter(BLC)》

プレインズウォーカー

  • 《飢餓の潮流、グリスト/Grist, the Hunger Tide(MH2)》

バトル

  • 《イコリアへの侵攻/Invasion of Ikoria(MOM)》

土地

  • 《沼/Swamp》
  • 《沼/Swamp》
  • 《沼/Swamp》
  • 《沼/Swamp》
  • 《沼/Swamp》
  • 《沼/Swamp》
  • 《沼/Swamp》
  • 《森/Forest》
  • 《森/Forest》
  • 《森/Forest》
  • 《森/Forest》
  • 《森/Forest》
  • 《森/Forest》
  • 《森/Forest》
  • 《森/Forest》
  • 《見捨てられたぬかるみ、竹沼/Takenuma, Abandoned Mire(NEO)》
  • 《ゴルガリの腐敗農場/Golgari Rot Farm(RAV)》
  • 《疾病の神殿/Temple of Malady(BLC)》
  • 《森林の墓地/Woodland Cemetery(TDC)》
  • 《黄昏のぬかるみ/Twilight Mire(TDC)》
  • 《ラノワールの荒原/Llanowar Wastes(TDC)》
  • 《緑ばんだ沼/Viridescent Bog(BLC)》
  • 《汚れた森/Tainted Wood(BLC)》
  • 《草むした墓/Overgrown Tomb(RAV)》
  • 《屍花の交錯/Necroblossom Snarl(BLC)》
  • 《風切る泥沼/Hissing Quagmire(OGW)》
  • 《眠らずの小屋/Restless Cottage(WOE)》
  • 《不気味な辺境林/Grim Backwoods(BLC)》
  • 《群がりの庭/Swarmyard(TSR)》
  • 《風変わりな果樹園/Exotic Orchard(BLC)》
  • 《祖先の道/Path of Ancestry(BLC)》
  • 《統率の塔/Command Tower(BLC)》
  • 《新緑の地下墓地/Verdant Catacombs(ZEN)》
  • 《成長の揺り篭、ヤヴィマヤ/Yavimaya, Cradle of Growth(MH2)》

お気に入りのデッキですが、ここ半年回していなかったのは明確な理由がありました。

「Geminiの画像生成により、全てのトークンを一新する必要があったため」

上記リストの太字はトークン生成/トークン生成を強化するもの。

それだけに、この一仕事を終えてホッとしています。

Nextcloud、ドメイン変更時のメモ。

正直、かなり甘く見ていました。

やろうとしたこと

a.hoge.comというサブドメインでNextcloudを立ち上げて運用していたのですが、唐突にexample.comというネイキッドドメインで運用しようとしたのがきっかけ。

当初の手順

  1. DBバックアップ
  2. 設定ファイルバックアップ(apacheバーチャルサイトとNextcloudのconfファイル)
  3. 新DNSレコード変更
  4. apacheバーチャルサイトのURL変更およびSSL証明書の差し替え
  5. NextcloudのconfファイルのURL変更
  6. Apache / PHP-FPM再起動

まではすんなりいきました。

URL変更後の苦行

Nextcloudは単なるファイルストレージではなく、統合コラボスイート。非常に多岐にわたって運用していたんだと改めて痛感。

  • デスクトップクライアント
  • スマートフォンアプリ
  • ブックマークの変更

がそれなりにヘビー。それ以上にヘビーだったのが

  • 高性能バックエンド
  • AppAPI

の設定変更を忘れていたことでした。

DBと参照ディレクトリ変更の更なる苦行

また、動作確認後、「DBの向き先とNextcloud格納ディレクトリが新ドメインに即していない」ことがわかり、

  1. apacheのconfファイルをいったん無効化
  2. 再度DBバックアップ(サイト名などを変えていたため)
  3. DB及びユーザー新規作成作成
  4. 再バックアップしていたDBから新DBにデータ流し込み
  5. Nextcloud格納ディレクトリを-pirオプションをつけてコピー&リネーム
  6. Nextcloudのconfigを修正。DBのユーザ名とDB名を新しく作成したDBに変更
  7. ログ格納ディレクトリを新規作成、www-dataに所有者変更
  8. apacheのconfファイルの格納ディレクトリとログ格納ディレクトリの向き先変更
  9. /etc/logrotate.d配下のローテーションを新しいログ格納ディレクトリに変更
  10. apacheのconfファイル有効化
  11. apache再起動
  12. Nextcloudのcronを新ディレクトリに合わせる

までやって、完全移行が完成しました。

「サーバリプレースとどう違うのか」レベルではありましたが、うまくいって良かったです。

詳細な手順は相当なボリュームになりそうなので、様子を見て描いていきます。

ネイキッドドメインでSSL証明書を取得したかどうかを確認するための手順

概要

筆者はletsencryptでワイルドカード証明書を取得していますが、

*.example.com

の証明書を取得して、

example.com

の、「サブドメインが付かないドメインそのもの」 (hoge.example.com / foo.example.com / supercalifragilisticexpialidocious.example.com等を 含まない ドメイン)、いわゆるネイキッドドメインでの証明書を取っていないかどうかの確認手順です。

重要な仕様

割と躓きやすい仕様ですが、

*.example.comは、example.comを含みません。

ワイルドカード証明書は「何か」.example.comにマッチする証明書。つまり、この「何か」が空文字にならないルールです。

筆者が過去の記事でletsencryptで証明書を作成する際

certbot certonly --manual \
    --preferred-challenges dns \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m あなたの有効なメールアドレス@example.com \
    -d "*.example.com" \
    -d "example.com"

と、

  • -d "*.example.com"
  • -d "example.com"

のように、ワイルドカードとネイキッドドメインの両方を含めているのはまさにその理由です。

これを忘れたことによるありがちなエラー

*.example.com だけ取得

https://example.com にアクセス

証明書エラー

「え、ワイルドカードなのに!?」

という事態が多く発生します。

ネイキッドドメインの証明書を取得したか

以下の2つのコマンドを用います。

Let's encryptを利用している場合

非常に簡単です。

sudo certbot certificates

と実行するだけ。

 Certificate Name: example.com
    Serial Number: UID]
    Key Type: ECDSA
    Identifiers: *.example.com example.com

のように、Identifiersの欄に.*がついているとついていないドメインがついていればOKです。

Let's encryptを利用していない場合

openssl x509 -in /path/to/certs/directory/cert.pem -noout -text | grep -A1 "Subject Alternative Name"

と実行。(証明書の場所は合わせます)

X509v3 Subject Alternative Name: 
DNS:*.example.com, DNS:example.com

のように、DNSの欄に.*がついているとついていないドメインがついていればOKです。

以上、実務で予め両方の証明書を取得していれば「なんてことない」仕様ですが、これを取得していない場合のSSL再取得の手間はかなり手間です。

『アルルの丘』ソロプレイ記録(2026/02/11)

降って湧いた週の中日の祝日。

ボードゲーム『アルルの丘』ソロプレイを行いました。

棚卸し前に作業台を1つ上げ、小麦も手配してくれる「工房」で少しブースト。

小屋ごとに水路3つを供給してくれる建物も相まって、総得点133点でした。

気軽にプレイできる環境が整ったため、もう少し回す機会を増やしたいです。

mermaid.jsによる調理の方法。(ポークソテー)

このやり方かなり気に入っています。

これをポークソテーでもやってみました。

sequenceDiagram participant Cook as 料理人 participant Table as 調理台 (まな板) participant Stove as コンロ (フライパン) Note over Cook, Table: 準備フェーズ Cook->>Table: 豚肉の酒粕を拭き取る Cook->>Table: 常温に戻す(放置) Cook->>Table: 豚肉の筋切りを行う Note over Cook, Stove: 加熱フェーズ Cook->>Stove: フライパンに油を引き、肉を並べる Cook->>Stove: 弱火で点火し、蓋をする par 並行作業 Cook->>Table: まな板をよく洗う and 加熱継続 Stove->>Stove: 約4分焼く end Cook->>Stove: 肉を裏返す Cook->>Table: アルミホイルを敷いて準備 Stove->>Stove: 約3分焼く(火を通す) Note over Cook, Table: 仕上げフェーズ Cook->>Stove: 肉を取り出す Cook->>Table: 肉をアルミホイルで包んで休ませる Cook->>Stove: 肉汁に日本酒・醤油・刻みネギを投入 Stove->>Stove: ソースを煮詰める Cook->>Table: 肉を皿に盛り付ける Cook->>Stove: ソースを肉にかけて完成

小麦粉で均して焼き始め。

ひっくり返してもう片面。

焼き終えてアルミホイルで包んでいるところ。

ご飯の上に載せてソースをかけた状態。

  • 柔らかく焼けた
  • 肉汁が流出しにくい
  • パラレルで作っているので焼き上がりと同時に食べられる

等は気に入っています。

『ライザのアトリエ3DX』追加されたキャラクタークエスト(内容そのもののネタバレ無し)

新規プレイアブルキャラクター、キロのキャラクタークエスト。

  • フルボイス
  • 既存キャラクターの新モーションあり
  • ストーリーを更に補完する内容

と盛りだくさん。それらの発生タイミングについて紹介です。

備考

  • いずれも異界ウィンドルで発生します。
  • 実績には関係ありません。
  • ※タイトルそのものがネタバレとなっているものに関しては、○○とします

発生タイミングと場所

メインクエスト『○○』発生後

  • たった4年
    • 異界ウィンドルのアトリエ近くで発生。
  • あの日のお礼
    • 異界ウィンドルのアトリエで発生。
    • キロがパーティーメンバーになります
  • 彼を待つ
    • 宥めの精の庭で発生。
  • 決闘!
    • 異界ウィンドルのアトリエ近くで発生。

メインクエスト『何度目かの里帰り』発生後

  • ○○の不思議な力
    • 異界ウィンドルのアトリエ近くで発生。
  • レントのお節介
    • 異界ウィンドルのアトリエの北で発生。

メインクエスト『酔い覚まし』発生後

  • 2人のアドバイス
    • 異界ウィンドルのアトリエの北で発生。
  • 響き合う○○
    • 異界ウィンドル、木の上の集会場で発生。

メインクエスト『何度目かの異界』発生後

  • いつか、その先へ
    • 宥めの精の庭で発生。
  • 巡りゆく輝き
    • 異界ウィンドルの入り口(竜の風跡)で発生。

と、数も多め。本作のファンには刺さる内容でした。

Page 1 of 283

Powered by WordPress & Theme by Anders Norén