<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>資訊安全 - 東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</title>
	<atom:link href="https://dongdonggcp.com/category/%E8%B3%87%E8%A8%8A%E5%AE%89%E5%85%A8/feed/" rel="self" type="application/rss+xml" />
	<link>https://dongdonggcp.com</link>
	<description>助你考取證照，轉職成功</description>
	<lastBuildDate>Wed, 22 Apr 2026 10:31:54 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://dongdonggcp.com/wp-content/uploads/2025/04/cropped-340838097_121391010914395_5443948698124160121_n-32x32.jpg</url>
	<title>資訊安全 - 東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</title>
	<link>https://dongdonggcp.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">243235092</site>	<item>
		<title>GCP Organization Policy 完全攻略：Google Cloud 安全工程師必備知識</title>
		<link>https://dongdonggcp.com/2026/04/22/gcp-organization-policy-introduction/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gcp-organization-policy-introduction</link>
					<comments>https://dongdonggcp.com/2026/04/22/gcp-organization-policy-introduction/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 10:31:51 +0000</pubDate>
				<category><![CDATA[資訊安全]]></category>
		<category><![CDATA[GCP Organization Policy]]></category>
		<category><![CDATA[GCP Security]]></category>
		<category><![CDATA[機構政策]]></category>
		<category><![CDATA[組織政策]]></category>
		<guid isPermaLink="false">https://dongdonggcp.com/?p=11790</guid>

					<description><![CDATA[<p>GCP Organization Pol [&#8230;]</p>
<p>The post <a href="https://dongdonggcp.com/2026/04/22/gcp-organization-policy-introduction/">GCP Organization Policy 完全攻略：Google Cloud 安全工程師必備知識</a> first appeared on <a href="https://dongdonggcp.com">東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</a>.</p>]]></description>
										<content:encoded><![CDATA[<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><a href="https://docs.cloud.google.com/organization-policy/overview" target="_blank" rel="noopener" title="">GCP Organization Policy</a>（組織政策）是 Google Cloud 提供的集中式資安政策管理工具，讓管理員統一設定「全公司的資源可以怎麼使用」，透過 Constraints（約束條件）在 Organization、Folder、Project 三層結構中強制執行安全限制。與 IAM 管理「誰能做什麼」不同，Organization Policy 管理「任何人都不能做什麼」——違規操作一律擋下，不受 IAM 角色影響。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">如果說 IAM 是管理「誰可以做什麼」的工具，那 <strong>GCP Organization Policy</strong> 就是管理「全公司的資源可以怎麼使用」的守門員。兩者看起來很像，但扮演的角色完全不同。</p>



<h2 class="wp-block-heading">1. 什麼是 GCP Organization Policy？</h2>



<h3 class="wp-block-heading">什麼是 Organization Policy？</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>GCP Organization Policy Service</strong> 是 Google Cloud 的集中式治理工具，透過定義 Constraints（約束條件），在整個雲端環境中統一規定哪些行為被允許、哪些行為被禁止。它是一種「護欄機制（Guardrail）」——不論操作者是誰、擁有什麼 IAM 角色，只要行為違反政策，一律擋下。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Organization Policy 的設定方式，是透過定義一系列的 <strong>Constraints（約束條件）</strong> 來實現。每個 constraint 對應一個特定的 Google Cloud 行為，例如：</p>



<ul class="wp-block-list">
<li>可不可以建立有公開 IP 的 VM？</li>



<li>可不可以使用未受信任的 OS 映像檔？</li>



<li>Storage bucket 能不能公開存取？</li>
</ul>



<p class="wp-block-paragraph">這些 constraint 可以套用在<strong>組織（Organization）、資料夾（Folder）或專案（Project）</strong> 層級，並依照層級結構自動向下繼承。</p>



<h3 class="wp-block-heading">為什麼 Organization Policy 比 IAM 更重要？</h3>



<p class="wp-block-paragraph">IAM 和 Organization Policy 是 Google Cloud 安全架構的兩個不同層次，不能互相取代：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>IAM</th><th>Organization Policy</th></tr></thead><tbody><tr><td>管理對象</td><td>身分（人、服務帳戶）</td><td>對資源的操作與設定</td></tr><tr><td>設定粒度</td><td>個別資源或專案</td><td>組織、資料夾、專案</td></tr><tr><td>執行機制</td><td>授權或拒絕操作</td><td>允許或禁止特定行為</td></tr><tr><td>繼承方式</td><td>自動向下繼承</td><td>自動向下繼承</td></tr><tr><td>典型用途</td><td>誰能讀取 GCS bucket</td><td>所有 bucket 不能公開</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Organization Policy 的優先層級高於 IAM 授權。就算某個使用者有 <code>Compute Instance Admin</code> 的 IAM 角色，如果組織政策規定「所有 VM 不得有外部 IP」，他一樣無法建立有外部 IP 的 VM。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">用比喻來說：</p>



<ul class="wp-block-list">
<li><strong>IAM</strong> 是「員工識別證」——決定某個人能不能進入這棟大樓、使用這台機器。</li>



<li><strong>Organization Policy</strong> 是「公司規章」——不管是誰，所有人都必須遵守，違規一律擋下。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. Organization Policy 的資源層級繼承架構</h2>



<h3 class="wp-block-heading">它是怎麼運作的？</h3>



<p class="wp-block-paragraph">Google Cloud 的資源以樹狀結構組織：</p>



<pre class="wp-block-code"><code>Organization（組織）
    └── Folder（資料夾）
            └── Project（專案）
                    └── Resources（資源）</code></pre>



<p class="wp-block-paragraph">當在 <strong>Organization 層級</strong>設定一個 Organization Policy 時，這個政策會自動往下繼承到所有 Folder、Project 和資源。組織管理員可以用最少的設定，達到全面覆蓋的效果。</p>



<p class="wp-block-paragraph"><strong>實際情境：</strong> 假設你在 Organization 層級設定政策，禁止任何 VM 使用外部 IP 位址，那麼整個組織底下的所有 Folder、所有 Project，都不能建立有外部 IP 的 VM——除非有特別的 Override 設定。</p>



<figure class="wp-block-image aligncenter size-large"><img fetchpriority="high" decoding="async" width="1024" height="533" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Organization-Policy-的資源層級繼承架構-1024x533.png" alt="" class="wp-image-11796" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Organization-Policy-的資源層級繼承架構-1024x533.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/Organization-Policy-的資源層級繼承架構-300x156.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Organization-Policy-的資源層級繼承架構-768x400.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/Organization-Policy-的資源層級繼承架構.png 1319w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Organization Policy 的資源層級繼承架構</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">inheritFromParent 是什麼？為什麼重要？</h3>



<p class="wp-block-paragraph"><code>inheritFromParent</code> 是理解 Organization Policy 繼承機制的核心欄位。</p>



<ul class="wp-block-list">
<li><strong>預設（inheritFromParent: true）</strong>：子層節點（Folder 或 Project）從父層繼承政策。</li>



<li><strong>設定 inheritFromParent: false</strong>：該節點完全切斷與父層的政策繼承，改用自己設定的政策。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">一旦子節點設定 <code>inheritFromParent: false</code>，它的政策就完全獨立運作。即使 Organization 層級允許某個網域，這個允許對該 Folder 完全無效——Folder 只認自己設定的規則。這是安全架構設計中最容易踩到的陷阱之一。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>具體案例：</strong></p>



<ul class="wp-block-list">
<li>Organization 層級：允許 <code>abc.com</code> 的成員</li>



<li>Apps Folder 層級：只允許 <code>def.com</code> 的成員，並設定 <code>inheritFromParent: false</code></li>
</ul>



<p class="wp-block-paragraph">結果：嘗試把 <code>peter@abc.com</code> 加入 Apps Folder 底下某個 Project 的 IAM 政策，<strong>會直接失敗</strong>。因為 Apps Folder 已完全切斷繼承，只認 <code>def.com</code>。</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="531" src="https://dongdonggcp.com/wp-content/uploads/2026/04/政策斷點-inheritFrom-Parent-覆蓋機制的運作邏輯-1024x531.png" alt="" class="wp-image-11797" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/政策斷點-inheritFrom-Parent-覆蓋機制的運作邏輯-1024x531.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/政策斷點-inheritFrom-Parent-覆蓋機制的運作邏輯-300x156.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/政策斷點-inheritFrom-Parent-覆蓋機制的運作邏輯-768x398.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/政策斷點-inheritFrom-Parent-覆蓋機制的運作邏輯-1536x796.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/政策斷點-inheritFrom-Parent-覆蓋機制的運作邏輯.png 1863w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">政策斷點 inheritFrom Parent 覆蓋機制的運作邏輯</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. 兩大核心 Constraint 類型：List vs Boolean</h2>



<h3 class="wp-block-heading">List Constraint（清單限制）</h3>



<p class="wp-block-paragraph">List Constraint 用「<strong>允許清單（Allow List）</strong>」或「<strong>拒絕清單（Deny List）</strong>」控制特定資源的使用範圍：</p>



<ul class="wp-block-list">
<li><strong>Allow（允許）操作</strong>：只有清單內的值才被允許，其他的全部拒絕</li>



<li><strong>Deny（拒絕）操作</strong>：清單內的值被禁止，其他的則允許</li>
</ul>



<p class="wp-block-paragraph">例如：<code>compute.trustedImageProjects</code> 是一個 List Constraint，用 Allow 操作把特定 Project 列入白名單，代表整個組織只能從這個 Project 的映像檔建立 boot disk。</p>



<h3 class="wp-block-heading">Boolean Constraint（布林限制）</h3>



<p class="wp-block-paragraph">Boolean Constraint 只有兩個選項：<strong>開（Enforced）</strong> 或 <strong>關（Not Enforced）</strong>。</p>



<p class="wp-block-paragraph">例如：<code>constraints/iam.disableServiceAccountCreation</code>，設定為 Enforced 後，整個組織就無法建立新的服務帳戶。沒有白名單、沒有例外，就是一個開關。</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="562" src="https://dongdonggcp.com/wp-content/uploads/2026/04/兩大控制閥門-布林開關與清單過濾-1024x562.png" alt="" class="wp-image-11798" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/兩大控制閥門-布林開關與清單過濾-1024x562.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/兩大控制閥門-布林開關與清單過濾-300x165.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/兩大控制閥門-布林開關與清單過濾-768x422.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/兩大控制閥門-布林開關與清單過濾.png 1288w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">兩大控制閥門:布林開關與清單過濾</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. 限制可信任映像檔來源：compute.trustedImageProjects</h2>



<h3 class="wp-block-heading">為什麼要控制 Boot Disk 映像檔來源？</h3>



<p class="wp-block-paragraph">在企業環境中，VM 使用的 OS 映像品質直接影響整體安全性。隨意使用公開市場上未經審核的映像檔，可能引入：</p>



<ul class="wp-block-list">
<li>映像檔內含已知漏洞（CVE）</li>



<li>映像檔被植入惡意程式</li>



<li>不符合企業安全強化（Hardening）標準</li>
</ul>



<p class="wp-block-paragraph">企業安全團隊通常會維護一個「<strong>黃金映像（Golden Image）</strong>」專案，所有 VM 只能從這個專案中的映像建立。</p>



<h3 class="wp-block-heading">如何設定？</h3>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">要讓所有 VM 只使用安全強化的 OS 映像，需要同時完成兩個步驟：</p>



<ol class="wp-block-list">
<li><strong>設定 Organization Policy</strong>：在 Organization 層級啟用 <code>compute.trustedImageProjects</code>，以 <strong>Allow</strong> 操作列入受信任的 Project（例如 <code>security-images-project</code>）當你使用 Allow 動作，它就是白名單的方式，同時，會阻擋所有不在白名單的映像檔。</li>



<li><strong>設定 IAM 權限</strong>：在 <code>security-images-project</code> 中，授予組織內使用者 <code>compute.imageUser</code> 角色，讓他們有讀取並使用映像的權限</li>
</ol>



<p class="wp-block-paragraph">Policy 確保大家只能用這個 Project 的映像；IAM 確保大家有權限存取這個 Project。兩個步驟缺一不可。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>為什麼用 Allow 而不是 Deny？</strong> 因為 Allow 的語義是「只有這些才被允許」，天然具有「排除其他所有選項」的效果。如果用 Deny，你只是拒絕了你列出的幾個專案，但其他未列出的公開映像仍然可以使用——這不是我們要的結果。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="526" src="https://dongdonggcp.com/wp-content/uploads/2026/04/限制可信任映像檔來源-1024x526.png" alt="" class="wp-image-11799" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/限制可信任映像檔來源-1024x526.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/限制可信任映像檔來源-300x154.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/限制可信任映像檔來源-768x394.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/限制可信任映像檔來源-1536x788.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/限制可信任映像檔來源-2048x1051.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5. 限制專案建立權限：集中管理 Project Creator 角色</h2>



<h3 class="wp-block-heading">為什麼要集中控制專案建立？</h3>



<p class="wp-block-paragraph">當你建立好一個 GCP 的組織機構，你會看到任何在這個網域的人員都有這兩個權限，專案建立者和帳單帳戶建立者。</p>



<p class="wp-block-paragraph">在大型企業中，如果所有人都能自由建立 GCP 專案，很快就會出現「<strong>專案蔓延（Project Sprawl）</strong>」——到處都是沒人管的孤兒專案，浪費資源又製造安全風險。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="422" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Org_member_default_iam_role-1024x422.png" alt="" class="wp-image-11822" style="aspect-ratio:2.426636283073807;width:689px;height:auto" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Org_member_default_iam_role-1024x422.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/Org_member_default_iam_role-300x124.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Org_member_default_iam_role-768x317.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/Org_member_default_iam_role-1536x634.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/Org_member_default_iam_role.png 1716w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">GCP 的組織機構預設會給所有網域成員的權限</figcaption></figure>



<h3 class="wp-block-heading">怎麼做？</h3>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">只讓特定團隊建立專案，需要同時執行兩個步驟：</p>



<ol class="wp-block-list">
<li><strong>移除一般使用者的 Project Creator 角色</strong>：在 Organization 層級，把所有使用者從 Project Creator 角色中移除，一般使用者就無法自行建立新專案</li>



<li><strong>授權指定團隊</strong>：把負責專案管理的 DevOps 團隊群組，加入 Organization 層級的 Project Creator 角色</li>
</ol>



<p class="wp-block-paragraph">注意：兩個步驟必須同時執行。只移除一般使用者但沒有指定誰來建立，專案建立會完全癱瘓；只授權 DevOps 但沒移除一般使用者，限制就沒有意義。</p>
</blockquote>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="234" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Remove_Project_Creator-1024x234.png" alt="" class="wp-image-11821" style="width:1024px;height:auto" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Remove_Project_Creator-1024x234.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/Remove_Project_Creator-300x68.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Remove_Project_Creator-768x175.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/Remove_Project_Creator.png 1367w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">在 Organization Level 移除一般使用者的 Project Creator 角色</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">6. 控制 VM 的公開 IP 位址：保護生產環境安全</h2>



<h3 class="wp-block-heading">為什麼生產環境不應有公開 IP？</h3>



<p class="wp-block-paragraph">給 VM 一個公開 IP 位址，等於把它直接曝露在網際網路上。對於資料庫伺服器、內部 API 服務、或任何不需要對外的 VM 來說，這是巨大的安全風險——攻擊者可以直接掃描公開 IP，嘗試暴力破解 SSH 或進行 DDoS 攻擊。</p>



<p class="wp-block-paragraph">如下圖你可以看到，當我建立好一臺虛擬機器時，隨時都有駭客在掃描我的外部 IP 並且嘗試登入。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="402" src="https://dongdonggcp.com/wp-content/uploads/2026/04/6-3-1-隨時有人嘗試登入主機-1024x402.png" alt="" class="wp-image-11823" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/6-3-1-隨時有人嘗試登入主機-1024x402.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/6-3-1-隨時有人嘗試登入主機-300x118.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/6-3-1-隨時有人嘗試登入主機-768x302.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/6-3-1-隨時有人嘗試登入主機-1536x603.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/6-3-1-隨時有人嘗試登入主機.png 1912w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">網路上隨時都有駭客在掃描 VM 的 IP 並且嘗試登入</figcaption></figure>



<h3 class="wp-block-heading">如何同時保留前端 IP，鎖定其他 VM？</h3>



<p class="wp-block-paragraph">現實情況往往是：前端 Web 伺服器需要公開 IP，但後端應用程式和資料庫不應該有。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">使用 <code>constraints/compute.vmExternalIpAccess</code> 這個 constraint，在政策中明確列出哪些 VM 實例可以使用外部 IP（以資源名稱方式列入 Allow 清單），其餘的 VM 自動被禁止。這比 VPC 分割更精準（VPC 分割以子網路為單位，無法做到 VM 層級的細粒度控制），也比移除 IAM 角色更直接，並且不依賴工程師手動記得不勾選外部 IP。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7. 服務帳戶安全管控：三大 IAM 約束條件</h2>



<p class="wp-block-paragraph">服務帳戶（Service Account）是 GCP 中機器身分的代表，也是許多安全事件的攻擊目標。Organization Policy 提供三個相關 constraint 加強管控：</p>



<h3 class="wp-block-heading">三個 Constraint 快速比較</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Constraint</th><th>作用</th><th>類型</th><th>適用場景</th></tr></thead><tbody><tr><td><code>iam.disableServiceAccountCreation</code></td><td>禁止建立新服務帳戶</td><td>Boolean</td><td>生產環境集中管控</td></tr><tr><td><code>iam.disableServiceAccountKeyCreation</code></td><td>禁止建立服務帳戶金鑰</td><td>Boolean</td><td>CI/CD 安全加固</td></tr><tr><td><code>iam.disableServiceAccountKeyUpload</code></td><td>禁止上傳服務帳戶金鑰</td><td>Boolean</td><td>防止外部金鑰匯入</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><code>disableServiceAccountKeyCreation</code> 和 <code>disableServiceAccountCreation</code> 是兩個功能完全不同的 constraint，不能混用。前者只限制「金鑰的建立」，服務帳戶本身還是存在的；後者才是直接禁止「服務帳戶的建立」。混淆這兩者，是企業安全配置中最常見的錯誤之一。</p>



<p class="wp-block-paragraph">而 <code>disableServiceAccountKeyUpload</code>，是因爲用戶可以任意建立金鑰並且上傳到 GCP 上，聽起來很方便，但這個金鑰是怎麼產生的？密碼強度夠不夠？甚至不知道這個金鑰是不是每個人都有，或者甚至是駭客上傳的。因此，在資安上會造成潛在的威脅。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">CI/CD 場景的最佳實務</h3>



<p class="wp-block-paragraph">在 CI/CD 場景中，建議：</p>



<ol class="wp-block-list">
<li>為 CI/CD cluster 建立一個專屬的自訂服務帳戶</li>



<li>在 Project 層級啟用 <code>constraints/iam.disableServiceAccountKeyCreation</code></li>



<li>讓 CI/CD 工具改用 <strong>Workload Identity Federation</strong> (如 Github) 或 <strong>Instance Metadata Service</strong> 取得短期憑證 </li>
</ol>



<p class="wp-block-paragraph">這樣即使有人嘗試為服務帳戶建立金鑰，也會被 Policy 阻擋，從源頭消除靜態憑證洩漏的風險。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">8. 保護 Shared VPC 主機專案不被誤刪</h2>



<h3 class="wp-block-heading">什麼是 Shared VPC？為什麼需要保護？</h3>



<p class="wp-block-paragraph"><strong>Shared VPC</strong>（又稱 XPN，Cross-Project Networking）讓多個專案共享同一個 VPC 網路。其中的 <strong>Host Project（主機專案）</strong> 負責提供 VPC 資源給其他 Service Projects 使用。如果 Host Project 被誤刪，所有依賴這個 VPC 的服務都會瞬間斷線。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Google Cloud 會自動為 Shared VPC Host Project 加上 **Lien（留置權）**防止被誤刪，但若使用者有足夠權限，可以手動移除這個 Lien 再刪除專案。啟用 <code>compute.restrictXpnProjectLienRemoval</code> 這個 constraint 後，就算使用者有 Project 刪除權限，也無法移除 Shared VPC Host Project 的 Lien，從根本保護關鍵網路資源不被誤刪。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">9. 網域限制共用政策：iam.allowedPolicyMemberDomains</h2>



<h3 class="wp-block-heading">為什麼要限制外部網域存取資源？</h3>



<p class="wp-block-paragraph">在預設情況下，Google Cloud 的 IAM 允許把任何 Google 帳戶加入專案的 IAM 政策。如果工程師不小心把外部 Gmail 帳戶加入專案，外部人員就能存取企業的雲端資源。</p>



<p class="wp-block-paragraph"><code>constraints/iam.allowedPolicyMemberDomains</code> 讓你指定哪些網域（以 Google Workspace 客戶 ID 或 Cloud Identity 客戶 ID 方式指定）才能被加入 IAM 政策，不在清單內的網域一律無法被授予任何權限。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="210" src="https://dongdonggcp.com/wp-content/uploads/2026/04/allowedPolicyMemberDomains-1024x210.png" alt="" class="wp-image-11820" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/allowedPolicyMemberDomains-1024x210.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/allowedPolicyMemberDomains-300x62.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/allowedPolicyMemberDomains-768x158.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/allowedPolicyMemberDomains.png 1397w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Organization Policy 網域邊界限制</figcaption></figure>



<h3 class="wp-block-heading">如何為外部合作夥伴開設例外政策？</h3>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">在維持 <code>iam.allowedPolicyMemberDomains</code> 政策的前提下，為外部合作夥伴開設例外的正確流程：</p>



<ol class="wp-block-list">
<li>暫時關閉 <code>iam.allowedPolicyMemberDomains</code> 政策</li>



<li>將政策值設定為「Custom（自訂）」</li>



<li>把外部合作夥伴的 Cloud Identity 或 Google Workspace 客戶 ID 加入 constraint 的例外清單</li>



<li>確認設定正確後，重新啟用政策</li>
</ol>



<p class="wp-block-paragraph">注意：把合作夥伴帳號加入 Google Group <strong>不能</strong>繞過這個限制。這個 constraint 是以<strong>客戶 ID</strong>為單位做網域驗證的。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">10. Cloud Storage 安全防護：防止資料對外公開洩漏</h2>



<h3 class="wp-block-heading">什麼是 storage.publicAccessPrevention？</h3>



<p class="wp-block-paragraph"><code>constraints/storage.publicAccessPrevention</code> 是專門防止 Cloud Storage 資料外洩的 constraint。啟用後，組織內所有 Cloud Storage bucket（包含未來新建立的）都無法被設定為允許匿名的公開存取。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">建立完整的 Cloud Storage 存取控制，建議搭配兩個設定的「黃金組合」：啟用 <code>storage.publicAccessPrevention</code>（防止 bucket 被匿名公開存取）+ 啟用 <strong>Uniform Bucket-Level Access</strong>（關閉 ACL，統一改用 IAM 管理 bucket 存取）。前者防止資料因設定疏漏而意外公開，後者防止因外部帳號被加入 IAM 而導致外洩。兩者相輔相成，缺一不可。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="540" src="https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-22-下午6.10.17-1024x540.png" alt="" class="wp-image-11825" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-22-下午6.10.17-1024x540.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-22-下午6.10.17-300x158.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-22-下午6.10.17-768x405.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-22-下午6.10.17.png 1276w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">防止 data 被公開存取，並且統一存取權限。</figcaption></figure>



<h2 class="wp-block-heading">11. 強制使用 CMEK 加密：gcp.restrictNonCmekServices</h2>



<h3 class="wp-block-heading">什麼是 CMEK？</h3>



<p class="wp-block-paragraph"><strong>CMEK（Customer-Managed Encryption Keys，客戶自管加密金鑰）</strong> 是 Google Cloud 提供的加密機制。預設情況下，Google Cloud 使用自己管理的金鑰（GMEK）加密資料。CMEK 讓企業可以使用自己在 Cloud KMS 中管理的金鑰進行加密。</p>



<p class="wp-block-paragraph">企業強制使用 CMEK 的主要原因：</p>



<ul class="wp-block-list">
<li><strong>法規合規</strong>：金融業、醫療業、GDPR 場景可能要求對加密金鑰有完整控制權</li>



<li><strong>資料主權</strong>：企業可以隨時撤銷金鑰，確保資料的最終控制權在自己手中</li>



<li><strong>審計要求</strong>：所有金鑰的使用記錄都可以在 Cloud KMS 中審計</li>
</ul>



<h3 class="wp-block-heading">如何強制使用 CMEK？Deny 才是正確做法</h3>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><code>constraints/gcp.restrictNonCmekServices</code> 的語義是「限制哪些服務<strong>可以不使用</strong> CMEK」。要強制所有 Cloud Storage 資源必須使用 CMEK，正確設定是使用 <strong>Deny</strong> 操作，將 <code>storage.googleapis.com</code> 列入拒絕清單。如果誤用 Allow 操作，代表的是「允許 Cloud Storage 不用 CMEK」，效果完全相反。這是實務配置中最容易搞反的邏輯之一。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">正確設定範例：</p>



<pre class="wp-block-code"><code>constraint: gcp.restrictNonCmekServices
binding at: org1
policy type: deny
policy value: storage.googleapis.com</code></pre>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="542" src="https://dongdonggcp.com/wp-content/uploads/2026/04/restrictNonCmekServices-1024x542.png" alt="" class="wp-image-11826" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/restrictNonCmekServices-1024x542.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/restrictNonCmekServices-300x159.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/restrictNonCmekServices-768x406.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/restrictNonCmekServices.png 1283w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">強制實施CMEK 加密</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">12. 資源地理位置限制：GDPR 合規的利器</h2>



<h3 class="wp-block-heading">什麼時候需要 Resource Location Restriction？</h3>



<p class="wp-block-paragraph">當企業需要遵守 <strong>GDPR</strong> 或其他有資料落地要求的法規時，確保所有 Google Cloud 資源只建立在特定地理區域是非常重要的合規要求。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">限制 Google Cloud 資源只能建立在特定地理區域，<strong>唯一正確的工具</strong>是 <code>constraints/gcp.resourceLocations</code>（Resource Location Restriction）。常見的錯誤做法包括：使用 IAM 自訂角色（IAM 沒有以地理位置為條件的授權機制）、使用 Identity-Aware Proxy（IAP 是管理使用者對應用程式的存取，和資源建立地點無關）、使用 Restrict Resource Service Usage（這個 constraint 是限制服務使用，不是限制地理位置）。</p>
</blockquote>



<p class="wp-block-paragraph"><code>constraints/gcp.resourceLocations</code> 支援以 Region、Multi-region 或具體的 Zone 為單位設定限制，能夠非常精確地控制資源的建立位置。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="555" src="https://dongdonggcp.com/wp-content/uploads/2026/04/resourceLocations-1024x555.png" alt="" class="wp-image-11827" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/resourceLocations-1024x555.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/resourceLocations-300x162.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/resourceLocations-768x416.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/resourceLocations.png 1289w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Resource Location Restriction 可以限制資源所在地以符合當地法規</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">13. 組織政策被繞過了怎麼辦？常見原因排查</h2>



<h3 class="wp-block-heading">為什麼政策對某個 Project 失效了？</h3>



<p class="wp-block-paragraph">假設你在 Folder 層級設定了政策，禁止所有 VM 使用外部 IP，但兩天後發現某個 Project 底下的 VM 竟然有外部 IP。</p>



<p class="wp-block-paragraph"><strong>最常見原因：</strong> 該 Project 在 Project 層級對這個 constraint 設定了 Override，把政策值改成了「Allow」，因此 Folder 層級的禁止設定對這個 Project 失效了。</p>



<h3 class="wp-block-heading">排查步驟</h3>



<ol class="wp-block-list">
<li>到 Google Cloud Console → <strong>Organization Policy</strong>，找到該 constraint</li>



<li>查看政策的繼承情況，確認各個層級的設定值</li>



<li>找出哪個層級有 Override，然後移除或修正</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">在 Google Cloud 的 Organization Policy 機制中，子層的 Policy 可以覆蓋父層的 Policy（除非父層政策設定了不允許 Override）。「沉默代表繼承」——如果你希望某個 Folder 或 Project 有不同的行為，必須明確在那個層級設定 Override；如果沒有設定，就代表接受上層的政策設定，沒有任何例外。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="520" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Policy_Override-1024x520.png" alt="" class="wp-image-11828" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Policy_Override-1024x520.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/Policy_Override-300x152.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Policy_Override-768x390.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/Policy_Override.png 1295w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">檢查 Organization Policy 覆蓋的狀況</figcaption></figure>



<h2 class="wp-block-heading">14. 預設網路與 CI/CD 管道的安全配置</h2>



<h3 class="wp-block-heading">compute.skipDefaultNetworkCreation 是什麼？</h3>



<p class="wp-block-paragraph">當一個新的 Google Cloud Project 被建立時，系統預設會自動建立一個 <strong>Default VPC 網路</strong>。這個預設網路有幾個問題：</p>



<ul class="wp-block-list">
<li>防火牆規則預設允許許多常見的輸入連線（如 SSH、RDP），不符合最小權限原則</li>



<li>大型組織中，每個 Project 都有預設網路，網路架構會變得混亂難以管理</li>



<li>工程師可能直接在預設網路上部署資源，沒有任何額外的安全配置</li>
</ul>



<p class="wp-block-paragraph"><strong>解決方法：</strong> 在 Organization 層級啟用 <code>constraints/compute.skipDefaultNetworkCreation</code>。啟用後，所有新建立的 Project 都不會自動產生預設 VPC 網路，工程師必須根據企業的網路架構規範手動建立符合要求的 VPC。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="561" src="https://dongdonggcp.com/wp-content/uploads/2026/04/skipDefaultNetworkCreation-1024x561.png" alt="" class="wp-image-11824" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/skipDefaultNetworkCreation-1024x561.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/skipDefaultNetworkCreation-300x164.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/skipDefaultNetworkCreation-768x421.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/skipDefaultNetworkCreation.png 1272w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">避免使用預設的 VPC 網絡，產生較寬鬆的防火牆規則。</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">15. 備戰重點整理與常見觀念陷阱</h2>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>GCP Organization Policy 六大常見陷阱：</strong></p>



<ol class="wp-block-list">
<li><strong>Allow vs Deny 搞反</strong>：<code>compute.trustedImageProjects</code> 用 Allow（只允許白名單）；<code>gcp.restrictNonCmekServices</code> 用 Deny（禁止不用 CMEK）</li>



<li><strong>Boolean Constraint 混用</strong>：<code>disableServiceAccountCreation</code>（禁建帳戶）≠ <code>disableServiceAccountKeyCreation</code>（禁建金鑰）</li>



<li><strong>繼承機制誤解</strong>：<code>inheritFromParent: false</code> 會讓子節點完全獨立，父層允許的規則在此完全無效</li>



<li><strong>地理位置限制用錯工具</strong>：要限制資源建立地區，只能用 <code>gcp.resourceLocations</code>，IAM 和 IAP 都做不到</li>



<li><strong>Shared VPC 保護工具記錯</strong>：用 <code>compute.restrictXpnProjectLienRemoval</code>，不是 <code>restrictSharedVpcHostProjects</code></li>



<li><strong>Cloud Storage 防護不完整</strong>：<code>storage.publicAccessPrevention</code> 要搭配 Uniform Bucket-Level Access 才形成完整防線</li>
</ol>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">結論</h2>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">GCP Organization Policy 是 Google Cloud 安全架構中不可或缺的一環，它在 IAM 之上提供更高維度的護欄——無論誰來操作、用什麼角色，只要行為違反組織政策，就一律擋下。從映像檔的來源控制、VM 的 IP 管理、服務帳戶的建立限制，到 Cloud Storage 的公開防護和 CMEK 加密強制，每一個 constraint 背後都對應著真實的企業安全需求。建議在設計組織的雲端安全架構時，把 Organization Policy 的規劃納入最早期的階段，先把護欄架好，讓工程師在安全的邊界內自由發揮。</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">常見問題解答（FAQ）</h2>



<p class="wp-block-paragraph"><strong>Q1：Organization Policy 和 IAM 條件（IAM Conditions）有什麼差別？</strong> IAM Conditions 是在 IAM 授權基礎上加入額外條件（如時間、資源標籤）來細化授權；Organization Policy 則是從行為層面設定哪些操作根本不被允許，不管你有什麼 IAM 角色。</p>



<p class="wp-block-paragraph"><strong>Q2：我可以在 Project 層級覆蓋 Organization 層級的政策嗎？</strong> 預設情況下可以，子層可以 Override 父層的政策。但如果父層在設定 constraint 時鎖定了不允許 Override，子層就無法覆蓋。這是組織管理員需要仔細規劃的地方。</p>



<p class="wp-block-paragraph"><strong>Q3：Organization Policy 的設定會即時生效嗎？</strong> 是的，Organization Policy 通常在幾分鐘內就會生效。但需要注意：對於已經存在的資源（例如已有公開 IP 的 VM），Policy 不會自動修正，只會阻擋<strong>未來</strong>的違規操作。</p>



<p class="wp-block-paragraph"><strong>Q4：什麼是 Constraint 的 Dry Run 模式？</strong> Dry Run（模擬執行）模式讓你先評估一個 constraint 的影響範圍，而不實際執行限制。違規操作會被記錄在 Cloud Logging 中但不會被阻止，方便管理員在正式啟用前了解有哪些資源會受到影響。</p>



<p class="wp-block-paragraph"><strong>Q5：如何查看目前組織內所有的 Organization Policy 設定？</strong> 可以在 Google Cloud Console 的「IAM &amp; Admin → Organization Policies」中查看，也可以使用以下指令：</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>gcloud org-policies list --organization=ORGANIZATION_ID</code></pre>



<p class="wp-block-paragraph"><strong>Q6：compute.trustedImageProjects 可以套用在 Folder 層級嗎？</strong> 可以。Organization Policy 可以套用在 Organization、Folder 或 Project 任何層級。套用在 Folder 層級時，該 Folder 底下的所有 Project 都會受到映像來源限制的約束。</p>



<p class="wp-block-paragraph"><strong>Q7：storage.publicAccessPrevention 和 Uniform Bucket-Level Access 有什麼關係？</strong> 兩者是獨立的設定，但相輔相成。<code>publicAccessPrevention</code> 防止 bucket 被匿名公開存取；Uniform Bucket-Level Access 則是關閉 ACL，統一用 IAM 管理存取權限。同時啟用兩者，可以建立更完整的 Cloud Storage 安全管控。</p>



<p class="wp-block-paragraph"><strong>Q8：如果同一個 constraint 在 Folder 和 Project 層級都有設定，以哪個為準？</strong> 以最接近資源的層級為準，也就是 Project 層級的設定會覆蓋 Folder 層級的設定（前提是 <code>inheritFromParent</code> 沒有特別限制）。理解這個優先順序，對排查政策衝突非常重要。</p>



<p class="wp-block-paragraph"><strong>Q9：Resource Location Restriction 可以限制到具體的 Zone（區域）嗎？</strong> 可以。<code>constraints/gcp.resourceLocations</code> 支援以 Region、Multi-region 或具體的 Zone 為單位設定限制，能夠非常精確地控制資源的建立位置。</p>



<p class="wp-block-paragraph"><strong>Q10：Organization Policy 的設定有沒有辦法自動化管理？</strong> 有。可以透過 Terraform 的 <code>google_org_policy_policy</code> 資源，或使用 Google Cloud 的 Organization Policy API，以程式碼方式管理所有 constraint 設定。這也是大型企業推薦的「<strong>Policy as Code</strong>」實踐方式，確保政策設定可被版本控管和自動化部署。</p><p>The post <a href="https://dongdonggcp.com/2026/04/22/gcp-organization-policy-introduction/">GCP Organization Policy 完全攻略：Google Cloud 安全工程師必備知識</a> first appeared on <a href="https://dongdonggcp.com">東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://dongdonggcp.com/2026/04/22/gcp-organization-policy-introduction/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">11790</post-id>	</item>
		<item>
		<title>GCP Cloud Armor 完整教學：功能介紹、使用條件與防禦規則設定</title>
		<link>https://dongdonggcp.com/2026/04/21/gcp-cloud-armor-complete-guide-features-setup-rules/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gcp-cloud-armor-complete-guide-features-setup-rules</link>
					<comments>https://dongdonggcp.com/2026/04/21/gcp-cloud-armor-complete-guide-features-setup-rules/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 09:39:33 +0000</pubDate>
				<category><![CDATA[資訊安全]]></category>
		<category><![CDATA[Cloud Armor]]></category>
		<category><![CDATA[DDoS]]></category>
		<category><![CDATA[Network Security]]></category>
		<category><![CDATA[WAF]]></category>
		<guid isPermaLink="false">https://dongdonggcp.com/?p=11802</guid>

					<description><![CDATA[<p>GCP Cloud Armor 是掛在  [&#8230;]</p>
<p>The post <a href="https://dongdonggcp.com/2026/04/21/gcp-cloud-armor-complete-guide-features-setup-rules/">GCP Cloud Armor 完整教學：功能介紹、使用條件與防禦規則設定</a> first appeared on <a href="https://dongdonggcp.com">東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">GCP Cloud Armor 是掛在 GCP Load Balancer 前面的 WAF 與 DDoS 防禦服務，讓你用規則決定哪些流量可以進來、哪些直接擋在門外。</p>



<p class="wp-block-paragraph">不需要自己架防火牆主機，也不需要密碼學背景，最快 15 分鐘就能完成基礎設定。</p>



<p class="wp-block-paragraph">這篇文章會帶你從頭搞懂 Cloud Armor 是什麼、用它之前要準備什麼、怎麼操作，以及 5 種常見的防禦規則範例，看完就能直接動手。 </p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">什麼是 GCP Cloud Armor？</h2>



<p class="wp-block-paragraph">GCP Cloud Armor 是 Google Cloud 提供的應用程式層防護服務，部署在 Google 的全球邊緣節點上，用來攔截進入你後端服務 (虛擬機、Cloud Run 或 Kubernetes) 之前的惡意 HTTP 流量。</p>



<p class="wp-block-paragraph">它的角色是守門員：在流量進入你的後端服務之前，先根據你設定的規則篩選一遍。</p>



<p class="wp-block-paragraph">符合規則的流量放行，不符合的直接拒絕，回傳 403 或自訂的錯誤回應。</p>



<p class="wp-block-paragraph">因為 GCP Cloud Armor 運行在 Google 的邊緣基礎設施上，惡意流量甚至不會打到你的 VM 或 Cloud Run 服務，就已經在網路邊緣被攔截。</p>



<p class="wp-block-paragraph">這是它和傳統在主機上裝軟體防火牆最大的差異。 </p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="541" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-is-deployed-on-edge-1024x541.png" alt="" class="wp-image-11804" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-is-deployed-on-edge-1024x541.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-is-deployed-on-edge-300x158.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-is-deployed-on-edge-768x406.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-is-deployed-on-edge-1536x811.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-is-deployed-on-edge-2048x1081.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Cloud Armor 部署在 Google 的邊緣基礎設施上，惡意流量直接在邊緣攔截</figcaption></figure>



<h3 class="wp-block-heading">Cloud Armor 的核心功能：WAF 與 DDoS 防護</h3>



<p class="wp-block-paragraph">Cloud Armor 主要提供兩層防護。</p>



<p class="wp-block-paragraph"><strong>WAF（Web Application Firewall，網頁應用程式防火牆）</strong>：針對應用程式層的攻擊，例如 SQL Injection、XSS、CSRF（Cross-Site Request Forgery，跨站請求偽造）、路徑遍歷（Path Traversal，進入不開放的路徑）等。</p>



<p class="wp-block-paragraph">你可以用 Google 預建的規則集（Rules Set），也可以自己寫條件規則。</p>



<p class="wp-block-paragraph"><strong>DDoS 防護</strong>：針對大流量的攻擊，Google 的基礎設施本身就有 L3/L4 層的 DDoS 緩解能力，Cloud Armor 在此基礎上再加上 L7 層的防護，例如針對 HTTP Flood 的速率限制（Rate Limiting）。</p>



<p class="wp-block-paragraph">兩種防護都不需要你另外架設任何伺服器，全部透過設定「安全政策」和「規則」來完成。</p>



<h3 class="wp-block-heading">Cloud Armor Standard 和 Managed Protection Plus 的差異</h3>



<p class="wp-block-paragraph">Cloud Armor 分成兩個版本，初學者只需要了解基礎版就夠用。</p>



<p class="wp-block-paragraph"><strong>Standard（標準版）</strong>：</p>



<ul class="wp-block-list">
<li>免費啟用，依照請求數與規則數計費</li>



<li>支援自訂規則、IP 封鎖、地理位置封鎖</li>



<li>支援 WAF 預建規則集（但要另外付費啟用每條規則）</li>



<li>適合絕大多數的 GCP 初學者和中小型專案</li>
</ul>



<p class="wp-block-paragraph"><strong><a href="https://docs.cloud.google.com/armor/docs/armor-enterprise-overview?hl=zh-tw" title="">Managed Protection Plus（進階版）</a></strong>：</p>



<ul class="wp-block-list">
<li>月費制，約 3,000 美元/月起，一次要訂閱一年。</li>



<li>包含自適應防護（Adaptive Protection）的完整功能</li>



<li>提供 DDoS 攻擊時的應急支援（Google 工程師介入，需搭配 Premium Support）</li>



<li>提供詳細的攻擊分析報告</li>



<li>適合有大規模 DDoS 風險的企業級應用</li>
</ul>



<p class="wp-block-paragraph">這篇文章的操作說明只涵蓋 Standard 版本。</p>



<h3 class="wp-block-heading">Cloud Armor 和傳統防火牆的不同之處</h3>



<p class="wp-block-paragraph">很多人第一次接觸 GCP Cloud Armor 時會問：「GCP 不是已經有 VPC Firewall 了嗎？為什麼還需要 Cloud Armor？」</p>



<p class="wp-block-paragraph">答案在於<strong>防護層次不同</strong>。</p>



<p class="wp-block-paragraph">VPC Firewall 在 L3/L4 層運作，它看的是 IP 位址、Port、Protocol。</p>



<p class="wp-block-paragraph">它可以說「拒絕所有來自這個 IP 的 TCP 連線」，但它看不懂 HTTP 請求的內容。</p>



<p class="wp-block-paragraph">GCP Cloud Armor 在 L7 層運作，它可以看到 HTTP Header、URL 路徑、Request Body、User-Agent，甚至可以判斷「這個請求的 query string 裡面有 SQL Injection 的特徵」。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>VPC Firewall</th><th>Cloud Armor</th></tr></thead><tbody><tr><td>防護層次</td><td>L3/L4</td><td>L7</td></tr><tr><td>可讀內容</td><td>IP、Port</td><td>HTTP 完整內容</td></tr><tr><td>部署位置</td><td>VPC 網路邊界</td><td>Google 邊緣節點</td></tr><tr><td>WAF 功能</td><td>❌</td><td>✅</td></tr><tr><td>地理封鎖</td><td>❌</td><td>✅</td></tr><tr><td>需要 LB</td><td>❌</td><td>✅</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">兩個服務不是互相取代，而是互補。實務上你會同時使用兩個。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="557" src="https://dongdonggcp.com/wp-content/uploads/2026/04/why-vpc-firewall-not-enough-need-cloud-armor-1024x557.png" alt="" class="wp-image-11805" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/why-vpc-firewall-not-enough-need-cloud-armor-1024x557.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/why-vpc-firewall-not-enough-need-cloud-armor-300x163.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/why-vpc-firewall-not-enough-need-cloud-armor-768x417.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/why-vpc-firewall-not-enough-need-cloud-armor-1536x835.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/why-vpc-firewall-not-enough-need-cloud-armor-2048x1113.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">有了 VPC Firewall 為什麼還需要 Cloud Armor？因為它可以處理第七層的請求內容</figcaption></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">你為什麼需要 Cloud Armor？</h2>



<h3 class="wp-block-heading">沒有 WAF 的 GCP 服務面臨哪些風險</h3>



<p class="wp-block-paragraph">把服務部署到 GCP 並開放公開存取之後，你面對的不只是真實用戶，還有各種自動化攻擊工具。</p>



<p class="wp-block-paragraph">常見的威脅類型有 6 種：</p>



<ol class="wp-block-list">
<li><strong>自動化掃描工具</strong>：每天有數以千計的 Bot 在網路上掃描開放的端點，試探常見漏洞</li>



<li><strong>SQL Injection 攻擊</strong>：試圖透過 URL 參數或表單欄位注入惡意 SQL 語句，讀取或竄改資料庫</li>



<li><strong>XSS 攻擊</strong>：在回應中插入惡意腳本，影響其他使用者的瀏覽器行為</li>



<li><strong>DDoS 攻擊</strong>：大量請求同時打進來，讓你的服務因為過載而無法回應</li>



<li><strong>地區性惡意流量</strong>：某些地區的 IP 段本身就有大量惡意行為的歷史紀錄</li>



<li><strong>暴力破解</strong>：對登入端點反覆嘗試密碼，每分鐘可發送超過 1,000 次請求</li>
</ol>



<p class="wp-block-paragraph">如果沒有 WAF，這些攻擊會直接打到你的後端，讓你的 VM 或容器承受無效請求，耗費運算資源，也增加被攻破的風險。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="570" src="https://dongdonggcp.com/wp-content/uploads/2026/04/the-threats-if-no-waf-1024x570.png" alt="" class="wp-image-11803" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/the-threats-if-no-waf-1024x570.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/the-threats-if-no-waf-300x167.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/the-threats-if-no-waf-768x427.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/the-threats-if-no-waf-1536x855.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/the-threats-if-no-waf-2048x1140.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">沒有 WAF 的 GCP 服務面臨哪些風險</figcaption></figure>



<h3 class="wp-block-heading">Cloud Armor 能防禦的攻擊類型</h3>



<p class="wp-block-paragraph">GCP Cloud Armor 可以有效防禦的攻擊，按照常見程度排列：</p>



<ol class="wp-block-list">
<li><strong>IP 層攻擊</strong>：封鎖特定 IP 或 IP 段的所有請求</li>



<li><strong>地理位置攻擊</strong>：封鎖來自特定國家的流量</li>



<li><strong>SQL Injection（SQLi）</strong>：使用 OWASP 規則集偵測並封鎖注入攻擊</li>



<li><strong>XSS（Cross-Site Scripting）</strong>：偵測 request 中的腳本注入特徵</li>



<li><strong>HTTP Flood</strong>：透過速率限制，對單一 IP 的請求次數設上限</li>



<li><strong>路徑遍歷（Path Traversal）</strong>：試圖存取 <code>../../../etc/passwd</code> 等路徑</li>



<li><strong>掃描工具偵測</strong>：根據 User-Agent 特徵封鎖常見的掃描工具</li>
</ol>



<h3 class="wp-block-heading">什麼規模的專案適合導入 Cloud Armor</h3>



<p class="wp-block-paragraph">只要你的 GCP 服務有開放公開的 HTTP/HTTPS 端點，就應該考慮 GCP Cloud Armor。</p>



<p class="wp-block-paragraph">以下 4 種情況特別建議導入：</p>



<ol class="wp-block-list">
<li>有處理用戶輸入的表單或 API（SQL Injection、XSS 風險高）</li>



<li>服務對外有 SLA 要求，不能接受因 DDoS 導致的停機</li>



<li>有合規需求（例如 PCI DSS），要求必須有 WAF</li>



<li>服務已經上線，Log 中已經出現大量可疑請求</li>
</ol>



<p class="wp-block-paragraph">即使是個人學習專案，Standard 版本的費用相對低，拿來練習設定規則也很合理。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">使用 Cloud Armor 之前：你必須知道的前提條件</h2>



<p class="wp-block-paragraph">GCP Cloud Armor 不是獨立服務，它必須掛在 GCP Load Balancer 上才能運作。</p>



<p class="wp-block-paragraph">這是最多初學者沒注意到的限制。</p>



<h3 class="wp-block-heading">Cloud Armor 只能搭配哪些 Load Balancer？</h3>



<h4 class="wp-block-heading">Global External HTTP(S) Load Balancer</h4>



<p class="wp-block-paragraph">這是最常用的搭配，也是 Cloud Armor 支援最完整的 Load Balancer 類型。</p>



<p class="wp-block-paragraph">如果你的後端是 Cloud Run、GKE、Compute Engine VM，並且使用 Global External HTTP(S) LB 對外服務，Cloud Armor 的所有功能（WAF 規則、地理封鎖、速率限制）都可以使用。</p>



<p class="wp-block-paragraph">套用位置是 Load Balancer 的<strong>後端服務（Backend Service）</strong>，不是 LB 本身。</p>



<h4 class="wp-block-heading">SSL Proxy 和 TCP Proxy Load Balancer</h4>



<p class="wp-block-paragraph">這兩種 LB 也支援 Cloud Armor，但只能使用 L4 層的防護功能（IP 封鎖），無法使用 WAF 規則或地理封鎖。</p>



<p class="wp-block-paragraph">原因是 SSL Proxy 和 TCP Proxy 在 L4 層就把流量轉發出去了，Cloud Armor 沒有機會讀取到 HTTP 層的內容。</p>



<h4 class="wp-block-heading">不支援的 LB 類型：Internal LB 和 Regional LB 的限制</h4>



<p class="wp-block-paragraph">以下 Load Balancer <strong>不支援</strong> GCP Cloud Armor：</p>



<ul class="wp-block-list">
<li><strong>Internal HTTP(S) Load Balancer</strong>：只面對內部 VPC 流量，Cloud Armor 的邊緣防護機制在此無法運作</li>



<li><strong>Regional External HTTP(S) Load Balancer</strong>：Cloud Armor 目前只支援 Global 版本</li>



<li><strong>Network Load Balancer（TCP/UDP NLB）</strong>：這是 Pass-through 型 LB，流量直接到後端，無法插入 Cloud Armor</li>
</ul>



<p class="wp-block-paragraph">如果你現在用的是 Internal LB 或 Regional LB，要使用 Cloud Armor 就必須先換成 Global External HTTP(S) LB，這可能需要調整你的架構。</p>



<h3 class="wp-block-heading">需要的 GCP 權限與 IAM 角色</h3>



<p class="wp-block-paragraph">設定 Cloud Armor 需要以下 IAM 角色之一：</p>



<ul class="wp-block-list">
<li><code>compute.securityAdmin</code>：可以建立、修改、刪除安全政策</li>



<li><code>compute.admin</code>：包含上面的所有權限，加上管理 LB 的能力</li>



<li><code>roles/owner</code> 或 <code>roles/editor</code>：專案層級的完整權限（不建議在正式環境使用）</li>
</ul>



<p class="wp-block-paragraph">如果只需要<strong>查看</strong>安全政策但不需要修改，可以給：</p>



<ul class="wp-block-list">
<li><code>compute.securityPolicyUser</code>：只能查看政策，無法修改</li>
</ul>



<h3 class="wp-block-heading">Cloud Armor 的計費方式</h3>



<p class="wp-block-paragraph">Cloud Armor Standard 版的計費方式：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>計費項目</th><th>費用</th></tr></thead><tbody><tr><td>安全政策（Security Policy）</td><td>每個政策 $5 美元/月</td></tr><tr><td>規則（Rule）</td><td>每條規則 $1 美元/月</td></tr><tr><td>處理的請求數</td><td>每百萬次請求 $0.75 美元</td></tr><tr><td>WAF 規則（預建規則集）</td><td>每條規則 $1 美元/月（另計）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">實際費用計算範例：</p>



<p class="wp-block-paragraph">1 個安全政策 + 5 條規則（含 2 條 WAF 規則）+ 每月 1 億次請求：</p>



<ul class="wp-block-list">
<li>政策：$5</li>



<li>規則：$5（5條 × $1）</li>



<li>WAF 規則：$2（2條 × $1）</li>



<li>請求數：$75（100百萬 × $0.75）</li>



<li><strong>合計約 $87 美元/月</strong></li>
</ul>



<p class="wp-block-paragraph">實際費用視流量規模而定，可以在 Google Cloud Pricing Calculator 試算。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">GCP Cloud Armor 功能完整介紹</h2>



<h3 class="wp-block-heading">安全政策（Security Policy）是什麼？</h3>



<p class="wp-block-paragraph">安全政策（Security Policy）是 GCP Cloud Armor 的核心容器，用來集中管理所有防禦規則，並套用到指定的 Load Balancer 後端服務上。</p>



<p class="wp-block-paragraph">一個安全政策可以包含多條規則，然後套用到一個或多個 Load Balancer 的後端服務（Backend Service）上。</p>



<p class="wp-block-paragraph">把安全政策想成「一份守門規則書」：裡面寫了哪些人可以進、哪些人要擋在外面、哪些人要特別審查。</p>



<p class="wp-block-paragraph">Load Balancer 把這份規則書交給門口的保全（Google 的邊緣節點）執行。</p>



<p class="wp-block-paragraph">一個 GCP 專案可以有最多 200 個安全政策，每個後端服務只能套用 1 個安全政策。 </p>



<h3 class="wp-block-heading">規則（Rule）的組成：優先序、條件與動作</h3>



<p class="wp-block-paragraph">每條規則由 3 個部分組成：</p>



<p class="wp-block-paragraph"><strong>1. 優先序（Priority）</strong>：數字越小，優先度越高，範圍是 0 到 2147483646。</p>



<p class="wp-block-paragraph">建議用 1000、2000、3000 這樣有間距的數字，方便之後在中間插入新規則。</p>



<p class="wp-block-paragraph"><strong>2. 條件（Match Condition）</strong>：用 CEL（Common Expression Language）語法描述這條規則要符合什麼條件，例如：</p>



<ul class="wp-block-list">
<li>來源 IP 是否在某個範圍</li>



<li>請求的來源國家代碼是否符合</li>



<li>Request 的內容是否有 SQL Injection 特徵</li>
</ul>



<p class="wp-block-paragraph"><strong>3. 動作（Action）</strong>：當條件成立時，要對這個請求做什麼：</p>



<ul class="wp-block-list">
<li><code>allow</code>：放行</li>



<li><code>deny(403)</code>：拒絕，回傳 403 Forbidden</li>



<li><code>deny(404)</code>：拒絕，回傳 404（讓攻擊者不確定原因）</li>



<li><code>throttle</code>：速率限制，超過閾值才封鎖</li>



<li><code>rate_based_ban</code>：超過速率就暫時封鎖這個 IP</li>
</ul>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="561" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-rule-1024x561.png" alt="" class="wp-image-11806" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-rule-1024x561.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-rule-300x164.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-rule-768x421.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-rule-1536x841.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-rule-2048x1122.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Cloud Armor 規則的運作方式</figcaption></figure>



<h3 class="wp-block-heading">預設規則（Default Rule）的作用</h3>



<p class="wp-block-paragraph">每個安全政策都有一條無法刪除的「預設規則」，Priority 固定為 <code>2147483647</code>（最低優先度）。</p>



<p class="wp-block-paragraph">預設規則的作用是：當所有其他規則都不符合時，這條規則決定最終結果。</p>



<p class="wp-block-paragraph">預設規則的動作可以設定為：</p>



<ul class="wp-block-list">
<li><code>allow</code>（預設值）：沒被其他規則攔截的流量（黑名單模式），全部放行</li>



<li><code>deny(403)</code>：沒被特別允許的流量，全部封鎖（白名單模式）</li>
</ul>



<p class="wp-block-paragraph">初學者建議使用 <code>allow</code> 作為預設動作（黑名單模式），只封鎖你明確設定要擋的流量，避免誤擋正常用戶。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="504" src="https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-21-下午4.40.37-1024x504.png" alt="" class="wp-image-11812" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-21-下午4.40.37-1024x504.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-21-下午4.40.37-300x148.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-21-下午4.40.37-768x378.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-21-下午4.40.37-1536x757.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/截圖-2026-04-21-下午4.40.37-2048x1009.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Cloud Armor 預設規則</figcaption></figure>



<h3 class="wp-block-heading">進階規則語言：CEL 表達式基礎</h3>



<p class="wp-block-paragraph">GCP Cloud Armor 使用 CEL（Common Expression Language，通用表達式語言）來寫規則條件，這是 Google 開發的開源條件判斷語法，專門用來描述篩選邏輯。</p>



<p class="wp-block-paragraph">常用的 CEL 函數：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>函數</th><th>用途</th><th>範例</th></tr></thead><tbody><tr><td><code>inIpRange()</code></td><td>判斷 IP 是否在某範圍</td><td><code>inIpRange(origin.ip, '203.0.113.0/24')</code></td></tr><tr><td><code>origin.region_code</code></td><td>來源國家代碼（ISO 3166-1）</td><td><code>origin.region_code == 'CN'</code></td></tr><tr><td><code>request.path</code></td><td>請求的 URL 路徑</td><td><code>request.path.matches('/admin.*')</code></td></tr><tr><td><code>request.headers</code></td><td>HTTP Header</td><td><code>request.headers['user-agent'].matches('.*sqlmap.*')</code></td></tr><tr><td><code>evaluatePreconfiguredExpr()</code></td><td>使用預建規則集</td><td><code>evaluatePreconfiguredExpr('sqli-stable')</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">條件可以用 <code>&amp;&amp;</code>（AND）、<code>||</code>（OR）、<code>!</code>（NOT）組合。</p>



<h3 class="wp-block-heading">地理位置封鎖（Geo-blocking）</h3>



<p class="wp-block-paragraph">地理位置封鎖讓你根據來源國家代碼（ISO 3166-1 alpha-2）決定是否放行。</p>



<p class="wp-block-paragraph">這個功能不需要你維護任何 IP 清單，Google 在邊緣節點自動判斷來源地理位置。</p>



<p class="wp-block-paragraph">常見使用情境：</p>



<ul class="wp-block-list">
<li>你的服務只對台灣用戶開放，可以封鎖所有非台灣的流量</li>



<li>某個國家最近有大量惡意請求，可以臨時封鎖該地區</li>
</ul>



<p class="wp-block-paragraph">封鎖多個國家的 CEL 語法：</p>



<pre class="wp-block-code"><code>origin.region_code == 'RU' || origin.region_code == 'KP' || origin.region_code == 'IR'
</code></pre>



<p class="wp-block-paragraph">注意：地理位置判斷是依照 IP 對應的地理資料庫，VPN 用戶可能顯示錯誤的國家。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="476" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Geo-blocking-1024x476.png" alt="" class="wp-image-11808" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Geo-blocking-1024x476.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Geo-blocking-300x139.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Geo-blocking-768x357.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Geo-blocking-1536x713.png 1536w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Geo-blocking.png 1647w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">IP 白名單與黑名單</h3>



<p class="wp-block-paragraph">IP 封鎖是 GCP Cloud Armor 最基本的功能，適合封鎖已知惡意 IP 或只開放特定辦公室 IP。</p>



<p class="wp-block-paragraph">每條規則最多可以指定 10 個 IP 或 CIDR 範圍。</p>



<p class="wp-block-paragraph">超過 10 個 IP 需要封鎖時，有 2 個選擇：</p>



<ol class="wp-block-list">
<li>建立多條規則，每條規則放 10 個 IP</li>



<li>使用 Cloud Armor 的「IP Address Group」功能，集中管理大量 IP 清單</li>
</ol>



<p class="wp-block-paragraph"><strong>黑名單模式</strong>（封鎖特定 IP）：</p>



<pre class="wp-block-code"><code>inIpRange(origin.ip, '198.51.100.0/24')
</code></pre>



<p class="wp-block-paragraph">動作設為 <code>deny(403)</code>，其他規則預設 <code>allow</code>。</p>



<p class="wp-block-paragraph"><strong>白名單模式</strong>（只開放特定 IP）：</p>



<pre class="wp-block-code"><code>inIpRange(origin.ip, '203.0.113.10/32')
</code></pre>



<p class="wp-block-paragraph">動作設為 <code>allow</code>，預設規則改為 <code>deny(403)</code>。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="1002" height="562" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-IP-Based-Control.png" alt="" class="wp-image-11807" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-IP-Based-Control.png 1002w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-IP-Based-Control-300x168.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-IP-Based-Control-768x431.png 768w" sizes="(max-width: 1002px) 100vw, 1002px" /><figcaption class="wp-element-caption">Cloud Armor IP 存取控制</figcaption></figure>



<h3 class="wp-block-heading">WAF 預建規則集（OWASP Top 10 防護）</h3>



<p class="wp-block-paragraph">Cloud Armor 提供 Google 維護的 WAF 預建規則集，對應 OWASP Top 10 常見攻擊。</p>



<p class="wp-block-paragraph">OWASP Top 10 是全球最廣泛引用的網頁應用程式安全風險清單，由非營利組織 OWASP 每幾年更新一次，列出最常被攻擊者利用的 10 種漏洞類型。</p>



<p class="wp-block-paragraph">不需要自己寫偵測邏輯，只要在條件中呼叫 <code>evaluatePreconfiguredExpr()</code> 就好：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>規則集名稱</th><th>防護目標</th></tr></thead><tbody><tr><td><code>sqli-stable</code></td><td>SQL Injection</td></tr><tr><td><code>xss-stable</code></td><td>Cross-Site Scripting</td></tr><tr><td><code>lfi-stable</code></td><td>Local File Inclusion（路徑遍歷）</td></tr><tr><td><code>rfi-stable</code></td><td>Remote File Inclusion</td></tr><tr><td><code>rce-stable</code></td><td>Remote Code Execution</td></tr><tr><td><code>scannerdetection-stable</code></td><td>掃描工具偵測</td></tr><tr><td><code>protocolattack-stable</code></td><td>HTTP 協議層攻擊</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">這些規則集由 Google 持續更新，不需要自己維護特徵碼。</p>



<p class="wp-block-paragraph"><strong>靈敏度等級說明</strong>：每個預建規則集都有靈敏度等級（Sensitivity Level），從 1 到 4。</p>



<ul class="wp-block-list">
<li>等級 4：偵測最嚴格，但誤判率也最高</li>



<li>等級 1：只抓最明顯的攻擊特徵，誤判率最低</li>
</ul>



<p class="wp-block-paragraph">初學者建議從 Level 1 開始，觀察 Log 後再調整。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="981" height="486" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Predefined-Rule-Set-1.png" alt="" class="wp-image-11810" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Predefined-Rule-Set-1.png 981w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Predefined-Rule-Set-1-300x149.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Predefined-Rule-Set-1-768x380.png 768w" sizes="(max-width: 981px) 100vw, 981px" /><figcaption class="wp-element-caption">Cloud Armor WAF 預建規則集 (OWASP Top 10)</figcaption></figure>



<h3 class="wp-block-heading">速率限制（Rate Limiting）功能</h3>



<p class="wp-block-paragraph">速率限制讓你設定「同一個 IP 在一段時間內最多可以發送幾個請求」，超過就觸發節流或封鎖。</p>



<p class="wp-block-paragraph">兩種模式：</p>



<p class="wp-block-paragraph"><strong>Throttle（節流）</strong>：超過速率的請求會收到 429 Too Many Requests，不會被永久封鎖，速率恢復後就能正常請求。</p>



<p class="wp-block-paragraph">適合防止意外的高流量，例如爬蟲設定太激進。</p>



<p class="wp-block-paragraph"><strong>Rate-based Ban（速率封鎖）</strong>：超過速率之後，該 IP 在指定時間內（例如 300 秒）的所有請求都被封鎖，無論後續速率是否降低。</p>



<p class="wp-block-paragraph">適合防禦故意的 HTTP Flood 攻擊。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="998" height="571" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Rate-Limiting.png" alt="" class="wp-image-11811" style="width:998px;height:auto" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Rate-Limiting.png 998w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Rate-Limiting-300x172.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Cloud-Armor-Rate-Limiting-768x439.png 768w" sizes="(max-width: 998px) 100vw, 998px" /><figcaption class="wp-element-caption">Cloud Armor 速率限制 (Rate Limiting)</figcaption></figure>



<h3 class="wp-block-heading">自適應防護（Adaptive Protection）簡介</h3>



<p class="wp-block-paragraph">自適應防護（Adaptive Protection）是 Cloud Armor 的 AI 功能，它會分析你的流量基準，當偵測到異常流量模式時，自動生成防禦規則建議，讓你一鍵套用。</p>



<p class="wp-block-paragraph">Standard 版本有基本的自適應防護功能，只能提供警告；Managed Protection Plus 版本的功能更完整，還提供即時攻擊警報和 Google 工程師介入支援，支援的前提是有購買 Premium Support 技術支援方案。</p>



<p class="wp-block-paragraph">對初學者來說，自適應防護是很好的輔助工具，但不要完全依賴它——建議的規則還是需要你自己審核才能套用。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">GCP Cloud Armor 基礎版操作步驟</h2>



<p class="wp-block-paragraph">GCP Cloud Armor 的設定流程共 5 個步驟：確認 LB 類型、建立安全政策、新增規則、套用到後端服務、測試生效。</p>



<h3 class="wp-block-heading">Step 1：確認你的 Load Balancer 類型</h3>



<p class="wp-block-paragraph">在開始之前，先確認你的 Load Balancer 是否支援 GCP Cloud Armor。</p>



<ol class="wp-block-list">
<li>前往 Google Cloud Console → <strong>Network Services</strong> → <strong>Load Balancing</strong></li>



<li>點進你的 Load Balancer，查看類型欄位</li>



<li>確認類型是 <strong>Global External HTTP(S) Load Balancer</strong> 或 <strong>Classic HTTP(S) Load Balancer</strong></li>
</ol>



<p class="wp-block-paragraph">如果你還沒有 Load Balancer，需要先建立一個 Global External HTTP(S) LB，再把你的後端服務（Cloud Run、GKE、VM 等）掛上去，才能繼續後面的步驟。</p>



<h3 class="wp-block-heading">Step 2：在 Google Cloud Console 建立安全政策</h3>



<ol class="wp-block-list">
<li>前往 <strong>Network Security</strong> → <strong>Cloud Armor</strong></li>



<li>點擊「<strong>+ Create Policy</strong>」</li>



<li>填入以下資訊：
<ul class="wp-block-list">
<li><strong>Name</strong>：自訂政策名稱，例如 <code>my-armor-policy</code>（只能小寫英文和連字號）</li>



<li><strong>Description</strong>（選填）：說明這個政策的用途</li>



<li><strong>Default rule action</strong> 預設規則：選擇 <code>Allow</code>（黑名單模式，符合的先擋，都不符合就允許，推薦初學者）</li>
</ul>
</li>



<li>點擊「<strong>Create Policy</strong>」</li>
</ol>



<p class="wp-block-paragraph">這時候安全政策已經建立，但還沒有套用到任何 Load Balancer，也沒有任何自訂規則（只有預設的 allow 規則）。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="609" src="https://dongdonggcp.com/wp-content/uploads/2026/04/Create-Cloud-Armor-Policy-1024x609.png" alt="" class="wp-image-11813" srcset="https://dongdonggcp.com/wp-content/uploads/2026/04/Create-Cloud-Armor-Policy-1024x609.png 1024w, https://dongdonggcp.com/wp-content/uploads/2026/04/Create-Cloud-Armor-Policy-300x178.png 300w, https://dongdonggcp.com/wp-content/uploads/2026/04/Create-Cloud-Armor-Policy-768x457.png 768w, https://dongdonggcp.com/wp-content/uploads/2026/04/Create-Cloud-Armor-Policy.png 1492w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">建立 Cloud Armor 安全政策和預設規則</figcaption></figure>



<h3 class="wp-block-heading">Step 3：新增第一條防禦規則</h3>



<p class="wp-block-paragraph">在政策頁面中，點擊「<strong>Add Rule</strong>」，依序填入：</p>



<ol class="wp-block-list">
<li><strong>Description</strong>：填入規則說明，例如「封鎖惡意 IP 段」</li>



<li><strong>Mode</strong>：選擇「Basic mode」（適合初學者）或「Advanced mode」（可以寫 CEL 表達式）</li>



<li><strong>Match</strong>：填入條件，例如 IP 範圍 <code>198.51.100.0/24</code></li>



<li><strong>Action</strong>：選擇 <code>Deny</code> 並選擇回應碼（<code>403</code> 或 <code>404</code>）</li>



<li><strong>Priority</strong>：填入優先序數字，例如 <code>1000</code></li>



<li>點擊「<strong>Add</strong>」</li>
</ol>



<p class="wp-block-paragraph">規則建立後會在 60 秒內生效，不需要重新部署 Load Balancer。</p>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">Step 4：將安全政策套用到後端服務</h3>



<p class="wp-block-paragraph">安全政策不是套用在 Load Balancer 本身，而是套用在 Load Balancer 的**後端服務（Backend Service）**上。</p>



<p class="wp-block-paragraph">從 Cloud Armor 頁面套用：</p>



<ol class="wp-block-list">
<li>前往 <strong>Network Security</strong> → <strong>Cloud Armor</strong> → 點進你剛建立的政策</li>



<li>點擊「<strong>Apply to targets</strong>」</li>



<li>點擊「<strong>Add target</strong>」</li>



<li>選擇你的 <strong>Load Balancer</strong> 和對應的 <strong>Backend Service</strong></li>



<li>點擊「<strong>Add</strong>」確認</li>
</ol>



<p class="wp-block-paragraph">從 Load Balancer 頁面套用（二擇一）：</p>



<ol class="wp-block-list">
<li>前往 <strong>Load Balancing</strong> → 點進你的 LB</li>



<li>點擊「Edit」</li>



<li>在 Backend Configuration 中，點進你的後端服務</li>



<li>在「Cloud Armor policy」欄位選擇你剛建立的政策</li>



<li>儲存</li>
</ol>



<h3 class="wp-block-heading">Step 5：測試規則是否生效</h3>



<h4 class="wp-block-heading">用 curl 測試封鎖效果</h4>



<p class="wp-block-paragraph">假設你建立了一條封鎖特定 IP 的規則，可以從該 IP 的機器用 curl 測試：</p>



<pre class="wp-block-code"><code>curl -v https://your-service-domain.com/
</code></pre>



<p class="wp-block-paragraph">如果規則生效，你會看到：</p>



<pre class="wp-block-code"><code>&lt; HTTP/2 403
&lt; content-type: text/html; charset=UTF-8
</code></pre>



<p class="wp-block-paragraph">要測試封鎖特定 User-Agent 或路徑，可以加上對應參數：</p>



<pre class="wp-block-code"><code># 測試封鎖特定 User-Agent
curl -v -A "sqlmap/1.0" https://your-service-domain.com/

# 測試封鎖特定路徑
curl -v https://your-service-domain.com/admin/config
</code></pre>



<h4 class="wp-block-heading">在 Cloud Logging 確認攔截紀錄</h4>



<p class="wp-block-paragraph">Cloud Armor 的攔截紀錄會自動寫入 Cloud Logging，查詢方式：</p>



<ol class="wp-block-list">
<li>前往 <strong>Logging</strong> → <strong>Log Explorer</strong></li>



<li>在查詢框填入：</li>
</ol>



<pre class="wp-block-code"><code>resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.outcome="DENY"
</code></pre>



<ol start="3" class="wp-block-list">
<li>點擊「Run Query」</li>
</ol>



<p class="wp-block-paragraph">你會看到每筆被攔截的請求，包含來源 IP、請求路徑、觸發的規則名稱，以及 Cloud Armor 做出的動作。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Cloud Armor 防禦規則範例</h2>



<p class="wp-block-paragraph">以下 5 個範例都是實務中最常用的規則設定，建議新增時使用 <strong>Advanced mode</strong>（進階模式），直接貼入 CEL 表達式。</p>



<h3 class="wp-block-heading">範例一：封鎖特定 IP 位址或 IP 段</h3>



<p class="wp-block-paragraph"><strong>情境</strong>：你的 Log 中發現 <code>198.51.100.42</code> 這個 IP 持續發送惡意請求。</p>



<p class="wp-block-paragraph"><strong>規則設定</strong>：</p>



<ul class="wp-block-list">
<li>Priority：<code>1000</code></li>



<li>條件（CEL）：</li>
</ul>



<pre class="wp-block-code"><code>inIpRange(origin.ip, '198.51.100.42/32')
</code></pre>



<ul class="wp-block-list">
<li>動作：<code>deny(403)</code></li>
</ul>



<p class="wp-block-paragraph">同時封鎖多個 IP 段：</p>



<pre class="wp-block-code"><code>inIpRange(origin.ip, '198.51.100.0/24') || inIpRange(origin.ip, '203.0.113.128/25')
</code></pre>



<p class="wp-block-paragraph">單條規則最多支援 10 個 IP 範圍。超過 10 個時，建立多條規則，或使用「IP Address Groups」功能集中管理。</p>



<h3 class="wp-block-heading">範例二：封鎖特定國家的流量（地理位置封鎖）</h3>



<p class="wp-block-paragraph"><strong>情境</strong>：你的服務只面向台灣用戶，想封鎖來自特定高風險國家的流量。</p>



<p class="wp-block-paragraph"><strong>規則設定</strong>：</p>



<ul class="wp-block-list">
<li>Priority：<code>2000</code></li>



<li>條件（CEL）：</li>
</ul>



<pre class="wp-block-code"><code>origin.region_code == 'RU' || origin.region_code == 'KP'
</code></pre>



<ul class="wp-block-list">
<li>動作：<code>deny(403)</code></li>
</ul>



<p class="wp-block-paragraph">如果服務只開放特定國家，反向設定更有效率（白名單模式）：</p>



<pre class="wp-block-code"><code>!(origin.region_code == 'TW' || origin.region_code == 'HK' || origin.region_code == 'SG')
</code></pre>



<p class="wp-block-paragraph">動作：<code>deny(403)</code></p>



<p class="wp-block-paragraph">這個寫法的意思是「不是台灣、香港、新加坡的流量，全部拒絕」。</p>



<p class="wp-block-paragraph">國家代碼使用 ISO 3166-1 alpha-2 標準：台灣是 <code>TW</code>，中國是 <code>CN</code>，美國是 <code>US</code>。</p>



<h3 class="wp-block-heading">範例三：防禦 SQL Injection 攻擊</h3>



<p class="wp-block-paragraph"><strong>情境</strong>：你的服務有開放查詢 API，擔心被 SQL Injection 攻擊。</p>



<p class="wp-block-paragraph"><strong>規則設定</strong>：</p>



<ul class="wp-block-list">
<li>Priority：<code>3000</code></li>



<li>條件（CEL）：</li>
</ul>



<pre class="wp-block-code"><code>evaluatePreconfiguredExpr('sqli-stable')
</code></pre>



<ul class="wp-block-list">
<li>動作：<code>deny(403)</code></li>
</ul>



<p class="wp-block-paragraph">這條規則使用 Google 的預建 SQLi 規則集，自動偵測 request 中常見的 SQL Injection 特徵，包含：</p>



<ul class="wp-block-list">
<li>URL 參數中的 <code>' OR 1=1</code>、<code>UNION SELECT</code> 等語句</li>



<li>編碼混淆過的注入字串</li>



<li>Blind SQL Injection 常用的時間延遲語句</li>
</ul>



<p class="wp-block-paragraph">如果誤判率太高，可以調整靈敏度到 Level 1：</p>



<pre class="wp-block-code"><code>evaluatePreconfiguredExpr('sqli-stable', {'sensitivity': 1})
</code></pre>



<h3 class="wp-block-heading">範例四：防禦 XSS（跨站腳本攻擊）</h3>



<p class="wp-block-paragraph"><strong>情境</strong>：你的服務有留言或輸入功能，想防止 XSS 攻擊。</p>



<p class="wp-block-paragraph"><strong>規則設定</strong>：</p>



<ul class="wp-block-list">
<li>Priority：<code>3100</code></li>



<li>條件（CEL）：</li>
</ul>



<pre class="wp-block-code"><code>evaluatePreconfiguredExpr('xss-stable')
</code></pre>



<ul class="wp-block-list">
<li>動作：<code>deny(403)</code></li>
</ul>



<p class="wp-block-paragraph">這條規則偵測的 XSS 特徵包含：</p>



<ul class="wp-block-list">
<li><code>&lt;script></code> 標籤的各種變形</li>



<li><code>javascript:</code> 協議注入</li>



<li><code>onerror=</code>、<code>onload=</code> 等事件處理器注入</li>



<li>HTML 編碼和 URL 編碼混淆的腳本</li>
</ul>



<p class="wp-block-paragraph">想節省計費，可以把 SQLi 和 XSS 合併成 1 條規則：</p>



<pre class="wp-block-code"><code>evaluatePreconfiguredExpr('sqli-stable') || evaluatePreconfiguredExpr('xss-stable')
</code></pre>



<h3 class="wp-block-heading">範例五：針對單一路徑設定速率限制</h3>



<p class="wp-block-paragraph"><strong>情境</strong>：你的 <code>/api/login</code> 端點常被暴力破解攻擊，想限制每個 IP 每分鐘最多 10 次請求。</p>



<p class="wp-block-paragraph"><strong>規則設定</strong>：</p>



<ul class="wp-block-list">
<li>Priority：<code>4000</code></li>



<li>條件（CEL）：</li>
</ul>



<pre class="wp-block-code"><code>request.path.matches('/api/login')
</code></pre>



<ul class="wp-block-list">
<li>動作：<code>throttle</code></li>



<li>速率設定：
<ul class="wp-block-list">
<li>統計週期：60 秒</li>



<li>超過閾值：10 次請求</li>



<li>超過後動作：<code>deny(429)</code></li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">如果想要更嚴格的封鎖，改用 <code>rate_based_ban</code> 動作，並設定封鎖時間（例如 300 秒）——超過次數後，該 IP 會被封鎖整整 5 分鐘。</p>



<p class="wp-block-paragraph">這個範例可以應對的情境：</p>



<ul class="wp-block-list">
<li>自動化密碼爆破工具（每秒幾十次請求）</li>



<li>API Key 暴力猜測</li>



<li>OTP 驗證碼爆破</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">想查詢更完整內容可查看<a href="https://docs.cloud.google.com/armor/docs/configure-security-policies?hl=zh-tw" target="_blank" rel="noopener" title="">官方文件《設定 Cloud Armor 安全性政策》</a>。</p>



<h2 class="wp-block-heading">常見問題與錯誤排查</h2>



<h3 class="wp-block-heading">規則設定完但沒有生效，怎麼辦？</h3>



<p class="wp-block-paragraph">按以下順序依序檢查，通常在第 1–3 步就能找到原因：</p>



<ol class="wp-block-list">
<li><strong>確認安全政策有套用到後端服務</strong>：前往 Cloud Armor → 點進你的政策 → 查看「Targets」分頁，確認你的 Backend Service 在清單中</li>



<li><strong>確認規則的優先序正確</strong>：數字小的先執行，確認要生效的規則優先序比「預設 allow 規則」小</li>



<li><strong>確認條件語法沒有錯誤</strong>：CEL 語法錯誤會讓規則直接無效，在 Cloud Console 的規則編輯頁面用「Validate」功能檢查</li>



<li><strong>等待傳播時間</strong>：Cloud Armor 規則通常在 60 秒內生效，最多可能需要 5 分鐘才能完全傳播到所有邊緣節點</li>



<li><strong>確認測試來源 IP</strong>：在自己的電腦測試時，確認你的 IP 確實在規則的封鎖範圍內</li>
</ol>



<h3 class="wp-block-heading">安全政策套用後合法流量被擋，如何排查？</h3>



<p class="wp-block-paragraph">合法流量被誤擋是 WAF 最常見的問題，特別是啟用預建規則集後。</p>



<p class="wp-block-paragraph">排查步驟：</p>



<ol class="wp-block-list">
<li>前往 Cloud Logging，查詢被擋的請求：</li>
</ol>



<pre class="wp-block-code"><code>resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.outcome="DENY"</code></pre>



<ol start="2" class="wp-block-list">
<li>查看 <code>jsonPayload.enforcedSecurityPolicy.name</code> 欄位，確認是哪條規則觸發</li>



<li>查看原始請求的 path、headers、body，判斷是否為正常請求</li>



<li>如果是 WAF 預建規則集誤判，可以選擇以下 3 種方式處理：
<ul class="wp-block-list">
<li>降低靈敏度等級（Sensitivity Level）</li>



<li>在誤判的規則前面加一條優先序更高的 <code>allow</code> 規則，放行特定 IP 或路徑</li>



<li>改用「Preview Mode」先觀察，不實際封鎖</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"><strong>Preview Mode（預覽模式）</strong>：規則動作設定為 <code>preview</code>，Cloud Armor 會記錄所有符合條件的請求到 Log，但不實際封鎖。</p>



<p class="wp-block-paragraph">上線新規則前，建議先開 Preview Mode 觀察 1–3 天，確認沒有異常再正式封鎖。</p>



<h3 class="wp-block-heading">在 Cloud Logging 中找到 Cloud Armor 攔截紀錄</h3>



<p class="wp-block-paragraph">Cloud Armor 的完整 Log 欄位說明：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>欄位</th><th>說明</th></tr></thead><tbody><tr><td><code>jsonPayload.enforcedSecurityPolicy.name</code></td><td>觸發的安全政策名稱</td></tr><tr><td><code>jsonPayload.enforcedSecurityPolicy.priority</code></td><td>觸發的規則優先序</td></tr><tr><td><code>jsonPayload.enforcedSecurityPolicy.outcome</code></td><td><code>ACCEPT</code>（放行）或 <code>DENY</code>（拒絕）</td></tr><tr><td><code>jsonPayload.enforcedSecurityPolicy.preconfiguredExprIds</code></td><td>觸發的預建規則集名稱</td></tr><tr><td><code>httpRequest.remoteIp</code></td><td>來源 IP</td></tr><tr><td><code>httpRequest.requestUrl</code></td><td>請求的完整 URL</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">查詢所有 GCP Cloud Armor 相關紀錄（含放行和攔截）：</p>



<pre class="wp-block-code"><code>resource.type="http_load_balancer"
jsonPayload.enforcedSecurityPolicy.name!=""</code></pre>



<p class="wp-block-paragraph">建議把這個查詢存成「已儲存的查詢」，方便日後快速查看。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">結語：Cloud Armor 值得學嗎？</h2>



<p class="wp-block-paragraph">值得，而且應該在服務上線前就設定好，而不是等到被攻擊才補。</p>



<p class="wp-block-paragraph">GCP Cloud Armor 的入門門檻不高，Standard 版本費用合理，3 個步驟就能讓你的服務多一層 WAF 保護：建立安全政策、加規則、套用到 Backend Service。</p>



<p class="wp-block-paragraph">從最基本的 IP 封鎖和地理封鎖開始，再慢慢加入 WAF 預建規則集，觀察 Log，調整靈敏度。</p>



<p class="wp-block-paragraph">不需要一次把所有功能都打開，循序漸進才不會誤擋正常流量。</p>



<p class="wp-block-paragraph">如果你的服務已經有 Global External HTTP(S) Load Balancer，今天就可以花 15 分鐘把基礎的 Cloud Armor 設定好。</p>



<p class="wp-block-paragraph">相關細節可以參考 <a href="https://docs.cloud.google.com/armor/docs/cloud-armor-overview?hl=zh-tw" target="_blank" rel="noopener" title="">Cloud Armor 說明文件</a>。</p>



<p class="wp-block-paragraph">如果想了解其他 GCP 的資安防禦功能，可以參考<a href="https://dongdonggcp.com/2024/07/17/gcp-common-security-service/" target="_blank" rel="noopener" title="">《雲端的資訊安全防禦縱深，常用 GCP 資安服務介紹》</a>。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">常見問題（FAQ）</h2>



<p class="wp-block-paragraph"><strong>Q1：Cloud Armor 可以防禦 L3/L4 層的 DDoS 攻擊嗎？</strong> </p>



<p class="wp-block-paragraph">A：GCP Cloud Armor 本身專注在 L7 層（應用程式層）的防護，L3/L4 層的 DDoS 防禦由 Google 底層基礎設施自動提供，不需要額外設定。大流量的 UDP Flood 或 SYN Flood，Google 網路邊緣就會自動緩解。如果你需要 L7 層的 HTTP Flood 防護，才需要在 Cloud Armor 設定速率限制規則。</p>



<p class="wp-block-paragraph"><strong>Q2：Cloud Armor 可以保護 Cloud Run 服務嗎？</strong> </p>



<p class="wp-block-paragraph">A：可以，但 Cloud Run 必須先搭配 Global External HTTP(S) Load Balancer 對外服務，才能套用 GCP Cloud Armor 安全政策。設定方式是建立 Serverless NEG（Network Endpoint Group），把 Cloud Run 掛到 LB 的後端服務，再套用安全政策。直接用 Cloud Run 的 <code>.run.app</code> 網址，無法使用 Cloud Armor。</p>



<p class="wp-block-paragraph"><strong>Q3：Cloud Armor 的規則修改後多久生效？</strong> </p>



<p class="wp-block-paragraph">A：在 Google Cloud Console 儲存後，新規則或修改後的規則最快 60 秒內生效，最慢約 5 分鐘完全傳播到所有 Google 邊緣節點。如果測試時還沒看到封鎖效果，等 5 分鐘後再試，不要急著以為設定有問題。</p>



<p class="wp-block-paragraph"><strong>Q4：同一個 GCP 專案可以建立幾個安全政策？</strong> </p>



<p class="wp-block-paragraph">A：預設上限是每個 GCP 專案 200 個安全政策，每個政策最多 200 條規則。一般使用不太會碰到這個限制。如果有需要，可以申請提高配額。</p>



<p class="wp-block-paragraph"><strong>Q5：安全政策可以套用到多個 Load Balancer 嗎？</strong> </p>



<p class="wp-block-paragraph">A：一個安全政策可以套用到多個後端服務（Backend Service），這些後端服務可以屬於不同的 Load Balancer。但反過來，一個後端服務在同一時間只能套用 1 個安全政策。</p>



<p class="wp-block-paragraph"><strong>Q6：使用 WAF 預建規則集會不會有很多誤判？</strong> </p>



<p class="wp-block-paragraph">A：剛啟用時確實可能有誤判，特別是靈敏度較高的等級。建議先用「Preview Mode」觀察 1–3 天的 Log，確認沒有異常後再正式開啟封鎖。靈敏度從 Level 1 開始，視需要再調高。</p>



<p class="wp-block-paragraph"><strong>Q7：Cloud Armor 可以封鎖特定的 User-Agent 嗎？</strong> </p>



<p class="wp-block-paragraph">A：可以。用 CEL 表達式判斷 <code>request.headers['user-agent']</code> 欄位，例如封鎖 sqlmap 工具：<code>request.headers['user-agent'].matches('.*sqlmap.*')</code>。不過攻擊者可以輕易偽造 User-Agent，這個方法只適合封鎖懶惰的攻擊工具，不能作為主要防禦手段。</p>



<p class="wp-block-paragraph"><strong>Q8：Cloud Armor 有辦法只保護特定路徑，不影響其他路徑嗎？</strong> </p>



<p class="wp-block-paragraph">A：可以。在規則條件中加入 <code>request.path</code> 的判斷，例如 <code>request.path.matches('/api/.*')</code> 只對 API 路徑套用規則，其他路徑不受影響。這樣可以針對敏感端點設定嚴格規則，同時不影響靜態資源的存取速度。</p>



<p class="wp-block-paragraph"><strong>Q9：Cloud Armor 和 reCAPTCHA 可以結合使用嗎？</strong> </p>



<p class="wp-block-paragraph">A：可以。Cloud Armor 支援整合 reCAPTCHA Enterprise，當偵測到可疑流量時，可以觸發 CAPTCHA 挑戰，而不是直接封鎖。這個功能適合面向一般用戶的服務，因為直接封鎖可能誤傷真實用戶，先給 CAPTCHA 挑戰更友善。</p>



<p class="wp-block-paragraph"><strong>Q10：如果我換掉 Load Balancer，之前設定的 Cloud Armor 安全政策會消失嗎？</strong> </p>



<p class="wp-block-paragraph">A：GCP Cloud Armor 安全政策本身不會消失，因為它是獨立的 GCP 資源。但套用關係會斷掉，因為原本的 Backend Service 被刪除了。換 LB 後，你需要重新把安全政策套用到新 LB 的後端服務上，政策內的規則設定全部保留，不需要重新設定。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://dongdonggcp.com/2026/04/21/gcp-cloud-armor-complete-guide-features-setup-rules/">GCP Cloud Armor 完整教學：功能介紹、使用條件與防禦規則設定</a> first appeared on <a href="https://dongdonggcp.com">東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://dongdonggcp.com/2026/04/21/gcp-cloud-armor-complete-guide-features-setup-rules/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">11802</post-id>	</item>
		<item>
		<title>使用 GCP Service Account 開發程式的小技巧和注意事項</title>
		<link>https://dongdonggcp.com/2025/04/14/tips-when-developing-with-gcp-service-account/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tips-when-developing-with-gcp-service-account</link>
					<comments>https://dongdonggcp.com/2025/04/14/tips-when-developing-with-gcp-service-account/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 14 Apr 2025 06:21:38 +0000</pubDate>
				<category><![CDATA[資訊安全]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[Service Account]]></category>
		<category><![CDATA[Service Account Key]]></category>
		<category><![CDATA[服務帳戶]]></category>
		<category><![CDATA[權限]]></category>
		<category><![CDATA[駭客]]></category>
		<guid isPermaLink="false">https://dongdonggcp.com/?p=10436</guid>

					<description><![CDATA[<p>上次在 《GCP 的 Cloud IAM [&#8230;]</p>
<p>The post <a href="https://dongdonggcp.com/2025/04/14/tips-when-developing-with-gcp-service-account/">使用 GCP Service Account 開發程式的小技巧和注意事項</a> first appeared on <a href="https://dongdonggcp.com">東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">上次在 <a href="https://dongdonggcp.com/2024/12/10/what-is-gcp-cloud-iam-role-and-permission-introduction/">《GCP 的 Cloud IAM – 角色與權限控管介紹》</a>有提到 Service Account ，這次我們從開發人員的角度，來分享在開發程式過程當中，使用 Service Account 的一些技巧和注意事項。</p>



<h1 class="wp-block-heading">一、Service Account 簡介</h1>



<p class="wp-block-paragraph">在 GCP 各種底層運作當中，有很多會代替我們人類執行的服務，例如 Compute Engine 的虛擬機器，這些服務要動起來，就要給它們一個身份，就是&nbsp; Service Account，並且要讓它們有權限存取其他服務，例如 Cloud Storage 或 BigQuery，就要在 IAM 授予角色給 Service Account。</p>



<p class="wp-block-paragraph">從開發的角度來說，Service Account 就是程式專用的帳戶，代表程式本人的身份。重點是，程式是 24 小時全年無休在跑的，它操作 GCP 的次數遠遠超過我們人類，所以管理好 Service Account 很明顯是更為重要的。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="472" src="https://dongdonggcp.com/wp-content/uploads/2025/04/01-Service-Account-運作示意圖-1024x472.png" alt="" class="wp-image-10437" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/01-Service-Account-運作示意圖-1024x472.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/01-Service-Account-運作示意圖-300x138.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/01-Service-Account-運作示意圖-768x354.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/01-Service-Account-運作示意圖.png 1421w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">01 Service Account 運作示意圖<br>資料來源：自行繪製</figcaption></figure>



<p class="wp-block-paragraph">和人類的帳號不同的是，Service Account 是沒有密碼的，它是放在程式裡使用，典型的方法就是產生 Service Account Key，它是一個 Json 文字檔，上面記錄 Service Account 所在的 GCP 專案、Key 的 ID、Key 本身 RSA 2048 的值（可視為密碼）等等。</p>



<p class="wp-block-paragraph">我們會在程式碼裡指定 Key 的存取位置，但通常我們不會把 Key 直接放在程式碼當中（太危險了），而是去外部某個安全的地方讀取到 Key，就可以去呼叫 GCP 上的各項服務。</p>



<p class="wp-block-paragraph">重點就在這裡，一個 Service Account 可以生成很多 Key，而這些 Key 都被使用者下載到各處，或直接存到主機的某個地方，反而增加了帳戶被盜的風險。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="579" src="https://dongdonggcp.com/wp-content/uploads/2025/04/02-一個-Service-Account-可以產生多個-Key-1024x579.png" alt="" class="wp-image-10438" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/02-一個-Service-Account-可以產生多個-Key-1024x579.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/02-一個-Service-Account-可以產生多個-Key-300x170.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/02-一個-Service-Account-可以產生多個-Key-768x435.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/02-一個-Service-Account-可以產生多個-Key.png 1421w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">02 一個 Service Account 可以產生多個 Key&nbsp;<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">萬一權限設定太大，而 Key 又被拿走，就像你的帳戶被盜，駭客可以在你的專案環境建立大量機器做為殭屍電腦，或是挖礦，一開就是幾千幾萬台，導致你在幫駭客支付 GCP 的費用。</p>



<p class="wp-block-paragraph">因此 Service Account 和 Key 務必好好保管，以免遭有心人士濫用。</p>



<h1 class="wp-block-heading">二、使用 Service Account 的小技巧</h1>



<p class="wp-block-paragraph">以下我們依照系統開發的流程，來逐步說明使用 Service Account 的小技巧。</p>



<h2 class="wp-block-heading">(一) 系統設計階段的最佳安全實務</h2>



<h3 class="wp-block-heading">1. 充分利用 GCP 內建的身份驗證機制&nbsp;</h3>



<h4 class="wp-block-heading">(1) 在 GCP 內部運行的資源</h4>



<p class="wp-block-paragraph">針對運作應用程式的服務如 Compute Engine、App Engine 和 Cloud Run，一定要為它們設定專屬的 Service Account。</p>



<p class="wp-block-paragraph">首先 Service Account 在這些服務當中運作，不需要產生 Service Account Key 去跟其他 GCP 服務互動，光是這一點，就直接免除了金鑰外洩的風險。</p>



<p class="wp-block-paragraph">而由於像 Compute Engine 和 App Engine 預設的 Service Account 具有 Editor 角色，權限非常大，所以才要另外設定專屬的 Service Account，並且給它們設定「最小且必要的權限」，就是所謂最小權限原則 （Principle of Least Privilege），即使該服務被盜用，也能透過權限來限制它的活動範圍，降低駭客入侵帶來的破壞。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="286" src="https://dongdonggcp.com/wp-content/uploads/2025/04/03-Compute-Engine-和-App-Engine-預設的-Service-Account--1024x286.png" alt="" class="wp-image-10439" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/03-Compute-Engine-和-App-Engine-預設的-Service-Account--1024x286.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/03-Compute-Engine-和-App-Engine-預設的-Service-Account--300x84.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/03-Compute-Engine-和-App-Engine-預設的-Service-Account--768x214.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/03-Compute-Engine-和-App-Engine-預設的-Service-Account-.png 1164w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">03 Compute Engine 和 App Engine 預設的 Service Account&nbsp;<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">而且每個服務用各自的 Service Account ，可以確保每一支程式都是隔離運作的，萬一有個服務遭到入侵，也不會影響到其他服務的正常運作，避免「牽一髮而動全身」的風險。</p>



<h4 class="wp-block-heading">(2) 容器化環境的解決方案</h4>



<p class="wp-block-paragraph">Google Kubernetes Engine (GKE) 提供 Workload Identity Federation for GKE。讓 Kubernetes 服務帳號能夠無縫地對應到 GCP 服務帳號，帶來極大便利。</p>



<p class="wp-block-paragraph">透過這種方式，容器化應用程式可以直接使用 GCP 的各種服務，而不需要在系統中儲存 Service Account Key。簡化了權限管理流程，也顯著提升了系統的安全性，為開發者和維運人員提供了一個更加方便且安全的雲端運算環境。</p>



<h4 class="wp-block-heading">(3) 在 GCP 外部的系統中的創新方法</h4>



<p class="wp-block-paragraph">同上 Workload Identity Federation 不只用於 GKE，也能讓不在 GCP 內部的系統也能輕鬆存取 GCP 資源。</p>



<p class="wp-block-paragraph">這項功能讓在 AWS、Azure 或是公司自己機房的應用程式，可以使用它們原本的身份認證機制來存取 GCP 的各種服務，不需要額外管理和儲存 GCP 的 Service Account Key。</p>



<p class="wp-block-paragraph">這樣的設計大幅減少了在多雲環境下管理憑證的複雜度，讓跨雲服務的整合變得更加簡單安全。</p>



<p class="wp-block-paragraph">綜合以上三種解決方法，你可以看出來，就是盡量不使用到 Service Account Key，間接地減少金鑰外洩的風險。</p>



<h3 class="wp-block-heading">2. 建立清晰的 Service Account 策略</h3>



<h4 class="wp-block-heading">(1) 了解各種身份驗證選項的優缺點</h4>



<p class="wp-block-paragraph">A. 從應用程式連接 GCP 各項服務</p>



<p class="wp-block-paragraph">你可以設定「應用程式預設憑證」(Application Default Credentials；ADC)，然後使用對應的程式語言函式庫，這是最常見的開發方式，適合大多數應用程式開發。</p>



<p class="wp-block-paragraph">B. 需要使用 ID Token 的情況</p>



<p class="wp-block-paragraph">ADC 主要是證明「這個應用程式有權限使用 Google Cloud 資源」，但不知道身份，ID Token：主要是證明「這個人/使用者是誰」，包含使用者身分資訊。當你需要使用者層級的身分驗證，不只是「應用程式有權限」而已。</p>



<p class="wp-block-paragraph">C. 實作使用者身份驗證</p>



<p class="wp-block-paragraph">當你需要讓你的應用程式的使用者能夠登入並存取 Google 服務，可以查看<a href="https://cloud.google.com/docs/authentication/use-cases#app-users">這份文件</a>，裡面有不同方式的比較。</p>



<p class="wp-block-paragraph">D. 在本機環境試用命令列（Command Line）工具</p>



<p class="wp-block-paragraph">你可以在自己電腦上安裝 gcloud CLI，輸入驗證的指令並確認身份後，就可以輸入各種指令來操作各項 GCP 的服務和資源。</p>



<p class="wp-block-paragraph">E. 在本機環境測試 API</p>



<p class="wp-block-paragraph">你不需要特別準備一個寫程式的環境，你可以直接用像是 curl 的指令來呼叫 REST API。</p>



<p class="wp-block-paragraph">F. 測試 GCP 官網提供的範例程式碼</p>



<p class="wp-block-paragraph">你可以在本機設定 ADC 憑證，並安裝相關的客戶端函式庫（ Client Library），客戶端函式庫會自動找到你的憑證，讓你能直接執行程式碼。</p>



<p class="wp-block-paragraph">在 GCP 的官方文件中，已經整理好<a href="https://cloud.google.com/docs/authentication#quick-links">各種身分驗證的相關說明</a>，你會發現有很多情況不一定要使用 Service Account 和 Key。</p>



<h4 class="wp-block-heading">(2) 建立評估流程</h4>



<p class="wp-block-paragraph">為特定情境選擇最合適的身份驗證方式，可以參考<a href="https://cloud.google.com/docs/authentication#auth-decision-tree">這個流程</a>，你一樣會發現，在判斷的過程當中，很多情境都不一定要用到 Service Account，真的是沒有其他辦法了，才用 Service Account。</p>



<h4 class="wp-block-heading">(3) 使用機構政策 (Organization Policy)&nbsp;</h4>



<p class="wp-block-paragraph">Organization Policy 提供了管理 Service Account 和 Key 的多種政策控制如下：</p>



<ul class="wp-block-list">
<li><strong>iam.disableServiceAccountCreation</strong> &#8211; 禁止在專案中創建新的 Service Account</li>



<li><strong>iam.disableServiceAccountKeyCreation</strong> &#8211; 禁止為服務帳戶創建新的 Service Account Key</li>



<li><strong>iam.disableServiceAccountKeyUpload</strong> &#8211; 禁止上傳外部生成的 Service Account Key</li>



<li><strong>iam.serviceAccountKeyExpiryHours</strong> &#8211; 強制設定 Service Account Key 到期時間</li>



<li><strong>iam.allowedPolicyMemberDomains</strong> &#8211; 限制可以被授予 IAM 角色的帳號所屬的網域，包括服務帳戶的網域。</li>
</ul>



<p class="wp-block-paragraph">使用機構政策做到了幾件重要的事情：它們防止人們亂建立沒人監控的服務帳戶，這樣可以避免資源使用混亂。</p>



<p class="wp-block-paragraph">它們也限制 Key 的建立，並要求定期更換 Key，大幅降低了 Key 被盜用的風險。這些工具還讓管理員能清楚看到誰在用什麼服務帳戶、有什麼權限，確保公司符合各種規定。</p>



<p class="wp-block-paragraph">最重要的是，這些政策幫助確保只有真正需要的服務帳戶會被建立，減少了可能被攻擊的地方。你可以根據不同部門或專案的需求，靈活設定這些規則的嚴格程度，既保障安全又不會妨礙正常工作。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="658" src="https://dongdonggcp.com/wp-content/uploads/2025/04/04-各-Service-Account-相關的-Org-Policy-1024x658.png" alt="" class="wp-image-10440" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/04-各-Service-Account-相關的-Org-Policy-1024x658.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/04-各-Service-Account-相關的-Org-Policy-300x193.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/04-各-Service-Account-相關的-Org-Policy-768x493.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/04-各-Service-Account-相關的-Org-Policy.png 1252w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">04 各 Service Account 相關的 Org Policy<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<h2 class="wp-block-heading">(二) 開發與測試階段技巧</h2>



<h3 class="wp-block-heading">1. 使用專屬的 Service Account 提高可觀察性</h3>



<p class="wp-block-paragraph">為每個應用程式建立獨立的服務帳戶，並分配最小權限。</p>



<p class="wp-block-paragraph">你甚至可以在不同環境的應用程式中，都使用不同的服務帳號，讓環境的隔離做得更為徹底，就不會發生一台機器中毒，然後感染整個環境的狀況。&nbsp;</p>



<p class="wp-block-paragraph">另外一個好處是，當你查看稽核記錄（ (Audited Logs）時，可以通過「principalEmail」欄位追蹤到每一個 Service Account 到底訪問過哪些資源，或是操作過哪些 API，確保他們沒有濫用權限，或訪問不該訪問的地方，大為提高了 Troubleshooting 的效率。</p>



<p class="wp-block-paragraph">這樣做有幾個重要好處，首先它能幫助您清楚區分不同應用程式的活動，讓監控和管理變得更加簡單。</p>



<p class="wp-block-paragraph">此外，還能幫助你進行更精確的權限控制，讓每個服務只擁有它所需的最小權限，從而減少安全風險。如果一個服務帳戶被入侵，受影響的範圍也會被限制在該服務的權限內，不會危及整個系統。</p>



<h3 class="wp-block-heading">2. 安全地建立與傳送金鑰</h3>



<h4 class="wp-block-heading">(1) 使用命令列工具創建金鑰的技巧&nbsp;</h4>



<p class="wp-block-paragraph">在 GCP 中建議使用命令列工具來提高安全性，就是下達 gcloud 指令，直接將 Key 檔案寫入指定的位置：</p>



<p class="wp-block-paragraph">gcloud iam service-accounts keys create&nbsp;</p>



<p class="wp-block-paragraph">這種方法的好處是，系統會自動設置適當的檔案權限，提高了金鑰的安全性。這比手動下載金鑰檔案更安全可靠，也減少了人為錯誤的可能性，像是 Key 到處亂放、甚至被盜取的情況。</p>



<h4 class="wp-block-heading">(2) 在團隊間安全傳送憑證的新方法&nbsp;</h4>



<p class="wp-block-paragraph">傳統上，我們是直接把 JSON 金鑰檔案通過電子郵件、聊天工具（如 Line 或Slack）或雲端硬碟分享等方式將檔案傳送給別人。</p>



<p class="wp-block-paragraph">這樣會增加了洩露的風險，同一個金鑰檔案可能同時存在多個地方，甚至大家傳來傳去，過程中複製越多份，存放的地方越多，越有可能被有心人士取得。</p>



<p class="wp-block-paragraph">萬一金鑰被盜，你也沒有辦法追蹤到底是誰手上的那一個金鑰被盜。這樣的話，管理員只能直接停用這個金鑰，這樣也會導致要使用同一個金鑰的人全部都不能用，相關的程式全部都停止運作，你必須重新建立金鑰，然後再次發送給各位，非常麻煩。</p>



<p class="wp-block-paragraph">你可以採用一種創新的自簽證書方法，這比傳統方式更安全。</p>



<p class="wp-block-paragraph">具體做法是：首先在需要使用 Service Account 的目標主機上創建 RSA 2048 位的金鑰對和自簽證書。</p>



<p class="wp-block-paragraph">建立私鑰：</p>



<p class="wp-block-paragraph">openssl genrsa -out private-key.pem 2048</p>



<p class="wp-block-paragraph">使用私鑰創建公鑰證書請求：&nbsp;</p>



<p class="wp-block-paragraph">openssl req -new -key private-key.pem -out cert-request.csr</p>



<p class="wp-block-paragraph">根據系統提示來填寫國家名稱、城市、公司名稱、單位名稱、服務名稱和電子郵件地址。</p>



<p class="wp-block-paragraph">生成自簽證書（有效期 365 天）：</p>



<p class="wp-block-paragraph">openssl x509 -req -days 365 -in cert-request.csr -signkey private-key.pem -out public-cert.pem</p>



<p class="wp-block-paragraph">開發人員只需要傳遞公開的證書檔案（public-cert.pem）給 GCP 管理員，這部分無需保密，可以透過一般的溝通管道分享。</p>



<p class="wp-block-paragraph">然後，管理員將這個公開證書上傳並綁定到對應的 Service Account：</p>



<p class="wp-block-paragraph">gcloud iam service-accounts keys upload public-cert.pem &#8211;iam-account=<a href="mailto:my-service-account@project-id.iam.gserviceaccount.com">my-service-account@project-id.iam.gserviceaccount.com</a></p>



<p class="wp-block-paragraph">運作流程如下圖：</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="450" src="https://dongdonggcp.com/wp-content/uploads/2025/04/05-GCP-Service-Account-自簽證書運作流程-1024x450.png" alt="" class="wp-image-10441" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/05-GCP-Service-Account-自簽證書運作流程-1024x450.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/05-GCP-Service-Account-自簽證書運作流程-300x132.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/05-GCP-Service-Account-自簽證書運作流程-768x337.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/05-GCP-Service-Account-自簽證書運作流程-1536x674.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/05-GCP-Service-Account-自簽證書運作流程-2048x899.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">05 GCP Service Account 自簽證書運作流程<br>資料來源：自行繪製</figcaption></figure>



<p class="wp-block-paragraph">這種方法的最大優點是完全不需要傳遞私鑰，因為私鑰始終保留在原始機器上，大幅降低了憑證洩露的風險，同時保證了開發人員和主機能夠安全地使用 Service Account。</p>



<p class="wp-block-paragraph">到這裡你可能會想到一個問題，上面提到的原始機器，不就是 Compute Engine 的虛擬機器嗎？Compute Engine 在呼叫 GCP 服務時，本來就不需要使用 Service Account Key 啊，這樣做有什麼意義嗎？不是多此一舉？</p>



<p class="wp-block-paragraph">對的， Compute Engine 本來就不用 Service Account Key，這個自簽證書的機制主要是針對「外部環境」設計的，例如：</p>



<ul class="wp-block-list">
<li><strong>本機開發環境</strong>：開發人員在自己的電腦上進行開發時需要存取 GCP 資源</li>



<li><strong>其他雲端平台的機器</strong>：例如在 AWS、Azure 或阿里雲上運行但需要存取 GCP 服務的應用</li>



<li><strong>自有機房中的主機</strong>：公司內部數據中心的機器需要與 GCP 服務整合</li>



<li><strong>CI/CD 管道</strong>：在 Jenkins、GitHub Actions 等持續整合 (Continuous Integration) 環境中需要存取 GCP</li>



<li><strong>第三方服務</strong>：需要整合到 GCP 的外部 SaaS 解決方案</li>
</ul>



<h4 class="wp-block-heading">(3) 善用過期時間設置</h4>



<p class="wp-block-paragraph">前面提到的 Organizatino Policy，設定的是「所有 Service Account Key」統一的有效時間，而每一個 Service Account Key 本身，都可以單獨設定到期時間。</p>



<p class="wp-block-paragraph">前者會設定長一點，例如三個月或六個月，做為所有 Key 的最低要求，後者則是會視情況設定較短的到期時間，可能只有 7~30 天，因為它的掌控程度較高，萬一到期再建立新的 Key 就好了。</p>



<p class="wp-block-paragraph">我們可以為開發和測試環境的 Service Account Key 設定合理的過期時間，自動讓不再需要的 Key 失效，減少後續管理工作，即使金鑰被有心人士取得，它也失去了作用。</p>



<h2 class="wp-block-heading">(三) 部署與生產環境技巧</h2>



<h3 class="wp-block-heading">1. 優化 Service Account Key 的存儲方式</h3>



<h4 class="wp-block-heading">(1) 硬體安全解決方案</h4>



<p class="wp-block-paragraph">使用硬體安全模組（Hardware Security Module；HSM）或可信平台模組（Trusted Platform Module；TPM）來管理您的金鑰可以大幅提升安全性。</p>



<h5 class="wp-block-heading">A. 硬體安全模組</h5>



<p class="wp-block-paragraph">關於 HSM，你可以購買專用的設備，價格為幾千到幾萬元不等，然後將此設備連接到伺服器上（不一定是 GCP 的虛擬機器）。 HSM 設備通常會提供的管理工具，使用跟上述類似的方法建立 RSA 金鑰對和公開的自簽證書，再上傳到 GCP 綁定 Service Account Key。</p>



<p class="wp-block-paragraph">程式要準備呼叫 GCP 的 API 時，會先呼叫 HSM 廠商提供的 API，發送資料跟 HSM 索取簽名，簽名就是要向 GCP 證明這個 Request 是合法的，簽名結果再返回程式，程式再將原始資料和簽名結果一起發送到 Google Cloud API。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="415" src="https://dongdonggcp.com/wp-content/uploads/2025/04/06-硬體安全模組-HSM-保護方案-1024x415.png" alt="" class="wp-image-10442" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/06-硬體安全模組-HSM-保護方案-1024x415.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/06-硬體安全模組-HSM-保護方案-300x122.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/06-硬體安全模組-HSM-保護方案-768x311.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/06-硬體安全模組-HSM-保護方案-1536x622.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/06-硬體安全模組-HSM-保護方案-2048x830.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">06 硬體安全模組 (HSM) 保護方案<br>資料來源：自行繪製</figcaption></figure>



<p class="wp-block-paragraph">其實，你不一定要額外購買 HSM 設備，Cloud Key Management Service (Cloud KMS) 也有 HSM 的功能，這是一種由 Google 管理的硬體安全模組服務，符合 FIPS 140-2 Level 3 安全標準，這樣你就不需要購買實體 HSM 設備。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="411" src="https://dongdonggcp.com/wp-content/uploads/2025/04/07-Cloud-KMS-加-HSM-Cloud-HSM-保護方案-1024x411.png" alt="" class="wp-image-10443" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/07-Cloud-KMS-加-HSM-Cloud-HSM-保護方案-1024x411.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/07-Cloud-KMS-加-HSM-Cloud-HSM-保護方案-300x120.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/07-Cloud-KMS-加-HSM-Cloud-HSM-保護方案-768x308.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/07-Cloud-KMS-加-HSM-Cloud-HSM-保護方案-1536x617.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/07-Cloud-KMS-加-HSM-Cloud-HSM-保護方案-2048x823.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">07 Cloud KMS 加 HSM Cloud HSM 保護方案<br>資料來源：自行繪製</figcaption></figure>



<p class="wp-block-paragraph">GCP 使用之前儲存的公鑰，來驗證簽名是否真的由對應的私鑰生成。只有當簽名驗證成功時，GCP 才會認為這是來自授權 Service Account 的合法請求。</p>



<p class="wp-block-paragraph">這樣做有幾個好處：</p>



<ul class="wp-block-list">
<li>即使有人攔截了請求和簽名，也無法使用這些資訊生成新的有效請求，就是駭客無法產生新的並且合法的 Request 來呼叫 GCP 的 API。</li>



<li>只有 HSM 中的私鑰才能生成 GCP 可以驗證的有效簽名，是一個唯一可以信任的來源。</li>



<li>主機和應用程式不一定都要在 GCP 內，但如果都在 GCP 內部，必定更為安全。</li>



<li>每個請求的簽名都是獨特的，防止重放攻擊（Replay Attack），指的是駭客使用一模一樣的資料去操作 GCP。</li>
</ul>



<h5 class="wp-block-heading">B. 可信任平台模組 (TPM)</h5>



<p class="wp-block-paragraph">大多數電腦（特別是 2016 年後製造的）通常已內建 TPM 2.0 晶片在主機板上。如果沒有內建 TPM，你就要購買一個 TPM 模組並安裝到主機板上。</p>



<p class="wp-block-paragraph">這些模組通常是小型電路板，可以插入主機板上專門的 TPM 插槽。然後在 Linux 上，使用 tpm2-tools 工具集來產生金鑰。</p>



<p class="wp-block-paragraph">以 Debian 為例，您可以安裝 tpm2-tools 後執行：</p>



<p class="wp-block-paragraph">ls /dev/tpm*</p>



<p class="wp-block-paragraph">如果顯示 /dev/tpm0 或 /dev/tpmrm0，通常表示系統已識別到 TPM 設備：</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="816" height="514" src="https://dongdonggcp.com/wp-content/uploads/2025/04/08-檢查系統有有沒有安裝-TPM2.png" alt="" class="wp-image-10444" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/08-檢查系統有有沒有安裝-TPM2.png 816w, https://dongdonggcp.com/wp-content/uploads/2025/04/08-檢查系統有有沒有安裝-TPM2-300x189.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/08-檢查系統有有沒有安裝-TPM2-768x484.png 768w" sizes="(max-width: 816px) 100vw, 816px" /><figcaption class="wp-element-caption">08 檢查系統有有沒有安裝 TPM2<br>資料來源：擷圖自 <a href="https://4sysops.com/archives/unlock-linux-unified-key-setup-luks-encrypted-partitions-with-tpm-20/">4sysops</a></figcaption></figure>



<p class="wp-block-paragraph">安裝 tpm2-tools 的相關指令如下（不同作業系統版本，指令可能會有所不同）：</p>



<p class="wp-block-paragraph">更新套件列表：</p>



<p class="wp-block-paragraph">sudo apt update</p>



<p class="wp-block-paragraph">安裝 TPM2 工具和資源庫：</p>



<p class="wp-block-paragraph">sudo apt install tpm2-tools tpm2-abrmd libtss2-dev</p>



<p class="wp-block-paragraph">安裝後重啟電腦，進入 BIOS/UEFI 設定，尋找 「Security」或「Advanced」選項，啟用 「TPM」，然後重啟電腦。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="614" src="https://dongdonggcp.com/wp-content/uploads/2025/04/09-在-BIOS-啟用-TPM-1024x614.jpg" alt="" class="wp-image-10445" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/09-在-BIOS-啟用-TPM-1024x614.jpg 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/09-在-BIOS-啟用-TPM-300x180.jpg 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/09-在-BIOS-啟用-TPM-768x461.jpg 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/09-在-BIOS-啟用-TPM.jpg 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">09 在 BIOS 啟用 TPM<br>資料來源：擷圖自 <a href="https://tw.msi.com/blog/How-to-Enable-TPM-on-MSI-Motherboards-Featuring-TPM-2-0">MSI 網站</a></figcaption></figure>



<p class="wp-block-paragraph">接下來建立「主要金鑰」（Primary Key），它是 TPM 中所有其他金鑰的根源。</p>



<p class="wp-block-paragraph">tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctx</p>



<p class="wp-block-paragraph">然後使用之前創建的主要金鑰來創建一個子金鑰對：</p>



<p class="wp-block-paragraph">tpm2_create -C primary.ctx -u key.pub -r key.priv</p>



<p class="wp-block-paragraph">將金鑰載入 TPM：</p>



<p class="wp-block-paragraph">tpm2_load -C primary.ctx -u rsa.pub -r rsa.priv -c rsa.ctx</p>



<p class="wp-block-paragraph">將公鑰轉換為 PEM 格式（是 GCP 可接受的格式）：</p>



<p class="wp-block-paragraph">tpm2_readpublic -c rsa.ctx -o rsa.pem -f pem</p>



<p class="wp-block-paragraph">使用 OpenSSL 指令創建自簽名證書：</p>



<p class="wp-block-paragraph">openssl req -new -x509 -key tpmkey -out cert.pem</p>



<p class="wp-block-paragraph">接下來就可以將 rsa_cert.pem 上傳到 GCP Service Account。</p>



<p class="wp-block-paragraph">最後程式在運作時，就可以使用以下指令，對要簽名的資料（例如 data.txt）來執行「簽名」：</p>



<p class="wp-block-paragraph">tpm2_sign -c rsa.ctx -g sha256 -o signature.bin data.txt</p>



<p class="wp-block-paragraph">另外注意程式需要能夠呼叫 TPM 指令，這需要使用 tpm2-tss 等程式庫進行開發。而且電腦必須保持開機狀態才能使用這些金鑰，因為私鑰無法從 TPM 中導出。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="444" src="https://dongdonggcp.com/wp-content/uploads/2025/04/10-硬體主機使用-TPM-建立-Service-Account-Key-1024x444.png" alt="" class="wp-image-10446" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/10-硬體主機使用-TPM-建立-Service-Account-Key-1024x444.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/10-硬體主機使用-TPM-建立-Service-Account-Key-300x130.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/10-硬體主機使用-TPM-建立-Service-Account-Key-768x333.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/10-硬體主機使用-TPM-建立-Service-Account-Key-1536x667.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/10-硬體主機使用-TPM-建立-Service-Account-Key-2048x889.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">10 硬體主機使用 TPM 建立 Service Account Key<br>資料來源：自行繪製</figcaption></figure>



<p class="wp-block-paragraph">這樣一來，應用程式只需要使用 HSM/TPM 提供的簽名 API，而不必直接接觸私鑰。這種方法提供了硬體層級的安全保障，有效防止金鑰被複製或提取，大幅降低了資安風險。</p>



<h3 class="wp-block-heading">(2) 軟體金鑰庫的實用技巧</h3>



<p class="wp-block-paragraph">如果你要使用軟體金鑰庫來儲存 GCP Service Account Key，在 GCP 中可以使用 Secret Manager 來儲存，以下是幾個具體的實作方法：</p>



<h4 class="wp-block-heading">A. 設定精細的存取控制</h4>



<ul class="wp-block-list">
<li>為 Secret Manager 的使用者，設定最小 IAM 角色權限。</li>



<li>建立 Secret，然後把 Service Account 放在 Secret 裡面。</li>



<li>為不同團隊或服務建立專用的存取群組，例如讓開發團隊只能存取開發環境的 Secret。</li>
</ul>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="607" src="https://dongdonggcp.com/wp-content/uploads/2025/04/11-不同-Secret-可以授權給不同團隊-1024x607.png" alt="" class="wp-image-10447" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/11-不同-Secret-可以授權給不同團隊-1024x607.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/11-不同-Secret-可以授權給不同團隊-300x178.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/11-不同-Secret-可以授權給不同團隊-768x455.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/11-不同-Secret-可以授權給不同團隊-1536x910.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/11-不同-Secret-可以授權給不同團隊-2048x1213.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">11 不同 Secret 可以授權給不同團隊<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<ul class="wp-block-list">
<li>為不同環境創建不同的 Key，例如 service-account-key-dev 和 service-account-key-prod，然後為每個 Key 設定不同的存取權限，你也可以或使用不同專案隔離環境，每個專案中有各自的 Secret Manager 和 Key。</li>
</ul>



<h4 class="wp-block-heading">B. 詳細記錄所有使用情況：</h4>



<p class="wp-block-paragraph">為了追蹤每個 Key 在 Secret Manager 被存取的狀況，你可以啟用 Cloud Audit Logs 來追蹤，因為根據預設，Secret 的存取是不會主動記錄的。你要去稽核記錄把它打開：</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="447" src="https://dongdonggcp.com/wp-content/uploads/2025/04/12-在稽核記錄的-Secret-Manager-API-開啟資料讀取-1024x447.png" alt="" class="wp-image-10448" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/12-在稽核記錄的-Secret-Manager-API-開啟資料讀取-1024x447.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/12-在稽核記錄的-Secret-Manager-API-開啟資料讀取-300x131.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/12-在稽核記錄的-Secret-Manager-API-開啟資料讀取-768x335.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/12-在稽核記錄的-Secret-Manager-API-開啟資料讀取-1536x671.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/12-在稽核記錄的-Secret-Manager-API-開啟資料讀取-2048x895.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">12 在稽核記錄的 Secret Manager API 開啟資料讀取<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">我們可以故意測試一下，在 Secret Manager 建立一個 Secret 之後，再用 gcloud 指令去讀取它。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="671" src="https://dongdonggcp.com/wp-content/uploads/2025/04/13-使用-gcloud-指令讀取-Secret-1024x671.png" alt="" class="wp-image-10449" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/13-使用-gcloud-指令讀取-Secret-1024x671.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/13-使用-gcloud-指令讀取-Secret-300x197.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/13-使用-gcloud-指令讀取-Secret-768x503.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/13-使用-gcloud-指令讀取-Secret-1536x1006.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/13-使用-gcloud-指令讀取-Secret-2048x1342.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">13 使用 gcloud 指令讀取 Secret<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">你看到我執行了兩次讀取 Secret 的指令，因為當我第一次執行完後，出了「Hello」這個值，但我還沒馬上截圖，結果「Hello」這個值就消失了，所以我又再執行了一次，並且馬上截圖，可見 Secret 即使透過 gcloud 指令操作，也會顧及安全性，只顯示幾秒鐘。</p>



<p class="wp-block-paragraph">接著就可以在 Cloud Logging 的「已稽核的資源」看到 Secret 被存取的時間和操作人員。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="556" src="https://dongdonggcp.com/wp-content/uploads/2025/04/14-在-Cloud-Logging-可以查到-Secret-被讀取的稽核記錄-1024x556.png" alt="" class="wp-image-10450" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/14-在-Cloud-Logging-可以查到-Secret-被讀取的稽核記錄-1024x556.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/14-在-Cloud-Logging-可以查到-Secret-被讀取的稽核記錄-300x163.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/14-在-Cloud-Logging-可以查到-Secret-被讀取的稽核記錄-768x417.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/14-在-Cloud-Logging-可以查到-Secret-被讀取的稽核記錄-1536x834.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/14-在-Cloud-Logging-可以查到-Secret-被讀取的稽核記錄-2048x1112.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">14 在 Cloud Logging 可以查到 Secret 被讀取的稽核記錄<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">因為稽核記錄的儲存是有期限的，如果想要長期保存 Secret 的存取記錄，你可以設定 Log Export 到 BigQuery 或 Cloud Storage。</p>



<p class="wp-block-paragraph">另外，你也可以針對 Secret 的存取記錄，建立 Log-Based Metric 監控指標，這樣就可以把 Secret 的存取次數畫在儀表板上，如果有存取異常，例如某個 Secret 平均一分鐘大概存取 5 次，突然變成 500 次，很明顯就是異常，就可以再設定快訊，來及時通知管理員。</p>



<h4 class="wp-block-heading">C. 加再一層 Cloud KMS 確保主金鑰的安全</h4>



<p class="wp-block-paragraph">你可以在建立 Secret 時，選擇 CMEK (Customer-Managed Encryption Keys) 功能，使用 Cloud KMS 來的金鑰來加密你建立的 Secret，這樣你的金鑰，除了要有 Secret Manager 的權限角色，又同時要有 KMS 的權限角色，才能夠存取到 Secret 裡的金鑰，等於是雙重保護。</p>



<p class="wp-block-paragraph">你還可以定期輪換加密金鑰，建議每 90 天一次。這樣除了你的 Service Account Key 能夠定期輪換，KMS 的 Key 也定期輪換，這樣能讓金鑰被竊取所造成的風險降到最低。</p>



<h4 class="wp-block-heading">D. 實施防止未授權存取的機制</h4>



<p class="wp-block-paragraph">VPC Service Control 是 GCP 中最嚴格的安全功能，能夠限制哪些 API，只能從哪裡進來存取，以及資料只能輸出到哪裡。 例如你可以設定 Service Controls 限制只有公司網路才能存取 Secret Manager。</p>



<p class="wp-block-paragraph">即使 Secret Manager 是軟體功能，但是當它與其他 GCP 安全功能結合使用時，還是可以在各種資安功能互相搭配之下，給予完善的保護，有效降低憑證洩漏的風險。</p>



<h3 class="wp-block-heading">2. 高效追蹤 Service Account 使用情況</h3>



<p class="wp-block-paragraph">你可以使用 Cloud Logging 設定查詢語法，來識別過去 90 天是否有未使用的 Service Account。</p>



<p class="wp-block-paragraph">在 Cloud Monitoring 中設置監控金鑰身份驗證事件指標，然後針對指標設定快訊，例如某一個 Service Account 每天不會用來呼叫某 API 超過 1000次，若超過就發出快訊通知。這能幫助您了解 Service Account 的使用模式和頻率，從而識別異常行為。</p>



<p class="wp-block-paragraph">每個 Service Account 都有一個「指標」分頁，可以快速查看基本用量資訊，你可以直接從這裡找到要監控的指標，然後設定快訊，就不用去 Metrics Explorer 大海撈針尋找指標。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="684" src="https://dongdonggcp.com/wp-content/uploads/2025/04/15-在-Service-Account-的常見指標中建立用量告警-1024x684.png" alt="" class="wp-image-10451" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/15-在-Service-Account-的常見指標中建立用量告警-1024x684.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/15-在-Service-Account-的常見指標中建立用量告警-300x200.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/15-在-Service-Account-的常見指標中建立用量告警-768x513.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/15-在-Service-Account-的常見指標中建立用量告警-1536x1025.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/15-在-Service-Account-的常見指標中建立用量告警-2048x1367.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">15 在 Service Account 的常見指標中建立用量告警<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<h3 class="wp-block-heading">3. 外部整合的最佳實務建議</h3>



<h4 class="wp-block-heading">(1) 安全使用外部來源的憑證</h4>



<p class="wp-block-paragraph">當您需要從外部來源取得 Service Account Key 時，建立一個嚴謹的驗證流程非常重要。首先，您應該確保憑證的來源是可信的，例如大家統一都從 Secret Manager 取得 Key，而非透過 Line 或 Email 來傳送，避免使用來歷不明的金鑰檔案。</p>



<p class="wp-block-paragraph">因為駭客雖然沒那麼容易偽造 Key，但 Key 被駭客取得後，修改其中某些欄位（如重新導向或添加惡意程式碼）但保留核心加密部分，都有可能對你的系統或 GCP 環境造成破壞。</p>



<p class="wp-block-paragraph">所以每次收到或使用 Service Account Key 檔案時，都應該檢查其 JSON 格式中的 &#8220;type&#8221; 欄位值是否確實為 &#8220;service_account&#8221;，並且確認 Service Account 的電子郵件是否具有正當的權限，再確認這個 Key 是否能夠從 GCP 獲取令牌。這些檢查步驟都能幫助您確認您使用的是正確的憑證類型，而非其他類型的金鑰或偽造的檔案。</p>



<h4 class="wp-block-heading">(2) 全網域授權的高效方法</h4>



<p class="wp-block-paragraph">GCP 提供了一種更安全、更簡潔的方式來進行服務授權，不需要使用傳統的 Service Account 金鑰。這種方法利用 signJwt API，可以為全網域提供高效的授權機制。</p>



<p class="wp-block-paragraph">什麼是 signJwt？</p>



<p class="wp-block-paragraph">想像你需要寄一封非常重要的信，你想確保收信人知道這封信確實是你寄的，而且信的內容沒有被人竄改。在數位世界中，signJwt 就像是一種特殊的「數位簽名」服務，幫你在重要文件上蓋上無法偽造的印章。</p>



<p class="wp-block-paragraph">首先使用 Service Account 或 Workload Identity Federation 進行身份驗證。就像在公司大樓，你不用自己帶鑰匙，而是在前台登記後由保全確認你的身分。這樣可以避免直接管理和存儲敏感的金鑰文件。</p>



<p class="wp-block-paragraph">然後建立一個 JSON Web Token (JWT) 做為「數位通行證」，它包含實際的資訊，例如誰可以讀取特定資料、這個權限何時過期等，這個 JWT 將作為授權請求的基礎。</p>



<p class="wp-block-paragraph">接著把這封「未簽名」的 JWT 內容送到 Google 的 signJwt 服務，說：「請幫我在這份文件上簽名。」</p>



<p class="wp-block-paragraph">Google 會確認你有權請求這項簽名服務，使用只有 Google 知道的特殊私鑰，再依據你信件的內容產生一個獨特的數學計算結果（簽名），然後把這個簽名附在你的信件上，形成一個完整的已簽名 JWT。</p>



<p class="wp-block-paragraph">最後把它送給 Google 的授權服務，換取一個臨時的「存取令牌」，其他 Google 服務看到這個令牌時，會使用 Google 的公鑰驗證簽名。如果簽名有效，且內容顯示你有權限，服務就會允許存取。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="792" src="https://dongdonggcp.com/wp-content/uploads/2025/04/16-signJWT-運作流程示意圖-1024x792.png" alt="" class="wp-image-10452" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/16-signJWT-運作流程示意圖-1024x792.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/16-signJWT-運作流程示意圖-300x232.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/16-signJWT-運作流程示意圖-768x594.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/16-signJWT-運作流程示意圖-1536x1189.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/16-signJWT-運作流程示意圖.png 1848w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">16 signJWT 運作流程示意圖<br>資料來源：自行繪製</figcaption></figure>



<p class="wp-block-paragraph">這種方法減少了安全風險，因為你不需要下載、發佈或管理 Service Account Key 的檔案。同時簡化了授權流程，使整個過程更加高效和易於維護。對於需要在多個服務或整個網域中進行授權的場景，這是一個特別有價值的解決方案。</p>



<p class="wp-block-paragraph">你可能會擔心，看起來流程很長，會不會來回很花時間或吃效能？</p>



<p class="wp-block-paragraph">其實 GCP 的這些服務都經過高度優化，大部分步驟在 GCP 的基礎設施上執行得非常快速。而且這個流程只有在第一次次建立連接或每次令牌過期時才需要執行。</p>



<p class="wp-block-paragraph">存取令牌一旦獲取，通常可以使用幾個小時（典型設定為 1 小時），不需要每次請求都重新執行整個流程。整個步驟加起來通常只需數百毫秒完成，所以在實際執行時，效能影響是很有限的，卻因此提升很高的安全性。</p>



<h2 class="wp-block-heading">(四) 維護與治理技巧</h2>



<h3 class="wp-block-heading">1. 金鑰輪替的最佳策略</h3>



<h4 class="wp-block-heading">(1) 制定有效的輪替計劃</h4>



<p class="wp-block-paragraph">如上述提到，就像定期更換家中門鎖一樣，即使目前沒有安全問題，定期的更新也能防範潛在威脅。建議每隔 90 天進行一次金鑰輪替，這樣即使某個金鑰被洩露，其可用時間也會受到限制。在實際操作中，可以通過 GCP 控制台或使用 gcloud 指令來創建新金鑰並廢棄舊金鑰。</p>



<p class="wp-block-paragraph">為了減少人為錯誤並確保輪替流程的一致性，建立自動化的金鑰輪替機制非常重要。您可以利用 Cloud Functions 配合 Cloud Scheduler 來定期觸發金鑰輪替流程，或者使用 CI/CD Pipeline 來管理這一過程。自動化不只是輪替，還能將新的金鑰自動部署到相關服務，減少服務中斷或人為操作錯誤。</p>



<p class="wp-block-paragraph">對於儲存在 HSM 中的高敏感度金鑰，需要制定更嚴格的輪替策略。這些金鑰通常用於加密重要資料或簽署關鍵交易，因此建議為 HSM 金鑰設定更短的輪替周期，例如 30～60 天。</p>



<h4 class="wp-block-heading">(2) 高效管理未使用的金鑰</h4>



<p class="wp-block-paragraph">如前面提到，你可以用 Cloud Logging 設定查詢語法，來識別過去 90 天是否有未使用的 Service Account，並且設定 Cloud Monitoring 監控指標， 顯示各金鑰的使用頻率，幫助您快速發現那些閒置的金鑰。</p>



<p class="wp-block-paragraph">這個動作最好建立成一個 SOP，每月或每季度對所有 Service Account Key 進行全面審查。你可以使用標籤系統來標記不同狀態的金鑰，如「活躍」、「待觀察」或「待刪除」。同時，確保審查結果有明確的記錄和後續行動，避免重複工作或遺漏重要金鑰。</p>



<p class="wp-block-paragraph">在移除未使用的金鑰時，不要急於刪除，而是先將其停用。停用後，觀察一段時間（通常為 7～14 天），確保沒有任何系統依賴這些金鑰。等到確認都沒問題，再執行刪除操作。這種「先停用再刪除」的方法能夠減少因誤刪而導致的系統中斷。</p>



<h3 class="wp-block-heading">2. 機構層級（Organization Level）的管理建議</h3>



<h4 class="wp-block-heading">(1) 有效利用機構政策</h4>



<p class="wp-block-paragraph">管理員應在機構層級設定預設的限制條件，同時也為特殊需求的設定例外政策。例如「iam.disableServiceAccountKeyCreation」，預設禁止所有專案建立 Service Account 金鑰，但為開發環境或特定整合需求的專案設置例外。</p>



<p class="wp-block-paragraph">還有透過條件表達式，如「resource.name.startsWith(&#8220;projects/dev-&#8220;)」，可以僅允許名稱以「dev-」開頭的開發專案建立金鑰，實現更靈活的控制機制，確保安全政策既嚴謹又不妨礙業務運作。</p>



<h4 class="wp-block-heading">(2) 角色與權限的最佳配置</h4>



<p class="wp-block-paragraph">盡量避免使用過於寬鬆的 Editor 角色，而改用更精細的預定義角色（Predefined Roles）。例如為負責 CI/CD 的 Service Account 分配「Cloud Build Service Agent」和「Storage Object Viewer」角色，共允許只能執行部署工作和讀取必要的物件。</p>



<p class="wp-block-paragraph">對於需要監控資源的 Service Account，可以建立包含「monitoring.timeSeries.list」和「logging.logEntries.list」等極小權限的自訂角色，而不是授予權限範圍過大的「Monitoring Viewer」角色，避免意外刪除資源或未授權訪問敏感資料等問題。</p>



<h1 class="wp-block-heading">三、使用 Service Account 的注意事項</h1>



<p class="wp-block-paragraph">前面提到的各項技巧，有些需要時間慢慢建立，如果要立刻可以執行的方法，可以遵守以下防範的各項動作：</p>



<h3 class="wp-block-heading">(一) 防範憑證外洩</h3>



<p class="wp-block-paragraph">1. 避免將金鑰保存在臨時位置，例如電腦桌面、共用電腦或共享的網路資料夾。</p>



<p class="wp-block-paragraph">2. 不要在用戶間直接傳遞 Service Account 金鑰文件，例如存在 Line 群組、Email 或雲端硬碟。</p>



<p class="wp-block-paragraph">3. 防止將金鑰提交到原始碼儲存庫，例如 GitHub 或 GitLab。</p>



<p class="wp-block-paragraph">4. 不要將金鑰嵌入程序的二進位檔，如果有人獲取了你的二進位檔，他們可能能夠提取出這些金鑰，而且當你需要更新金鑰時，你必須重新編譯整個程式，不安全也很麻煩。</p>



<p class="wp-block-paragraph">5. 前面雖然提到使用 Secret Manager 來儲存 Key，但能夠不使用 Service Account Key，就盡量不使用，建議還是使用 Workload Identity Federation、HSM、TPM 或自簽證書的方法。</p>



<h3 class="wp-block-heading">(二) 防範安全配置問題</h3>



<p class="wp-block-paragraph">你需要特別小心處理那些安全認證文件。這些 X.509 證書檔案（就是那種帶有 .pem 或 .crt 副檔名的檔案），它可能會包含比你想像的更多資訊。</p>



<p class="wp-block-paragraph">首先，請確保你不要在這些證書中放入敏感資訊。例如，不要在裡面寫你公司的內部系統名稱、伺服器位置或其他機密資料。</p>



<p class="wp-block-paragraph">其次，當你填寫證書的「Subject」（主體）欄位時，請使用一般性的名稱，像是「GCP服務帳戶」或「應用程式認證」，而不是具體的系統名稱如「公司財務系統主機」。</p>



<p class="wp-block-paragraph">另外，證書中有些是選填欄位，像是地址、城市、郵遞區號等，建議你不要填寫這些資訊。因為如果駭客取得了這些證書，他們可以利用這些地點資訊來猜測你的實體伺服器位置，或是用來發動更具針對性的釣魚攻擊。</p>



<h3 class="wp-block-heading">(三) 防範權限提升風險</h3>



<p class="wp-block-paragraph">因為如果金鑰被不當取得，駭客可能利用這些憑證來進行各種破壞。尤其是 Editor 角色可能帶來的安全隱患，它的權限實在是太大，若被濫用可能造成嚴重損害，建議採用最小權限原則，只授予必要的權限，前面提了很多次，但還是再問一次，你真的有確實遵守嗎？</p>



<p class="wp-block-paragraph">其次，應避免在檔案系統（本機電腦、VM 的某個目錄）中直接存儲金鑰，因為這樣很容易被其他人拿到或在系統備份過程中洩露。真的要用，建議使用 Secret Manager 來安全存儲這些敏感憑證。</p>



<p class="wp-block-paragraph">最後，在虛擬化環境（如容器或虛擬機）中使用 Service Account 金鑰時，要防止底層安全問題，因為底層主機被入侵的話，可能導致所有虛擬環境的金鑰都被洩露。在這種情況下，可考慮使用臨時憑證或 Workload Identity，來減少金鑰洩露的風險。</p>



<h1 class="wp-block-heading">四、同場加映：防止呼叫 API 爆量的方法&nbsp;</h1>



<p class="wp-block-paragraph">GCP 提供了豐富的 API 服務，幾乎所有 GCP 的功能，都是以 API 的形式在運作，讓開發人員可以透過程式來自動化存取各種雲端資源。但如果沒有加以控制，API 可能被過度呼叫，導致成本急劇上升，甚至造成服務異常。</p>



<h2 class="wp-block-heading">(一) API 爆量的發生情境</h2>



<p class="wp-block-paragraph">這種問題通常發生在以下幾種情境：</p>



<p class="wp-block-paragraph">1. 開發或測試環境未設限</p>



<p class="wp-block-paragraph">開發人員可能在測試時，沒有把程式碼寫得完善，不慎觸發大量 API 請求。</p>



<p class="wp-block-paragraph">2. 系統錯誤或程式 Bug</p>



<p class="wp-block-paragraph">例如無限迴圈 （For Loop）或非預期的重試機制，導致 API 被頻繁呼叫。</p>



<p class="wp-block-paragraph">3. 流量暴增</p>



<p class="wp-block-paragraph">突然的流量高峰，例如 DDoS 攻擊或用戶激增，可能導致 API 配額迅速耗盡。</p>



<p class="wp-block-paragraph">4. 惡意濫用</p>



<p class="wp-block-paragraph">如果 API 沒有適當的身份驗證與授權控制，可能會被未授權用戶濫用，如上述 Service Account Key 被盜用，如果這個 Key 具有建立虛擬機器的權限，就會被任意建立大量主機，執行挖礦或作為殭屍電腦，是上述情境中最危險的情況。</p>



<h2 class="wp-block-heading">(二) 限制 GCP API 呼叫的方法</h2>



<h3 class="wp-block-heading">1. 設定消費預算警報</h3>



<p class="wp-block-paragraph">GCP Cloud Billing 允許設定預算警報，一旦 API 費用達到特定閾值，系統會自動發送通知，提醒使用者注意 API 開銷。像我自己是真的把預算警報用到「極致」，不要說超過 50 美金要通知，我只要每超過 1 美金都要收到通知。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="551" src="https://dongdonggcp.com/wp-content/uploads/2025/04/17-預算通知門檻越多越好-1024x551.png" alt="" class="wp-image-10453" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/17-預算通知門檻越多越好-1024x551.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/17-預算通知門檻越多越好-300x161.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/17-預算通知門檻越多越好-768x413.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/17-預算通知門檻越多越好-1536x826.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/17-預算通知門檻越多越好-2048x1102.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">17 預算通知門檻越多越好<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">但是 GCP 預算警報要隔一天才知道，在正常使用的情況下，GCP 的費用不會超出太多。但如果是被駭客入侵或攻擊，當你看到警報時，可能已經產生一百萬的 GCP 費用了，所以這是緩不濟急的，請再搭配下面提到的方法。</p>



<h3 class="wp-block-heading">2. 加強 Service Account 權限控制</h3>



<p class="wp-block-paragraph">像前面提到最基本的要求，就是為 Service Account 設置最小權限原則，限制各個 Service Account 只能呼叫特定的 API 和服務，甚至不同環境都用不同的 Service Account，讓它無法隨意呼叫 GCP 的 API。</p>



<h3 class="wp-block-heading">3. 設定 API 配額限制</h3>



<p class="wp-block-paragraph">在 GCP 上呼叫 API 有多種方式，包括使用 Service Account 和 API Key，API Key 是一種相對簡單的認證方式，它只是一個字串，例如「AIzaSy………M-O1pNg」。</p>



<p class="wp-block-paragraph">API Key 主要用於特定 API 的存取控制，你可以設定這個 Key 只能呼叫 Compute Engine API，其他 API 都不能呼叫。有些服務能夠限制 API 請求配額，可以有效確保 API 的呼叫次數，尤其是可以限制一天之內或一分鐘之內的次數上限，甚至能區分每個使用者的呼叫上限。</p>



<p class="wp-block-paragraph">這可以確保萬一 API Key 被駭客取得，呼叫次數也能限制在某個次數範圍之內。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="708" src="https://dongdonggcp.com/wp-content/uploads/2025/04/18-限制-API-每天或每分鐘的使用配額-1024x708.png" alt="" class="wp-image-10454" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/18-限制-API-每天或每分鐘的使用配額-1024x708.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/18-限制-API-每天或每分鐘的使用配額-300x208.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/18-限制-API-每天或每分鐘的使用配額-768x531.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/18-限制-API-每天或每分鐘的使用配額.png 1372w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">18 限制 API 每天或每分鐘的使用配額<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<h3 class="wp-block-heading">4. 設定資源配額</h3>



<p class="wp-block-paragraph">除了像 API 可以限制呼叫次數，在 GCP IAM 裡管理的則是資源配額，例如專案內可以建立的 VM 數量、vCPU 核心數、儲存容量等各種資源可被開啟的數量上限。</p>



<p class="wp-block-paragraph">我個人認為這是更重要的，因為假如駭客盜取你的帳號，或是 Service Account Key，他可以直接在你的 GCP 專案內任意開啟機器，要注意他不是一台一台手動開機器，他是用程式自動化的技術，在每個 Region 把你的機器「開好開滿」，直接開到配額上限。</p>



<p class="wp-block-paragraph">以 N1 的 vCPU 來說，如果你是以個人信用卡使用 GCP，每個 Region 初期只能用到 24 vCPU，隨著使用時間越長，配額會自動調高。</p>



<p class="wp-block-paragraph">但是你的專案帳單如果直接綁定在代理商，系統會判定你是等級較高的用戶，你在每個 Region 能使用的 vCPU 就會提高不少，萬一被駭，就會變成每個 Region 的主機、CPU 甚至 GPU，全部開滿。</p>



<p class="wp-block-paragraph">只要 1~2 天的時間，就可以在一個專案內，開「幾萬台」機器，隔天就會收到「百萬」等級的帳單，等你收到帳單警示已經來不及了。這是確實有發生過的情況，絕非杜撰，這就回到你的 Service Account Key 務必保管好，甚至使用其他驗證方式。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="821" src="https://dongdonggcp.com/wp-content/uploads/2025/04/19-長期使用或綁定代理商的-GCP-專案有較高的資源配額-1024x821.png" alt="" class="wp-image-10455" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/19-長期使用或綁定代理商的-GCP-專案有較高的資源配額-1024x821.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/19-長期使用或綁定代理商的-GCP-專案有較高的資源配額-300x240.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/19-長期使用或綁定代理商的-GCP-專案有較高的資源配額-768x615.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/19-長期使用或綁定代理商的-GCP-專案有較高的資源配額-1536x1231.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/19-長期使用或綁定代理商的-GCP-專案有較高的資源配額.png 1752w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">19 長期使用或綁定代理商的 GCP 專案有較高的資源配額<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">難道沒有其他解決辧法嗎？有的，就是減少配額，建議針對每個型號，例如 N1、N2 的 vCPU，而且每個 Region 都要減少。如果你沒有在用 GPU，就直接把每個 GPU 配額改成 0。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="468" src="https://dongdonggcp.com/wp-content/uploads/2025/04/20-減少-CPU-配額-1024x468.png" alt="" class="wp-image-10456" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/20-減少-CPU-配額-1024x468.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/20-減少-CPU-配額-300x137.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/20-減少-CPU-配額-768x351.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/20-減少-CPU-配額-1536x702.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/20-減少-CPU-配額-2048x935.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">20 減少 CPU 配額<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">你可能會想，駭客進來也可以提高配額啊？這點不用擔心，減少配額可以改完當下就生效，但是如果要增加配額超過預設值，Google 那邊至少需要兩天的時間人工審核，還要填寫聯絡方式包含電話號碼，所以駭客不會去做的。</p>



<h3 class="wp-block-heading">5. 設定各個服務的運作上限&nbsp;</h3>



<h4 class="wp-block-heading">(1) Compute Engine 的配額限制</h4>



<p class="wp-block-paragraph">如前段提到的例子，你可以通過配額限制來控制資源使用。</p>



<h4 class="wp-block-heading">(2) Google App Engine 必須要調整 app.yaml</h4>



<p class="wp-block-paragraph">很多人都不知道，App Engine 預設沒有設定上限，代表它會無限擴充，重點是，很多人都一直以為他的 App Engine 只有一台機器在跑，直到看到帳單才發現原來它在某個尖峰時間，曾經擴充過多台主機。</p>



<p class="wp-block-paragraph">你必須要在 app.yaml 設定 Autoscale 的上限數量，才不會一直擴充下去。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="465" src="https://dongdonggcp.com/wp-content/uploads/2025/04/21-設定-app.yaml-以防止-App-Engine-無限擴充-1024x465.png" alt="" class="wp-image-10457" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/21-設定-app.yaml-以防止-App-Engine-無限擴充-1024x465.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/21-設定-app.yaml-以防止-App-Engine-無限擴充-300x136.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/21-設定-app.yaml-以防止-App-Engine-無限擴充-768x349.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/21-設定-app.yaml-以防止-App-Engine-無限擴充-1536x698.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/21-設定-app.yaml-以防止-App-Engine-無限擴充-2048x930.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">21 設定 app.yaml 以防止 App Engine 無限擴充<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<h4 class="wp-block-heading">(3) Cloud Run 或 Cloud Run Function&nbsp;</h4>



<p class="wp-block-paragraph">執行個體預設的 Autoscale 數量是 0 到 100，記得把它改成你能接受的上限，例如 5 個。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="568" src="https://dongdonggcp.com/wp-content/uploads/2025/04/22-調整-Cloud-Run-自動擴充的上限預設值-1024x568.png" alt="" class="wp-image-10458" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/22-調整-Cloud-Run-自動擴充的上限預設值-1024x568.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/22-調整-Cloud-Run-自動擴充的上限預設值-300x166.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/22-調整-Cloud-Run-自動擴充的上限預設值-768x426.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/22-調整-Cloud-Run-自動擴充的上限預設值.png 1211w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">22 調整 Cloud Run 自動擴充的上限預設值<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<h4 class="wp-block-heading">(4) 設定 BigQuery 每天查詢上限&nbsp;</h4>



<p class="wp-block-paragraph">要注意，原本 BigQuery 的預設查詢配額，也是「無上限」的，如果你的資料太多又沒整理，或是不小心有程式一直自動查詢大量資料，也會造成非常大的費用。你可以設定 BigQuery 每天的查詢限制，也能設定每天+每個使用者的查詢限制。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="408" src="https://dongdonggcp.com/wp-content/uploads/2025/04/23-設定-BigQuery-每天的查詢限制-1024x408.png" alt="" class="wp-image-10459" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/23-設定-BigQuery-每天的查詢限制-1024x408.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/23-設定-BigQuery-每天的查詢限制-300x119.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/23-設定-BigQuery-每天的查詢限制-768x306.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/23-設定-BigQuery-每天的查詢限制-1536x612.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/23-設定-BigQuery-每天的查詢限制-2048x816.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">23 設定 BigQuery 每天的查詢限制<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<h3 class="wp-block-heading">6. 節流機制 (Throttling)</h3>



<h4 class="wp-block-heading">(1) Cloud Armor 節流（Rate Limit）</h4>



<p class="wp-block-paragraph">對於外部流量，Cloud Armor 可以設定節流機制，例如每分鐘不能存取超過 1,000 次，超過即停止服務。但要注意，你要先知道你的服務平時的流量，以及假日或活動期間的流量，以免低估流量，反而把真正的用戶阻擋在外面。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="432" src="https://dongdonggcp.com/wp-content/uploads/2025/04/24-設定-Cloud-Armor-節流規則-1024x432.png" alt="" class="wp-image-10460" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/24-設定-Cloud-Armor-節流規則-1024x432.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/24-設定-Cloud-Armor-節流規則-300x127.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/24-設定-Cloud-Armor-節流規則-768x324.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/24-設定-Cloud-Armor-節流規則.png 1474w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">24 設定 Cloud Armor 節流規則<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<h4 class="wp-block-heading">(2) 本地節流機制</h4>



<p class="wp-block-paragraph">這裡指的就是你自己開發的應用程式，直接實作 API 請求節流的邏輯，那你就可以彈性地設定各種不同時間間隔，例如每秒不能超過 100 次，每分鐘不能超過 1000 次，每小時不能超過 10,000 次等等。這也是要注意，不要錯估流量。</p>



<p class="wp-block-paragraph">另一方面，如果程式發生錯誤，例如當 API 回應 429 時，必須要重新存取（Retry），或是被外部呼叫，你可以使用指數退避 (Exponential Backoff) 策略處理重試，自動延遲並逐步增加重試間隔，例如當發生第一次錯誤，休息兩秒，第二次，休息四秒，第三次，休息八秒&#8230;等，不要讓程式在出錯時還一直不斷存取，減少無謂資源的消耗。</p>



<h3 class="wp-block-heading">7. 設定各種指標的監控</h3>



<p class="wp-block-paragraph">Cloud Monitoring 可以監控很多指標，不只監控 API 呼叫次數，你也可以監控例如用戶發出的 Request 數量，或是主機每秒送出的流量大小，並且限制例每分送出超過 10 MB，就發出流量警告，讓你在異常流量發生的當下，就能夠立即發現並阻擋。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="438" src="https://dongdonggcp.com/wp-content/uploads/2025/04/25-設定-VM-流出流量每分鐘超過某個門檻時發出警告-1024x438.png" alt="" class="wp-image-10461" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/25-設定-VM-流出流量每分鐘超過某個門檻時發出警告-1024x438.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/25-設定-VM-流出流量每分鐘超過某個門檻時發出警告-300x128.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/25-設定-VM-流出流量每分鐘超過某個門檻時發出警告-768x328.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/25-設定-VM-流出流量每分鐘超過某個門檻時發出警告-1536x657.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/25-設定-VM-流出流量每分鐘超過某個門檻時發出警告-2048x875.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">25 設定 VM 流出流量每分鐘超過某個門檻時發出警告<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<h1 class="wp-block-heading">五、結論</h1>



<p class="wp-block-paragraph">成功管理 Service Account 需要綜合考慮安全性、方便性和維護成本。通過上述的小技巧，你可以在系統開發過程的各個階段，有效並安全地使用 Service Account。</p>



<p class="wp-block-paragraph">要記住的是，不是「Service Account 怎麼用」或「Service Account Key 怎麼保管」。因為你「不一定要用 Service Account」，選擇合適的身份驗證方法是最重要的第一步。</p>



<p class="wp-block-paragraph">你可以優先考慮 GCP 的內建驗證機制，只在非用不可的時候，才使用 Service Account 和 Key，並依照最佳實務來管理。這樣不僅可以降低維護成本，還能大幅提高系統的整體安全性。</p>



<p class="wp-block-paragraph">另外，各種機制也是需要不少時間規劃流程和制度，以及各部門之間互相配合，遵守規範，這也需要主管大力支持並提供充份的資源，才能有效實施。</p>



<h1 class="wp-block-heading">六、常見問題</h1>



<p class="wp-block-paragraph">(一) 如何檢查 Service Account 是否有過度授權？</p>



<p class="wp-block-paragraph">1. GCP 提供 IAM 建議 (IAM Recommender)</p>



<p class="wp-block-paragraph">可以分析 Service Account 的使用情況，找出是否擁有過多權限。<br>步驟：</p>



<p class="wp-block-paragraph">(1) 前往 GCP Console，打開 IAM &amp; Admin &gt; IAM。</p>



<p class="wp-block-paragraph">(2) 找到 Service Account，查看「建議的角色」(Recommended roles) 欄位。</p>



<p class="wp-block-paragraph">(3) 如果 GCP 建議降低權限，請根據建議調整角色。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="551" src="https://dongdonggcp.com/wp-content/uploads/2025/04/26-查看-IAM-Recommender-的建議來調整權限角色-1024x551.png" alt="" class="wp-image-10462" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/26-查看-IAM-Recommender-的建議來調整權限角色-1024x551.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/26-查看-IAM-Recommender-的建議來調整權限角色-300x161.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/26-查看-IAM-Recommender-的建議來調整權限角色-768x413.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/26-查看-IAM-Recommender-的建議來調整權限角色-1536x826.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/26-查看-IAM-Recommender-的建議來調整權限角色-2048x1102.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">26 查看 IAM Recommender 的建議來調整權限角色<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">2. 使用 IAM Policy Analyzer 進行分析</p>



<p class="wp-block-paragraph">你可以在 IAM &amp; Admin &gt; Policy Analyzer 中輸入 Service Account 的電子郵件。查看該帳戶擁有哪些權限，並確認是否有不必要的存取權限，操作方式和上述差不多。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="728" src="https://dongdonggcp.com/wp-content/uploads/2025/04/27-使用-Policy-Analyzer-檢查權限-1024x728.png" alt="" class="wp-image-10463" srcset="https://dongdonggcp.com/wp-content/uploads/2025/04/27-使用-Policy-Analyzer-檢查權限-1024x728.png 1024w, https://dongdonggcp.com/wp-content/uploads/2025/04/27-使用-Policy-Analyzer-檢查權限-300x213.png 300w, https://dongdonggcp.com/wp-content/uploads/2025/04/27-使用-Policy-Analyzer-檢查權限-768x546.png 768w, https://dongdonggcp.com/wp-content/uploads/2025/04/27-使用-Policy-Analyzer-檢查權限-1536x1091.png 1536w, https://dongdonggcp.com/wp-content/uploads/2025/04/27-使用-Policy-Analyzer-檢查權限-2048x1455.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">27 使用 Policy Analyzer 檢查權限<br>資料來源：擷圖自 <a href="https://console.cloud.google.com/">GCP Console</a></figcaption></figure>



<p class="wp-block-paragraph">(二) 如何刪除未使用的 Service Account？</p>



<p class="wp-block-paragraph">可參考以下步驟：</p>



<p class="wp-block-paragraph">1.&nbsp; 列出所有 Service Account 並找出未使用的帳戶：</p>



<p class="wp-block-paragraph">gcloud iam service-accounts list &#8211;format=&#8221;table(email, disabled)&#8221;</p>



<p class="wp-block-paragraph">可以顯示所有 Service Account 和目前的使用狀態 (是否已停用)。</p>



<p class="wp-block-paragraph">(2) 停用 Service Account</p>



<p class="wp-block-paragraph">如果確認某個 Service Account 一直都沒有在用，可先停用：</p>



<p class="wp-block-paragraph">gcloud iam service-accounts disable service-account@your-project.iam.gserviceaccount.com</p>



<p class="wp-block-paragraph">這樣可以避免影響現有服務，若發現問題仍可重新啟用。</p>



<p class="wp-block-paragraph">(3) 刪除 Service Account</p>



<p class="wp-block-paragraph">停用後，如果確定不再需要，可刪除：</p>



<p class="wp-block-paragraph">gcloud iam service-accounts delete service-account@your-project.iam.gserviceaccount.com</p>



<p class="wp-block-paragraph">⚠ 注意：刪除後不可恢復，請確保已經沒有任何應用程式在使用該帳戶。</p>



<p class="wp-block-paragraph">(三) Service Account 金鑰遺失該怎麼辦？</p>



<p class="wp-block-paragraph">如果 Service Account 金鑰遺失，應立即執行以下步驟，以確保系統安全：</p>



<p class="wp-block-paragraph">1. 列出現有的 Service Account 金鑰</p>



<p class="wp-block-paragraph">gcloud iam service-accounts keys list &#8211;iam-account=service-account@your-project.iam.gserviceaccount.com</p>



<p class="wp-block-paragraph">這會顯示所有金鑰的 KEY_ID，你可以確認哪個金鑰可能遺失。</p>



<p class="wp-block-paragraph">2. 立即刪除遺失的金鑰</p>



<p class="wp-block-paragraph">如果確定某個金鑰已洩露，請使用以下命令刪除：</p>



<p class="wp-block-paragraph">gcloud iam service-accounts keys delete YOUR_KEY_ID &#8211;iam-account=service-account@your-project.iam.gserviceaccount.com</p>



<p class="wp-block-paragraph">刪除之後，即使駭客手上擁有你的金鑰檔案，也是無法發運任何作用的。</p>



<p class="wp-block-paragraph">⚠ 注意：一旦刪除，任何使用該金鑰的應用程式都將失去存取權限，請確保已經準備好替代方案。</p>



<p class="wp-block-paragraph">3. 生成新的 Service Account 金鑰</p>



<p class="wp-block-paragraph">如果仍需使用金鑰（不推薦），可以產生新的金鑰：</p>



<p class="wp-block-paragraph">gcloud iam service-accounts keys create new-key.json &#8211;iam-account=service-account@your-project.iam.gserviceaccount.com</p>



<p class="wp-block-paragraph">(四) 我可以將 Service Account Key 存放在 GitHub 嗎？</p>



<p class="wp-block-paragraph">不建議這樣做，因為這可能導致憑證洩漏，應該使用 Secret Manager 來管理。</p>



<p class="wp-block-paragraph">(五) 如何檢測 Service Account Key 是否外洩？</p>



<p class="wp-block-paragraph">你可以透過 Cloud Audit Logs 來查詢這個 Service Account Key 異常存取行為，你可以參考<a href="https://cloud.google.com/iam/docs/audit-logging/examples-service-accounts#auth-service-account-key">這份文件</a>來操作。</p>



<p class="wp-block-paragraph">(六) Service Account Key 有效期多久？</p>



<p class="wp-block-paragraph">預設情況下都是永久的，開發人員應該手動輪替金鑰。</p>



<p class="wp-block-paragraph">(七) 有哪些更安全的替代方案？</p>



<p class="wp-block-paragraph">Workload Identity Federation 和 OAuth 2.0 是更安全的選擇，能不用 Service Account Key 就盡量不要用。</p>



<p class="wp-block-paragraph">另一個方法是產生 RSA 2048 金鑰對，透過 HSM 模組、Cloud KMS 或 TPM 方法，在私鑰完全不需要對外分享的情況下，讓應用程式還是可以操作 GCP 的 API。</p>



<p class="wp-block-paragraph">(八) 如何讓 CI/CD 流程更加安全？</p>



<p class="wp-block-paragraph">可以使用 Workload Identity Federation，避免直接存放 Service Account Key。</p>



<p class="wp-block-paragraph">(九) 如何避免因資安事件發生，而造成大量的帳單費用？</p>



<ol class="wp-block-list">
<li>設定預算警示</li>



<li>設定 API 配額</li>



<li>設定減少資源配額，例如 CPU 和 GPU</li>



<li>設定 Service Account 和 Key 的監控和快訊</li>



<li>設定流量和資源使用量的監控和快訊</li>



<li>限縮服務本的的自動擴充上限</li>



<li>設定應用程式的存取次數</li>
</ol>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">本文同時刊登於：</p>



<p class="wp-block-paragraph"> <a href="https://masterconcept.ai/zh-hant/learning-column/google-cloud-zh-hant/gcp-kol-x-master-concept-tips-for-developing-programs-using-gcp-service-account/" target="_blank" rel="noopener" title="">《【東東老師 X 思想科技】使用 GCP Service Account 開發程式的小技巧》</a></p>



<p class="wp-block-paragraph"><a href="https://masterconcept.ai/zh-hant/learning-column/google-cloud-zh-hant/gcp-kol-x-master-concept-considerations-for-developing-programs-using-gcp-service-account/" target="_blank" rel="noopener" title="">《【東東老師 X 思想科技】使用 GCP Service Account 開發程式的注意事項》</a></p><p>The post <a href="https://dongdonggcp.com/2025/04/14/tips-when-developing-with-gcp-service-account/">使用 GCP Service Account 開發程式的小技巧和注意事項</a> first appeared on <a href="https://dongdonggcp.com">東東 GCP 教學 - GCP 實戰講師 - 雲上星辰有限公司</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://dongdonggcp.com/2025/04/14/tips-when-developing-with-gcp-service-account/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">10436</post-id>	</item>
	</channel>
</rss>
