tech#azure#security#front-door#waf#azure-policy#sentinel#finops#gdpr

FinOps と GDPR から始めた Memolog のセキュリティ改善

公開 👁
FinOps と GDPR から始めた Memolog のセキュリティ改善

Memolog は個人サイトです。最初から企業向けのセキュリティ構成を目指していたわけではありません。

きっかけは、Azure の費用を把握する FinOps、海外からのアクセスも考えた GDPR とプライバシー対応、Application Insights のデータをどこまで収集するか、といった別々の疑問でした。そこから実際のアクセスや攻撃面を調べるうちに、Front Door、WAF、Azure Policy、Microsoft Sentinel、DNSSEC、セキュリティ演習までつながりました。

特に驚いたのは、Azure Front Door のレポートで世界中からアクセスされている様子を見たことです。自分では日本語中心の小さなサイトだと思っていても、公開した瞬間からインターネット全体へ接続されています。

この記事では、個別の Azure サービスを並べるのではなく、どのような疑問から始まり、何を観測し、どう脅威を整理し、どのルールと運用へ落としたかを振り返ります。

目次

先に結論

今回の取り組みで一番大きかった学びは、セキュリティはサービスを追加する作業ではなく、次の循環を作ることだという点です。

  1. 目的を決める: 守るデータ、許容する費用、法令や運用上の制約を整理する
  2. 観測する: Front Door、Application Insights、Log Analytics で実際の通信と変更を見る
  3. 脅威を整理する: OWASP、STRIDE、実際の攻撃事例から信頼境界と攻撃経路を洗い出す
  4. 統制する: WAF、Managed Identity、Azure Policy、DNSSEC、CI の権限境界へ落とす
  5. 演習する: Sentinel の incident や tabletop で、検知と復旧が本当に使えるか確かめる
  6. 残ったリスクを追跡する: 未実証のものを「対応済み」にせず、owner と期限を決める

Azure Well-Architected Framework には、Security だけでなく、Reliability、Cost Optimization、Operational Excellence、Performance Efficiency があります。Memolog でも、WAF を強くすれば費用とログ量が増え、ログを減らせば調査能力が下がります。1 つの柱だけを最大化するのではなく、サイトの規模と守るものに合わせてバランスを取る必要がありました。

出発点は FinOps とプライバシーだった

最初に取り組んだのは、攻撃対策ではなく費用とデータの把握でした。

FinOps から始めた理由

Azure は小さく始められますが、ログ、リクエスト、Functions の実行、Storage transaction も利用量に応じて費用になります。セキュリティ機能にも、Front Door Premium、Log Analytics、Sentinel、Defender for Cloud などの費用があります。

一方で、費用を下げるためにログを短くする、監視を外す、冗長性を下げると、調査や復旧が難しくなります。Azure Well-Architected Framework の Cost Optimization と Security の trade-offでも、セキュリティ対策の費用と侵害時の影響を比較し、合意したリスク水準より下まで対策を削らないことが示されています。

Memolog では、すべてを最大構成にするのではなく、次のように役割を分けました。

対象方針
日常の Application Insights / 運用ログ30日保持、0.1 GB / 日の上限を設定
Front Door access / WAF log専用 Log Analytics に90日保持し、日次上限を設けない
長期のセキュリティ証跡ZRS Storage に365日保存
Hot Topics / ViewCountsZRS を使用し、リージョン障害時は再構築・再収集を基本とする
高額なセキュリティ機能実際のリスクと費用を確認して個別に判断する

これは「安くする」だけではありません。費用の上限を決めながら、止めてはいけない証跡は別経路へ逃がす設計です。

GDPR と同意管理から見えたこと

Application Insights のブラウザー SDK は、匿名 ID、session、browser 情報などを扱います。公開する閲覧数が集計値だけでも、その前段にある telemetry まで自動的に「個人データではない」とは言えません。

そこで、分析へ同意した後だけ SDK を読み込み、拒否時と撤回後は送信しないようにしました。参照元は完全な URL ではなく hostname だけ、campaign parameter も許可した3キーと制限済みの値だけを送ります。公開する閲覧数 snapshot には、生の user ID、session ID、IP、地域情報を含めません。

GDPR 対応を考えたことで、収集前の同意だけでなく、目的、保存期間、アクセス権、削除、外部委託、障害時の証跡まで考えるようになりました。プライバシーとセキュリティは別の作業ではなく、どのデータを、なぜ、どこへ、いつまで保存するかという同じ設計につながっています。

Front Door で見えていなかったアクセスに気づいた

Azure Front Door Premium と WAF を導入して印象が変わったのは、サイトの入口で起きていることが見えるようになった点です。

Azure portal の Front Door レポートでは、北米、南米、ヨーロッパ、中東、アジア、オセアニアなど、多くの地点からリクエストが届いていました。日本語中心の個人サイトでも、検索 engine、正規の crawler、未知の Bot、脆弱性を探す自動 scan、通常の閲覧者が国境に関係なく到達します。

Azure Front Door の直近7日間の通信レポートに、世界各地からのリクエストが青い円で表示されている
Front Door が観測した request の送信元地域。青い円は利用者や攻撃者の所在地を確定するものではない

ただし、地図上の点をすべて「攻撃者」と考えるのは正確ではありません。

情報分かることそのまま断定できないこと
Front Door access logFront Door を通った request、応答、cache、client IP 由来の地域など人か Bot か、善意か悪意か
WAF logWAF rule に一致した request、rule、action一致が真の攻撃か false positive か
Bot Managergood bot、bad bot、unknown bot の rule 分類と actionunknown bot の最終的な意図
Application Insights同意後の page view と application telemetry同意前を含む全 HTTP request

Azure Front Door の公式監視資料では、access log は Front Door を通る request を記録し、WAF log は潜在的な攻撃や false positive の調査に使うと説明されています。また、access / WAF log は既定では有効ではなく、Diagnostic settings で明示的に保存先を構成する必要があります。

Azure Front Door WAF の Security reports に、rule match 数と時系列グラフ、rule type 別の内訳が表示されている
WAF の Security reports。5.5K は rule に一致した event 数であり、5,500回の攻撃や一意な攻撃者数を意味しない

Premium で利用できる Bot Manager は、bad bot を block、good bot を allow、unknown bot を log する既定 action を持ちます。Memolog では WAF を Prevention mode にしているため、rule に一致した request は設定した action に従って edge で処理されます。

つまり、Premium にしただけで世界中のアクセスが発生したのではありません。以前から到達していた通信を、Front Door のレポート、WAF、Bot rule、Log Analytics で観測し、分類できるようになったと考えるのが正確です。

OWASP と実例から攻撃面を見直した

WAF の managed rule を有効にすると、SQL injection や cross-site scripting のような有名な攻撃を意識しやすくなります。Azure Front Door WAF の Default Rule Set は OWASP Core Rule Set を基礎にし、Microsoft Threat Intelligence の rule も含みます。

ただし、Memolog の攻撃面レビューで最も優先度が高かったのは、典型的な SQL injection ではありませんでした。

Hot Topics の匿名検索 API は、当初、検索や存在しない article ID の確認で複数 partition を走査する可能性がありました。攻撃者が高コストな request を繰り返すと、Functions の実行時間、scale-out、Storage transaction、telemetry が増えます。データを盗まなくても、計算量とクラウド費用を攻撃対象にできるということです。

そこで、次の対策を行いました。

さらに、credential leakage や管理者 lockout の事例から、「通常時の防御」だけでなく、「漏れたと仮定したときの revoke」「MFA device を失ったときの復旧」「監視基盤自身が止まったときの通知」を考えました。

実例を脅威モデルへ取り込むと、チェックリストには出にくい運用上の穴を見つけられます。

STRIDE で製品ではなく脅威から整理した

対策が増えると、「Front Door を入れた」「Sentinel を有効にした」という製品一覧になりがちです。そこで、Memolog では STRIDE で asset、entry point、trust boundary、owner、残余 risk を整理しました。

分類Memolog で考えた例主な control
Spoofing別 repository / branch から deployment identity を使うGitHub OIDC の issuer / audience / main subject
Tamperingworkflow、Bicep、security log を改ざんするimmutable Action SHA、Git history、独立 archive
Repudiation管理変更の実行者や理由を否認するGitHub Issue、Activity Log、Sentinel incident
Information Disclosuretelemetry、secret、raw log が漏れるconsent gating、masking、Managed Identity、log hygiene
Denial of ServiceAPI の高コスト処理、distributed L7、daily cap 到達WAF、rate limit、query 改善、独立 security workspace
Elevation of Privilegeruntime / deployment identity の過剰権限から横展開するidentity 分離、resource scope の RBAC、定期 audit

この整理で重要だったのは、control を書くだけでなく、残っている risk と owner を書いたことです。

たとえば archive Storage は365日保持しますが、immutability はまだ有効にしていません。書き込み、lifecycle deletion、recovery を検証する前に固定すると、運用を壊す可能性があるためです。「機能があるから使う」ではなく、保護効果と復旧への影響を確認してから判断します。

Azure Policy は止める前に Audit で学べる

Azure Policy には、企業が使える region や SKU を制限する仕組み、という印象を持っていました。実際には、組織のルールを Azure resource へ継続的に照合し、逸脱を見つける用途にも使えます。

代表的な effect は次のように異なります。

Effect動作導入時の使い分け
Auditrequest を止めず、Activity Log に warning を作り、resource を non-compliant として示す影響と例外を把握する最初の段階
Deny条件に合わない create / update を拒否する十分に検証した安定した guardrail
Modifytag など request の一部を変更する自動補正が安全な項目
DeployIfNotExists必要な関連 resource や設定を deploy するdiagnostic settings などの標準化

Azure Policy の custom policy tutorialでも、Deny にする前に policy の影響を確認するため、Audit は良い最初の選択肢とされています。

Memolog では、次のような baseline を Audit で割り当てました。

Azure Policy の Compliance 画面で、Memolog の Production governance audit baseline が compliant と表示されている
Memolog の Audit baseline が 100%(36 out of 36)の compliant と評価された時点の表示。公開用に scope はマスクしている

最初からすべてを Deny にすると、既存 resource の更新や緊急時の復旧を想定外に止める可能性があります。まず compliance state を見て false positive と例外を整理し、必要性と rollback が確認できた rule だけを強制へ進める方が安全です。

Policy は「利用者を縛るもの」だけではなく、自分たちで決めた設計原則が時間とともに崩れていないかを確認する自動レビューとして使えます。

現在の構成は防御と証跡を分けている

2026年8月26日時点の主な構成を、公開経路、data plane、security evidence、control plane に分けると次のようになります。

利用者の通信を Azure Front Door Premium と WAF が受け、Static Web Apps と Azure Functions へ転送する。Functions は Managed Identity で private Storage へ接続する。Front Door のログは security Log Analytics、Microsoft Sentinel、ZRS archive へ送る。GitHub Actions は OIDC で Azure control plane へ接続し、DNSSEC と registrar control が独自ドメインを保護する構成図Public edge利用者・BotHTTPSPublic edgeFront Door PremiumWAF・Bot・Rate limitApplicationStatic Web AppsAzure FunctionsRead API・Timer triggerPrivate data planeZRS StorageManaged Identity・RBACSecurity evidenceSecurity Log AnalyticsMicrosoft SentinelZRS archive・365日Control planeGitHub ActionsOIDC・main subjectDNSSEC・CAAMFA・Transfer lock静的・API routePrivate EndpointAccess / WAF logBicep・deployDomain trust
図1: 公開通信、application、private data、security evidence、control plane を別の trust boundary として扱っています。

公開経路

Data と identity

観測と security evidence

DNS と supply chain

境界の考え方は、すべてを 1 つの workspace や identity へ集約しないことです。application が侵害された場合にも security evidence を同じ権限で消せないようにし、deployment identity、runtime identity、人の admin identity を分けています。

実装だけでなく演習で確かめる

構成図に線が描かれていても、incident が作られ、担当者へ割り当てられ、調査して閉じられるとは限りません。

Memolog では、controlled distributed L7 exercise を実施し、Sentinel で次を確認しました。

Microsoft Defender portal の incident 一覧に、Memolog の distributed L7 API traffic exercise で作成された3件の解決済み incident が表示されている
controlled exercise で生成し、調査後に解決した3件の incident。公開用に incident ID と優先度 score はマスクしている

また、次の 3 シナリオを tabletop で確認しました。

Scenario確認した判断残った課題
SWA deployment token leakage調査より revoke を優先し、旧 token へ戻さない実際の rotation と production recovery は未実証
Monitoring loss / daily capcapped workspace と独立 security destination を識別する欠測した監視に依存しない自動通知は未実証
Administrator lockoutMFA / Conditional Access を全体無効化せず、Azure、GitHub、registrar を分けて復旧するtested recovery path と実 RTO は未実証

Azure の incident response guidanceは、準備、検知と分析、封じ込めと復旧、事後活動という NIST SP 800-61 の段階に沿っています。tabletop は実際の復旧時間を証明しませんが、事故が起きる前に判断順序、stop condition、rollback、owner、必要な証跡を確認できます。

「設定した」と「使える」は別です。Memolog では、未実証の rotation、独立 monitoring signal、administrator recovery を期限付き Issue として残しています。

個人サイトで取り組んで分かったこと

小さなサイトでも公開面は小さくない

利用者が少なくても、公開 hostname と API は crawler や automated scan から見えます。page view が少ないことと、HTTP request や攻撃試行が少ないことは同じではありません。

セキュリティと FinOps は対立ではなく設計条件

ログを無制限に集めればよいわけでも、費用のために全部切ればよいわけでもありません。investigation に必要な log を別 workspace と archive に分け、日常 telemetry には cap を置くように、用途ごとに費用と保持を決められます。

Policy は組織規模に関係なく役立つ

Azure Policy は大企業だけのものではありません。1人で運用していても、数か月後の自分が同じ設計原則を覚えているとは限りません。Audit で drift を見つけるだけでも価値があります。

管理 API を強く守るより、なくせるかを考える

認証方式を複雑にする前に、その operation を Internet へ公開する必要があるかを見直しました。定期処理にできるものは Timer trigger と Managed Identity へ移し、公開 entry point 自体を減らしました。

脅威モデルは完成品ではない

新しい API、identity、secret、data store、external integration を追加すると trust boundary が変わります。重大な incident や exercise failure の後にも、STRIDE と runbook を更新する必要があります。

まとめ

Memolog のセキュリティ改善は、WAF を入れるところから始まったわけではありません。

Azure の費用を理解したいという FinOps の関心、海外利用も考えた GDPR と privacy、Application Insights のデータをどこまで集めるかという疑問が出発点でした。Front Door を導入して世界中から request が届く現実を観測し、OWASP と実例から API のコスト攻撃や credential leakage を考え、STRIDE で trust boundary と owner を整理しました。

その結果を WAF、Managed Identity、OIDC、Azure Policy の Audit、独立した security log、Sentinel、DNSSEC、管理 API 廃止へ落とし、最後に controlled exercise と tabletop で使えるかを確認しています。

完成したわけではありません。未実証の recovery path や monitoring signal も残っています。それでも、観測し、脅威を言語化し、ルールへ落とし、演習し、残課題を追跡する循環ができたことで、次の変更をどの視点で評価すべきかが分かるようになりました。

個人サイトでも、最初からすべての製品を導入する必要はありません。まず、何を収集し、何を守り、どの risk と費用を受け入れるかを決めます。そのうえで入口の log を有効にし、実際の traffic と変更を観測するところから始めると、必要な対策を具体的に選びやすくなります。

参考資料