2026年2月1日日曜日

マクドナルドの闇!?フィレオフィッシュのチーズが「半分」なのは、実は計算し尽くされた戦略だった件




 1. 衝撃の発見:その時、事件は起きた

マクドナルドで不動の人気を誇る「フィレオフィッシュ」。

ホカホカのバンズを何気なくめくってみたら……




「えっ、チーズが半分しかない!?」

これ、マック好きなら一度は経験したことがある「フィレオフィッシュあるある」かもしれません。私も最初は「バイトの店員さん、忙しくてちぎれちゃったのかな?」と、クレームを入れる寸前までいきました。

2. 発覚した衝撃の事実:ミスじゃなかった!

怒りに震えながら(?)念のためネットで調べてみると、Yahoo!知恵袋や元店員さんの証言で驚愕の事実が判明。


「フィレオフィッシュのチーズは、最初から半分(1/2枚)が正規のレシピです」


なんと、入れ忘れでも手抜きでもなく、マクドナルドの厳格なルールだったのです。

3. なぜ「半分」なのか?マックのこだわり(という名の正当化?)

なぜ、わざわざ1枚を半分にする手間をかけてまで「半分」にこだわるのか。そこには深い(?)理由があるようです。

• 味のバランス: 白身魚の繊細な味を殺さないよう、チーズの主張を抑えるため。

• コスト管理: …という側面も否定はできませんが、公式には「最高の味のバランス」を追求した結果だとか。

ちなみに、ダブルチーズバーガーにはあんなにチーズが入っているのに、フィレオフィッシュだけがこの扱い。まさに「選ばれし半分の美学」ですね。

4. まとめ:知らぬは客ばかりなり

「チーズ半分」を知らずに食べ続けている人は意外と多いはず。

次からフィレオフィッシュを食べる時は、そっとバンズをめくって「今日も正しく半分だな」と、職人のこだわりを確認してみてください。




【失敗談】3COINSタブレット(2525/PRE-GHTB)をドアベル専用モニターにする計画が崩壊した話。CloudEdgeは動くのか?

 


1. 導入:完璧な計画だった。

「玄関のインターホン(CloudEdge)を、キッチンで座ったまま確認したい。」

そんな願いを叶えるべく、3COINS(スリコ)で1万円のタブレット(2525/PRE-GHTB)を購入。

「Android 15だし、アプリの要求はAndroid 5.0(Lollipop)以上。勝ったな。」

そう確信してレジへ向かったあの時の自分に、今の私は言いたい。「ちょっと待て」と。

2. 期待に胸膨らむ「開封の儀」



• パッケージを開けると、1万円とは思えない綺麗な大画面。

• 「これがサブ機として動けばコスパ最強伝説の始まりだ」とワクワクしながら電源をON。

3. スムーズなセットアップ



• 初期設定はいたって順調。Android 15 (Go Edition) の軽快な動きに、「お、意外とイケるかも?」と期待値は最高潮に。

4. 運命の瞬間:Google Playストアの無慈悲

いよいよ本命のアプリ「CloudEdge」をインストールしようと検索バーに打ち込みます。検索結果に出てきたアイコンをタップした瞬間、目に飛び込んできたのは……



「……えっ?」

アプリ名で検索はできるのに、、、

OSのバージョンは足りているはずなのに、、、なぜ?

5. なぜ拒絶されたのか?(技術的な考察)

調べたところ、原因はおそらくこれです。

• Android Go Editionの制限: 低スペック端末向けの「軽量版Android」であるため、特定の高度な機能やハードウェア要件(映像のエンコード/デコード等)を必要とするアプリが制限されることがある。

• カメラ・マイクの権限や解像度: ドアベルという「リアルタイム映像」を扱う特性上、このタブレットのチップセット(Allwinner A333)がサポート対象外と判断された可能性。

6. まとめ:1万5000円の勉強代

今回の教訓。

「Androidのバージョンが最新でも、Go Editionには見えない壁がある。」

CloudEdgeをタブレットで使おうと思っている皆さん、安物買いの銭失いにならないよう、せめて「Go Edition」ではない普通のAndroidタブレットを選ぶことを強くおすすめします……。

2026年1月28日水曜日

【Azure】WAFとの死闘168時間。ASP.NET CoreアプリをAzure WAFで守ろうとして学んだこと

 



1. イントロダクション

Azureを勉強して、ASP.NET Coreでポートフォリオ兼用のWebアプリを公開してみた。

「せっかくなら実戦的に」とAzure Web Application Firewall (WAF) を導入したが、ここからが本当の戦いの始まりだった……。

2. 最初の壁:ログインできない!

公開直後、ログインしようとすると謎の403エラー。ログを確認すると……

Restricted SQL Character Anomaly Detection (args): # of special characters exceeded (12)

何が起きていたのか?

ASP.NETの認証用Cookieに含まれる記号の多さが、「攻撃用コードを隠している」と判定されていた。

• 原因: WAFの「異常検知ルール(942450など)」。

• 気づき: セキュリティを強くしすぎると、標準的なフレームワークの挙動すら「悪」とみなされる。

3. 第二の壁:いたちごっこの泥沼

特定のCookieを除外設定(Exclusion)して「勝った!」と思ったのも束の間。今度は別のログが。

• SQL Injection Attack: SQL Tautology Detected(1=1攻撃の誤認)

• Multiple URL Encoding Detected(二重エンコードの誤認)

しかも、よく見るとCookieだけでなく、URLの引数(ARGS)でも発生している。

ここで私は、「1つ1つ除外設定を書いていたら、いつまでもアプリがまともに動かない」という現実に直面した。

4. 決戦:ログから読み解く「真犯人」

WAFのログに記録された detail_message_s をデコードして、じっくり眺めてみた。

そこには、攻撃コードではなく、ただの「日付データ」や「パスワードの記号」があった。

今回の学び(技術的な急所)

1. 多重エンコードの正体: URLの中にURLを入れる(ReturnUrl)際、記号が %252F のように多重変換される。これはモダンなWebフレームワークの「標準仕様」であって攻撃ではない。

2. パスワードの宿命: 強力なパスワードには記号が必須。これをWAFのSQLIルールで検査すること自体が、実はアンチパターン。

5. 解決策:多層防御の再設計

「WAFの設定をいじり続ける」のをやめ、「どこをWAFに任せ、どこをアプリに任せるか」の役割分担を見直した。

• WAF側: パスワードやReturnUrlなど、正規の処理で記号が入り混じる箇所は、勇気を持って「検査除外」または「特定ルールの無効化」を行う。

• アプリ側: ASP.NET Core Identityを正しく使い、「パラメータ化クエリ(静的プレースホルダ)」と「アカウントロック機能」を有効にする。

6. おわりに:本当のセキュリティとは

WAFは「魔法の杖」ではなかった。

ただボタンをポチポチして「最強」に設定するのではなく、「自分のアプリがどういうURLを吐き出し、どういうCookieを使うのか」を理解して、初めて正しく運用できる。

「いたちごっこ」を終わらせたのは、WAFの知識ではなく、自作したASP.NET Coreのソースコードの中にあった一行のエビデンスだった。


2026年1月25日日曜日

【Azure】 ASP.NETアプリを公開したら、正常な通信がブロックされまくった話(解決編)




Azureを勉強して、ASP.NETでWebアプリを作ってみました。
Application Gateway(WAF)も立てて、セキュリティは万全!……のはずが、いざ公開してみると、自分や友人のログインが突然ブロックされるという謎の現象に遭遇しました。
今回は、初心者がハマりがちな「WAF運用いたちごっこ」の正体と、スマートな解決策を共有します。

1. 犯人は「ランダムすぎるCookie」

ASP.NET(特にCore)には、セキュリティを守るための仕組みが標準で備わっています。
その代表格が、以下のようなCookieやトークンです。
• .AspNetCore.Mvc.CookieTempDataProvider
• .AspNetCore.Antiforgery
これらの中身は、セキュリティのために「推測不可能なランダム文字列」になっています。
ところが、このランダムな文字列の中に、たまたまSQLインジェクション攻撃に似たパターン(-- など)が紛れ込んでしまうことがあるのです。

2. 初心者が陥る「ID除外の罠」

WAFのログ(Log Analytics)を見ると、「ルールID: 942440 でブロック」と出ます。
そこで「よし、この 942440 を許可リストに入れよう!」と設定するのが、最初の落とし穴です。
実は、Cookieの中身は毎回変わるため、「昨日は 942440 だったけど、今日は 942441 でブロックされる」という現象が起きます。これが「いたちごっこ」の始まりです。

3. 正解は「変数のグローバル除外」

特定のルール番号を許可するのではなく、「この名前のCookieについては、WAFの全検査をスキップしていいよ」という設定をするのが正解です。
設定のコツ(Azureポータル)
WAFポリシーの「管理ルール」→「除外」設定で、以下のように登録します。
• 一致変数: 要求のCookieの名前
• セレクター: .AspNetCore.Mvc.CookieTempDataProvider
• ルールセット: ここを特定のIDにせず、全体(Global)にするのがポイント!
これで、どんなランダムな値が入ってきても、WAFが「あ、このCookieは安全な枠組みのやつだね」とスルーしてくれるようになります。

4. もっと安心するために:Azure Advisorを活用しよう

「除外設定を増やすとセキュリティが弱くならない?」と不安になるかもしれません。
そんな時は、Azure Advisor や Microsoft Defender for Cloud の「セキュリティ態勢」をチェックしましょう。
「基盤となる CSPM(無料版)」を有効にするだけで、Azureが「他にも設定ミス(暗号化漏れなど)はない?」と自動で診断してくれます。今回のWAF設定だけでなく、サイト全体の健康診断をセットで行うのが、モダンなクラウド運用のコツです。

最後に

WAFは「ただ置くだけ」では、時に味方を攻撃してしまうことがあります。
「いたちごっこ」に疲れたら、ぜひ除外設定の「範囲(スコープ)」を見直してみてください。
「ログを見て、原因を突き止め、ベストプラクティスを適用する」。この流れを一度経験すると、クラウドのセキュリティがぐっと身近に感じられるようになりますよ!  

【おまけ】WAFのブロック理由を特定するKQLクエリ

Azure WAFが「何を」「どのルールで」ブロックしたのかを調べるためのクエリです。
Azure Portalの Log Analytics で実行してください。

1. 直近のブロック履歴を一覧表示する

まずは「何が起きているか」の全体像を把握するクエリです。

// WAFのブロックログを新しい順に100件表示
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" 
| where Category == "ApplicationGatewayFirewallLog"
| where action_s == "Blocked"
| project TimeGenerated, clientIp_s, requestUri_s, ruleId_s, Message, details_data_s
| order by TimeGenerated desc
| take 100


2. 特定のCookieが原因でブロックされているか特定する

今回の「犯人(Cookie)」を追い詰めるためのクエリです。

// 特定のCookie名が含まれるブロックログを抽出
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" 
| where Category == "ApplicationGatewayFirewallLog"
| where action_s == "Blocked"
// ↓ここに調べたいCookie名(.AspNetCore.Mvc.CookieTempDataProviderなど)を入れます
| where details_data_s contains "CookieTempDataProvider" 
| project TimeGenerated, clientIp_s, ruleId_s, details_data_s, details_message_s
| order by TimeGenerated desc

3. どのルールIDによく引っかかっているか集計する

「いたちごっこ」が起きていることを証明するためのクエリです。

// ブロックされたルールIDのランキングを表示
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.NETWORK" 
| where Category == "ApplicationGatewayFirewallLog"
| where action_s == "Blocked"
| summarize Count = count() by ruleId_s, Message
| order by Count desc


ワンポイントチェック
ruleId_s: どのルールに触れたかがわかります。

details_data_s: Cookieやリクエストの中身の「どの文字列」がダメだったのか、具体的な中身が表示されます。ここを見て Password=... ではなく、ランダムな英数字の羅列であれば、誤検知の可能性大です!





2026年1月2日金曜日

【解決】Azure VMで「The target machine has denied access」エラー!原因はパスワード間違いによるロックアウト?(0xC0000234)

 


Azureの仮想マシン(VM)に突然RDP接続できなくなったことはありませんか?

「The target machine has denied access to this connection」というエラーが表示された場合、原因はネットワーク設定ではなく、パスワードの入力ミスによる「アカウントロックアウト」かもしれません。

本記事では、シリアルコンソールを使った原因特定方法から、具体的な復旧手順までを解説します。

1. 発生した事象とエラーメッセージ

まずは、どのような状況で接続できなくなったのかを記載します。

• 現象: RDP(リモートデスクトップ)接続時に拒否される。

• エラー文: The target machine has denied access to this connection.

• 心当たり: パスワードを数回間違えて入力した。

2. 原因の特定:シリアルコンソールでログを確認する

「本当にパスワード間違いが原因か?」を外側から特定する方法を紹介します。

手順:

Azureポータルから対象VMの「シリアルコンソール」を開く。

cmd → ch -si 1 でコマンドプロンプトを起動。

以下のコマンドでイベントログを確認。

wevtutil qe Security /q:"*[System[(EventID=4625)]]" /c:5 /f:text /rd:true


特定ポイント:

ログの中に以下の情報があれば、ロックアウトが確定です。

• 失敗の原因: アカウントのロックアウト

• 状態コード: 0xC0000234

3. 解決策:アカウントロックを解除する方法

ロックアウトされた場合の対処法は3つあります。

① 自動解除を待つ(30分〜1時間)

多くの設定では、一定時間経過するとロックが自動解除されます。急ぎでない場合は、「一切の操作をせず待つ」のが最も安全です。

② Azureポータルからパスワードをリセット(即時)

急ぎの場合は、Azureポータルの「パスワードのリセット」機能を使います。

Tips: 既存のパスワード(チームで共有しているもの等)を変えたくない場合は、一度「別パスワード」に変更してログインした後、OS内部の設定から元のパスワードに戻すのがコツです。


③ ネットワーク設定(NSG)の確認

もし上記でもダメな場合は、念のためNSG(ファイアウォール)でRDPポート(3389)が開放されているか、自分のIPアドレスが許可されているかを確認しましょう。

まとめ:予防策

• パスワード管理ツールを使用し、打ち間違いを防ぐ。

• 踏み台サーバー(Bastion)の利用を検討する。