<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Kms on Tarragon</title><link>https://tarrragon.github.io/blog/tags/kms/</link><description>Recent content in Kms on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 18 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/kms/index.xml" rel="self" type="application/rss+xml"/><item><title>AWS KMS</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-kms/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-kms/</guid><description>&lt;p>AWS KMS 是 AWS 原生的 key management service、解決 &lt;em>對稱 / 非對稱金鑰生命週期管理&lt;/em> 與 &lt;em>envelope encryption pattern&lt;/em>：service 內部保管 master key（KMS Key）、應用層用 &lt;code>GenerateDataKey&lt;/code> 取得短暫的 data key 對實際資料加密、master key 完全不離 KMS 服務邊界。整合面跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-iam/" data-link-title="AWS IAM" data-link-desc="AWS cloud resource permission engine、Role / Policy / STS、跨帳號信任邊界與 OIDC federation 的核心">AWS IAM&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &amp;#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">AWS Secrets Manager&lt;/a> / S3 / EBS / RDS 都串好、是 AWS 上幾乎所有靜態資料加密的後端。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>AWS KMS 的核心定位是 &lt;em>AWS-only 的 multi-tenant managed key management&lt;/em>，FIPS 140-2 Level 3 認證、跨服務 envelope encryption 的共同地基。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &amp;#43; 資料主權場景的 key custody">CloudHSM&lt;/a> 比、KMS 是 &lt;em>managed + shared HSM 池&lt;/em>、CloudHSM 是 &lt;em>single-tenant dedicated HSM&lt;/em>；需要更高隔離 / 自管 cluster / FIPS Level 3 single-tenant 時走 CloudHSM、或用 KMS Custom Key Store 把 KMS 後端指向自己的 CloudHSM。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/google-cloud-kms/" data-link-title="Google Cloud KMS" data-link-desc="GCP 原生 key management service、KeyRing / CryptoKey Version 設計、CMEK 整合 &amp;#43; Cloud HSM &amp;#43; External Key Manager">Google Cloud KMS&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &amp;#43; Key &amp;#43; Certificate）、整合 Managed Identity &amp;#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault&lt;/a> 比、設計概念相近、但 KMS 把 secret store 切出去（&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &amp;#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">Secrets Manager&lt;/a>）、Key Vault 則把兩者合一。&lt;/p></description><content:encoded><![CDATA[<p>AWS KMS 是 AWS 原生的 key management service、解決 <em>對稱 / 非對稱金鑰生命週期管理</em> 與 <em>envelope encryption pattern</em>：service 內部保管 master key（KMS Key）、應用層用 <code>GenerateDataKey</code> 取得短暫的 data key 對實際資料加密、master key 完全不離 KMS 服務邊界。整合面跟 <a href="/blog/backend/07-security-data-protection/vendors/aws-iam/" data-link-title="AWS IAM" data-link-desc="AWS cloud resource permission engine、Role / Policy / STS、跨帳號信任邊界與 OIDC federation 的核心">AWS IAM</a> / <a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">AWS Secrets Manager</a> / S3 / EBS / RDS 都串好、是 AWS 上幾乎所有靜態資料加密的後端。</p>
<h2 id="服務定位">服務定位</h2>
<p>AWS KMS 的核心定位是 <em>AWS-only 的 multi-tenant managed key management</em>，FIPS 140-2 Level 3 認證、跨服務 envelope encryption 的共同地基。跟 <a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a> 比、KMS 是 <em>managed + shared HSM 池</em>、CloudHSM 是 <em>single-tenant dedicated HSM</em>；需要更高隔離 / 自管 cluster / FIPS Level 3 single-tenant 時走 CloudHSM、或用 KMS Custom Key Store 把 KMS 後端指向自己的 CloudHSM。跟 <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-kms/" data-link-title="Google Cloud KMS" data-link-desc="GCP 原生 key management service、KeyRing / CryptoKey Version 設計、CMEK 整合 &#43; Cloud HSM &#43; External Key Manager">Google Cloud KMS</a> / <a href="/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &#43; Key &#43; Certificate）、整合 Managed Identity &#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault</a> 比、設計概念相近、但 KMS 把 secret store 切出去（<a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">Secrets Manager</a>）、Key Vault 則把兩者合一。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault transit engine</a> 比、行為相似（key 不離 service、app 拿 ciphertext）、但治理面完全不同：KMS 綁 AWS 控制面、IAM + Key Policy 雙層授權、CloudTrail 是稽核入口；Vault transit 是跨雲統一介面、token + policy 為主、需要自管 cluster。AWS-heavy 組織首選 KMS、跨雲組織才會把 KMS 當下游、上游用 Vault transit 抽象。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>哪些資料 / 場景該用 Customer Managed KMS Key、哪些 AWS Managed Key 已經夠用、什麼時候直接走 CloudHSM</li>
<li>Key Policy + IAM + Grant 三層授權的分工、production 必開的 CloudTrail Data event 與 monitor 範圍</li>
<li>Multi-Region Key、Custom Key Store、External Key Store、BYOK 等進階形態的取捨</li>
<li>KMS 出事（IAM 過寬、Key Policy 把自己鎖死、Schedule Deletion 誤觸發）時的判讀路徑跟回退選項</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷一個 AWS KMS deployment 是否健康、最少看四件事：</p>
<ul>
<li><strong>Key Policy 設計</strong>：是否含 <code>root</code> principal（不然 key 變孤兒）、是否走 least privilege（不是 <code>kms:*</code> 給整個 account）、admin / user / monitor 三類 principal 是否分開、policy 變更是否走 PR review</li>
<li><strong>Grant 治理</strong>：哪些 service-to-service 短期授權走 Grant（rotation Lambda / RDS / EBS）、Grant TTL 是否設、廢棄 grant 是否定期 <code>RetireGrant</code></li>
<li><strong>Multi-Region 與 rotation 策略</strong>：是否啟用 annual automatic rotation（適用 symmetric encryption key）、Multi-Region Key 的 replica 是否跟 DR plan 對齊、asymmetric / signing key 的 manual rotation 流程是否有 runbook</li>
<li><strong>CloudTrail Data Event 必開</strong>：management event 預設記、但 <code>Encrypt</code> / <code>Decrypt</code> / <code>GenerateDataKey</code> 是 data event、預設不記 — 沒這層 forensic 沒著力點、Storm-0558 對照下完全無法回答「誰用哪把 key 簽了什麼 token」</li>
</ul>
<p>四件事任一缺失、就回到 <a href="/blog/backend/07-security-data-protection/secrets-and-machine-credential-governance/" data-link-title="7.6 秘密管理與機器憑證治理" data-link-desc="以問題驅動方式整理 secret、token、key 與機器身份治理">7.6 秘密管理與機器憑證治理</a> 跟 <a href="/blog/backend/knowledge-cards/audit-log/" data-link-title="Audit Log" data-link-desc="說明高風險操作如何留下可追溯、可稽核的紀錄">Audit Log</a> 的補丁清單。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Key Type 選擇</strong>：symmetric encryption key（AES-256-GCM、最常用、S3 / EBS / RDS / Secrets Manager 都走這個）；asymmetric key pair（RSA / ECC、用於 sign / verify 或 encrypt / decrypt、JWT 簽署、CodeSign、文件簽章）；HMAC key（generate / verify MAC、API request signing）。對應 <a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/microsoft-storm-0558-2023-signing-key-chain/" data-link-title="7.R7.1.5 Microsoft Storm-0558 2023：簽章金鑰鏈與郵件存取" data-link-desc="從簽章金鑰保護失效到雲端郵件存取，拆解身分信任鏈的關鍵控制點">Storm-0558 signing key chain</a> — 自己 host signing key 出事的核心教訓是 <em>key 不該離 HSM service</em>、所以 JWT signing 用 asymmetric KMS key 是 baseline 設計、private key 永遠不離 KMS。</p>
<p><strong>Key Origin（key material 來源）</strong>：<code>AWS_KMS</code>（KMS 內部生成、預設）；<code>EXTERNAL</code>（BYOK、組織自己生成 key material、import 進 KMS、可以隨時 reimport 或刪除）；<code>AWS_CLOUDHSM</code>（Custom Key Store、key material 存在自己的 CloudHSM cluster）；<code>EXTERNAL_KEY_STORE</code>（XKS、AWS 外的 HSM、控制面在 AWS、key material 在 on-prem）。多數場景用 <code>AWS_KMS</code> 就夠、合規 / 主權需求才走 EXTERNAL / Custom Key Store。</p>
<p><strong>Key Policy 跟 IAM 的雙層</strong>：KMS 跟其他 AWS service 最大差異是 <em>Key Policy 是主要授權機制</em>、IAM policy 單獨不夠。Key Policy 必含 <code>arn:aws:iam::ACCOUNT_ID:root</code> 給 root principal（不是 root user、是讓 IAM 能參與授權的開關）— 沒這條 key 變孤兒、即使 IAM 開了 admin 也救不回來。production 通常分三類 statement：admin（Create / Delete / Schedule、走 break-glass）、user（Encrypt / Decrypt / GenerateDataKey、給 app）、monitor（Describe / List、給 SRE）。</p>
<p><strong>Grant 是程式化短期授權</strong>：service-to-service 整合（<a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">Secrets Manager</a> rotation Lambda、RDS 自動加密、EBS volume attach）通常走 Grant 而不是改 Key Policy — 每個 grant 有自己的 grant token、可以帶 TTL、可以 <code>RetireGrant</code> / <code>RevokeGrant</code> 收回、不跟 key policy 永久綁定。沒治理時 grant 累積上千個 / 沒人 retire 是常見問題、跟 <a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a> 同類 — 沒 scope map 等於沒治理。</p>
<p><strong>Alias 與 Key ID 的解耦</strong>：alias（<code>alias/my-app-prod-key</code>）是 <em>指向 key 的可變指標</em>、key ID / ARN 是 <em>不可變識別</em>。production code 應該用 alias、要換 key 時只需要重綁 alias、不用改 deployment。Cross-account 跨帳號使用必須用 ARN（alias 不跨帳號）。</p>
<p><strong>Key Rotation 的真實語義</strong>：annual automatic rotation（symmetric encryption key 才支援）換的是 <em>KMS 內部的 backing key material</em>、key ARN / Alias / Key ID 都不變、app 完全不需要動。<strong>舊資料仍用舊 backing key 解密、KMS 自動處理</strong>、不是「資料全部重新加密」— 這是常見誤解。asymmetric / HMAC key 不支援 automatic rotation、必須 manual 建新 key + alias 切換 + app 端雙讀容忍窗口（跟 JWT signing key rotation 同套路）。</p>
<p><strong>Multi-Region Key</strong>：跨 region replicate 的 KMS key 共用 <em>key material</em> 跟 <em>Key ID</em>（後綴帶 <code>mrk-</code>）、不是建立新 key — 跨 region 加密的 ciphertext 在另一 region 可以直接 decrypt、不用 cross-region API call。適合 multi-region active-active app + DR scenario。代價是 <em>replica region 跟 primary region 的權限要分別治理</em>、Key Policy 不會自動同步。</p>
<p><strong>Encryption Context 是 <em>authenticated data</em></strong>：encrypt 時帶的 key-value pair（例：<code>{&quot;app&quot;: &quot;billing&quot;, &quot;tenant&quot;: &quot;acme&quot;}</code>）、decrypt 必須提供同一組 context — 否則失敗。用來防 <em>ciphertext 被 replay 到別的 context</em>（攻擊者拿到 billing 的 ciphertext 想當 payroll 的 ciphertext 用）、所有 context 都會進 CloudTrail、是 forensic 上的關鍵欄位。production 一律帶 context、單純加密不帶 context 等於少一層防護。</p>
<p><strong>Customer Managed vs AWS Managed vs AWS Owned</strong>：三層分權 — Customer Managed（CMK、自己控 Key Policy + 自選 rotation）、AWS Managed（<code>aws/secretsmanager</code>、<code>aws/s3</code>、AWS 管 Key Policy、看得到但改不了）、AWS Owned（完全看不見、AWS 自己用、無 CloudTrail）。production 高敏感資料應該用 Customer Managed、才能控 policy + 開 data event + 自選 rotation 週期。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>AWS KMS</th>
          <th>Google Cloud KMS</th>
          <th>Azure Key Vault</th>
          <th>AWS CloudHSM</th>
          <th>Vault transit engine</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>部署模型</td>
          <td>AWS managed multi-tenant、FIPS 140-2 Level 3</td>
          <td>GCP managed multi-tenant、FIPS 140-2 L3</td>
          <td>Azure managed、Standard / Premium tier</td>
          <td>AWS managed single-tenant HSM cluster</td>
          <td>自管 Vault cluster</td>
      </tr>
      <tr>
          <td>跨雲</td>
          <td>弱 — AWS-only</td>
          <td>弱 — GCP-only</td>
          <td>弱 — Azure-only</td>
          <td>弱 — AWS-only</td>
          <td>強 — 跨雲統一介面</td>
      </tr>
      <tr>
          <td>授權模型</td>
          <td>Key Policy（強制） + IAM + Grant 三層</td>
          <td>IAM 為主、Resource policy 輔</td>
          <td>Access policy + RBAC 雙模式</td>
          <td>CloudHSM user / role + Cluster IAM</td>
          <td>path-based policy + token</td>
      </tr>
      <tr>
          <td>Multi-Region</td>
          <td>Multi-Region Key（共用 key material）</td>
          <td>自動跨 region replication 較易</td>
          <td>Geo-replication 透過 Premium tier</td>
          <td>自管 cross-region replication</td>
          <td>Replication（Enterprise）</td>
      </tr>
      <tr>
          <td>Envelope encryption</td>
          <td>一級 pattern（<code>GenerateDataKey</code>）</td>
          <td>一級 pattern</td>
          <td>一級 pattern</td>
          <td>自己實作</td>
          <td>內建（transit engine）</td>
      </tr>
      <tr>
          <td>Asymmetric signing</td>
          <td>支援（RSA / ECC、JWT / CodeSign 直用）</td>
          <td>支援</td>
          <td>支援</td>
          <td>支援 + 完整 PKCS#11</td>
          <td>支援（部分）</td>
      </tr>
      <tr>
          <td>整合面</td>
          <td>全 AWS service 原生（S3 / EBS / RDS / Lambda）</td>
          <td>全 GCP service 原生</td>
          <td>全 Azure service 原生</td>
          <td>PKCS#11 / JCE / OpenSSL</td>
          <td>應用層 SDK</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>AWS-heavy + envelope encryption + JWT signing</td>
          <td>GCP-heavy</td>
          <td>Azure-heavy + 跟 AD 整合</td>
          <td>合規 / FIPS L3 single-tenant / 自管 HSM</td>
          <td>跨雲 + key 不離 service</td>
      </tr>
      <tr>
          <td>不適合場景</td>
          <td>跨雲統一 custody、需 FIPS L4、需自管 HSM cluster</td>
          <td>同左</td>
          <td>同左</td>
          <td>純 envelope encryption 用 KMS 即可</td>
          <td>AWS-only 簡單需求（KMS 更便宜）</td>
      </tr>
  </tbody>
</table>
<p>KMS 是 AWS 上的 <em>預設選擇</em>、CloudHSM 是合規 / 自管要求才上的 <em>昇級</em>、Vault transit 是跨雲統一介面、Google / Azure 對標品在各自雲一樣是預設選擇。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>KMS Custom Key Store + CloudHSM 整合</strong>：Custom Key Store 把 KMS 的 <em>控制面</em>（API、Key Policy、CloudTrail、IAM 整合）保留、但 <em>key material 存在自己的 CloudHSM cluster</em>。組織需要 FIPS 140-2 Level 3 single-tenant 但又不想放棄 KMS 的 service 整合（S3 SSE-KMS / EBS encryption）時用。代價是 CloudHSM cluster 的運維成本（cluster HA、user 管理、backup）。</p>
<p><strong>External Key Store (XKS)</strong>：更激進的形態 — key material 完全在 AWS 之外（on-prem HSM 或第三方 HSM）、AWS 透過 XKS proxy 呼叫外部 HSM 做 cryptographic operation。用於 <em>資料主權</em> 場景（金融 / 政府 / 跨境合規要求 key 不出組織邊界）、代價是 latency 跟 availability 完全綁外部 HSM、AWS service 整合面要算清楚。</p>
<p><strong>Multi-Region Replica Key 跟 DR</strong>：primary region 出事時 replica region 仍能 decrypt 既有 ciphertext、不需要 cross-region API call。但 <em>primary 跟 replica 是各自獨立的 Key Policy</em>、變更不會自動同步 — 跟 <a href="/blog/backend/knowledge-cards/audit-log/" data-link-title="Audit Log" data-link-desc="說明高風險操作如何留下可追溯、可稽核的紀錄">Audit Log</a> 治理一樣、replica region 也要納入 CloudTrail Data Event 覆蓋範圍。</p>
<p><strong>BYOK（Bring Your Own Key）</strong>：<code>Origin = EXTERNAL</code> 的 KMS Key、key material 由組織自己生成、用 wrapping key 加密後 import 進 KMS。優點是組織保有 <em>master copy</em>（KMS 出事時仍能 re-import 到別處）、缺點是 <em>automatic rotation 不支援</em>（必須手動 import 新 key material）、且必須自己處理 wrapping key 的生命週期。</p>
<p><strong>跟 <a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">Secrets Manager</a> 的整合</strong>：Secrets Manager 的 secret 本身用 KMS key 加密（預設 AWS Managed <code>aws/secretsmanager</code>、production 應該指到 Customer Managed CMK）。rotation Lambda 透過 Grant 取得 Decrypt + Encrypt 能力、跟 Secrets Manager 一起構成 <em>static secret rotation 的證據鏈</em> — 跟 <a href="/blog/backend/07-security-data-protection/credential-rotation-scoped-evidence/" data-link-title="7.27 Credential Rotation with Scoped Evidence 實作示範" data-link-desc="以 webhook/API credential 輪替示範 scope map、證據欄位與回退窗口如何一起設計。">credential rotation scoped evidence</a> 對齊。</p>
<p><strong>Asymmetric signing 的 use cases</strong>：JWT signing（KMS <code>Sign</code> API 直接簽 JWT header.payload、private key 不離 KMS、跟 Storm-0558 的設計對照鮮明）；CodeSign / S3 object signing（artifact integrity）；mTLS client cert 的 private key（搭配 <a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">cert-manager</a> AWS issuer）。代價是 <em>latency</em>（每次 sign 一次 KMS API call、~10ms 級別、不適合超高 QPS）跟 <em>cost</em>（asymmetric operation 比 symmetric 貴 ~5x）。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>Key Policy 沒有 <code>root</code> principal</strong>：Schedule 時忘了寫、key 立刻變孤兒、誰都不能用 — 只能透過 AWS Support 救（流程慢）；建立流程強制 template 含 root principal</li>
<li><strong>IAM admin 改不動 KMS key</strong>：Key Policy 沒授權 IAM 介入、即使 admin policy 有 <code>kms:*</code> 也擋掉 — 加 <code>Enable IAM User Permissions</code> statement 給 root principal、IAM 才能參與授權</li>
<li><strong>Schedule Key Deletion 誤觸發</strong>：min 7 天、max 30 天的等待期、期內可 cancel — production key 必含 alert（CloudWatch Alarm on <code>ScheduleKeyDeletion</code> event）+ 強制 4-eyes approval</li>
<li><strong>CloudTrail Data Event 沒開</strong>：事故後想查「誰 decrypt 了什麼」、發現只有 management event — production 必開 KMS data event、預估 cost（每 100k events ~$0.10）、敏感 key 一律開</li>
<li><strong>Encryption Context 不一致</strong>：encrypt 時帶 context、decrypt 時忘了帶（或帶錯）、<code>InvalidCiphertextException</code> — code review 強制 context schema、用 typed wrapper 避免人手帶錯</li>
<li><strong>Grant 累積 + 沒 retire</strong>：每個 KMS key 有 50,000 grant 上限、rotation Lambda 跑久了 grant 累積 — 定期 <code>ListGrants</code> + <code>RetireGrant</code> 廢棄的、IaC 治理 grant lifecycle</li>
<li><strong>Cross-region decrypt 失敗</strong>：以為 ciphertext 跨 region 通用、結果原本不是 Multi-Region Key — production 跨 region 場景一律建 Multi-Region Key、不要事後補</li>
<li><strong>CMK rotation 後舊 ciphertext 還能 decrypt</strong>：annual rotation 不會 re-encrypt 舊資料、KMS 自動用對應 backing key — 這是設計、不是 bug；真要全量 re-encrypt 要走 application-level migration</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>FIPS 140-2 Level 3 single-tenant HSM</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a>、或 KMS Custom Key Store 橋接</td>
      </tr>
      <tr>
          <td>GCP-heavy 環境</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/google-cloud-kms/" data-link-title="Google Cloud KMS" data-link-desc="GCP 原生 key management service、KeyRing / CryptoKey Version 設計、CMEK 整合 &#43; Cloud HSM &#43; External Key Manager">Google Cloud KMS</a></td>
      </tr>
      <tr>
          <td>Azure-heavy + 跟 AD / Managed Identity 整合</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &#43; Key &#43; Certificate）、整合 Managed Identity &#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault</a></td>
      </tr>
      <tr>
          <td>跨雲統一 key custody</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault transit engine</a></td>
      </tr>
      <tr>
          <td>Static secret + rotation orchestration</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">AWS Secrets Manager</a>（後端是 KMS）</td>
      </tr>
      <tr>
          <td>K8s workload mTLS cert</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">cert-manager</a>（可用 KMS asymmetric key）</td>
      </tr>
      <tr>
          <td>Public TLS cert</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/aws-acm/" data-link-title="AWS ACM" data-link-desc="AWS-managed certificate provisioning、DNS validation &#43; auto-renewal、整合 ELB / CloudFront / API Gateway、Private CA 後端">AWS ACM</a> / <a href="/blog/backend/07-security-data-protection/vendors/letsencrypt/" data-link-title="Let&#39;s Encrypt" data-link-desc="免費 &#43; 自動化的公共 ACME CA、90 天 TTL 強制自動化、跨雲跨平台 public TLS cert 的事實基礎">Let&rsquo;s Encrypt</a></td>
      </tr>
      <tr>
          <td>數據主權 / on-prem HSM required</td>
          <td>KMS External Key Store (XKS) 或直接 <a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a></td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>KMS 完整 API reference 跟 SDK 範例</li>
<li>各 AWS service（S3 SSE-KMS、EBS encryption、RDS encryption、DynamoDB encryption）的詳盡設定步驟</li>
<li>跟 AWS Organizations / SCPs 的 cross-account KMS sharing 完整治理流程</li>
<li>CloudHSM cluster 的完整運維（高可用、user 管理、backup）— 看 <a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a></li>
<li>各種 cryptographic algorithm 的數學原理跟選型細節</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>KMS 在 07 案例庫沒有直接 vendor-level 事件、以下案例採對照引用：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 KMS 的關係（對照）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/microsoft-storm-0558-signing-key-2023/" data-link-title="7.C4 Microsoft：Storm-0558 簽章金鑰事件" data-link-desc="簽章金鑰事件如何回寫 identity 信任邊界與觀測證據鏈。">Microsoft Storm-0558 Signing Key 2023</a></td>
          <td>KMS 設計核心對照 — signing key 必須 HSM-bound + 不可導出、KMS 預設 key 完全不離 service；自己 host private key 是 Storm-0558 級事件的根因</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/microsoft-storm-0558-2023-signing-key-chain/" data-link-title="7.R7.1.5 Microsoft Storm-0558 2023：簽章金鑰鏈與郵件存取" data-link-desc="從簽章金鑰保護失效到雲端郵件存取，拆解身分信任鏈的關鍵控制點">Microsoft Storm-0558 Signing Key Chain (red-team)</a></td>
          <td>三件事必到位：asymmetric KMS Key 做 JWT signing（private key 永遠不離 KMS）、強制 rotation 流程、CloudTrail Data Event 紀錄「誰用 key 簽什麼 token」</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a></td>
          <td>KMS Alias / Grant 的 rotation 跟 revocation 要分域 — 一次 Schedule Key Deletion 沒 scope map 等於潛在全停、Grant lifecycle 要納入治理</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/secrets-and-machine-credential-governance/" data-link-title="7.6 秘密管理與機器憑證治理" data-link-desc="以問題驅動方式整理 secret、token、key 與機器身份治理">7.6 秘密管理與機器憑證治理</a>、<a href="/blog/backend/07-security-data-protection/transport-trust-and-certificate-lifecycle/" data-link-title="7.5 傳輸信任與憑證生命週期" data-link-desc="以問題驅動方式整理傳輸信任鏈、會話完整性與憑證節奏">7.5 傳輸信任與憑證生命週期</a>（KMS 為 TLS / signing key 的 root custodian）、<a href="/blog/backend/07-security-data-protection/detection-coverage-and-signal-governance/" data-link-title="7.13 偵測覆蓋率與訊號治理" data-link-desc="定義偵測覆蓋、訊號品質與誤報成本的治理問題">7.13 偵測覆蓋率與訊號治理</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/google-cloud-kms/" data-link-title="Google Cloud KMS" data-link-desc="GCP 原生 key management service、KeyRing / CryptoKey Version 設計、CMEK 整合 &#43; Cloud HSM &#43; External Key Manager">Google Cloud KMS</a>、<a href="/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &#43; Key &#43; Certificate）、整合 Managed Identity &#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault</a>、<a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a></li>
<li>下游：<a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">AWS Secrets Manager</a>（後端用 KMS）、<a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">cert-manager</a>（可用 KMS asymmetric key 當 issuer）</li>
<li>對照：<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a>（transit engine / 跨雲統一介面）</li>
<li>跨模組：<a href="/blog/backend/08-incident-response/vendors/" data-link-title="事故處理 Vendor 清單" data-link-desc="規劃 on-call、incident response、status page 與 postmortem 工具的服務頁撰寫順序與判準">8 事故處理 vendor 清單</a>（KMS 事件如何 routing 進 IR 流程）</li>
<li>官方：<a href="https://docs.aws.amazon.com/kms/">AWS KMS Documentation</a></li>
</ul>
]]></content:encoded></item><item><title>Google Cloud KMS</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/google-cloud-kms/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/google-cloud-kms/</guid><description>&lt;p>Google Cloud KMS 是 GCP 原生的 key management service、把 envelope encryption、asymmetric signing 與 MAC 等密碼運算集中在受控的 key custodian 內、key material 不離保護邊界。應用端只持 &lt;em>KMS resource name + IAM 權限&lt;/em>、用 &lt;code>Encrypt&lt;/code> / &lt;code>Decrypt&lt;/code> / &lt;code>AsymmetricSign&lt;/code> API 把 plaintext 或 hash 送進 Cloud KMS、key 永遠在 Google 管理的 software 模組或 HSM 內運算完才把結果送回。整個 GCP 的 CMEK（Customer Managed Encryption Key）生態都以 Cloud KMS 為錨點 — GCS bucket、BigQuery dataset、Persistent Disk、Cloud SQL、GKE etcd 都可指定一把 Cloud KMS key 做加密、跟 cloud-native 預設加密（GCP 自管 key、客戶看不到）拉出邊界。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Cloud KMS 的核心定位是 &lt;em>GCP-native envelope encryption + signing 控制面&lt;/em>、用 KeyRing 作為 organizational + locational grouping、CryptoKey + CryptoKeyVersion 作為 key material 的版本軸。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-kms/" data-link-title="AWS KMS" data-link-desc="AWS 原生 key management service、envelope encryption / digital signing / Multi-Region Key、Key Policy &amp;#43; Grant 雙軌授權">AWS KMS&lt;/a> 相比、最大差異是 &lt;em>沒有獨立的 Key Policy&lt;/em>：權限完全走 GCP IAM（Role Binding 綁到 KeyRing 或 CryptoKey resource）、好處是跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google Cloud IAM&lt;/a> 統一治理（同一份 IAM audit、同一套 conditional binding）、代價是少了 AWS KMS Key Policy 那種 &lt;em>key-level 的獨立 deny override&lt;/em>。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &amp;#43; Key &amp;#43; Certificate）、整合 Managed Identity &amp;#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault&lt;/a> 相比、Cloud KMS 拆得更細：Azure 把 secret + key + certificate 合在同一個 Key Vault service、Google 拆成 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &amp;#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager&lt;/a>（secret）+ Cloud KMS（key）+ Certificate Authority Service（PKI），各 service IAM、quota、audit 獨立。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &amp;#43; 資料主權場景的 key custody">CloudHSM&lt;/a> 相比、Cloud KMS Protection Level=HSM 是 &lt;em>managed HSM&lt;/em>（FIPS 140-2 Level 3、Google 顧 cluster）、CloudHSM 是 &lt;em>single-tenant 專屬 HSM&lt;/em>（客戶顧 cluster、合規隔離更強）。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault transit&lt;/a> 相比、Cloud KMS 綁 GCP、Vault transit 可跨雲；但 Vault 自己常用 Cloud KMS 當 auto-unseal master key custodian。&lt;/p></description><content:encoded><![CDATA[<p>Google Cloud KMS 是 GCP 原生的 key management service、把 envelope encryption、asymmetric signing 與 MAC 等密碼運算集中在受控的 key custodian 內、key material 不離保護邊界。應用端只持 <em>KMS resource name + IAM 權限</em>、用 <code>Encrypt</code> / <code>Decrypt</code> / <code>AsymmetricSign</code> API 把 plaintext 或 hash 送進 Cloud KMS、key 永遠在 Google 管理的 software 模組或 HSM 內運算完才把結果送回。整個 GCP 的 CMEK（Customer Managed Encryption Key）生態都以 Cloud KMS 為錨點 — GCS bucket、BigQuery dataset、Persistent Disk、Cloud SQL、GKE etcd 都可指定一把 Cloud KMS key 做加密、跟 cloud-native 預設加密（GCP 自管 key、客戶看不到）拉出邊界。</p>
<h2 id="服務定位">服務定位</h2>
<p>Cloud KMS 的核心定位是 <em>GCP-native envelope encryption + signing 控制面</em>、用 KeyRing 作為 organizational + locational grouping、CryptoKey + CryptoKeyVersion 作為 key material 的版本軸。跟 <a href="/blog/backend/07-security-data-protection/vendors/aws-kms/" data-link-title="AWS KMS" data-link-desc="AWS 原生 key management service、envelope encryption / digital signing / Multi-Region Key、Key Policy &#43; Grant 雙軌授權">AWS KMS</a> 相比、最大差異是 <em>沒有獨立的 Key Policy</em>：權限完全走 GCP IAM（Role Binding 綁到 KeyRing 或 CryptoKey resource）、好處是跟 <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google Cloud IAM</a> 統一治理（同一份 IAM audit、同一套 conditional binding）、代價是少了 AWS KMS Key Policy 那種 <em>key-level 的獨立 deny override</em>。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &#43; Key &#43; Certificate）、整合 Managed Identity &#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault</a> 相比、Cloud KMS 拆得更細：Azure 把 secret + key + certificate 合在同一個 Key Vault service、Google 拆成 <a href="/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager</a>（secret）+ Cloud KMS（key）+ Certificate Authority Service（PKI），各 service IAM、quota、audit 獨立。跟 <a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a> 相比、Cloud KMS Protection Level=HSM 是 <em>managed HSM</em>（FIPS 140-2 Level 3、Google 顧 cluster）、CloudHSM 是 <em>single-tenant 專屬 HSM</em>（客戶顧 cluster、合規隔離更強）。跟 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault transit</a> 相比、Cloud KMS 綁 GCP、Vault transit 可跨雲；但 Vault 自己常用 Cloud KMS 當 auto-unseal master key custodian。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>KeyRing 該放哪個 location（global / regional / dual-regional / multi-regional）、為何一旦決定無法搬遷</li>
<li>CryptoKey Version + Primary 版本軸怎麼支撐 rotation、何時該 disable / destroy 舊 version</li>
<li>Protection Level（SOFTWARE / HSM / EXTERNAL）跟 Cloud HSM、External Key Manager 的取捨</li>
<li>CMEK 整合 GCS / BigQuery / Persistent Disk 跟 cloud-native default encryption 的邊界差異</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷一份 Cloud KMS 部署是否健康、最少看四件事：</p>
<ul>
<li><strong>KeyRing location 對不對</strong>：production sensitive key 用 region / multi-region、避免不必要的 <code>global</code> KeyRing；location 一旦設定 <em>不能改</em>、key 也搬不出原 KeyRing — 設錯只能建新 KeyRing + 重新加密所有 ciphertext</li>
<li><strong>IAM Conditions 跟 least privilege</strong>：<code>roles/cloudkms.cryptoKeyEncrypterDecrypter</code> 不該綁到 KeyRing level（會放大爆炸半徑）、應綁到具體 CryptoKey；admin 跟 use 角色分離（<code>roles/cloudkms.admin</code> ≠ <code>roles/cloudkms.signer</code>）；敏感 key 加 IAM Condition（時間窗、resource attribute）</li>
<li><strong>Cloud Audit Logs 開到對的層級</strong>：Admin Activity（建 key、改 IAM、destroy version）預設開、Data Access（每次 Encrypt / Decrypt / Sign）<em>預設關</em> — production sensitive key 必須在 IAM audit config 把 Data Access 開、否則「誰用 key 做了什麼」查不到</li>
<li><strong>Protection Level 對齊合規</strong>：production 跟 PII / 金融 / 醫療資料的 key 應走 HSM 或 EXTERNAL、SOFTWARE 只給 dev / 低敏感場景；EKM 對應 <em>資料主權</em>（key 物理上不在 GCP）</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/knowledge-cards/audit-log/" data-link-title="Audit Log" data-link-desc="說明高風險操作如何留下可追溯、可稽核的紀錄">Audit Log</a> 與 KMS 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>KeyRing 設計</strong>：KeyRing 是 <em>組織單位 + 位置鎖</em>。建議切法：依 <em>環境 + 用途</em> 拆（<code>prod-data-encryption-asia-east1</code>、<code>prod-signing-global</code>、<code>dev-data-encryption-asia-east1</code>），不要全公司一個 KeyRing。Location 選擇：跟資料 colocate（GCS bucket 在 <code>asia-east1</code> 的 key 也放 <code>asia-east1</code> KeyRing、避免跨區延遲與資料主權問題）；signing key 多半放 <code>global</code> 或 multi-region 提高可用性；CMEK 給 BigQuery 時 KeyRing location 必須跟 dataset location 一致、否則綁不上。一個原則：<em>KeyRing location 是一次性決策</em>、上線前確認跟 cloud resource location + 法規要求對齊。</p>
<p><strong>CryptoKey Version 與 Primary</strong>：CryptoKey 有多個 version（<code>projects/.../cryptoKeys/k/cryptoKeyVersions/1</code>、<code>v2</code>、<code>v3</code>）、其中一個是 Primary — 所有 <code>Encrypt</code> API 預設用 Primary version 加密、<code>Decrypt</code> 自動依 ciphertext 內嵌的 version ID 找對應 version 解。Rotation 不是「換 key」、是 <em>建立新 version 並 promote 為 Primary</em>；舊 version 仍可 decrypt 既有 ciphertext（除非手動 disable / destroy）。Destroy 是 24 小時延遲（可在期內 restore）、destroy 之後 ciphertext 永久不可解 — 排程 destroy 前必須確認沒有遺留 ciphertext 還在用該 version。</p>
<p><strong>Auto Rotation</strong>：CryptoKey 可設 <code>rotationPeriod</code>（最短 1 天、預設 90 天）、KMS 在到期時自動建立新 version + promote 為 Primary、app 不需要改 code。Auto rotation 只對 <em>symmetric encryption key</em> 有效；asymmetric key（signing / decryption）不支援 auto rotation、需要手動建 version + 通知 consumer 更新 public key。注意 auto rotation 是 <em>key version 換</em>、不會 re-encrypt 既有資料 — 真正的 <em>資料 re-encryption</em> 是另一條工作流（讀回 ciphertext + 用新 Primary 重加密寫回）、要依 CMEK-integrated resource 各自規劃。</p>
<p><strong>Protection Level</strong>：SOFTWARE（軟體運算、最便宜、FIPS 140-2 Level 1）/ HSM（Cloud HSM 後端、FIPS 140-2 Level 3、key 物理上在 Google 管理的 HSM cluster）/ EXTERNAL（External Key Manager、key 在客戶自管的外部 HSM、Cloud KMS 把運算委派出去）。Production sensitive key 應走 HSM、SOFTWARE 給 dev / 低敏感場景。Protection Level 是 <em>CryptoKey 建立時決定</em>、不能改 — 要升等只能建新 CryptoKey + 遷移 ciphertext。</p>
<p><strong>CMEK 整合</strong>：CMEK 把 Cloud KMS key 綁到 GCS bucket / BigQuery dataset / Persistent Disk / Cloud SQL / GKE etcd / Pub/Sub topic / Dataflow job 等 resource。設定方式：cloud service 的 service account（如 <code>service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com</code>）取得該 CryptoKey 的 <code>cryptoKeyEncrypterDecrypter</code> 權限、resource 在加密時自動呼叫 KMS。跟 cloud-native default encryption（GCP 自己管 key）的差異：CMEK 下 <em>客戶可隨時 disable key 讓整個 bucket / dataset 立刻無法解</em>（compliance kill switch）、default encryption 沒這個能力。代價是 KMS 故障 = CMEK-integrated resource 全部讀寫卡住、所以 production KMS 自身 SLA 跟 monitoring 是 cluster-level dependency。</p>
<p><strong>External Key Manager (EKM)</strong>：GCP 把 encryption / decryption operation <em>委派</em> 給客戶自管的外部 HSM（Thales、Equinix SmartKey、Fortanix 等）、key 物理上不在 GCP、Cloud KMS 只是個 proxy。適合 <em>資料主權</em> 嚴格的場景（歐盟金融、政府機密、跨境法規）— 客戶撤銷外部 HSM 的存取、GCP 立刻無法解密、達成「Google 看不到資料」的合規承諾。代價：每次 Encrypt / Decrypt 都打外部 HSM、延遲跟可用性受外部 HSM 影響、運維複雜度大幅上升。</p>
<p><strong>IAM 整合</strong>：用 Role Binding 控制存取（綁在 KeyRing 或 CryptoKey resource）— <code>roles/cloudkms.cryptoKeyEncrypterDecrypter</code>（Encrypt + Decrypt）/ <code>roles/cloudkms.signer</code>（AsymmetricSign）/ <code>roles/cloudkms.signerVerifier</code>（含 public key 取得）/ <code>roles/cloudkms.admin</code>（建 key、改 IAM）。對應 <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google Cloud IAM</a> 的 conditional binding、可加時間窗、resource attribute、access level 條件。跟 AWS KMS 的關鍵差異：<em>沒有 Key Policy</em> — 所有授權都在 IAM、好處是統一治理、代價是少了 key-level 的獨立 deny override（AWS KMS Key Policy 可寫「即使 IAM 給了 admin、仍 deny destroy」、Cloud KMS 要用 Organization Policy 或 IAM Deny 達成類似效果）。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Google Cloud KMS</th>
          <th>AWS KMS</th>
          <th>Azure Key Vault</th>
          <th>Vault transit</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>部署模型</td>
          <td>GCP managed</td>
          <td>AWS managed</td>
          <td>Azure managed</td>
          <td>self-hosted 或 HCP</td>
      </tr>
      <tr>
          <td>跨雲</td>
          <td>弱 — 綁 GCP</td>
          <td>弱 — 綁 AWS</td>
          <td>弱 — 綁 Azure</td>
          <td>強 — 同介面跨雲</td>
      </tr>
      <tr>
          <td>Multi-region key</td>
          <td>用 multi-region KeyRing（key material 在多 region 鏡像）</td>
          <td>Multi-Region Key 較直接（單一 key ID、跨 region 自動同步）</td>
          <td>支援 geo-replication</td>
          <td>跨雲、需自行設計 replication</td>
      </tr>
      <tr>
          <td>Key 權限模型</td>
          <td>純 IAM Role Binding、無 Key Policy</td>
          <td>IAM + 獨立 Key Policy（雙層授權）</td>
          <td>RBAC + Access Policy 雙模式</td>
          <td>Vault policy（path-based）</td>
      </tr>
      <tr>
          <td>HSM 選項</td>
          <td>Protection Level=HSM（managed、FIPS 140-2 L3）</td>
          <td>AWS KMS HSM-backed（預設）+ CloudHSM（專屬）</td>
          <td>Premium tier + Managed HSM</td>
          <td>依賴後端 KMS / HSM</td>
      </tr>
      <tr>
          <td>外部 key 託管</td>
          <td>External Key Manager (EKM)</td>
          <td>XKS (External Key Store)</td>
          <td>BYOK + Managed HSM</td>
          <td>自管 HSM unseal</td>
      </tr>
      <tr>
          <td>Audit</td>
          <td>Cloud Audit Logs（Data Access 需手動開）</td>
          <td>CloudTrail（KMS event 自動進）</td>
          <td>Azure Monitor / Activity Log</td>
          <td>Vault audit device</td>
      </tr>
      <tr>
          <td>CMEK 整合廣度</td>
          <td>GCS / BQ / PD / Cloud SQL / GKE etcd / Pub/Sub / Dataflow</td>
          <td>S3 / EBS / RDS / DynamoDB / Lambda env</td>
          <td>Storage / SQL / Cosmos / Disk</td>
          <td>不適用（app-level）</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>GCP-heavy、需 CMEK 整合、Workload Identity Federation 已主導</td>
          <td>AWS-heavy、需 Multi-Region Key + Key Policy 精細控制</td>
          <td>Azure-heavy、需要 secret + key 統一治理</td>
          <td>跨雲、需要 app-level encryption-as-a-service</td>
      </tr>
  </tbody>
</table>
<p>選 Cloud KMS 的核心訴求：<em>GCP 是主力雲</em> + 需要 CMEK 把 GCS / BigQuery / PD / Cloud SQL 的加密 key custody 拉回客戶手上 + 接受 IAM-only 授權模型。需要 <em>跨雲統一 key custody</em> 走 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault transit</a> 或 EKM；需要 <em>單一專屬 HSM 隔離</em> 走 <a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a> 或 EKM 接 on-prem HSM。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>External Key Manager (EKM) 與資料主權</strong>：EKM 讓 key 物理上不在 GCP、Cloud KMS 變成 proxy 把 cryptographic operation 委派給客戶自管 HSM。常見部署：金融 / 政府用 <em>EKM via VPC</em>（外部 HSM 在客戶 VPC 內、Cloud KMS 走 PSC 連線、延遲較低）、跨境合規用 <em>EKM via Internet</em>（HSM 在第三方 KMS provider、延遲較高但治理邊界更乾淨）。代價：每次 Encrypt / Decrypt = 一次外部呼叫、CMEK-integrated resource 的讀寫吞吐量受外部 HSM 限制、外部 HSM 故障 = 整個 GCP 端讀寫卡住。</p>
<p><strong>Cloud HSM（Protection Level=HSM）</strong>：把 CryptoKey 物理上鎖在 Google 託管的 FIPS 140-2 Level 3 HSM cluster 內、key 不可 export、所有 cryptographic operation 在 HSM 邊界內完成。對應 <a href="/blog/backend/07-security-data-protection/cases/microsoft-storm-0558-signing-key-2023/" data-link-title="7.C4 Microsoft：Storm-0558 簽章金鑰事件" data-link-desc="簽章金鑰事件如何回寫 identity 信任邊界與觀測證據鏈。">Microsoft Storm-0558 Signing Key 2023</a> 的對照啟示：signing key 一旦能被 export 或從 memory crash dump 撈出、整個信任鏈崩 — HSM-bound key 從設計上斷掉這條路徑。代價：HSM 後端比 SOFTWARE 貴、operation 延遲略高（典型多 &lt; 10ms）、quota 也獨立計算。</p>
<p><strong>Asymmetric Key 做 JWT signing</strong>：CryptoKey purpose=<code>ASYMMETRIC_SIGN</code> 配 algorithm（RSA / EC）、app 透過 <code>AsymmetricSign</code> API 把 JWT header+payload 的 hash 送進 KMS、KMS 回 signature。Public key 走 <code>GetPublicKey</code> API 取得、給 JWKS endpoint 對外發布。優勢：private key 不離 KMS、即使 app server compromise 也無法搬走 signing key；劣勢：每次簽名都 round-trip 一次 KMS、高 QPS 場景要算 quota 跟延遲（典型 ~10-30ms / sign）。</p>
<p><strong>跟 Google Secret Manager 的 CMEK 整合</strong>：<a href="/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager</a> 預設用 GCP 管的 key 加密 secret、若要 <em>客戶管 key</em>、可設 CMEK 把 GSM 的 secret 用客戶 Cloud KMS key 加密。意義：disable Cloud KMS key 立刻讓 GSM secret 不可讀（compliance kill switch）— 但代價是 KMS 故障 = GSM 也卡住、是強耦合 dependency。</p>
<p><strong>Multi-region key</strong>：Cloud KMS 的 multi-region KeyRing（如 <code>us</code>、<code>europe</code>、<code>asia</code>）讓 key material 在多 region 鏡像、提高可用性但加密 / 解密延遲較高。AWS KMS 的 Multi-Region Key 設計不同（單一 key ID 跨 region 同步、有獨立的 primary / replica 角色）— 跨雲遷移 / 多雲 active-active 設計時要留意這個差異、Cloud KMS multi-region 比較像 <em>單一邏輯 key 多 region 可用</em>、不是 <em>多 region 各自獨立可寫</em>。</p>
<p><strong>Import 自有 key material（BYOK）</strong>：Cloud KMS 可 import 客戶自產的 key material（透過 wrapping key 包覆後上傳）、適合需要 <em>客戶端 key generation 證據鏈</em> 的合規場景。代價：import 的 key 不能 auto rotate（rotation 必須客戶端重新產 key 再 import），且 SOFTWARE / HSM Protection Level 都支援、EXTERNAL 不適用（EXTERNAL 本來就在外部 HSM、不走 import 路徑）。</p>
<p><strong>Organization Policy 與防護欄</strong>：跟 <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google Cloud IAM</a> 整合的 Org Policy 可在 organization-level 強制 <em>只允許 HSM / EXTERNAL key</em>（<code>constraints/gcp.restrictNonCmekServices</code>）、防止工程師建出 SOFTWARE key 處理敏感資料。這層防護欄比依賴 reviewer 紀律有效、屬於 <a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a> 同類「規約靠系統而非紀律」的設計。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>KeyRing location 設錯</strong>：KeyRing 建在 <code>global</code>、要綁 <code>asia-east1</code> 的 BigQuery dataset CMEK — 綁不上、location 不能改、只能建新 KeyRing + 重新加密 — 上線前 review KeyRing location 跟 resource location 對齊</li>
<li><strong>Data Access audit 沒開</strong>：production 用 Cloud KMS 做 signing、事故時要查 <em>誰用 key 簽了什麼</em>、發現只有 Admin Activity log、沒有 Decrypt / Sign 記錄 — IAM audit config 加 <code>dataAccess</code> log type、留意 audit log 自己會增加成本與 quota</li>
<li><strong>CMEK key disable 後 resource 全卡</strong>：disable CryptoKey 想做 compliance 演練、整個 GCS bucket 讀寫立刻 503 — disable 是 <em>全或無</em>、要演練得排維護窗、有 rollback 計畫（re-enable 後恢復）</li>
<li><strong>Auto rotation 設定 + asymmetric key</strong>：以為 asymmetric signing key 也會 auto rotate、上線數月後發現 version 1 還在用 — asymmetric key 不支援 auto rotation、要手動建 version + 通知 JWKS consumer</li>
<li><strong>IAM Role 過寬</strong>：給整個 KeyRing <code>cryptoKeyEncrypterDecrypter</code>、單一 service account 可以解所有 key — 改綁到具體 CryptoKey、加 IAM Condition</li>
<li><strong>EKM 外部 HSM 故障</strong>：外部 HSM 連線中斷、Cloud KMS 端 Encrypt / Decrypt 全 fail、所有 CMEK-integrated resource 讀寫卡住 — EKM 需要 dual HSM redundancy + Cloud KMS 端 monitoring alert</li>
<li><strong>Destroy 後資料不可解</strong>：CryptoKeyVersion destroy 後 24 小時 grace period 過了、發現某個 backup 還是用該 version 加密 — destroy 前必須跑 inventory 確認沒有 ciphertext 還掛在該 version</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>AWS-only 加密 + 需 Key Policy 精細控制</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/aws-kms/" data-link-title="AWS KMS" data-link-desc="AWS 原生 key management service、envelope encryption / digital signing / Multi-Region Key、Key Policy &#43; Grant 雙軌授權">AWS KMS</a></td>
      </tr>
      <tr>
          <td>Azure-only 加密 + 需 secret + key 同治理</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &#43; Key &#43; Certificate）、整合 Managed Identity &#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault</a></td>
      </tr>
      <tr>
          <td>跨雲統一 encryption-as-a-service</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a> transit engine</td>
      </tr>
      <tr>
          <td>單一專屬 HSM 隔離 / 跨雲合規</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a></td>
      </tr>
      <tr>
          <td>GCP secret 管理（非 key）</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager</a></td>
      </tr>
      <tr>
          <td>GCP IAM 治理基底</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google Cloud IAM</a></td>
      </tr>
      <tr>
          <td>公開憑證 / PKI</td>
          <td>Certificate Authority Service（GCP）或 <a href="/blog/backend/07-security-data-protection/vendors/letsencrypt/" data-link-title="Let&#39;s Encrypt" data-link-desc="免費 &#43; 自動化的公共 ACME CA、90 天 TTL 強制自動化、跨雲跨平台 public TLS cert 的事實基礎">Let&rsquo;s Encrypt</a></td>
      </tr>
      <tr>
          <td>Secret rotation 證據鏈</td>
          <td><a href="/blog/backend/07-security-data-protection/credential-rotation-scoped-evidence/" data-link-title="7.27 Credential Rotation with Scoped Evidence 實作示範" data-link-desc="以 webhook/API credential 輪替示範 scope map、證據欄位與回退窗口如何一起設計。">7.5 Credential Rotation Scoped Evidence</a></td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>Cloud KMS 完整 API reference 跟 <code>gcloud kms</code> CLI 詳盡用法</li>
<li>Cloud HSM partition 內部架構、FIPS 140-2 Level 3 驗證細節</li>
<li>EKM 各 partner（Thales / Fortanix / Equinix）的整合步驟與 API 對照</li>
<li>BigQuery / GCS / Cloud SQL 各自 CMEK 設定的完整教學</li>
<li>Cloud KMS pricing 詳盡計算（key version 數、operation 次數、HSM 加成）</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Cloud KMS 在 07 案例庫沒有直接 vendor-level 事件、以下案例採對照引用：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Cloud KMS 的關係（對照）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/microsoft-storm-0558-signing-key-2023/" data-link-title="7.C4 Microsoft：Storm-0558 簽章金鑰事件" data-link-desc="簽章金鑰事件如何回寫 identity 信任邊界與觀測證據鏈。">Microsoft Storm-0558 Signing Key 2023</a></td>
          <td>Cloud KMS Protection Level=HSM 把 signing key 鎖在硬體、不可 export、跟 HSM-bound mindset 同源 — signing key 一旦能 export 整條信任鏈崩</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/microsoft-storm-0558-2023-signing-key-chain/" data-link-title="7.R7.1.5 Microsoft Storm-0558 2023：簽章金鑰鏈與郵件存取" data-link-desc="從簽章金鑰保護失效到雲端郵件存取，拆解身分信任鏈的關鍵控制點">Microsoft Storm-0558 Signing Key Chain (red-team)</a></td>
          <td>Asymmetric Key + Cloud Audit Data Access 是 <em>誰用 key 簽什麼</em> 的稽核基礎、預設關閉的 Data Access log 在 production 必須開、否則事故時無證據</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a></td>
          <td>Auto Rotation 是 vendor-controlled、但 CMEK 整合的 GCS bucket / BQ dataset 的 <em>re-encryption schedule</em> 還是要自己管、否則 rotation 只換 key version、舊資料還是用舊 version</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/secrets-and-machine-credential-governance/" data-link-title="7.6 秘密管理與機器憑證治理" data-link-desc="以問題驅動方式整理 secret、token、key 與機器身份治理">7.6 秘密管理與機器憑證治理</a>、<a href="/blog/backend/07-security-data-protection/transport-trust-and-certificate-lifecycle/" data-link-title="7.5 傳輸信任與憑證生命週期" data-link-desc="以問題驅動方式整理傳輸信任鏈、會話完整性與憑證節奏">7.5 傳輸信任與憑證生命週期</a>（KMS 為 TLS / signing key 的 root custodian）、<a href="/blog/backend/07-security-data-protection/detection-coverage-and-signal-governance/" data-link-title="7.13 偵測覆蓋率與訊號治理" data-link-desc="定義偵測覆蓋、訊號品質與誤報成本的治理問題">7.13 偵測覆蓋率與訊號治理</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/aws-kms/" data-link-title="AWS KMS" data-link-desc="AWS 原生 key management service、envelope encryption / digital signing / Multi-Region Key、Key Policy &#43; Grant 雙軌授權">AWS KMS</a>、<a href="/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &#43; Key &#43; Certificate）、整合 Managed Identity &#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault</a>、<a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a></li>
<li>平行（secret）：<a href="/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager</a>、<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a></li>
<li>上游（IAM）：<a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google Cloud IAM</a>（Cloud KMS 權限完全走 IAM Role Binding）</li>
<li>跨模組：<a href="/blog/backend/08-incident-response/vendors/" data-link-title="事故處理 Vendor 清單" data-link-desc="規劃 on-call、incident response、status page 與 postmortem 工具的服務頁撰寫順序與判準">8 事故處理 vendor 清單</a>（KMS 事件如何 routing 進 IR 流程）</li>
<li>官方：<a href="https://cloud.google.com/kms/docs">Cloud KMS Documentation</a></li>
</ul>
]]></content:encoded></item><item><title>Azure Key Vault</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/azure-key-vault/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/azure-key-vault/</guid><description>&lt;p>Azure Key Vault 是 Azure 平台把 &lt;em>secret&lt;/em>、&lt;em>cryptographic key&lt;/em>、&lt;em>X.509 certificate&lt;/em> 三類資產 &lt;em>合進同一個 service&lt;/em> 的設計。Vault instance 本身是 first-class ARM resource、有 FQDN endpoint（&lt;code>https://&amp;lt;vault-name&amp;gt;.vault.azure.net&lt;/code>）、跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &amp;#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&amp;#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Azure RBAC&lt;/a> 跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &amp;#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&amp;#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Entra ID&lt;/a> Managed Identity 深度整合 — 每個 Vault 自己一個邊界、區別於 region-wide service 的模型。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Azure Key Vault 的核心定位是 &lt;em>三合一 secret + key + cert service 加 Azure-native secret-less 取用&lt;/em>。AWS 是 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &amp;#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">Secrets Manager&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-kms/" data-link-title="AWS KMS" data-link-desc="AWS 原生 key management service、envelope encryption / digital signing / Multi-Region Key、Key Policy &amp;#43; Grant 雙軌授權">KMS&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-acm/" data-link-title="AWS ACM" data-link-desc="AWS-managed certificate provisioning、DNS validation &amp;#43; auto-renewal、整合 ELB / CloudFront / API Gateway、Private CA 後端">ACM&lt;/a> 三個獨立 service、職責邊界清楚但要管三套權限；GCP 是 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &amp;#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/google-cloud-kms/" data-link-title="Google Cloud KMS" data-link-desc="GCP 原生 key management service、KeyRing / CryptoKey Version 設計、CMEK 整合 &amp;#43; Cloud HSM &amp;#43; External Key Manager">Cloud KMS&lt;/a> + Certificate Authority Service 三個獨立；Azure 把這三件事合在 Key Vault — 同一 RBAC role 可同時管 secret / key / cert、減少 IAM 維護成本、但治理上需要在 Vault 內用 &lt;em>naming convention + 多 Vault instance&lt;/em> 自己劃分敏感度邊界（例：production secret / cert 分開不同 Vault、admin access 分人）。&lt;/p></description><content:encoded><![CDATA[<p>Azure Key Vault 是 Azure 平台把 <em>secret</em>、<em>cryptographic key</em>、<em>X.509 certificate</em> 三類資產 <em>合進同一個 service</em> 的設計。Vault instance 本身是 first-class ARM resource、有 FQDN endpoint（<code>https://&lt;vault-name&gt;.vault.azure.net</code>）、跟 <a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Azure RBAC</a> 跟 <a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Entra ID</a> Managed Identity 深度整合 — 每個 Vault 自己一個邊界、區別於 region-wide service 的模型。</p>
<h2 id="服務定位">服務定位</h2>
<p>Azure Key Vault 的核心定位是 <em>三合一 secret + key + cert service 加 Azure-native secret-less 取用</em>。AWS 是 <a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">Secrets Manager</a> + <a href="/blog/backend/07-security-data-protection/vendors/aws-kms/" data-link-title="AWS KMS" data-link-desc="AWS 原生 key management service、envelope encryption / digital signing / Multi-Region Key、Key Policy &#43; Grant 雙軌授權">KMS</a> + <a href="/blog/backend/07-security-data-protection/vendors/aws-acm/" data-link-title="AWS ACM" data-link-desc="AWS-managed certificate provisioning、DNS validation &#43; auto-renewal、整合 ELB / CloudFront / API Gateway、Private CA 後端">ACM</a> 三個獨立 service、職責邊界清楚但要管三套權限；GCP 是 <a href="/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager</a> + <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-kms/" data-link-title="Google Cloud KMS" data-link-desc="GCP 原生 key management service、KeyRing / CryptoKey Version 設計、CMEK 整合 &#43; Cloud HSM &#43; External Key Manager">Cloud KMS</a> + Certificate Authority Service 三個獨立；Azure 把這三件事合在 Key Vault — 同一 RBAC role 可同時管 secret / key / cert、減少 IAM 維護成本、但治理上需要在 Vault 內用 <em>naming convention + 多 Vault instance</em> 自己劃分敏感度邊界（例：production secret / cert 分開不同 Vault、admin access 分人）。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a> 相比、Azure Key Vault 是 Azure-only 的 <em>static-focused</em> 服務 — 沒有 dynamic credential engine、沒有 transit encryption-as-a-service、沒有跨雲統一介面。優勢是 <em>零運維</em> + <em>Managed Identity 取用免 client secret</em> + <em>Premium tier 直接 HSM-backed</em>。Azure-heavy + 一站式 secret/key/cert + secret-less workload 取用是 Key Vault 的甜蜜點。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>哪些 secret / key / cert 適合放 Key Vault、哪些該走 <a href="https://learn.microsoft.com/azure/key-vault/managed-hsm/overview">Managed HSM</a>（FIPS 140-2 Level 3 需求）</li>
<li>Access Policy 跟 Azure RBAC 兩種授權模型的差異與 migration 路徑</li>
<li>Soft Delete + Purge Protection 的 <em>防誤刪</em> 與 <em>防勒索</em> 邊界</li>
<li>何時用 Key Vault、何時改走 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a>（跨雲 + dynamic credential）的取捨</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Azure Key Vault deployment 是否健康、最少看四件事：</p>
<ul>
<li><strong>誰能 access</strong>：Vault 用 Access Policy 還是 Azure RBAC、是否還有 legacy Access Policy 沒清掉、Managed Identity 的 role assignment 是否最小化（Key Vault Secrets User 而非 Key Vault Administrator）</li>
<li><strong>RBAC vs Access Policy 模型</strong>：production 應該全走 Azure RBAC（跟 <a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Azure RBAC vendor</a> 同套）、舊 Access Policy 是 migration backlog、不可長期兩軌並存</li>
<li><strong>Soft Delete + Purge Protection</strong>：兩個都應開、Soft Delete 90 天 retention、Purge Protection 開了之後連 owner 都不能立即 purge — 防誤刪 + 防 ransomware 一次性刪光</li>
<li><strong>Diagnostic Logs</strong>：Key Vault <em>預設不記操作 log</em>、必須手動配 Diagnostic Setting 推 Log Analytics / Event Hub / Storage — 沒這層 <code>KeyVaultGet</code> / <code>SecretGet</code> 都沒 audit trail</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/knowledge-cards/audit-log/" data-link-title="Audit Log" data-link-desc="說明高風險操作如何留下可追溯、可稽核的紀錄">Audit Log</a> 與 <a href="/blog/backend/knowledge-cards/secret-management/" data-link-title="Secret Management" data-link-desc="說明 token、key、password 與憑證如何保存、輪替與撤銷">Secret Management</a> 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Vault Standard vs Premium</strong>：Standard 用 software protection（key 存在 Microsoft-managed software boundary）、Premium 用 FIPS 140-2 Level 2 HSM-backed key、key material 在 HSM 內、不可 export。Premium 適合 <em>signing key / wrapping key 等高敏 key</em>、Standard 適合 <em>application secret + 常規 envelope encryption key</em>。要 FIPS 140-2 Level 3、Standard 跟 Premium 都不夠、必須用 Managed HSM。</p>
<p><strong>Access Policy vs Azure RBAC（兩種授權）</strong>：Access Policy 是 Key Vault legacy 模型 — 在 Vault 物件上掛一張 capability 表（Get / List / Set / Delete / Encrypt / Sign 等細粒度權限）、跟 Azure RBAC 體系獨立。Azure RBAC 模型是新版 — 用 Azure built-in role（Key Vault Secrets User / Key Vault Crypto User / Key Vault Administrator）走 <a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Entra ID</a> 統一身份治理。production 全走 RBAC、舊 Vault 的 Access Policy 是 migration backlog — 兩軌並存會出現 <em>RBAC 拒絕但 Access Policy 允許</em> 的權限漏洞。</p>
<p><strong>Managed Identity 取用（secret-less）</strong>：Azure VM / Function / App Service / AKS pod 走 <em>Managed Identity</em> 直接呼叫 Key Vault API — 不需要存 client secret 或 cert。Workload 拿 IMDS token、token 帶 Entra ID identity、Key Vault 端用 RBAC role assignment 驗證 — 這是 Azure-native 的 secret-less 取用模式、跟 <a href="/blog/backend/07-security-data-protection/vendors/aws-iam/" data-link-title="AWS IAM" data-link-desc="AWS cloud resource permission engine、Role / Policy / STS、跨帳號信任邊界與 OIDC federation 的核心">AWS IAM Role for Service Account</a> / <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">GCP Workload Identity</a> 同類設計。production 應該 <em>只允許</em> Managed Identity 取用、禁用 service principal + client secret。</p>
<p><strong>Secret rotation（手動 / event-driven）</strong>：Key Vault Secret <em>沒有像 <a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">AWS Secrets Manager</a> 內建的 rotation Lambda</em>。Rotation 走兩條路：手動更新 secret version（app 端拉新版）、或 Event Grid 通知 secret 過期 + Azure Function 觸發 rotation。後者需要自己寫 rotation logic、Key Vault 只提供 <em>版本管理</em> 跟 <em>過期通知</em>、不負責執行 rotation。</p>
<p><strong>Key Rotation Policy</strong>：Key（不是 Secret）有 native Rotation Policy — Vault 在 key 到期前自動生成新版、舊版保留可解密但不再 encrypt。policy 設 <code>rotationPeriod</code> + <code>notifyBeforeExpiry</code>、Key Vault 自動跑、不需要外部觸發。Secret 沒這功能、Key 才有。</p>
<p><strong>Certificate auto-renewal</strong>：Certificate object 可整合 <em>Issuer</em>（DigiCert / GlobalSign / 自簽）做 auto-issue + auto-renew — Key Vault 在到期前自動跑 CSR、向 Issuer 申請新 cert、寫回同一個 Certificate object（保留歷史版本）。比起手動跑 OpenSSL + 寫進 <a href="/blog/backend/07-security-data-protection/vendors/aws-acm/" data-link-title="AWS ACM" data-link-desc="AWS-managed certificate provisioning、DNS validation &#43; auto-renewal、整合 ELB / CloudFront / API Gateway、Private CA 後端">AWS ACM</a>、Certificate object 的優勢是 <em>Issuer 在 Vault 端統一治理</em> — 不過只支援整合過的 public CA。</p>
<p><strong>Soft Delete + Purge Protection</strong>：Soft Delete 預設開（2020 後新 Vault 強制開）、delete 後 90 天 retention、Recover 可救回。Purge Protection 是 <em>額外</em> 開關 — 開了之後 retention 內任何人（包含 subscription owner）都不能 <code>purge</code> 立即清除、必須等 90 天到期才會物理刪除。這是 <em>防勒索</em> 的關鍵 — 沒 Purge Protection、attacker 拿到 owner role 可以 delete + purge 一次性清光。</p>
<p><strong>Private Endpoint</strong>：Key Vault 預設是 public endpoint（FQDN 走 internet）。Private Endpoint 把 Vault 拉進 VNet、只走內網存取 — 高敏 Vault 應該關 public access、強制走 Private Endpoint + Firewall rule（IP 白名單）。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Azure Key Vault</th>
          <th>AWS（拆三個）</th>
          <th>GCP（拆三個）</th>
          <th>HashiCorp Vault</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>部署模型</td>
          <td>Azure managed、三合一</td>
          <td>AWS managed、Secrets Manager + KMS + ACM 各獨立</td>
          <td>GCP managed、GSM + Cloud KMS + CAS 各獨立</td>
          <td>自管或 HCP managed</td>
      </tr>
      <tr>
          <td>服務邊界</td>
          <td>一個 Vault 內 secret/key/cert 共用 ACL</td>
          <td>三個 service 各自 IAM policy、邊界清楚</td>
          <td>三個 service 各自 IAM policy</td>
          <td>一個 cluster 內 path-based policy</td>
      </tr>
      <tr>
          <td>Secret-less 取用</td>
          <td>Managed Identity 原生</td>
          <td>IAM Role for Service Account / IRSA</td>
          <td>Workload Identity Federation</td>
          <td>AppRole / K8s / cloud IAM auth</td>
      </tr>
      <tr>
          <td>Dynamic credential</td>
          <td>無 — 純 static</td>
          <td>部分（RDS rotation Lambda）</td>
          <td>較弱（依靠 IAM impersonation）</td>
          <td>強 — database / cloud / SSH engine</td>
      </tr>
      <tr>
          <td>HSM 等級</td>
          <td>Standard 軟體 / Premium FIPS 140-2 Level 2 / Managed HSM Level 3</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/aws-kms/" data-link-title="AWS KMS" data-link-desc="AWS 原生 key management service、envelope encryption / digital signing / Multi-Region Key、Key Policy &#43; Grant 雙軌授權">KMS</a> Level 3 / <a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a> Level 3</td>
          <td>Cloud KMS HSM Level 3 / Cloud HSM Level 3</td>
          <td>走後端 KMS（AWS / GCP / Azure）</td>
      </tr>
      <tr>
          <td>Certificate auto-renew</td>
          <td>內建（整合 DigiCert / GlobalSign）</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/aws-acm/" data-link-title="AWS ACM" data-link-desc="AWS-managed certificate provisioning、DNS validation &#43; auto-renewal、整合 ELB / CloudFront / API Gateway、Private CA 後端">ACM</a> auto-renew、限 AWS-issued</td>
          <td>CAS + Public CA 整合</td>
          <td>PKI engine 自簽 + <a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">cert-manager</a></td>
      </tr>
      <tr>
          <td>跨雲</td>
          <td>弱 — Azure-only</td>
          <td>弱 — AWS-only</td>
          <td>弱 — GCP-only</td>
          <td>強 — 跨雲統一介面</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>Azure-heavy + 三合一一站式 + Managed Identity</td>
          <td>AWS-heavy + 職責拆分 + RDS 自動 rotation</td>
          <td>GCP-heavy + Workload Identity Federation</td>
          <td>跨雲 + dynamic credential + 內部 PKI</td>
      </tr>
  </tbody>
</table>
<p>選 Azure Key Vault 的核心訴求：<em>Azure-only</em>、需要 <em>secret + key + cert</em> 一站式、workload 走 <em>Managed Identity</em> secret-less 取用、可接受 <em>無 dynamic credential</em>。需要跨雲統一 secret 控制面、或要 dynamic database credential、走 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a>。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Managed HSM（dedicated）</strong>：Managed HSM 是 <em>dedicated single-tenant HSM cluster</em>、FIPS 140-2 Level 3、跟 multi-tenant 的 Key Vault Premium 是不同 service。Managed HSM 適合 <em>主權合規</em>（key material 完全自有控制權、Microsoft 也不可存取）、<em>金融 / 醫療 / 政府場景</em>。代價是 <em>貴</em> 跟 <em>初始化要走 ceremony</em>（多人持有 activation key、Microsoft 不可單方面操作）— 不是 Premium 的簡單升級、是另一條 product line。</p>
<p><strong>Premium tier HSM-backed Key</strong>：Premium tier 的 key 有 <code>HSM-protected</code> 屬性、key material 在 multi-tenant HSM 內、API call 還是走標準 Key Vault endpoint、但 cryptographic operation 在 HSM 跑。比 Standard 慢一點、價格高、適合 <em>signing key / wrapping key / root encryption key</em> — 一般 application secret 還是 Standard 即可。</p>
<p><strong>Certificate Issuer 整合</strong>：Vault 內可註冊 Issuer（DigiCert / GlobalSign / Entrust）、提供 API credential、Vault 在 Certificate 到期前自動跑 CSR、向 Issuer 申請、Issuer 簽完寫回 Vault。Self-signed / Unknown Issuer 也支援、後者表示 <em>Vault 產 CSR、人或 pipeline 拿去外部 CA 簽完再 import 回 Vault</em>。</p>
<p><strong>Cross-tenant key access（federated identity）</strong>：Key Vault 可允許跨 Entra ID tenant 的 service principal 取用 — 透過 Federated Identity Credential（Workload Identity Federation）、外部 tenant 的 identity（甚至 GitHub Actions OIDC、AWS workload）拿 token 來 Key Vault 驗證。這是 cross-cloud workload 拉 Azure secret 的方式、不需要存 Azure service principal credential。</p>
<p><strong>跟 <a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Entra ID</a> Conditional Access 整合</strong>：Key Vault 用 Azure RBAC 模型時、可走 Conditional Access policy — <em>特定 IP</em>、<em>已 enrolled 裝置</em>、<em>MFA 已驗證</em> 才能取用 secret / key。production 高敏 Vault 應該疊 Conditional Access、避免單純 RBAC 在 token leak 時就直接被存取。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>Diagnostic Setting 沒開</strong>：production Vault 啟用後忘了配 Diagnostic Setting 推 log、事故發生時無 <code>SecretGet</code> / <code>KeyDecrypt</code> 紀錄 — 啟動 checklist 必含「Diagnostic Setting → Log Analytics」、Azure Policy 強制全 subscription Vault 都配</li>
<li><strong>Access Policy 跟 RBAC 兩軌並存</strong>：migration 過程中 RBAC 已切換但舊 Access Policy 沒清、出現 <em>RBAC 拒絕但 Access Policy 允許</em> — migration 一次切斷、跑 <code>az keyvault update --enable-rbac-authorization true</code> 後清空所有 Access Policy</li>
<li><strong>Soft Delete 沒開 / Purge Protection 沒開</strong>：誤刪 secret 救不回、或 attacker 拿到 owner role 一次 purge 清光 — 新 Vault 兩個都強制開、Azure Policy 阻擋 <code>enablePurgeProtection: false</code> 的 Vault 建立</li>
<li><strong>Managed Identity role 過寬</strong>：給 workload identity <code>Key Vault Administrator</code> 而非 <code>Key Vault Secrets User</code> — workload 拿到 admin role 等於可改 ACL — role assignment 走 least privilege built-in role</li>
<li><strong>Premium key 跑非 HSM operation</strong>：Premium key 配錯 attribute、key 變成 software-protected 而非 HSM-protected — 建 key 時明示 <code>--protection hsm</code>、CI 驗證 key attribute</li>
<li><strong>Certificate auto-renew Issuer credential 過期</strong>：Vault 內 DigiCert API credential 過期、auto-renew 默默失敗、cert 到期前才發現 — Issuer credential 也要 rotation + monitor</li>
<li><strong>Public access 開著</strong>：Vault 沒關 public endpoint、secret 暴露在 internet（雖然有 RBAC、但 attack surface 多一層）— 高敏 Vault 強制 Private Endpoint + Firewall rule</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>跨雲統一 secret 控制面</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a></td>
      </tr>
      <tr>
          <td>Dynamic database / cloud credential</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a>（database / cloud secret engine）</td>
      </tr>
      <tr>
          <td>FIPS 140-2 Level 3 HSM</td>
          <td><a href="https://learn.microsoft.com/azure/key-vault/managed-hsm/overview">Managed HSM</a> / <a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a></td>
      </tr>
      <tr>
          <td>內部 PKI workload mTLS</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">cert-manager</a> + Vault PKI / SPIRE</td>
      </tr>
      <tr>
          <td>公開 web cert 自動更新（非 Azure-issued）</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/letsencrypt/" data-link-title="Let&#39;s Encrypt" data-link-desc="免費 &#43; 自動化的公共 ACME CA、90 天 TTL 強制自動化、跨雲跨平台 public TLS cert 的事實基礎">Let&rsquo;s Encrypt</a> + cert-manager</td>
      </tr>
      <tr>
          <td>Entra ID 身份治理 / Conditional Access</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Azure RBAC</a></td>
      </tr>
      <tr>
          <td>Secret rotation 證據鏈</td>
          <td><a href="/blog/backend/07-security-data-protection/credential-rotation-scoped-evidence/" data-link-title="7.27 Credential Rotation with Scoped Evidence 實作示範" data-link-desc="以 webhook/API credential 輪替示範 scope map、證據欄位與回退窗口如何一起設計。">7.5 Credential Rotation Scoped Evidence</a></td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>Key Vault REST API / Azure CLI 完整 reference</li>
<li>Managed HSM activation ceremony 完整步驟</li>
<li>Bicep / Terraform 配置 Key Vault 的完整 IaC 範例</li>
<li>Certificate Issuer（DigiCert / GlobalSign）的合約與計價細節</li>
<li>每個 Entra ID role 的細粒度 permission map</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Azure Key Vault 的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/azure-ad-identity-control-plane-2021/" data-link-title="7.C3 Azure AD：2021 Identity Control-plane 事件" data-link-desc="身分控制面事件如何影響多服務信任鏈與回復優先序。">Azure AD Identity Control Plane 2021</a></td>
          <td>Key Vault 是身份控制面下游、Entra ID 出事時 Managed Identity 取 Vault 也失敗 — 需要 fallback access plan（emergency Access Policy + separate identity 走 break-glass）</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/microsoft-storm-0558-signing-key-2023/" data-link-title="7.C4 Microsoft：Storm-0558 簽章金鑰事件" data-link-desc="簽章金鑰事件如何回寫 identity 信任邊界與觀測證據鏈。">Microsoft Storm-0558 Signing Key 2023</a></td>
          <td>Key Vault Premium / Managed HSM 把 signing key 鎖硬體、key 不離保護邊界、跟 HSM-bound 同 mindset — signing key 必上 Premium 或 Managed HSM、不放 Standard</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/microsoft-storm-0558-2023-signing-key-chain/" data-link-title="7.R7.1.5 Microsoft Storm-0558 2023：簽章金鑰鏈與郵件存取" data-link-desc="從簽章金鑰保護失效到雲端郵件存取，拆解身分信任鏈的關鍵控制點">Microsoft Storm-0558 Signing Key Chain (red-team)</a></td>
          <td>Asymmetric Key + Diagnostic Logs 是「誰用 key」的稽核基礎 — production Vault 必開 Diagnostic Setting 推 SIEM、不然 key 被誰用過完全沒紀錄</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a></td>
          <td>Key Vault Secret 跨 service 共用時 rotation 要分域 — Vault 端用 Event Grid 通知 + app 端訂閱 rotation event、不能一次 push 全域更新</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/secrets-and-machine-credential-governance/" data-link-title="7.6 秘密管理與機器憑證治理" data-link-desc="以問題驅動方式整理 secret、token、key 與機器身份治理">7.6 秘密管理與機器憑證治理</a>、<a href="/blog/backend/07-security-data-protection/transport-trust-and-certificate-lifecycle/" data-link-title="7.5 傳輸信任與憑證生命週期" data-link-desc="以問題驅動方式整理傳輸信任鏈、會話完整性與憑證節奏">7.5 傳輸信任與憑證生命週期</a>（Key Vault Certificate + Managed HSM 為 TLS / signing key 的 root custodian）、<a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">7.2 身分與授權邊界</a></li>
<li>平行（secret store）：<a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">AWS Secrets Manager</a>、<a href="/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager</a>、<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a></li>
<li>平行（KMS-class）：<a href="/blog/backend/07-security-data-protection/vendors/aws-kms/" data-link-title="AWS KMS" data-link-desc="AWS 原生 key management service、envelope encryption / digital signing / Multi-Region Key、Key Policy &#43; Grant 雙軌授權">AWS KMS</a>、<a href="/blog/backend/07-security-data-protection/vendors/google-cloud-kms/" data-link-title="Google Cloud KMS" data-link-desc="GCP 原生 key management service、KeyRing / CryptoKey Version 設計、CMEK 整合 &#43; Cloud HSM &#43; External Key Manager">Google Cloud KMS</a>、<a href="/blog/backend/07-security-data-protection/vendors/cloudhsm/" data-link-title="AWS CloudHSM" data-link-desc="Single-tenant dedicated HSM（FIPS 140-2 Level 3）、AWS 不持 Crypto User credential、合規 &#43; 資料主權場景的 key custody">CloudHSM</a>（Key Vault 是跨類 vendor、同時是 secret store 跟 key management）</li>
<li>下游：<a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Azure RBAC</a>（Managed Identity + RBAC 取用模型）</li>
<li>下游：<a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">cert-manager</a>（K8s workload cert 自動化、可整合 Key Vault Certificate）</li>
<li>跨模組：<a href="/blog/backend/08-incident-response/vendors/" data-link-title="事故處理 Vendor 清單" data-link-desc="規劃 on-call、incident response、status page 與 postmortem 工具的服務頁撰寫順序與判準">8 事故處理 vendor 清單</a>（Key Vault 事件如何 routing 進 IR 流程）</li>
<li>官方：<a href="https://learn.microsoft.com/azure/key-vault/">Azure Key Vault Documentation</a></li>
</ul>
]]></content:encoded></item></channel></rss>