<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Open-Source on Tarragon</title><link>https://tarrragon.github.io/blog/tags/open-source/</link><description>Recent content in Open-Source on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 18 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/open-source/index.xml" rel="self" type="application/rss+xml"/><item><title>Keycloak</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/keycloak/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/keycloak/</guid><description>&lt;p>Keycloak 是 open source 自管 Identity Provider、Red Hat 主導維護（商業支援版本為 Red Hat build of Keycloak、前身 Red Hat SSO）。它承擔的責任跟 SaaS IdP 相同 — SSO、MFA、federation、user lifecycle — 但 &lt;em>整個控制面留在組織自己手上&lt;/em>：issuer signing key、support tooling、底層 PostgreSQL、HA cluster、CVE patch cadence 全部自管。決定上 Keycloak 不是技術偏好、是組織決定把 SaaS IdP 的「第三方信任成本」換成「自家 SRE 運維成本 + 安全責任」。在 &lt;a href="https://tarrragon.github.io/blog/backend/00-service-selection/capability-buy-vs-build/" data-link-title="0.22 能力級買 vs 建：feature-as-a-service 與 BaaS bundle 選型" data-link-desc="在交付形態決定整個系統要不要自建之後、逐能力判斷該外包還是自建：辨識 managed 基礎設施、feature SaaS 與 BaaS bundle 三種外包深度、no-code 到 dev-tool 的服務光譜、買 vs 建判準與權重浮動、整合接縫與遷出代價">0.22 能力級買 vs 建&lt;/a> 的光譜上、Keycloak 是認證能力「建」側的 canonical 例子 — 把 feature SaaS（Auth0 / Okta）的第三方信任成本、換成自管控制面的運維成本；什麼訊號該翻到這一側、見 0.22 與 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/capability-outsourcing-depth/" data-link-title="Capability Outsourcing Depth（外包深度）" data-link-desc="說明外包一塊後端能力有三種深度（managed 基礎設施、feature SaaS、BaaS bundle）、深度決定保留多少控制權與遷出代價">外包深度&lt;/a> 卡。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Keycloak 是 &lt;em>自管控制面&lt;/em> 的 human identity 與 federation engine、不是 cloud resource permission engine。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/okta/" data-link-title="Okta" data-link-desc="SaaS Identity Provider 主流選項、SSO / MFA / lifecycle 整合、第三方信任邊界的代價">Okta&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/auth0/" data-link-title="Auth0" data-link-desc="B2C / B2B Customer Identity Provider、Universal Login、Action / Rule hook、屬 Okta 旗下 Customer Identity Cloud">Auth0&lt;/a> 的本質差異在於信任邊界落點：SaaS IdP 把 signing key、tenant 隔離、support workflow 都託管出去、客戶承擔「供應商出事我也跟著被打」的風險；Keycloak 把整條控制面收回自家機房或自家 VPC、客戶承擔「signing key 過期 / DB 崩 / Java app CVE 沒跟上」的運維風險。&lt;/p>
&lt;p>跟 cloud-native SSO（&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/aws-iam-identity-center/" data-link-title="AWS IAM Identity Center" data-link-desc="AWS 原生 workforce SSO、前 AWS SSO、Permission Set 跨帳號 access、可串外部 IdP federation">AWS IAM Identity Center&lt;/a>）相比、Keycloak 的核心優勢是 &lt;em>不綁雲廠 + 可深度客製 authentication flow + 資料不出境&lt;/em>。適合垂直：金融、政府、醫療某些不接受 SaaS IdP 的場景；以及預算敏感、員工數中等、SRE 量能足以接 24/7 on-call 的組織。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本頁、讀者能判斷：&lt;/p>
&lt;ol>
&lt;li>Keycloak 該承擔哪一段 identity 控制（SSO / MFA / federation / brokering）、哪一段該交給雲端 IAM 或下游應用&lt;/li>
&lt;li>自管 IdP 的最低運維基線（HA、DB DR、cert / signing key rotation、CVE cadence、SIEM 接點）&lt;/li>
&lt;li>Realm / Client / User Federation / Identity Broker / Authentication Flow / SPI 各自的決策時機與陷阱&lt;/li>
&lt;li>何時用 Keycloak、何時改走 SaaS（Okta / Auth0）或其他 OSS（Authentik / Zitadel）&lt;/li>
&lt;/ol>
&lt;h2 id="最短判讀路徑">最短判讀路徑&lt;/h2>
&lt;p>判斷 Keycloak 部署是否健康、最少看 SaaS IdP 的四件事加上自管特有的四個維度：&lt;/p></description><content:encoded><![CDATA[<p>Keycloak 是 open source 自管 Identity Provider、Red Hat 主導維護（商業支援版本為 Red Hat build of Keycloak、前身 Red Hat SSO）。它承擔的責任跟 SaaS IdP 相同 — SSO、MFA、federation、user lifecycle — 但 <em>整個控制面留在組織自己手上</em>：issuer signing key、support tooling、底層 PostgreSQL、HA cluster、CVE patch cadence 全部自管。決定上 Keycloak 不是技術偏好、是組織決定把 SaaS IdP 的「第三方信任成本」換成「自家 SRE 運維成本 + 安全責任」。在 <a href="/blog/backend/00-service-selection/capability-buy-vs-build/" data-link-title="0.22 能力級買 vs 建：feature-as-a-service 與 BaaS bundle 選型" data-link-desc="在交付形態決定整個系統要不要自建之後、逐能力判斷該外包還是自建：辨識 managed 基礎設施、feature SaaS 與 BaaS bundle 三種外包深度、no-code 到 dev-tool 的服務光譜、買 vs 建判準與權重浮動、整合接縫與遷出代價">0.22 能力級買 vs 建</a> 的光譜上、Keycloak 是認證能力「建」側的 canonical 例子 — 把 feature SaaS（Auth0 / Okta）的第三方信任成本、換成自管控制面的運維成本；什麼訊號該翻到這一側、見 0.22 與 <a href="/blog/backend/knowledge-cards/capability-outsourcing-depth/" data-link-title="Capability Outsourcing Depth（外包深度）" data-link-desc="說明外包一塊後端能力有三種深度（managed 基礎設施、feature SaaS、BaaS bundle）、深度決定保留多少控制權與遷出代價">外包深度</a> 卡。</p>
<h2 id="服務定位">服務定位</h2>
<p>Keycloak 是 <em>自管控制面</em> 的 human identity 與 federation engine、不是 cloud resource permission engine。跟 <a href="/blog/backend/07-security-data-protection/vendors/okta/" data-link-title="Okta" data-link-desc="SaaS Identity Provider 主流選項、SSO / MFA / lifecycle 整合、第三方信任邊界的代價">Okta</a> / <a href="/blog/backend/07-security-data-protection/vendors/auth0/" data-link-title="Auth0" data-link-desc="B2C / B2B Customer Identity Provider、Universal Login、Action / Rule hook、屬 Okta 旗下 Customer Identity Cloud">Auth0</a> 的本質差異在於信任邊界落點：SaaS IdP 把 signing key、tenant 隔離、support workflow 都託管出去、客戶承擔「供應商出事我也跟著被打」的風險；Keycloak 把整條控制面收回自家機房或自家 VPC、客戶承擔「signing key 過期 / DB 崩 / Java app CVE 沒跟上」的運維風險。</p>
<p>跟 cloud-native SSO（<a href="/blog/backend/07-security-data-protection/vendors/aws-iam-identity-center/" data-link-title="AWS IAM Identity Center" data-link-desc="AWS 原生 workforce SSO、前 AWS SSO、Permission Set 跨帳號 access、可串外部 IdP federation">AWS IAM Identity Center</a>）相比、Keycloak 的核心優勢是 <em>不綁雲廠 + 可深度客製 authentication flow + 資料不出境</em>。適合垂直：金融、政府、醫療某些不接受 SaaS IdP 的場景；以及預算敏感、員工數中等、SRE 量能足以接 24/7 on-call 的組織。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Keycloak 該承擔哪一段 identity 控制（SSO / MFA / federation / brokering）、哪一段該交給雲端 IAM 或下游應用</li>
<li>自管 IdP 的最低運維基線（HA、DB DR、cert / signing key rotation、CVE cadence、SIEM 接點）</li>
<li>Realm / Client / User Federation / Identity Broker / Authentication Flow / SPI 各自的決策時機與陷阱</li>
<li>何時用 Keycloak、何時改走 SaaS（Okta / Auth0）或其他 OSS（Authentik / Zitadel）</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Keycloak 部署是否健康、最少看 SaaS IdP 的四件事加上自管特有的四個維度：</p>
<ul>
<li><strong>誰能做什麼</strong>：master realm admin 的人數、是否走 access request workflow、admin console 是否限 IP / device trust、是否強制 <a href="/blog/backend/knowledge-cards/authentication/" data-link-title="Authentication" data-link-desc="說明系統如何確認呼叫者身份">phishing-resistant 認證</a></li>
<li><strong>憑證在哪裡</strong>：client secret 是否走 <a href="/blog/backend/knowledge-cards/secret-management/" data-link-title="Secret Management" data-link-desc="說明 token、key、password 與憑證如何保存、輪替與撤銷">secret management</a>、realm signing key 的 rotation 排程、admin token 的 TTL</li>
<li><strong>入口如何暴露</strong>：哪些 realm 對外、reverse proxy / Ingress 是否做 rate limit、admin console（/auth/admin）是否限內網或 zero trust</li>
<li><strong>證據是否可回查</strong>：Event Listener SPI 是否接 SIEM、admin event 跟 login event 是否分流、保留期是否符合稽核</li>
<li><strong>DB 健康</strong>：PostgreSQL / MySQL 是否跨 AZ、是否有 PITR、是否做過 restore 演練（不是只有備份成功訊息）</li>
<li><strong>Cert lifecycle</strong>：TLS cert 與 realm signing key 各自的 rotation 排程、是否走 <a href="/blog/backend/knowledge-cards/website-certificate-lifecycle/" data-link-title="Website Certificate Lifecycle" data-link-desc="說明網站 TLS 憑證從簽發到續期與撤銷的全流程責任">Website Certificate Lifecycle</a> 自動化</li>
<li><strong>HA topology</strong>：Keycloak cluster 是否多節點、Infinispan cache 是否跨 AZ、單節點重啟是否會踢掉所有 session</li>
<li><strong>Upgrade cadence</strong>：Keycloak 每年 major release、CVE patch 是否能在 SLA 內上、是否有 staging 跑 DB migration</li>
</ul>
<p>八個維度任一缺失、都是自管 IdP 常見事故的入口。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Realm 設計</strong>：Realm 是 Keycloak 的隔離邊界、每個 realm 有獨立的 user store、client、role、signing key。multi-tenancy 走 realm 是正確選擇、但 <em>master realm 能管所有 realm</em>、master realm 的 admin compromise = 全公司 IdP compromise。把 master realm 鎖在內網、operational realm 才對外、是基本姿勢。</p>
<p><strong>Client 註冊與 secret</strong>：每個應用是一個 client、confidential client 有 secret、public client（SPA / mobile）走 PKCE 不存 secret。client secret 不存 source code、走 <a href="/blog/backend/knowledge-cards/secret-management/" data-link-title="Secret Management" data-link-desc="說明 token、key、password 與憑證如何保存、輪替與撤銷">secret management</a> 注入。client 數量爆炸時要設 naming convention 跟 ownership 標記、不然 stale client 會堆積。</p>
<p><strong>User Federation</strong>：把既有 LDAP / Active Directory 接進 Keycloak、user 還是住在原 directory、Keycloak 做 protocol 翻譯（LDAP → OIDC / SAML）。這是 Keycloak 強項之一 — 不需要 user migration、漸進接入。陷阱是 LDAP 連線健康 = IdP 健康、LDAP 慢 = 全公司 login 慢。</p>
<p><strong>Identity Brokering</strong>：把外部 IdP（Google、Microsoft、其他 SAML / OIDC provider）federate 進來、Keycloak 當中介。B2B 合作常見模式 — partner 用自己的 IdP、不在我的 user store 開帳號。決策點是 <em>trust mapping</em>：外部 claim 怎麼對應到內部 role、外部 IdP 的 MFA 狀態怎麼信任。</p>
<p><strong>Authentication Flow</strong>：Keycloak 把 login / registration / reset password 做成可編輯的 flow DAG、可以插入自訂 step。這是 Keycloak 跟 SaaS IdP 最大差異點之一 — 想要 step-up MFA、device fingerprint、risk-based 判斷都可以自己接。雙面刃是 <em>自訂 flow 容易留漏洞</em>：跳過必要步驟、condition 寫錯讓 MFA 變可選、custom Authenticator SPI 沒處理 race condition。</p>
<p><strong>Theme / 客製 UI</strong>：Keycloak 支援 theme override、可以改 login page HTML / CSS / JS。custom JS 在 login page = 自己注入 XSS 風險 — theme 寫進去之後就是 IdP 本體的攻擊面、不是普通網頁。CSP 跟 input sanitization 要當成 IdP 安全規範看待。</p>
<p><strong>Event Listener / Audit</strong>：Keycloak 預設只把 event 寫進 DB、UI 上能查、但 <em>不會自動推到外部 SIEM</em>。生產環境必須接 Event Listener SPI（內建 jboss-logging、或自寫 Kafka / file listener）把 admin event 跟 login event 推進 SIEM。沒接的話 audit trail 只在 IdP 本機、IdP 出事就拿不到 evidence。</p>
<p><strong>Exception / break-glass</strong>：master realm 留至少 2 個 break-glass admin、credential 離線存、走獨立 MFA（hardware key）。Keycloak cluster 整個失聯時、用 break-glass 直連 DB / 直連單一節點救回。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Keycloak（自管 OSS）</th>
          <th>Okta（SaaS）</th>
          <th>Auth0（SaaS / B2C）</th>
          <th>Authentik / Zitadel（其他 OSS）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>控制面責任</td>
          <td>自己跑 issuer / signing / HA / DB / upgrade</td>
          <td>Okta 託管</td>
          <td>Auth0 託管</td>
          <td>自己跑、但社群規模小於 Keycloak</td>
      </tr>
      <tr>
          <td>客製化深度</td>
          <td>高 — Authenticator SPI / theme / event listener</td>
          <td>中 — Workflows / Hooks、限定範圍</td>
          <td>高 — Actions（JS hook）</td>
          <td>中 — Authentik flow 視覺化、彈性中等</td>
      </tr>
      <tr>
          <td>第三方信任成本</td>
          <td>低 — 自管、自己承擔運維</td>
          <td>高 — 供應商事件直接波及</td>
          <td>高 — 同 Okta（同集團）</td>
          <td>低 — 自管</td>
      </tr>
      <tr>
          <td>運維成本</td>
          <td>高 — HA、DR、cert、DB、CVE 都自管</td>
          <td>低 — SaaS</td>
          <td>低 — SaaS</td>
          <td>高 — 同 Keycloak、生態系更小</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>資料主權、預算敏感、需深度客製、有 SRE 量能</td>
          <td>多雲、大量 SaaS、lifecycle 自動化</td>
          <td>B2C、消費者 identity、developer-centric</td>
          <td>規模小、Keycloak 太重、想要更現代 UI</td>
      </tr>
      <tr>
          <td>退場成本</td>
          <td>中 — 自己掌握資料、protocol 標準可遷移</td>
          <td>高 — SAML / SCIM 接線散在數百 app</td>
          <td>高 — Actions / Rules 客製綁定深</td>
          <td>中 — 同 Keycloak</td>
      </tr>
  </tbody>
</table>
<p>選 Keycloak 的核心訴求：<em>資料主權 + 預算控制 + 客製 flow 需求</em>、且有 SRE 團隊能 24/7 on-call、能接受自管的運維重量。團隊小於 50 人沒 SRE 量能、應用主要在 SaaS（pre-built integration 用不上 Keycloak 強項）、需要快速接 7000+ SaaS app — 都該回頭看 Okta / Auth0。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>User Federation 跟 LDAP 整合</strong>：企業環境常見「Active Directory 是 user source of truth、Keycloak 做 protocol 層」。注意 LDAP 同步策略（read-only / writable / import）、LDAP 健康直接影響 IdP 可用性、LDAP timeout 要設嚴格避免 login 卡住整個 cluster。</p>
<p><strong>Identity Brokering 跟外部 IdP</strong>：把 Google / Microsoft / 其他 SAML IdP federate 進來、外部 user 進來時 Keycloak 自動建 link。trust mapping 是關鍵 — 外部 IdP 宣稱「這個 user 已 MFA」、要不要信？外部 group claim 怎麼對應到內部 role？沒有預設答案、要用 <a href="/blog/backend/knowledge-cards/authorization/" data-link-title="Authorization" data-link-desc="說明授權如何判斷誰能對哪些資源執行哪些操作">authorization</a> 邊界決定。</p>
<p><strong>Fine-Grained Authorization（UMA / Authorization Services）</strong>：Keycloak 內建 policy engine、可以做 resource-level 授權（不只是 role-based）。適合需要中央化 policy decision 的場景、但會把應用的授權邏輯綁進 Keycloak、退場成本變高。多數場景應該把 authorization 留在應用內、Keycloak 只做 authentication + role token 發行。</p>
<p><strong>Custom Authenticator SPI</strong>：用 Java 寫自訂 authenticator、插進 Authentication Flow。能做 step-up MFA、device posture、risk score 判斷。陷阱是 SPI 程式碼就是 IdP 本體的一部分、bug = IdP 漏洞、必須走完整 code review + 安全測試流程、不能當普通 feature 開發。</p>
<p><strong>Realm signing key rotation</strong>：每個 realm 有自己的 RSA / EC signing key、用來簽 ID token / SAML assertion。rotation 必須跟下游 client 協調（key rollover 期間 client 要能接受新舊 key）、否則 rotation 當天全公司 login 失敗。分域分批是必做的、參考 <a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a>。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>DB 是 SPOF</strong>：Keycloak 所有 state 在 PostgreSQL / MySQL、DB 出事 = IdP 停 = 全公司 SSO 停。跨 AZ replication + PITR + 季度 restore 演練、不是 nice-to-have</li>
<li><strong>Cert / signing key 過期</strong>：自管 IdP 最常見事故、TLS cert 過期擋對外 endpoint、realm signing key 過期讓所有 token 變無效。走 <a href="/blog/backend/knowledge-cards/certificate-rotation-renewal/" data-link-title="Certificate Rotation and Renewal" data-link-desc="說明網站憑證如何安全續期與輪替以避免停機">Certificate Rotation</a> 自動化、過期前 30 天 alert</li>
<li><strong>Cluster split-brain</strong>：Infinispan cache 跨節點同步、網路分區時 session 狀態不一致、user 看起來登入但下一個 request 又被踢出。HA topology 設計要考慮 cache mode（distributed vs replicated）、network 健康監控要 alert split-brain</li>
<li><strong>Major upgrade 卡 DB migration</strong>：每年 major release 帶 schema migration、staging 沒跑過就 production 升級 = 數小時 downtime。upgrade plan 包含 rollback DB snapshot + staging full rehearsal</li>
<li><strong>Custom theme / Authenticator 留漏洞</strong>：theme JS 引入 XSS、custom Authenticator 跳過 MFA、SPI 沒處理 race condition。把 IdP 客製當成 <a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">supply chain</a> 看待、走 code review + 安全測試</li>
<li><strong>Event 沒進 SIEM</strong>：預設只在 Keycloak DB、IdP 出事就拿不到 evidence。Event Listener SPI 接 Kafka / file / SIEM、admin event 跟 login event 各自接 <a href="/blog/backend/knowledge-cards/alert-runbook/" data-link-title="Alert Runbook" data-link-desc="說明告警如何連到可執行的排障與恢復流程">alert runbook</a></li>
<li><strong>Master realm admin 過多</strong>：日常工作不該用 master realm admin、應該在 operational realm 開有限權限 admin。master realm 是 single point of compromise</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>不想自管、要 SaaS IdP</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/okta/" data-link-title="Okta" data-link-desc="SaaS Identity Provider 主流選項、SSO / MFA / lifecycle 整合、第三方信任邊界的代價">Okta</a> / <a href="/blog/backend/07-security-data-protection/vendors/auth0/" data-link-title="Auth0" data-link-desc="B2C / B2B Customer Identity Provider、Universal Login、Action / Rule hook、屬 Okta 旗下 Customer Identity Cloud">Auth0</a></td>
      </tr>
      <tr>
          <td>AWS-only 員工 SSO</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/aws-iam-identity-center/" data-link-title="AWS IAM Identity Center" data-link-desc="AWS 原生 workforce SSO、前 AWS SSO、Permission Set 跨帳號 access、可串外部 IdP federation">AWS IAM Identity Center</a></td>
      </tr>
      <tr>
          <td>Cloud resource 權限</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/aws-iam/" data-link-title="AWS IAM" data-link-desc="AWS cloud resource permission engine、Role / Policy / STS、跨帳號信任邊界與 OIDC federation 的核心">AWS IAM</a> / <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google IAM</a> / <a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Azure RBAC</a></td>
      </tr>
      <tr>
          <td>小團隊、Keycloak 太重</td>
          <td>Authentik / Zitadel / Ory Hydra（更輕量 OSS、生態系較小）</td>
      </tr>
      <tr>
          <td>事件偵測（不只 Keycloak event）</td>
          <td>04 SIEM / detection 工具（<a href="/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">04 observability</a> 跟 07 SIEM 章節）</td>
      </tr>
      <tr>
          <td>Secret / signing key 治理</td>
          <td><a href="/blog/backend/07-security-data-protection/secrets-and-machine-credential-governance/" data-link-title="7.6 秘密管理與機器憑證治理" data-link-desc="以問題驅動方式整理 secret、token、key 與機器身份治理">7.6 秘密管理與機器憑證治理</a></td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>Keycloak 完整 SAML / OIDC 規格細節、SPI Java API 文件</li>
<li>Red Hat build of Keycloak 商業支援的差異與授權細節</li>
<li>Keycloak Operator（Kubernetes deployment）的逐步部署教學</li>
<li>LDAP / Active Directory 各種 schema 對應規格</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Keycloak 沒有直接的廠商級公開事件（OSS 沒有 vendor incident 的對應形態）、自管 IdP 的失效模式以下分兩類整理：跨 vendor 共通的 <em>同構失效</em> 用既有 case 對照、自管 IdP <em>特有</em> 的失效情境補敘事說明、避免案例表變成「同一個 frame 拼四個 case slug」。</p>
<p><strong>對照引用（跨 vendor 同構失效）</strong>：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Keycloak 的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/azure-ad-identity-control-plane-2021/" data-link-title="7.C3 Azure AD：2021 Identity Control-plane 事件" data-link-desc="身分控制面事件如何影響多服務信任鏈與回復優先序。">Azure AD Identity Control Plane 2021</a></td>
          <td>對所有自管 IdP 的啟示：IdP 控制面故障會外溢到下游所有依賴 SSO 的服務、降級策略（local fallback、cached session）必須事先設計</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a></td>
          <td>Keycloak realm signing key rotation 必須分域分批、一次 rotate 全部 realm = 全公司 login 同時失敗</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/uber-2022-mfa-fatigue/" data-link-title="7.R7.1.1 Uber 2022：MFA 疲勞與內部工具擴散" data-link-desc="從社交工程到內部工具存取，拆解身分流程與權限邊界的失效點">Uber 2022 MFA Fatigue</a></td>
          <td>純 push MFA 抗不過 fatigue、Keycloak 自訂 Authentication Flow 應該強制高風險操作走 phishing-resistant factor</td>
      </tr>
  </tbody>
</table>
<p><strong>自管 IdP 特有的失效情境</strong>（沒有對應公開 vendor case、來自自管運維常見事故樣態）：</p>
<ul>
<li><strong>Cert 過期讓全公司 SSO 卡死</strong>：Keycloak signing cert / TLS cert / 後端 DB cert 都自己管、任何一張過期 = login 全停。Okta / Auth0 客戶不會遇到這個失效面（vendor 自己 rotate）— 自管組織必須有 cert lifecycle monitoring（Prometheus exporter + alert）+ 季度 rotate rehearsal、不能等 Let&rsquo;s Encrypt / 公司 PKI 發過期通知才動</li>
<li><strong>Major upgrade 卡 DB migration 變數小時 downtime</strong>：Keycloak 每年 major release 帶 schema migration、若 staging 沒 full rehearsal 就 production 升級、可能遇到 migration 比預期慢 5-10 倍、整個維護視窗炸掉。對照 Okta / Auth0：vendor 自己升、客戶感知是 minutes-level、不是 hours-level</li>
<li><strong>Realm scope 在小規模時用法跟大規模衝突</strong>：<a href="/blog/backend/07-security-data-protection/cases/contrast-identity-governance-by-scale/" data-link-title="7.C10 對照：規模差異下的身份治理" data-link-desc="identity 控制面治理在不同規模服務下的失敗邊界差異。">Contrast: Identity Governance by Scale</a> 揭示不同規模治理模式差異 — 小團隊用單一 realm 順、團隊長大後該拆 realm 卻沒拆、最後 admin compromise blast radius 變整個組織。Keycloak 比 SaaS IdP 更容易踩到、因為 realm 拆分要自己決定時機、沒 vendor 推使用者升級 tier</li>
<li><strong>DB 是 SPOF、自管沒做好 = SSO 跟 DB 一起死</strong>：Keycloak 用 PostgreSQL / MySQL 存 user / session / signing key、DB 出事 = IdP 停。跨 AZ HA + 跨 region DR + 季度 failover 演練是硬性要求、不是 nice-to-have；SaaS IdP 客戶不會遇到這個層次的失效面</li>
</ul>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">7.2 身分與授權邊界</a>、<a href="/blog/backend/07-security-data-protection/detection-coverage-and-signal-governance/" data-link-title="7.13 偵測覆蓋率與訊號治理" data-link-desc="定義偵測覆蓋、訊號品質與誤報成本的治理問題">7.13 偵測覆蓋率與訊號治理</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/okta/" data-link-title="Okta" data-link-desc="SaaS Identity Provider 主流選項、SSO / MFA / lifecycle 整合、第三方信任邊界的代價">Okta vendor</a>、<a href="/blog/backend/07-security-data-protection/vendors/auth0/" data-link-title="Auth0" data-link-desc="B2C / B2B Customer Identity Provider、Universal Login、Action / Rule hook、屬 Okta 旗下 Customer Identity Cloud">Auth0 vendor</a>、<a href="/blog/backend/07-security-data-protection/vendors/aws-iam-identity-center/" data-link-title="AWS IAM Identity Center" data-link-desc="AWS 原生 workforce SSO、前 AWS SSO、Permission Set 跨帳號 access、可串外部 IdP federation">AWS IAM Identity Center</a></li>
<li>下游：<a href="/blog/backend/07-security-data-protection/vendors/aws-iam/" data-link-title="AWS IAM" data-link-desc="AWS cloud resource permission engine、Role / Policy / STS、跨帳號信任邊界與 OIDC federation 的核心">AWS IAM</a> / <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google Cloud IAM</a> / <a href="/blog/backend/07-security-data-protection/vendors/azure-rbac/" data-link-title="Azure RBAC &#43; Entra ID" data-link-desc="Azure 雙層身份/權限體系、Entra ID（IdP）&#43; Azure RBAC（resource permission）、Conditional Access、PIM、Managed Identity">Azure RBAC</a>（Keycloak 之後的 cloud resource permission 層）</li>
<li>跨模組：<a href="/blog/backend/08-incident-response/vendors/" data-link-title="事故處理 Vendor 清單" data-link-desc="規劃 on-call、incident response、status page 與 postmortem 工具的服務頁撰寫順序與判準">8 事故處理 vendor 清單</a>（自管 IdP 事件如何 routing 進 IR 流程）</li>
<li>官方：<a href="https://www.keycloak.org/documentation">Keycloak Documentation</a></li>
</ul>
]]></content:encoded></item><item><title>Trivy</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/trivy/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/trivy/</guid><description>&lt;p>Trivy 是 Aqua Security 維護的 &lt;em>open-source all-in-one security scanner&lt;/em>、Apache 2.0、單一 CLI 涵蓋 container image / filesystem / git repo / Kubernetes / IaC 五種 scan target、額外做 secret / license / SBOM scan。設計目標跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &amp;#43; Code (SAST) &amp;#43; Container &amp;#43; IaC &amp;#43; Cloud (CSPM)、Reachability analysis">Snyk&lt;/a> 不同 — Snyk 是 SaaS-first、用 server-side dashboard 跨 SCM / 跨 repo 聚合；Trivy 是 CLI-first、零 server、CI runner 自己就能完成所有工作、air-gapped 環境也能跑。商業版 Aqua Platform 加 dashboard / RBAC / policy / runtime defense、但 Trivy 本身免費覆蓋大部分團隊需求。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Trivy 的核心定位是 &lt;em>把 supply chain scan 收斂成一個 CLI&lt;/em>。同一個 binary 處理 container image、source tree、K8s cluster live state、Terraform / Dockerfile / CloudFormation 配置、secret / license / SBOM — 不需要拼裝多個工具、不需要 SaaS account、不需要 server。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &amp;#43; Code (SAST) &amp;#43; Container &amp;#43; IaC &amp;#43; Cloud (CSPM)、Reachability analysis">Snyk&lt;/a> 商業 SaaS 的差異是 &lt;em>資料治理權&lt;/em> 在自己這邊（scan 結果不上 vendor cloud）、代價是 &lt;em>跨 repo 集中報表&lt;/em> 需要自己拼（用 Trivy Operator 或 Aqua Platform）。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &amp;#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &amp;#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft + Grype&lt;/a> 的差異是 &lt;em>工具邊界劃法&lt;/em>。Anchore Syft 專做 SBOM 生成、Grype 專做 vuln scan、兩個工具靠 SBOM 標準（CycloneDX / SPDX）串接；Trivy 一個 CLI 全包、SBOM 也同樣輸出標準格式。多 vendor 並存環境（例：build pipeline 用 Syft 生 SBOM、release gate 用 Grype scan、跟 SBOM repository 互通）Syft+Grype 模組化較適合；單一團隊單一 pipeline 想 &lt;em>一次裝完&lt;/em> 用 Trivy 更直接。&lt;/p></description><content:encoded><![CDATA[<p>Trivy 是 Aqua Security 維護的 <em>open-source all-in-one security scanner</em>、Apache 2.0、單一 CLI 涵蓋 container image / filesystem / git repo / Kubernetes / IaC 五種 scan target、額外做 secret / license / SBOM scan。設計目標跟 <a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a> 不同 — Snyk 是 SaaS-first、用 server-side dashboard 跨 SCM / 跨 repo 聚合；Trivy 是 CLI-first、零 server、CI runner 自己就能完成所有工作、air-gapped 環境也能跑。商業版 Aqua Platform 加 dashboard / RBAC / policy / runtime defense、但 Trivy 本身免費覆蓋大部分團隊需求。</p>
<h2 id="服務定位">服務定位</h2>
<p>Trivy 的核心定位是 <em>把 supply chain scan 收斂成一個 CLI</em>。同一個 binary 處理 container image、source tree、K8s cluster live state、Terraform / Dockerfile / CloudFormation 配置、secret / license / SBOM — 不需要拼裝多個工具、不需要 SaaS account、不需要 server。跟 <a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a> 商業 SaaS 的差異是 <em>資料治理權</em> 在自己這邊（scan 結果不上 vendor cloud）、代價是 <em>跨 repo 集中報表</em> 需要自己拼（用 Trivy Operator 或 Aqua Platform）。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft + Grype</a> 的差異是 <em>工具邊界劃法</em>。Anchore Syft 專做 SBOM 生成、Grype 專做 vuln scan、兩個工具靠 SBOM 標準（CycloneDX / SPDX）串接；Trivy 一個 CLI 全包、SBOM 也同樣輸出標準格式。多 vendor 並存環境（例：build pipeline 用 Syft 生 SBOM、release gate 用 Grype scan、跟 SBOM repository 互通）Syft+Grype 模組化較適合；單一團隊單一 pipeline 想 <em>一次裝完</em> 用 Trivy 更直接。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GitHub Advanced Security</a> 的差異是 <em>偵測類型 + 部署面</em>。GHAS 綁 GitHub、SAST（CodeQL）覆蓋深、但容器掃跟 IaC scan 較弱；Trivy 跨 SCM、容器跟 IaC 掃強、但沒 SAST 深度。跟 Clair（RedHat / Quay 內建）或 Anchore Enterprise 比、Trivy 用戶基數大（CNCF Sandbox）、社群更新快、整合面廣（GitLab CI / GitHub Actions / Jenkins / CircleCI 都有官方 step）。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Trivy 的五種 scan target（image / fs / repo / k8s / config）各承擔哪段 supply chain 責任、什麼時候用哪個</li>
<li>Trivy DB 的更新模型（OCI artifact、6 小時 cadence、air-gapped mirror）跟 CI runner 信任邊界</li>
<li><code>.trivyignore</code> 跟 severity gate 在 CI 怎麼接、exception 治理要設哪些 tripwire</li>
<li>何時用 Trivy、何時改走 <a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a> / <a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft + Grype</a> / <a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS</a> 的取捨</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Trivy 配置是否健康、最少看四件事：</p>
<ul>
<li><strong>scan target 覆蓋面</strong>：是否 image / fs / config / secret 四類都跑（不是只 scan image）、CI 是否把 dev container / base image / runtime image 全納入 — 漏掉 base image 等於信任 upstream registry</li>
<li><strong>Trivy DB 更新 cadence</strong>：CI runner 是否每次都 pull 最新 DB（OCI artifact、預設 6 小時 TTL）、air-gapped 環境是否有內部 mirror（<code>--db-repository</code> 指到內部 registry）、<code>trivy --skip-db-update</code> 是否被誤用</li>
<li><strong>severity gate 是否真的 fail build</strong>：Trivy 預設 scan 完 exit 0、CI 不會 fail；需要 <code>--exit-code 1 --severity HIGH,CRITICAL</code> 才會把 PR build 擋下來、否則 scan 結果只在 log、沒人看</li>
<li><strong><code>.trivyignore</code> 治理</strong>：ignore 的 CVE 有 reason + expiration 嗎、quarterly review 流程在嗎、<code>.trivyignore.yaml</code> 有用嗎 — 沒治理的 ignore list 會無限膨脹、最後等於沒 scan</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">supply chain integrity</a> 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>CLI 五種 scan target</strong>：<code>trivy image &lt;ref&gt;</code> 掃 container image 的 OS package + language dependency；<code>trivy fs &lt;dir&gt;</code> 掃 source tree（含 lockfile + Dockerfile + IaC manifest + secret）；<code>trivy repo &lt;url&gt;</code> 不 clone 直接掃 git repo；<code>trivy k8s --report summary cluster</code> 掃 K8s cluster 內所有 workload（image + manifest 配置）；<code>trivy config &lt;dir&gt;</code> 專掃 IaC 配置（Terraform / CloudFormation / K8s YAML / Dockerfile / Helm）。本地 dev 最常用 <code>trivy fs .</code>、CI 最常用 <code>trivy image $IMAGE</code>、K8s 場景用 Trivy Operator 跑 in-cluster scan。</p>
<p><strong>Trivy DB（OCI artifact）</strong>：Trivy 自己維護 vulnerability DB、以 OCI artifact 形式存在 <code>ghcr.io/aquasecurity/trivy-db</code>、每 6 小時更新一次。CI runner 第一次 scan 自動 pull、後續用 cache。air-gapped 環境（金融 / 政府 / 工控）需要把 DB mirror 到內部 OCI registry、<code>--db-repository internal.registry/trivy-db</code> 指過去。DB 內容是 aggregated source — NVD、GHSA、各 Linux distro security advisory、language ecosystem advisory（npm / PyPI / Maven / RubyGems / crates.io / Go / etc.）合在一起、所以單一查詢就能跨多生態。</p>
<p><strong><code>.trivyignore</code> 跟 <code>.trivyignore.yaml</code></strong>：scan 發現的 CVE 若已評估無風險（無 reachable code path、已有 mitigation、upstream 尚未 patch 但業務不受影響）寫進 <code>.trivyignore</code>（純 CVE-ID list）或 <code>.trivyignore.yaml</code>（含 <code>expired_at</code> + <code>comment</code> + <code>paths</code>、更適合治理）。後者強制每筆 ignore 有 expiration（建議 quarterly）跟 reason、過期自動失效、避免 ignore list 變成「忘了清的死帳」。CI 應該每季跑 <code>trivy --ignorefile .trivyignore.yaml</code> 同時 alert 即將過期的條目。</p>
<p><strong>Severity gate 是 CI 必設</strong>：Trivy 預設 scan 完 print 結果但 exit 0、CI build 不會 fail。要在 CI 真正擋下高風險 PR、必須 <code>trivy image --exit-code 1 --severity HIGH,CRITICAL $IMAGE</code>。Severity 級別（UNKNOWN / LOW / MEDIUM / HIGH / CRITICAL）對應 CVSS score、團隊需要決定 <em>什麼 severity 算 release blocker</em>。常見 baseline：CRITICAL fail PR build、HIGH fail nightly build（給 24 小時修補窗口）、MEDIUM 進 backlog ticket。</p>
<p><strong>SBOM 生成與 scan</strong>：<code>trivy image --format cyclonedx --output sbom.json $IMAGE</code> 生 CycloneDX 格式 SBOM、<code>--format spdx-json</code> 生 SPDX。也可以反向 — 拿別人生的 SBOM 餵給 Trivy：<code>trivy sbom sbom.json</code> 跑 vuln scan、不重新解析 image。這個 workflow 跟 <a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft + Grype</a> 重疊（Syft 生 SBOM + Grype scan SBOM）、差別是 Trivy 一站完成、Syft+Grype 拆兩階段更模組化。SBOM artifact 進 OCI registry（用 cosign attach）或 SBOM repository（如 Dependency-Track）做長期追蹤。</p>
<p><strong>Misconfig + Secret + License 一起 scan</strong>：<code>trivy fs .</code> 預設啟用四類 scanner — vuln（package CVE）、misconfig（IaC 配置錯誤）、secret（hardcoded credential）、license（license compliance）。Misconfig 內建 hundreds of built-in policy（Rego 寫的）涵蓋 K8s / Terraform / Docker / CloudFormation 常見錯誤（privileged container / open S3 bucket / 0.0.0.0/0 ingress）。Secret scanner 用 regex pattern 找 AWS access key / GCP service account / Stripe key 等常見格式、不是萬能、但 dev pre-commit 攔截已洩漏 secret 很實用。</p>
<p><strong>Trivy Operator（K8s in-cluster scanner）</strong>：K8s 場景的標準配置。Operator 在 cluster 跑、定期 scan 所有 namespace 的 workload、產 CRD reports：<code>VulnerabilityReport</code>（image CVE）、<code>ConfigAuditReport</code>（manifest 配置）、<code>SbomReport</code>、<code>ClusterComplianceReport</code>（CIS Kubernetes Benchmark / NSA Kubernetes Hardening Guide）。Operator 可選配 ValidatingAdmissionWebhook、admission 階段拒絕高風險 image（CVE severity 超門檻）。Reports 是 CRD、可以走 <code>kubectl get vulnerabilityreport</code> 看、也可以 prometheus exporter 出 metric 進 Grafana。</p>
<p><strong>Aqua Platform 整合</strong>：Trivy CLI / Operator 結果可以推到 Aqua Platform（商業版）做集中 dashboard、跨 cluster RBAC、policy engine、compliance report、runtime defense（runtime container 監控）。純 CLI 用戶不需要、但企業有多 cluster + 跨團隊 governance 需求時、Aqua Platform 補 server-side aggregation 那塊（對應 Snyk dashboard 的功能）。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Trivy</th>
          <th>Snyk</th>
          <th>Syft + Grype</th>
          <th>GitHub Advanced Security</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>部署模型</td>
          <td>CLI-only、零 server</td>
          <td>SaaS-first、需要 Snyk account</td>
          <td>CLI-only、兩個 binary</td>
          <td>綁 GitHub、整合在 PR / Code Scanning</td>
      </tr>
      <tr>
          <td>授權</td>
          <td>Apache 2.0、完全免費</td>
          <td>商業 SaaS（Free tier + 付費 plan）</td>
          <td>Apache 2.0、完全免費</td>
          <td>GitHub Enterprise add-on</td>
      </tr>
      <tr>
          <td>Scan target</td>
          <td>image / fs / repo / k8s / config</td>
          <td>image / SCA / IaC / Code (SAST) / Container</td>
          <td>image / fs（SBOM-first）</td>
          <td>SAST (CodeQL) + Dependabot + Secret scanning</td>
      </tr>
      <tr>
          <td>Vulnerability DB</td>
          <td>Trivy DB（OCI artifact、6h cadence、可 mirror）</td>
          <td>Snyk Intel（私有、含 reachability data）</td>
          <td>Grype DB（GitHub-hosted、可 mirror）</td>
          <td>GitHub Advisory DB</td>
      </tr>
      <tr>
          <td>Reachability</td>
          <td>無</td>
          <td>有（Snyk Code reachability）</td>
          <td>無</td>
          <td>部分（CodeQL data flow）</td>
      </tr>
      <tr>
          <td>SBOM 支援</td>
          <td>生 + scan（CycloneDX / SPDX）</td>
          <td>生（Snyk SBOM）</td>
          <td>Syft 生、Grype scan、最完整 SBOM workflow</td>
          <td>部分（Dependency Graph）</td>
      </tr>
      <tr>
          <td>K8s in-cluster</td>
          <td>Trivy Operator（CRD reports + admission）</td>
          <td>Snyk Kubernetes（agent-based）</td>
          <td>無原生、靠外部 wrapper</td>
          <td>無</td>
      </tr>
      <tr>
          <td>跨 repo 報表</td>
          <td>Trivy 本身無、Aqua Platform 補</td>
          <td>Snyk dashboard（強項）</td>
          <td>無原生、靠外部</td>
          <td>GitHub Security tab（綁 GitHub）</td>
      </tr>
      <tr>
          <td>Air-gapped 支援</td>
          <td>強 — DB 可 mirror 到內部 registry</td>
          <td>弱 — 需要 Snyk SaaS（Snyk On-Prem 商業版另算）</td>
          <td>強 — DB 可 mirror</td>
          <td>弱 — 綁 GitHub.com</td>
      </tr>
      <tr>
          <td>學習曲線</td>
          <td>低 — 一個 CLI + 通用 flag</td>
          <td>低 — UI 友善、CLI 也順</td>
          <td>中 — 兩個工具拼、SBOM 概念要懂</td>
          <td>中 — CodeQL query 寫 / 調有門檻</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>CI image scan、K8s scan、air-gapped、OSS-only 預算</td>
          <td>跨 SCM 跨 repo 集中治理、SaaS 預算 OK、需 reachability</td>
          <td>SBOM 為主軸的 supply chain、多 vendor 互通</td>
          <td>GitHub-only + 需要 SAST 深度</td>
      </tr>
  </tbody>
</table>
<p>選 Trivy 的核心訴求：<em>零 server / OSS-only 預算 / air-gapped 友善 / 一個 CLI 涵蓋 container + IaC + secret</em>。需要跨 SCM 集中 dashboard 跟 reachability 走 Snyk；純 SBOM workflow + 多工具互通走 Syft+Grype；GitHub-only + 重 SAST 走 GHAS。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Trivy Operator + admission control</strong>：Operator 跑 ValidatingAdmissionWebhook、admission 階段對 Pod spec 的 image 跑 vuln check、超門檻就拒絕創建。對應 <a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">supply chain integrity</a> 的 <em>artifact gate at deploy time</em>。組態要小心 — webhook timeout / Trivy DB 不可用 / Operator 自己 down 都會擋住 deploy、production 通常 fail-open（DB 不可用時放行 + alert）而非 fail-close。</p>
<p><strong>Custom check（Rego policy）</strong>：Trivy misconfig scanner 用 Rego 寫 policy、可以自己加 custom check（例：禁止特定 namespace 用 hostPath volume、禁止特定 IAM action）。policy 走 <code>--policy ./custom-policies/</code> 載入、跟內建 policy 一起跑。比 OPA Gatekeeper 簡單（不需要部署 admission webhook、scan-time 就執行）、但 runtime enforcement 還是要靠 Gatekeeper / Kyverno。</p>
<p><strong>Air-gapped DB sync</strong>：金融 / 政府 / 工控環境 CI runner 不能連外網。流程是：有對外網的 staging machine 跑 <code>trivy --download-db-only</code> 把 OCI artifact 拉下來、用 <code>skopeo copy</code> 推到內部 OCI registry、CI runner 用 <code>--db-repository internal.registry/trivy-db --skip-db-update</code>（或排程從內部 mirror pull）。DB 更新節奏要排程化（每天 / 每 6 小時）、否則 air-gapped DB 落後幾天會 miss 掉新公布 CVE。</p>
<p><strong>Cosign + SLSA + Trivy 三件事</strong>：Trivy 看的是 <em>known CVE</em>、看不到 <em>build-time backdoor</em>。配套需要 Sigstore cosign 做 image signature verify（確認 image 真的是自家 CI 出的）+ SLSA provenance（build pipeline 不可篡改紀錄）+ Trivy scan（known CVE）三件事一起、才是完整 supply chain trust chain。對應 <a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">Cert-manager</a> 在 TLS 的角色、Trivy 在 supply chain 的角色是 <em>已知漏洞檢測</em>、不是 <em>trust establishment</em>。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>CI 顯示 scan 完但 build 沒 fail</strong>：忘了 <code>--exit-code 1 --severity HIGH,CRITICAL</code>、scan 結果只在 log、PR 一直 merge 進高風險 image — 補 severity gate flag、設 baseline</li>
<li><strong>Trivy DB 拉不下來 / 過期</strong>：CI runner 沒對外網 / GitHub Container Registry 被擋 / DB cache 太舊 — 設內部 OCI mirror、CI runner <code>--db-repository</code> 指過去、排程 update</li>
<li><strong><code>.trivyignore</code> 無限膨脹</strong>：用純 list 沒 expiration、團隊找不到誰加的 / 為什麼加 — 改 <code>.trivyignore.yaml</code> 強制 reason + expiration、quarterly review 排進 sprint</li>
<li><strong>false positive 多到 alert fatigue</strong>：base image 自帶大量未修補 OS package、scan 出 50+ HIGH — 換 distroless / Chainguard / Wolfi 等 <em>minimal base image</em>、或 multi-stage build 只保留必要 binary、不是調高門檻當沒看到</li>
<li><strong>secret scanner 漏報</strong>：hardcoded credential 是非標準格式（內部 token、特殊 vendor key）— 加 custom secret pattern、或配合 dedicated tool（Gitleaks / GitGuardian）做第二道</li>
<li><strong>Trivy Operator 報表沒人看</strong>：reports 是 CRD、<code>kubectl get</code> 才看到、PR / Slack 沒通知 — 接 prometheus exporter + Grafana alert、或 webhook 推 Slack</li>
<li><strong>K8s admission webhook fail 擋住 deploy</strong>：Operator down / DB 不可用、所有 Pod 創建被拒 — webhook 配 <code>failurePolicy: Ignore</code>、production 通常 fail-open + alert、不是 fail-close</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>需 reachability / 跨 SCM dashboard</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a></td>
      </tr>
      <tr>
          <td>SBOM-first / 多工具互通</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft + Grype</a></td>
      </tr>
      <tr>
          <td>SAST 深度 / GitHub-only</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GitHub Advanced Security</a>（CodeQL）</td>
      </tr>
      <tr>
          <td>純依賴升級自動化</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/dependabot/" data-link-title="Dependabot" data-link-desc="GitHub 原生依賴更新自動化、Version Update &#43; Security Update &#43; Alerts、Grouped Updates 減 PR noise、Auto-merge 配 branch protection">Dependabot</a></td>
      </tr>
      <tr>
          <td>Runtime container monitoring</td>
          <td>Falco / Cilium Tetragon / Aqua Runtime（商業版）</td>
      </tr>
      <tr>
          <td>TLS / mTLS cert lifecycle</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">cert-manager</a></td>
      </tr>
      <tr>
          <td>Image signing / provenance</td>
          <td>Sigstore cosign + SLSA framework</td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>Trivy CLI 所有 flag 跟 output format 完整 reference</li>
<li>Rego policy language 完整語法（OPA / Rego 自有體系）</li>
<li>Aqua Platform 商業版完整功能矩陣（dashboard / RBAC / runtime defense）</li>
<li>各 PCI DSS / SOC 2 / FedRAMP 合規 mapping</li>
<li>跟其他 scanner（Clair / Anchore Enterprise / Twistlock）的逐項比較</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Trivy 在 07 案例庫沒有 <em>直接 vendor-level 事件</em>（Trivy 本身 OSS、無 vendor-side 控制面風險）、但 supply chain 案例都對應 Trivy 的能力與邊界：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Trivy 的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/log4shell-cve-2021-44228-component-chain/" data-link-title="7.R7.2.7 Log4Shell 2021：共用元件風險與修補鏈" data-link-desc="共用元件漏洞如何同步影響多服務，並迫使團隊建立依賴治理 workflow">Log4Shell CVE-2021-44228</a></td>
          <td>對照啟示 — CVE 公開後 Trivy DB 幾小時內更新、scan container image 找受影響 service 是緊急 response 主軸；air-gapped 環境 DB mirror 更新節奏直接決定窗口期長度</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/solarwinds-2020-sunburst/" data-link-title="7.R7.2.1 SolarWinds 2020：更新鏈被濫用" data-link-desc="合法更新流程遭植入後，攻擊者如何長期潛伏與橫向擴散">SolarWinds 2020 Sunburst</a></td>
          <td>對照啟示 — Trivy scan known CVE、看不到 build-time backdoor 植入；必須配合 image signing（cosign）+ SLSA provenance 才完整</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/3cx-2023-desktopapp-supply-chain/" data-link-title="7.R7.2.8 3CX 2023：桌面軟體更新鏈攻擊" data-link-desc="合法更新流程被植入後，桌面端供應鏈事件如何傳到企業端點">3CX 2023 Desktop App Supply Chain</a></td>
          <td>對照啟示 — container scan 看 image layer 內 known CVE、看不到 runtime callback / dynamic load；需配合 runtime monitoring（Falco / Tetragon）</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/xz-backdoor-2024-open-source-supply-chain/" data-link-title="7.R7.2.4 XZ Backdoor 2024：開源供應鏈長期滲透" data-link-desc="開源維護鏈遭滲透後，為何會直接影響廣泛 Linux 發行流程">XZ Backdoor 2024</a></td>
          <td>對照啟示 — Trivy 比對 package name + version 對應 CVE、看不到 maintainer takeover；mitigation 走 SBOM provenance + maintainer trust baseline</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性與 Artifact 信任</a></td>
          <td>章節原則 — Trivy 是 <em>known CVE 檢測</em>、SBOM + signing + provenance 三件事一起才形成完整 trust chain</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性與 Artifact 信任</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a>、<a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft + Grype</a>、<a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GitHub Advanced Security</a>、<a href="/blog/backend/07-security-data-protection/vendors/dependabot/" data-link-title="Dependabot" data-link-desc="GitHub 原生依賴更新自動化、Version Update &#43; Security Update &#43; Alerts、Grouped Updates 減 PR noise、Auto-merge 配 branch protection">Dependabot</a></li>
<li>下游：<a href="/blog/backend/07-security-data-protection/entrypoint-and-server-protection/" data-link-title="7.3 入口治理與伺服器防護" data-link-desc="以問題驅動方式整理對外入口、管理平面與伺服器邊界">7.3 入口治理與伺服器防護</a>（image 漏洞最終影響的是 origin server 風險面）</li>
<li>跨類：<a href="/blog/backend/07-security-data-protection/vendors/cert-manager/" data-link-title="cert-manager" data-link-desc="K8s 原生 certificate lifecycle automation、支援 Let&#39;s Encrypt / Vault PKI / Venafi 等多 issuer、auto-renewal &#43; Challenge solver">cert-manager</a>（TLS lifecycle）、<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a>（secret rotation 對應 Trivy secret scan 找到的 hardcoded credential）</li>
<li>跨模組：<a href="/blog/backend/08-incident-response/vendors/" data-link-title="事故處理 Vendor 清單" data-link-desc="規劃 on-call、incident response、status page 與 postmortem 工具的服務頁撰寫順序與判準">8 事故處理 vendor 清單</a>（CVE 緊急 response 流程 / 高風險 image rollback）</li>
<li>官方：<a href="https://aquasecurity.github.io/trivy/">Trivy Documentation</a>、<a href="https://aquasecurity.github.io/trivy-operator/">Trivy Operator</a></li>
</ul>
]]></content:encoded></item><item><title>Syft + Grype</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/syft-grype/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/syft-grype/</guid><description>&lt;p>Syft 跟 Grype 是 Anchore 開源的 &lt;em>姐妹工具&lt;/em>（Apache 2.0、免費）、各做一件事、用 pipe 串接成 &lt;em>SBOM-first&lt;/em> 的 supply chain scan 鏈：&lt;strong>Syft&lt;/strong> 掃 container image / 檔案系統 / 目錄、產出標準 SBOM（CycloneDX 1.5+ / SPDX 2.3 / SyftJSON）；&lt;strong>Grype&lt;/strong> 吃 SBOM 或直接 scan target、比對 Grype-DB 回報 CVE。設計哲學是 Unix philosophy — &lt;code>syft image:tag -o cyclonedx-json | grype&lt;/code> 等價於 &lt;code>grype image:tag&lt;/code>、但中間的 SBOM 是 &lt;em>正式 artifact&lt;/em>、可以單獨簽章、單獨保存、單獨給下游消費。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &amp;#43; Secret &amp;#43; License &amp;#43; SBOM、Apache 2.0、CI 友善">Trivy&lt;/a> 全包式設計不同、跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &amp;#43; Code (SAST) &amp;#43; Container &amp;#43; IaC &amp;#43; Cloud (CSPM)、Reachability analysis">Snyk&lt;/a> 商業 SaaS 路線也不同。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Syft + Grype 的核心定位是 &lt;em>SBOM-first 的 OSS supply chain scan tool chain&lt;/em>。SBOM 不是中間產物、是 &lt;em>正式可簽章 artifact&lt;/em>：Syft 產 SBOM 後通常用 &lt;a href="https://docs.sigstore.dev/">Sigstore cosign&lt;/a> &lt;code>attest --predicate sbom.cdx.json&lt;/code> 把 SBOM 簽進 image OCI metadata、跟 image 一起發布；下游團隊 / 客戶 / scan pipeline 拿 &lt;em>trusted SBOM&lt;/em> 跑 Grype、不需要重新 scan image。對 &lt;em>air-gapped 環境&lt;/em>、&lt;em>multi-team handoff&lt;/em>、&lt;em>合規場景&lt;/em>（EO 14028 / FedRAMP 要求交付 CycloneDX 或 SPDX）特別合適。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &amp;#43; Secret &amp;#43; License &amp;#43; SBOM、Apache 2.0、CI 友善">Trivy&lt;/a> 的差異是 &lt;em>分工 vs 全包&lt;/em>：Trivy 一個 binary 把 SBOM 生成 + vuln scan + IaC + secret + license 都做了；Syft + Grype 拆兩個工具、SBOM 互通流程適合、團隊偏好 Unix philosophy 選這條。功能覆蓋面 Trivy 略廣（含 IaC / secret scan）、Syft 的 SBOM 格式互通性是 OSS reference implementation。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &amp;#43; Code (SAST) &amp;#43; Container &amp;#43; IaC &amp;#43; Cloud (CSPM)、Reachability analysis">Snyk&lt;/a> 的差異更直接：Snyk 商業 SaaS、覆蓋廣（SAST / IaC / CSPM / Reachability）、有 dashboard 跟 fix PR；Syft + Grype 純 CLI、OSS 免費、聚焦 SBOM + vuln 兩件事、沒 server / 沒 dashboard、要 dashboard 走商業 Anchore Enterprise 或自接 JSON 到 Elasticsearch / Grafana。&lt;/p></description><content:encoded><![CDATA[<p>Syft 跟 Grype 是 Anchore 開源的 <em>姐妹工具</em>（Apache 2.0、免費）、各做一件事、用 pipe 串接成 <em>SBOM-first</em> 的 supply chain scan 鏈：<strong>Syft</strong> 掃 container image / 檔案系統 / 目錄、產出標準 SBOM（CycloneDX 1.5+ / SPDX 2.3 / SyftJSON）；<strong>Grype</strong> 吃 SBOM 或直接 scan target、比對 Grype-DB 回報 CVE。設計哲學是 Unix philosophy — <code>syft image:tag -o cyclonedx-json | grype</code> 等價於 <code>grype image:tag</code>、但中間的 SBOM 是 <em>正式 artifact</em>、可以單獨簽章、單獨保存、單獨給下游消費。跟 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> 全包式設計不同、跟 <a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a> 商業 SaaS 路線也不同。</p>
<h2 id="服務定位">服務定位</h2>
<p>Syft + Grype 的核心定位是 <em>SBOM-first 的 OSS supply chain scan tool chain</em>。SBOM 不是中間產物、是 <em>正式可簽章 artifact</em>：Syft 產 SBOM 後通常用 <a href="https://docs.sigstore.dev/">Sigstore cosign</a> <code>attest --predicate sbom.cdx.json</code> 把 SBOM 簽進 image OCI metadata、跟 image 一起發布；下游團隊 / 客戶 / scan pipeline 拿 <em>trusted SBOM</em> 跑 Grype、不需要重新 scan image。對 <em>air-gapped 環境</em>、<em>multi-team handoff</em>、<em>合規場景</em>（EO 14028 / FedRAMP 要求交付 CycloneDX 或 SPDX）特別合適。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> 的差異是 <em>分工 vs 全包</em>：Trivy 一個 binary 把 SBOM 生成 + vuln scan + IaC + secret + license 都做了；Syft + Grype 拆兩個工具、SBOM 互通流程適合、團隊偏好 Unix philosophy 選這條。功能覆蓋面 Trivy 略廣（含 IaC / secret scan）、Syft 的 SBOM 格式互通性是 OSS reference implementation。跟 <a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a> 的差異更直接：Snyk 商業 SaaS、覆蓋廣（SAST / IaC / CSPM / Reachability）、有 dashboard 跟 fix PR；Syft + Grype 純 CLI、OSS 免費、聚焦 SBOM + vuln 兩件事、沒 server / 沒 dashboard、要 dashboard 走商業 Anchore Enterprise 或自接 JSON 到 Elasticsearch / Grafana。</p>
<p>關鍵 first-class concept：<strong>Source</strong>（OCI image / OCI archive / Docker daemon / dir / file / 既有 SBOM）、<strong>Catalog</strong>（Syft 內部 package inventory 結構）、<strong>Package</strong>、<strong>Vulnerability</strong>、<strong>Match</strong>（Grype 的 package ↔ CVE 配對）、<strong>Match Configuration</strong>（<code>grype.yaml</code> 設 severity gate / 比對策略）、<strong>Vulnerability DB</strong>（Grype-DB、Anchore 聚合 NVD + GHSA + 各 distro secdb）、<strong>Ignore Rule</strong>（CVE 例外、強制帶 expiration）。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Syft 跟 Grype 各自的責任邊界、為什麼拆兩個工具比合一個工具好（SBOM 互通、attestation、air-gapped）</li>
<li>SBOM 格式（CycloneDX / SPDX / SyftJSON）的選擇、跟合規要求對應</li>
<li>Grype Match Configuration 跟 Ignore Rule 怎麼設、CI fail 條件怎麼定</li>
<li>何時改走 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> 全包式、何時走 <a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a> 商業 SaaS</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Syft + Grype 配置是否健康、最少看四件事：</p>
<ul>
<li><strong>SBOM 格式跟保存</strong>：產出格式是否符合合規（多數 EO 14028 / FedRAMP 場景要 CycloneDX 或 SPDX、不是 SyftJSON）、SBOM 是否簽章（cosign attest）、是否集中保存（OCI registry 旁邊 / artifact store）、是否有 <em>baseline diff</em>（image 升級前後依賴變化）</li>
<li><strong>Grype DB 更新</strong>：DB 是否每日同步、air-gapped 場景是否 mirror 到內部 registry（Grype DB 是 OCI artifact、可 <code>oras pull</code> 鏡像）、DB version 是否進 SBOM scan record（重現性）</li>
<li><strong>Match Configuration</strong>：<code>grype.yaml</code> 的 severity gate（CI fail 條件、通常 high / critical fail）、<code>only-fixed: true</code> 是否開（只報有 patch 的 CVE）、<code>add-cpes-if-none: true</code> 對 binary-only package 行為</li>
<li><strong>Ignore Rule 治理</strong>：例外清單是否帶 <em>expiration</em>、<code>reason</code> 欄位是否填 ticket / decision 連結、quarterly review 機制、過期自動回到 fail 狀態</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">Supply Chain Integrity</a> 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Syft 用法跟 Source 種類</strong>：<code>syft &lt;source&gt; -o &lt;format&gt;</code> 是核心 — source 可以是 OCI image（<code>registry/image:tag</code>）、OCI archive（<code>oci-archive:image.tar</code>）、Docker daemon（<code>docker:image:tag</code>）、目錄（<code>dir:./</code>）、單一檔案、甚至既有 SBOM（<code>sbom:./prev.cdx.json</code>、用來 <em>轉格式</em>）。format 包括 <code>cyclonedx-json</code> / <code>cyclonedx-xml</code> / <code>spdx-json</code> / <code>spdx-tag-value</code> / <code>syft-json</code> / <code>table</code>。production 通常產 <em>cyclonedx-json</em>（合規要求最常見）+ 保留 <em>syft-json</em>（Syft 自家最完整、未來 round-trip 用）。</p>
<p><strong>Package detector 廣度</strong>：Syft 自動偵測 OS package（apk / dpkg / rpm）+ 語言 dependency（npm / pip / gem / go module / cargo / maven / gradle / nuget / composer / hex / conan / swift / dart 等）+ binary analysis（Go binary 內 embedded module、Rust binary metadata、Java jar / war / ear nested）。對 <em>static binary</em> / <em>FAT image</em> 的支援是 Syft 的強項、比多數 SBOM tool 廣。但 <em>runtime-only dependency</em>（dlopen / dynamic load）SBOM 看不到、要靠 runtime workload protection（Falco / Cilium Tetragon 類工具、見 <a href="/blog/backend/07-security-data-protection/vendors/" data-link-title="資安與資料保護 Vendor 清單" data-link-desc="規劃身份、秘密、金鑰、入口防護、供應鏈與偵測工具的服務頁撰寫順序與教學大綱">7 後續候選 vendor 清單</a>）補。</p>
<p><strong>Grype 用法</strong>：<code>grype &lt;source&gt;</code> 或 <code>grype sbom:./image.cdx.json</code>。輸出 <code>table</code> / <code>json</code> / <code>cyclonedx-json</code>（CycloneDX VEX 格式）/ <code>sarif</code>（GitHub code scanning）/ <code>template</code>（Go template 自訂）。production CI 通常 <code>--output sarif</code> 上傳 GitHub code scanning + <code>--output json</code> 進內部 SIEM。<code>grype sbom:./prev.cdx.json</code> 模式是 <em>SBOM-only scan</em>、不碰 image — 適合 <em>下游團隊拿 SBOM 持續 monitor</em>、原始 image 已經 frozen 或不可達。</p>
<p><strong>Match Configuration（<code>grype.yaml</code>）</strong>：核心欄位包括 <code>fail-on-severity: high</code>（CI gate）、<code>only-fixed: true</code>（只回報有 fix 可用的 CVE、避免 noise）、<code>ignore</code> list（個別 CVE 例外）、<code>match</code> strategy（如何把 package CPE / PURL 對應到 CVE、預設策略對 90% 場景夠用、特殊 binary 場景才調）。所有設定走版控、<code>grype.yaml</code> 跟程式碼一起 review、避免 console 改。</p>
<p><strong>Ignore Rule 治理</strong>：<code>grype.yaml</code> 的 <code>ignore</code> entry 結構：<code>vulnerability</code> + <code>reason</code> + <code>expiration</code>（YYYY-MM-DD）+ optional <code>package.name</code> / <code>fix-state</code>。Anchore 設計 <em>沒有「永久 ignore」</em>、必須帶 expiration — 強制 quarterly review、避免「五年前 ignore 的 CVE 早被 fix 了還在清單裡」。reason 欄位填 ticket 編號或 ADR link、給未來的人 context。</p>
<p><strong>Cosign attest SBOM</strong>：<code>syft image:tag -o cyclonedx-json &gt; sbom.cdx.json &amp;&amp; cosign attest --predicate sbom.cdx.json --type cyclonedx --key cosign.key image:tag</code> — SBOM 被簽進 image 的 OCI signature manifest、下游 <code>cosign verify-attestation --type cyclonedx ...</code> 拿到 <em>cryptographically signed SBOM</em>。這把 SBOM 從「可被竄改的 JSON 檔」升級到 <em>trusted artifact</em>、是 <a href="https://slsa.dev/">SLSA L3+</a> provenance 的基礎。</p>
<p><strong>SLSA / SPDX 流程整合</strong>：Syft SBOM 是 build 階段產物、跟 SLSA provenance（誰 build 的、用什麼 builder、source commit 是什麼）併存、不互斥 — SBOM 答「裡面有什麼」、provenance 答「怎麼 build 的」。完整 supply chain trust 需要兩者 + cosign signature。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Syft + Grype</th>
          <th>Trivy</th>
          <th>Snyk</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>工具拆分</td>
          <td>兩個（Unix philosophy）</td>
          <td>一個（all-in-one binary）</td>
          <td>SaaS + CLI（多模組）</td>
      </tr>
      <tr>
          <td>授權</td>
          <td>OSS Apache 2.0</td>
          <td>OSS Apache 2.0</td>
          <td>商業（freemium、付費才解鎖完整）</td>
      </tr>
      <tr>
          <td>部署模型</td>
          <td>CLI、無 server</td>
          <td>CLI、無 server</td>
          <td>SaaS dashboard + CLI</td>
      </tr>
      <tr>
          <td>SBOM 格式</td>
          <td>CycloneDX 1.5+ / SPDX 2.3 / SyftJSON（reference 實作）</td>
          <td>CycloneDX / SPDX</td>
          <td>CycloneDX / SPDX（次要、scan 為主）</td>
      </tr>
      <tr>
          <td>Vuln 資料源</td>
          <td>Grype-DB（NVD + GHSA + 各 distro secdb 聚合）</td>
          <td>Trivy-DB（類似來源 + Aqua 加值）</td>
          <td>Snyk Intel（自家 research、含 reachability）</td>
      </tr>
      <tr>
          <td>額外掃描</td>
          <td>無（聚焦 SBOM + vuln）</td>
          <td>IaC / secret / license / k8s misconfig</td>
          <td>SAST / IaC / container / IaC / Open Source / Code</td>
      </tr>
      <tr>
          <td>Dashboard</td>
          <td>無（Anchore Enterprise 商業才有）</td>
          <td>無（Aqua 商業才有）</td>
          <td>內建 SaaS dashboard</td>
      </tr>
      <tr>
          <td>Air-gapped</td>
          <td>強 — Grype DB 是 OCI artifact、可 mirror</td>
          <td>強 — Trivy DB OCI artifact</td>
          <td>弱 — SaaS-only 為主（自管 server 是 Enterprise）</td>
      </tr>
      <tr>
          <td>Reachability</td>
          <td>無</td>
          <td>無</td>
          <td>有（Java / JS）</td>
      </tr>
      <tr>
          <td>Fix PR 自動化</td>
          <td>無</td>
          <td>無</td>
          <td>有（auto PR、Renovate-like）</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>OSS 偏好、SBOM 互通流程、air-gapped、Unix tool chain</td>
          <td>OSS 偏好、單一工具想包多事、k8s misconfig 也要</td>
          <td>商業 SaaS、需 dashboard / fix workflow / reachability</td>
      </tr>
  </tbody>
</table>
<p>選 Syft + Grype 的核心訴求：<em>要正式 SBOM 作為交付 artifact</em>（合規 / 多 team handoff）+ <em>偏好 OSS Unix philosophy</em>（兩個工具各做一件事、容易整合自家 pipeline）+ 不需要 SaaS dashboard（自家 SIEM / Grafana 已經有）。需要 IaC scan 一起做、看一下 Trivy 是不是更省整合成本；需要 fix workflow 跟 reachability、商業預算足、走 Snyk。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>SBOM attestation 完整鏈</strong>：build pipeline 順序通常是 — build image → <code>syft image -o cyclonedx-json &gt; sbom.cdx.json</code> → <code>cosign sign image</code> → <code>cosign attest --predicate sbom.cdx.json --type cyclonedx image</code> → push。下游 admission controller（Kyverno / Gatekeeper / Sigstore policy-controller）<code>verify-attestation</code> 拿 trusted SBOM、再 Grype scan、policy 決定是否允許 deploy。這條鏈把 SBOM 從 <em>文件</em> 升級成 <em>deploy gate</em>。</p>
<p><strong>Grype DB air-gapped sync</strong>：Grype DB 是 OCI artifact（<code>ghcr.io/anchore/grype/listing.json</code> + <code>db.tar.gz</code>）、<code>oras pull</code> 或 <code>grype db update</code> 取得。air-gapped 場景：DMZ 跑 <code>grype db update --skip-listing-content-check</code>、把 <code>~/.cache/grype/db/</code> 整個 sync 到內部 mirror registry、內部 grype 透過 <code>GRYPE_DB_UPDATE_URL</code> 指到內部 listing。DB 版本進 scan record、確保 <em>相同 SBOM + 相同 DB = 相同結果</em>（可重現）。</p>
<p><strong>Custom matcher / Ignore Rule 細部</strong>：Grype 預設 matcher 對 90% 場景夠、但 <em>Go binary</em>、<em>static-linked binary</em>、<em>custom C++ build</em> 可能需要 <code>add-cpes-if-none: true</code> 強制配對 CPE。Ignore Rule 支援 <code>vex-status</code> 欄位（accepted / under-investigation / fixed / not-affected）對齊 CycloneDX VEX 標準、輸出 VEX-enriched SBOM 給下游 / 客戶。</p>
<p><strong>Anchore Enterprise 商業整合</strong>：OSS Syft + Grype 不夠時、Anchore Enterprise 加：policy engine（GraphQL 寫複雜 policy）、dashboard、RBAC、SLA-backed support、跟 Kubernetes admission integration、跟 Jira / ServiceNow ticket 自動建單。OSS 是 90% 場景的起點、Enterprise 解的是 <em>policy + workflow</em> 而非 <em>scan ability</em>。</p>
<p><strong>SBOM diff（baseline 比對）</strong>：<code>syft</code> 自己沒內建 diff、但 <code>cyclonedx-cli diff</code> 或自家 script 可以比對 <em>image v1 SBOM</em> vs <em>image v2 SBOM</em>、找出新增 / 移除 / 升級的 package。用途：<a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/xz-backdoor-2024-open-source-supply-chain/" data-link-title="7.R7.2.4 XZ Backdoor 2024：開源供應鏈長期滲透" data-link-desc="開源維護鏈遭滲透後，為何會直接影響廣泛 Linux 發行流程">XZ backdoor</a> 之類「相同 version 但被植入後門」事件、單靠 SBOM 看不出來、但 <em>baseline + behavior anomaly</em> 雙軌可以提早警示。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>Syft scan 找不到 package</strong>：image 是 <code>FROM scratch</code> 或 distroless、Syft 偵測不到 OS package metadata — 改 scan source 為 build 階段的 <code>dir:./</code> 或保留 builder image 的 SBOM</li>
<li><strong>Grype 報一堆 unfixed CVE</strong>：base image 老、有 CVE 但 upstream 還沒 patch — 設 <code>only-fixed: true</code> 過濾 noise、focus 在 actionable item；同時排程 base image 升級</li>
<li><strong>CI 突然 fail 變多</strong>：Grype DB 更新後新 CVE 揭露 — 看 DB version diff、評估是 <em>真新風險</em> 還是 <em>舊 package 被重新分類</em>、必要時用 Ignore Rule + expiration 過渡</li>
<li><strong>SBOM 格式下游不認</strong>：合規要求 SPDX、產的是 SyftJSON — 用 <code>syft convert syft-json:./sbom.json -o spdx-json</code> 轉格式（Syft 本身就是 SBOM 互轉工具）</li>
<li><strong>Air-gapped 環境 Grype 跑不動</strong>：DB 沒同步、scan 直接報 0 vulnerability（假陰性）— <code>grype db status</code> 看 DB age、mirror sync 機制檢查、加 staleness alarm</li>
<li><strong>Ignore Rule 過期回到 fail</strong>：CI 突然 fail、查 expiration 已過 — 預期行為、強制 quarterly review；補 rotation 機制（cronjob 提前一週 alert owner）</li>
<li><strong>Binary 偵測不到 module</strong>：Go binary stripped、<code>-trimpath</code> 後 module path 沒了 — build 改加 <code>-buildvcs=true</code> 保留 VCS info、或 build 階段 SBOM scan source code、不是 binary</li>
<li><strong>cosign verify-attestation 失敗</strong>：image 被 re-tag / re-push 後 attestation manifest 不對 — 用 image digest（<code>@sha256:...</code>）而非 tag 做 attest、tag 不可信</li>
<li><strong>Grype 不抓某個 ecosystem</strong>：例如新冒出的 package manager — Syft 沒實作 detector、Grype 也看不到；submit issue 或自己寫 catalogger 貢獻</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>一個工具想包 IaC / secret / k8s misconfig</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a></td>
      </tr>
      <tr>
          <td>需要 SAST / Reachability / Fix PR workflow</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a></td>
      </tr>
      <tr>
          <td>綁 GitHub 的 SAST + Dependabot</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GitHub Advanced Security</a></td>
      </tr>
      <tr>
          <td>Container runtime detection</td>
          <td>Falco / Cilium Tetragon（見 <a href="/blog/backend/07-security-data-protection/vendors/" data-link-title="資安與資料保護 Vendor 清單" data-link-desc="規劃身份、秘密、金鑰、入口防護、供應鏈與偵測工具的服務頁撰寫順序與教學大綱">7 後續候選 vendor 清單</a>）</td>
      </tr>
      <tr>
          <td>Image signing / attestation</td>
          <td><a href="https://docs.sigstore.dev/">Sigstore cosign</a></td>
      </tr>
      <tr>
          <td>Policy at admission</td>
          <td>Kyverno / OPA Gatekeeper（見 <a href="/blog/backend/07-security-data-protection/vendors/" data-link-title="資安與資料保護 Vendor 清單" data-link-desc="規劃身份、秘密、金鑰、入口防護、供應鏈與偵測工具的服務頁撰寫順序與教學大綱">7 後續候選 vendor 清單</a>）</td>
      </tr>
      <tr>
          <td>SBOM dashboard / enterprise policy / RBAC</td>
          <td>Anchore Enterprise（商業）</td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>CycloneDX / SPDX 完整 schema 規格逐欄位解讀</li>
<li>Sigstore cosign / Rekor / Fulcio 完整架構（attest 鏈的 OIDC / transparency log）</li>
<li>SLSA framework 各 level 對應的 builder 要求</li>
<li>Anchore Enterprise policy DSL 完整語法</li>
<li>VEX（Vulnerability Exploitability eXchange）跟 CSAF 標準對照細節</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>07 案例庫沒有直接 Syft / Grype-level 事件、但供應鏈案例都是 SBOM-first 思維的對照：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Syft + Grype 的關係</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/log4shell-cve-2021-44228-component-chain/" data-link-title="7.R7.2.7 Log4Shell 2021：共用元件風險與修補鏈" data-link-desc="共用元件漏洞如何同步影響多服務，並迫使團隊建立依賴治理 workflow">Log4Shell CVE-2021-44228</a></td>
          <td>對照啟示 — 預先用 Syft 產 SBOM 集中保存後、Log4Shell 公開時拿歷史 SBOM 跑 Grype 在分鐘級回答「我們哪些服務有用、含 transitive」</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/solarwinds-2020-sunburst/" data-link-title="7.R7.2.1 SolarWinds 2020：更新鏈被濫用" data-link-desc="合法更新流程遭植入後，攻擊者如何長期潛伏與橫向擴散">SolarWinds 2020 Sunburst</a></td>
          <td>對照啟示 — Syft 看 package layer、看不到 build-time backdoor 注入；需配 cosign attest + SLSA provenance 才完整</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/xz-backdoor-2024-open-source-supply-chain/" data-link-title="7.R7.2.4 XZ Backdoor 2024：開源供應鏈長期滲透" data-link-desc="開源維護鏈遭滲透後，為何會直接影響廣泛 Linux 發行流程">XZ Backdoor 2024</a></td>
          <td>對照啟示 — 相同 version 被植入後 SBOM 一樣、純比對 SBOM 看不出來；mitigation 是 SBOM diff 對 baseline + release tarball verify</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/kaseya-vsa-2021-msp-ransomware-chain/" data-link-title="7.R7.2.9 Kaseya VSA 2021：MSP 供應鏈擴散路徑" data-link-desc="管理平台事件透過 MSP 模型向多客戶擴散時，workflow 應如何分層應對">Kaseya VSA 2021</a></td>
          <td>對照啟示 — 多服務 SBOM 集中 inventory（哪 service 用哪 component）、緊急時可 <em>affected-services-by-package</em> 反查、不是逐 image scan</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性與 Artifact 信任</a></td>
          <td>Syft 是 SBOM reference implementation、章節原則對應 SBOM + signing + provenance 的 trust chain</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性與 Artifact 信任</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a>（一站式替代）、<a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a>（商業 SaaS）、<a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GitHub Advanced Security</a>（GitHub 內建）</li>
<li>下游：<a href="https://docs.sigstore.dev/">Sigstore cosign</a>（SBOM attestation）、admission policy（Kyverno / OPA Gatekeeper、見 <a href="/blog/backend/07-security-data-protection/vendors/" data-link-title="資安與資料保護 Vendor 清單" data-link-desc="規劃身份、秘密、金鑰、入口防護、供應鏈與偵測工具的服務頁撰寫順序與教學大綱">7 後續候選 vendor 清單</a>）</li>
<li>跨類：runtime workload protection（Falco / Cilium Tetragon、見 <a href="/blog/backend/07-security-data-protection/vendors/" data-link-title="資安與資料保護 Vendor 清單" data-link-desc="規劃身份、秘密、金鑰、入口防護、供應鏈與偵測工具的服務頁撰寫順序與教學大綱">7 後續候選 vendor 清單</a>）、<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a>（cosign signing key 保存）</li>
<li>跨模組：<a href="/blog/backend/08-incident-response/vendors/" data-link-title="事故處理 Vendor 清單" data-link-desc="規劃 on-call、incident response、status page 與 postmortem 工具的服務頁撰寫順序與判準">8 事故處理 vendor 清單</a>（新 CVE 揭露時的 SBOM-based fan-out 查詢）</li>
<li>官方：<a href="https://github.com/anchore/syft">Syft Documentation</a> / <a href="https://github.com/anchore/grype">Grype Documentation</a></li>
</ul>
]]></content:encoded></item><item><title>Open Policy Agent (OPA)</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/opa/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/opa/</guid><description>&lt;p>Open Policy Agent (OPA) 是 CNCF graduated 的 &lt;em>general-purpose policy engine&lt;/em>、設計目的是把「誰能做什麼、什麼 config 才合法」從 application code 抽到外部 policy decision layer。它跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &amp;#43; Constraint 兩層、Rego policy &amp;#43; Audit &amp;#43; Mutation">Gatekeeper&lt;/a> 的差別是：後兩者鎖在 K8s admission controller 領域、OPA 是 &lt;em>跨 enforcement point&lt;/em> 的 unified policy framework — 同一份 policy 可以同時管 K8s admission、API authz、Terraform plan、SQL row-level filter。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/conftest/" data-link-title="Conftest" data-link-desc="OPA CLI wrapper for static config policy check、Rego policy &amp;#43; 多 parser（Terraform / K8s / Dockerfile / JSON）、CI-time gate">Conftest&lt;/a> 的差別是：Conftest 是 OPA 的 &lt;em>CLI wrapper for static config&lt;/em>（在 CI 跑 Terraform / Dockerfile / K8s YAML 檢查）、OPA 本體是 &lt;em>runtime evaluation engine&lt;/em>（線上服務查詢決策）。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>OPA 的核心抽象是 &lt;em>decoupled decision + enforcement&lt;/em> — OPA 只負責 &lt;em>decide&lt;/em>（&lt;code>input&lt;/code> 進來、&lt;code>allow&lt;/code> / &lt;code>deny&lt;/code> + decision metadata 出去）、application 負責 &lt;em>enforce&lt;/em>（拿到 decision 後實際 reject request / block deploy / mask data）。這個解耦讓同一份 policy 跨 K8s admission（透過 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &amp;#43; Constraint 兩層、Rego policy &amp;#43; Audit &amp;#43; Mutation">Gatekeeper&lt;/a> 或 kube-mgmt sidecar）、Envoy authz filter、API gateway、Terraform pre-plan、SQL row-level filter、Kafka topic ACL 都能重用。&lt;/p>
&lt;p>OPA 的查詢語言是 &lt;em>Rego&lt;/em>、Datalog-like declarative language、設計上適合表達「給定一組 fact，這個動作合法嗎」。Rego 跟一般 imperative programming（Python / Go / YAML rules）差距大、team 要投入 1-2 週才能寫出 production-grade policy；換回的是 &lt;em>表達力 + 跨情境一致性&lt;/em> — Kyverno 的 YAML policy 易上手、但跨 K8s 邊界後沒辦法用。&lt;/p></description><content:encoded><![CDATA[<p>Open Policy Agent (OPA) 是 CNCF graduated 的 <em>general-purpose policy engine</em>、設計目的是把「誰能做什麼、什麼 config 才合法」從 application code 抽到外部 policy decision layer。它跟 <a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a> / <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> 的差別是：後兩者鎖在 K8s admission controller 領域、OPA 是 <em>跨 enforcement point</em> 的 unified policy framework — 同一份 policy 可以同時管 K8s admission、API authz、Terraform plan、SQL row-level filter。跟 <a href="/blog/backend/07-security-data-protection/vendors/conftest/" data-link-title="Conftest" data-link-desc="OPA CLI wrapper for static config policy check、Rego policy &#43; 多 parser（Terraform / K8s / Dockerfile / JSON）、CI-time gate">Conftest</a> 的差別是：Conftest 是 OPA 的 <em>CLI wrapper for static config</em>（在 CI 跑 Terraform / Dockerfile / K8s YAML 檢查）、OPA 本體是 <em>runtime evaluation engine</em>（線上服務查詢決策）。</p>
<h2 id="服務定位">服務定位</h2>
<p>OPA 的核心抽象是 <em>decoupled decision + enforcement</em> — OPA 只負責 <em>decide</em>（<code>input</code> 進來、<code>allow</code> / <code>deny</code> + decision metadata 出去）、application 負責 <em>enforce</em>（拿到 decision 後實際 reject request / block deploy / mask data）。這個解耦讓同一份 policy 跨 K8s admission（透過 <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> 或 kube-mgmt sidecar）、Envoy authz filter、API gateway、Terraform pre-plan、SQL row-level filter、Kafka topic ACL 都能重用。</p>
<p>OPA 的查詢語言是 <em>Rego</em>、Datalog-like declarative language、設計上適合表達「給定一組 fact，這個動作合法嗎」。Rego 跟一般 imperative programming（Python / Go / YAML rules）差距大、team 要投入 1-2 週才能寫出 production-grade policy；換回的是 <em>表達力 + 跨情境一致性</em> — Kyverno 的 YAML policy 易上手、但跨 K8s 邊界後沒辦法用。</p>
<p>關鍵張力：<em>Rego 學習曲線</em> ↔ <em>unified policy 的長期價值</em>。只跑 K8s 的團隊用 Kyverno YAML 更直覺；只跑 CI policy 的用 Conftest 更輕；要在 K8s + API + Terraform + DB 跨層統一 policy、或要 audit-grade decision log、或預期 policy 會長期累積成資產的、才值得投資 OPA + Rego。</p>
<p>商業模型：核心 OPA 是 Apache 2.0 OSS、免費。Styra DAS（OPA 創辦人公司）是 enterprise SKU、提供 policy library + impact analysis + multi-cluster management + audit dashboard、適合大型團隊。OPAL（Permit.io 維護的 OSS）是 GitOps-style policy distribution layer、補 OSS OPA 缺的 bundle server。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>OPA 在 policy stack 中承擔哪一段（decision engine） vs enforcement point 各自的 ownership</li>
<li>Rego 投資門檻是否值得（K8s-only vs 跨 enforcement point）</li>
<li>Policy bundle / Decision log / Partial evaluation 三個 first-class concept 在 production 的設計形狀</li>
<li>何時用 OPA、何時走 <a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a> / <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> / <a href="/blog/backend/07-security-data-protection/vendors/conftest/" data-link-title="Conftest" data-link-desc="OPA CLI wrapper for static config policy check、Rego policy &#43; 多 parser（Terraform / K8s / Dockerfile / JSON）、CI-time gate">Conftest</a> 的取捨</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 OPA deployment 是否健康、最少看四件事：</p>
<ul>
<li><strong>Policy ownership</strong>：誰能寫 / 改 Rego policy（platform team / security team / SRE）、policy 是否進 Git、change 是否經 PR review + staging tenant 跑 24-48hr 觀察</li>
<li><strong>Bundle distribution</strong>：policy 是否 build 成 bundle（tar.gz）、是否簽章、OPA agent 是否定期 pull、bundle server 在哪（自管 nginx / S3 / OPAL / Styra DAS）</li>
<li><strong>Decision log governance</strong>：每個 decision 是否進 audit log（input + output + policy version + timestamp）、log 是否進 SIEM（<a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a> / Elastic）、retention 多久</li>
<li><strong>Enforcement coverage</strong>：哪些 enforcement point 接 OPA（K8s admission / API / Envoy / Terraform）、policy 是否 share 還是各 point 各寫一份、跨 point 的一致性怎麼驗</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/security-as-risk-routing-system/" data-link-title="7.15 資安作為風險路由系統" data-link-desc="建立資安作為風險路由系統的導讀大綱，串接問題節點、控制面與跨模組交接">Policy as Code Foundations</a> 的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Rego policy 形狀</strong>：Rego 是 Datalog-like declarative language、policy 寫成 <code>allow { ... }</code> rule、所有條件成立才 evaluate 為 true。實務 idiom：底層寫 <em>base policy</em>（如 <code>policies/k8s/required_labels.rego</code>）、上層寫 <em>policy library</em>（共用 helper 如 <code>policies/lib/registry.rego</code>）、application 端傳 <code>input</code>（K8s admission request / API request / Terraform plan JSON）查詢。Rego 鼓勵 <em>small composable rule</em>、不寫長 imperative function。</p>
<p><strong>Policy bundle</strong>：OPA 不從 Git 直接讀 policy、而是讀 <em>bundle</em>（tar.gz、含 <code>.rego</code> + data JSON、optional 簽章）。Bundle 從 <em>bundle server</em> pull（自管 nginx / S3 / OPAL / Styra DAS）、OPA agent 定期 polling（預設 60s）。Bundle 的核心價值是 <em>versioned + signed + atomically swap</em> — policy 更新不會 partial apply、簽章確保中間沒被改、版本 metadata 讓 decision log 可追到當時用哪版 policy。</p>
<p><strong>Decision log</strong>：每個 OPA query 都可開 decision logging、log entry 含 <code>input</code> + <code>result</code> + <code>policy_version</code> + <code>timestamp</code> + <code>decision_id</code>。意義是 <em>audit-grade reconstruction</em> — 事後可以重跑 <code>opa eval --bundle &lt;version&gt; --input &lt;log_input&gt;</code> 驗證當時 decision 是否正確。Decision log 進 SIEM 後可做 <em>over-permission analysis</em>（哪些 user 拿到 allow 但實際從不該被 allow）跟 <em>policy coverage check</em>（哪些 rule 從沒被觸發過、可能是 dead code）。</p>
<p><strong>Integration pattern</strong>：production OPA 主要四種 enforcement integration — <em>K8s admission</em>（走 <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> 是 OPA 官方 K8s integration、或 kube-mgmt 把 OPA 當 sidecar 跑、admission webhook 把 request 送進 OPA decide）；<em>API authz</em>（application 在 request handler 開頭 query OPA、拿 allow/deny 後 enforce）；<em>Envoy / service mesh</em>（Envoy 的 ext_authz filter 接 OPA、L7 authz decision）；<em>Infrastructure as Code</em>（CI 跑 <a href="/blog/backend/07-security-data-protection/vendors/conftest/" data-link-title="Conftest" data-link-desc="OPA CLI wrapper for static config policy check、Rego policy &#43; 多 parser（Terraform / K8s / Dockerfile / JSON）、CI-time gate">Conftest</a> 對 Terraform plan / K8s YAML 做 OPA 評估）。</p>
<p><strong>Partial evaluation</strong>：OPA 進階 feature、把一份 policy 對某個 <em>partial input</em>（如 <code>user=&quot;alice&quot;</code>）pre-evaluate、產出 <em>殘餘 query</em>（如 SQL <code>WHERE tenant_id IN (...)</code> 或 regex），下發給 enforcement point 直接用。意義是 <em>把 policy decision 推到 enforcement point 內部</em>、減少每次 query 都要過 OPA 的 latency；常用於 row-level data filter（policy 寫一次、partial eval 出 SQL WHERE clause、application 直接拼進 query）。</p>
<p><strong>OPAL（GitOps for OPA）</strong>：OSS、Permit.io 維護、解決「policy 從 Git push 到所有 OPA agent」的 distribution 問題。Git → OPAL Server → OPA Agent 的 push model、policy commit 到 main branch 後幾秒內所有 OPA 更新。對應 OSS-only 的 production setup；Styra DAS 提供同等功能 + 管理 UI。</p>
<p><strong>Styra DAS（商業 management）</strong>：Styra 是 OPA 創辦人公司、DAS 是 enterprise SKU。核心價值：<em>policy library</em>（pre-built policy for K8s / Terraform / Kafka）、<em>impact analysis</em>（policy 上 production 前 dry-run 看會 deny 多少現有 resource）、<em>multi-cluster policy distribution</em>、<em>audit dashboard</em>。OSS-only 自己拼 OPAL + decision log + SIEM 也能做、但團隊 &gt; 50 個 cluster / 多 BU 時 DAS 划算。</p>
<p><strong>Constraint Framework</strong>：<a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> 在 OPA 之上加的 K8s-specific 抽象、用 <code>ConstraintTemplate</code>（Rego policy 模板）+ <code>Constraint</code>（K8s CRD instance、實際 enforce）。對純 K8s 場景比直接寫 Rego 更 K8s-native；但這個抽象只在 K8s 領域有意義、不會跨到 API / Terraform。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>OPA</th>
          <th>Kyverno</th>
          <th>Gatekeeper</th>
          <th>Conftest</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>定位</td>
          <td>General-purpose policy engine</td>
          <td>K8s-native admission controller</td>
          <td>OPA 的 K8s admission integration（官方）</td>
          <td>OPA 的 CLI wrapper for static config</td>
      </tr>
      <tr>
          <td>語言</td>
          <td>Rego（Datalog-like declarative）</td>
          <td>YAML（K8s-native）</td>
          <td>Rego（透過 ConstraintTemplate）</td>
          <td>Rego</td>
      </tr>
      <tr>
          <td>Enforcement</td>
          <td>K8s / API / Envoy / Terraform / SQL / Kafka 跨層</td>
          <td>K8s admission only</td>
          <td>K8s admission only</td>
          <td>CI / pre-commit（不在 runtime）</td>
      </tr>
      <tr>
          <td>學習曲線</td>
          <td>陡 — Rego 1-2 週</td>
          <td>緩 — YAML 1-2 天</td>
          <td>中 — ConstraintTemplate 抽象 + Rego</td>
          <td>中 — Rego 1-2 週、但 scope 小</td>
      </tr>
      <tr>
          <td>部署模型</td>
          <td>OPA agent（sidecar / daemon / library embed）</td>
          <td>K8s controller + webhook</td>
          <td>K8s controller + webhook</td>
          <td>CLI（CI / 本地）</td>
      </tr>
      <tr>
          <td>Mutation</td>
          <td>透過 Gatekeeper Mutation 或 application enforce 補上</td>
          <td>原生 mutate webhook（強項）</td>
          <td>Mutation 是 v3.10+ beta、功能不及 Kyverno</td>
          <td>無（static check only）</td>
      </tr>
      <tr>
          <td>Bundle / 分發</td>
          <td>Bundle server + sign + OPA agent pull / OPAL push</td>
          <td>K8s CRD apply（kubectl）</td>
          <td>K8s CRD apply</td>
          <td>Git repo（CI 直接 clone）</td>
      </tr>
      <tr>
          <td>Decision log</td>
          <td>First-class、audit-grade</td>
          <td>K8s event + audit log</td>
          <td>K8s event + audit log</td>
          <td>CI build log</td>
      </tr>
      <tr>
          <td>商業 SKU</td>
          <td>Styra DAS（management + impact analysis）</td>
          <td>Nirmata Kyverno Enterprise</td>
          <td>無（純 OSS）</td>
          <td>無（純 OSS）</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>跨 enforcement point + long-term policy investment</td>
          <td>K8s-only + 快速上手 + YAML-friendly team</td>
          <td>K8s-only + 已用 OPA / Rego、要 OPA 官方整合</td>
          <td>CI pre-deploy check + Terraform / K8s YAML / Dockerfile</td>
      </tr>
      <tr>
          <td>退場成本</td>
          <td>中 — Rego policy 可移到其他 OPA-compatible engine</td>
          <td>高 — YAML policy 僅 Kyverno 認</td>
          <td>中 — Rego 可重用、Constraint 抽象要重寫</td>
          <td>低 — CLI tool、policy 可移到 OPA runtime</td>
      </tr>
  </tbody>
</table>
<p>選 OPA 的核心訴求：<em>跨 enforcement point 的 unified policy</em> + <em>long-term policy 資產化</em> + <em>audit-grade decision log</em> + 團隊願意投資 Rego。純 K8s + 想快速上手用 <a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a>；K8s + 已決定走 OPA 生態用 <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a>；只跑 CI 不跑 runtime 用 <a href="/blog/backend/07-security-data-protection/vendors/conftest/" data-link-title="Conftest" data-link-desc="OPA CLI wrapper for static config policy check、Rego policy &#43; 多 parser（Terraform / K8s / Dockerfile / JSON）、CI-time gate">Conftest</a>。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Rego idioms（policy library + base policy）</strong>：production Rego 走分層結構 — <code>lib/</code>（utility function、registry whitelist、CIDR check）、<code>base/</code>（concrete policy、引用 lib）、<code>tests/</code>（用 <code>opa test</code> 跑 unit test）。Policy 也是 code、走 PR review + CI test + staging tenant、不是 console 直改。</p>
<p><strong>Partial evaluation for SQL row-level filter</strong>：把 policy 寫成「user 能看哪些 row」、用 <code>opa eval --partial</code> 把 <code>user=&quot;alice&quot;</code> 部分 pre-evaluate、output 殘餘 query 變 SQL <code>WHERE tenant_id IN ('a', 'b', 'c')</code>、application 拼進 query。意義是 <em>policy 不在 query path latency 上</em>、policy 規則仍是 SSoT。對應 RLS（row-level security）的工程化作法。</p>
<p><strong>跟 <a href="/blog/backend/07-security-data-protection/vendors/spire/" data-link-title="SPIRE" data-link-desc="SPIFFE Runtime Environment、attested workload identity、short-lived SVID &#43; Trust Bundle、跨組織 federation">SPIRE</a> workload identity 整合 authz</strong>：service-to-service authz 場景、SPIRE 簽 SVID（SPIFFE ID + mTLS cert）證明 caller 身份、OPA 拿到 SPIFFE ID 後 decide「這個 service 能呼叫這個 API 嗎」。SPIRE 解 <em>who</em>、OPA 解 <em>can they do this</em>、職責清楚分離。</p>
<p><strong>跟 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> 整合 dynamic credential policy</strong>：Vault 簽 dynamic credential（DB password / cloud STS token）的 issue 決定可以走 OPA — Vault 收到 issue request、轉 OPA decide「這個 caller 在這個 context 能不能拿這個 scope 的 token」。對應 <a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a> 的 lesson：scope 判斷不分散在應用層、集中到 policy engine。</p>
<p><strong>Decision log 進 SIEM</strong>：OPA decision log 設成 push 到 <a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a> HEC / Elastic / Datadog、進 SIEM 後可做三件事 — over-permission analysis（哪些 allow 從沒被合法理由觸發）、dead policy detection（哪些 rule 從沒被 evaluate）、anomalous decision pattern（某 service 突然大量 allow 不在 baseline）。</p>
<p><strong>跟 K8s admission 的兩條路</strong>：純 K8s admission 場景、走 <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a>（OPA 官方 K8s integration、有 Constraint Framework 抽象、社群活躍）比直接跑 OPA + kube-mgmt sidecar 更 production-ready。kube-mgmt 路線適合 already-running OPA 想加 K8s admission 而不引入 Gatekeeper 抽象。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>Rego policy review 卡 SRE</strong>：policy 都得 SRE 寫、security team 看不懂 — 拆 <code>lib/</code> 給 SRE 維護、<code>base/</code> 給 security review、用 <code>opa test</code> unit test 保持迭代速度</li>
<li><strong>Bundle distribution 慢 / policy 不一致</strong>：自管 nginx bundle server 沒高可用、agent pull 失敗 fallback 用舊版 — 換 OPAL push model 或 S3 + CloudFront、bundle pull 失敗時 OPA <code>--set status.console=true</code> 直接 alert</li>
<li><strong>Decision log 沒進 SIEM</strong>：OPA 開了 decision log 但只進本地 file、沒人看 — 設 decision log plugin push 到 <a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a> HEC / Kafka、不是寫本地 disk</li>
<li><strong>Policy 改完 production 大量 deny</strong>：新 policy 沒在 staging dry-run、上 production 後合法 traffic 被擋 — Styra DAS 的 impact analysis 或自己跑 <code>opa eval --partial</code> 對歷史 decision log replay、看 deny 數量再 promote</li>
<li><strong>OPA latency 高 / API 卡</strong>：每個 request 都 round-trip OPA、policy 複雜 evaluation 慢 — embed OPA as library（Go SDK / WASM）跑 in-process、或用 partial evaluation 把 policy compile 進 SQL / regex</li>
<li><strong>Rego policy bug 線上才發現</strong>：沒 unit test、staging 沒 cover edge case — 強制 PR 要含 <code>opa test</code> case、staging 跑 shadow mode（log only 不 enforce）24hr 再切 enforce</li>
<li><strong>跨 cluster policy drift</strong>：多 cluster 各自 apply、版本不同步 — OPAL 或 Styra DAS multi-cluster sync、不靠 kubectl apply 人工同步</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>K8s admission only + YAML-friendly</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a></td>
      </tr>
      <tr>
          <td>K8s admission + 已選 OPA 生態</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a></td>
      </tr>
      <tr>
          <td>CI pre-deploy check（Terraform / K8s YAML / Dockerfile）</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/conftest/" data-link-title="Conftest" data-link-desc="OPA CLI wrapper for static config policy check、Rego policy &#43; 多 parser（Terraform / K8s / Dockerfile / JSON）、CI-time gate">Conftest</a></td>
      </tr>
      <tr>
          <td>Runtime container behavior（不是 admission）</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/" data-link-title="資安與資料保護 Vendor 清單" data-link-desc="規劃身份、秘密、金鑰、入口防護、供應鏈與偵測工具的服務頁撰寫順序與教學大綱">Falco</a></td>
      </tr>
      <tr>
          <td>Image scan + vulnerability policy</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a>（scan）+ OPA（gate）</td>
      </tr>
      <tr>
          <td>Workload identity / mTLS</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/spire/" data-link-title="SPIRE" data-link-desc="SPIFFE Runtime Environment、attested workload identity、short-lived SVID &#43; Trust Bundle、跨組織 federation">SPIRE</a> + OPA（identity → authz 分工）</td>
      </tr>
      <tr>
          <td>Cloud IAM policy（AWS / GCP / Azure 本體）</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/aws-iam/" data-link-title="AWS IAM" data-link-desc="AWS cloud resource permission engine、Role / Policy / STS、跨帳號信任邊界與 OIDC federation 的核心">AWS IAM</a> / <a href="/blog/backend/07-security-data-protection/vendors/google-cloud-iam/" data-link-title="Google Cloud IAM" data-link-desc="GCP cloud resource permission engine、Role Binding / Service Account / Workload Identity Federation、resource hierarchy 為核心的權限治理">Google Cloud IAM</a></td>
      </tr>
      <tr>
          <td>Decision log → SIEM</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a> / <a href="/blog/backend/07-security-data-protection/vendors/elastic-security/" data-link-title="Elastic Security" data-link-desc="Elastic Stack 上的 SIEM &#43; EDR &#43; Cloud Security 套件、OSS 起源、KQL/EQL/Lucene/ES|QL 多查詢語言、resource-based pricing">Elastic Security</a></td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>Rego 完整語法 reference（rule / function / built-in / <code>with</code> / <code>some</code>）</li>
<li>Gatekeeper Constraint Framework 的 ConstraintTemplate / Constraint CRD 設計細節（屬 Gatekeeper 頁）</li>
<li>Conftest CLI 用法跟 <code>conftest test</code> / <code>conftest verify</code> 流程（屬 Conftest 頁）</li>
<li>Kyverno YAML policy 語法跟 mutate / generate / verifyImages（屬 Kyverno 頁）</li>
<li>Styra DAS 商業 license / SKU 對照、Nirmata Enterprise 對照</li>
<li>WASM-compiled Rego policy 的 edge deployment 細節</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 OPA 的關係（對照啟示）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/solarwinds-2020-sunburst/" data-link-title="7.R7.2.1 SolarWinds 2020：更新鏈被濫用" data-link-desc="合法更新流程遭植入後，攻擊者如何長期潛伏與橫向擴散">SolarWinds 2020 Sunburst</a></td>
          <td>OPA admission policy 在 K8s 擋住未簽章 image deploy、配合 cosign signature verify 補 supply chain 信任鏈、policy 集中不分散到各 deployment</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/log4shell-cve-2021-44228-component-chain/" data-link-title="7.R7.2.7 Log4Shell 2021：共用元件風險與修補鏈" data-link-desc="共用元件漏洞如何同步影響多服務，並迫使團隊建立依賴治理 workflow">Log4Shell CVE-2021-44228</a></td>
          <td>OPA admission 配合 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> scan result 擋住已知 vulnerable image deploy、policy 走「critical CVE = deny」</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a></td>
          <td>OPA 控制 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> dynamic credential issuance policy、scope 判斷集中不分散到應用層各自 if-else</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性 (section)</a></td>
          <td>OPA 是 admission gate 的核心工具、跟 SLSA provenance / cosign signature 組合做 policy enforcement、不是看一兩個欄位放行</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/security-as-risk-routing-system/" data-link-title="7.15 資安作為風險路由系統" data-link-desc="建立資安作為風險路由系統的導讀大綱，串接問題節點、控制面與跨模組交接">Policy as Code Foundations (section)</a></td>
          <td>OPA 對應 policy-as-code 的 <em>decoupled decision + enforcement</em>、跨 enforcement point 共用 policy 是設計核心、不是「再寫一份 K8s policy」</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/security-as-risk-routing-system/" data-link-title="7.15 資安作為風險路由系統" data-link-desc="建立資安作為風險路由系統的導讀大綱，串接問題節點、控制面與跨模組交接">7 章 policy-as-code foundations</a>、<a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性</a></li>
<li>平行（Policy-as-Code 批次）：<a href="/blog/backend/07-security-data-protection/vendors/conftest/" data-link-title="Conftest" data-link-desc="OPA CLI wrapper for static config policy check、Rego policy &#43; 多 parser（Terraform / K8s / Dockerfile / JSON）、CI-time gate">Conftest</a>（CI static check）、<a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a>（K8s YAML-native）、<a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a>（OPA K8s integration）</li>
<li>跨類：<a href="/blog/backend/07-security-data-protection/vendors/spire/" data-link-title="SPIRE" data-link-desc="SPIFFE Runtime Environment、attested workload identity、short-lived SVID &#43; Trust Bundle、跨組織 federation">SPIRE</a>（workload identity → OPA authz）、<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a>（dynamic credential policy）、<a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a>（scan → OPA gate）、<a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a>（decision log → SIEM）</li>
<li>跨模組：<a href="/blog/backend/06-reliability/" data-link-title="模組六：可靠性驗證流程" data-link-desc="用 SRE 領域詞彙建問題節點、以服務級案例庫累積驗證脈絡，先建概念與案例庫再進實作交接">6 reliability</a>（CI pre-deploy gate 接 Conftest）、<a href="/blog/backend/08-incident-response/" data-link-title="模組八：事故處理與復盤" data-link-desc="用 IR 領域詞彙建問題節點、以服務級案例庫累積事故脈絡，先建概念與案例庫再進實作交接">8 incident response</a>（policy violation alert → IR routing）</li>
<li>官方：<a href="https://www.openpolicyagent.org/">Open Policy Agent</a>、<a href="https://www.openpolicyagent.org/docs/latest/policy-language/">Rego Policy Language</a>、<a href="https://www.styra.com/">Styra DAS</a>、<a href="https://github.com/permitio/opal">OPAL</a></li>
</ul>
]]></content:encoded></item><item><title>Conftest</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/conftest/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/conftest/</guid><description>&lt;p>Conftest 是 &lt;em>OPA CLI wrapper for static config policy check&lt;/em>、Open Policy Agent project 旗下的 CLI 工具、Apache 2.0 OSS、無商業版。它的核心定位是 &lt;em>CI-time policy gate&lt;/em>、有別於 admission runtime：在 git commit / PR / merge 階段、用 Rego policy 對 config file（Terraform HCL / K8s YAML / Dockerfile / JSON / TOML / INI / serverless.yml）做 static check、把 misconfiguration 攔在 deploy 之前。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/opa/" data-link-title="Open Policy Agent (OPA)" data-link-desc="CNCF general-purpose policy engine、Rego Datalog-like 語言、decoupled decision &amp;#43; enforcement、跨 K8s / API / Terraform / SQL 統一 policy">OPA&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &amp;#43; Constraint 兩層、Rego policy &amp;#43; Audit &amp;#43; Mutation">Gatekeeper&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &amp;#43; Secret &amp;#43; License &amp;#43; SBOM、Apache 2.0、CI 友善">Trivy&lt;/a> Config 的差異在 &lt;em>執行時機 + 客製化方式&lt;/em>、規則表達力反而相近。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Conftest 是 OPA 生態中 &lt;em>最輕量的 CI-time tool&lt;/em> — 拿一份 Rego policy + 一份 config file、跑 &lt;code>conftest test&lt;/code> 就出 violation report。它不需要 cluster、不需要 daemon、不接 admission webhook、只是個 binary。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/opa/" data-link-title="Open Policy Agent (OPA)" data-link-desc="CNCF general-purpose policy engine、Rego Datalog-like 語言、decoupled decision &amp;#43; enforcement、跨 K8s / API / Terraform / SQL 統一 policy">OPA&lt;/a> 比、OPA 是 &lt;em>runtime decision engine&lt;/em>（HTTP server / library / sidecar 提供 policy decision）、Conftest 只是 &lt;em>CLI 跑 once、結束即關&lt;/em>。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &amp;#43; Constraint 兩層、Rego policy &amp;#43; Audit &amp;#43; Mutation">Gatekeeper&lt;/a> 比、Gatekeeper 是 &lt;em>K8s admission controller runtime&lt;/em>、會在 kubectl apply 時攔下違規；Conftest 是在 PR 階段就攔下、deploy 前就 fail CI。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno&lt;/a> 比、Kyverno 是 K8s-only 的 admission policy（YAML 語法）、Conftest 跨多 config format（不只 K8s）且用 Rego。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &amp;#43; Secret &amp;#43; License &amp;#43; SBOM、Apache 2.0、CI 友善">Trivy&lt;/a> Config 比、Trivy Config 是 &lt;em>built-in misconfig rule&lt;/em>（開箱即用、預定義常見 anti-pattern）、Conftest 是 &lt;em>自己寫 Rego policy&lt;/em>（客製化彈性大但要寫 rule）。&lt;/p></description><content:encoded><![CDATA[<p>Conftest 是 <em>OPA CLI wrapper for static config policy check</em>、Open Policy Agent project 旗下的 CLI 工具、Apache 2.0 OSS、無商業版。它的核心定位是 <em>CI-time policy gate</em>、有別於 admission runtime：在 git commit / PR / merge 階段、用 Rego policy 對 config file（Terraform HCL / K8s YAML / Dockerfile / JSON / TOML / INI / serverless.yml）做 static check、把 misconfiguration 攔在 deploy 之前。跟 <a href="/blog/backend/07-security-data-protection/vendors/opa/" data-link-title="Open Policy Agent (OPA)" data-link-desc="CNCF general-purpose policy engine、Rego Datalog-like 語言、decoupled decision &#43; enforcement、跨 K8s / API / Terraform / SQL 統一 policy">OPA</a> / <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> / <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> Config 的差異在 <em>執行時機 + 客製化方式</em>、規則表達力反而相近。</p>
<h2 id="服務定位">服務定位</h2>
<p>Conftest 是 OPA 生態中 <em>最輕量的 CI-time tool</em> — 拿一份 Rego policy + 一份 config file、跑 <code>conftest test</code> 就出 violation report。它不需要 cluster、不需要 daemon、不接 admission webhook、只是個 binary。跟 <a href="/blog/backend/07-security-data-protection/vendors/opa/" data-link-title="Open Policy Agent (OPA)" data-link-desc="CNCF general-purpose policy engine、Rego Datalog-like 語言、decoupled decision &#43; enforcement、跨 K8s / API / Terraform / SQL 統一 policy">OPA</a> 比、OPA 是 <em>runtime decision engine</em>（HTTP server / library / sidecar 提供 policy decision）、Conftest 只是 <em>CLI 跑 once、結束即關</em>。跟 <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> 比、Gatekeeper 是 <em>K8s admission controller runtime</em>、會在 kubectl apply 時攔下違規；Conftest 是在 PR 階段就攔下、deploy 前就 fail CI。跟 <a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a> 比、Kyverno 是 K8s-only 的 admission policy（YAML 語法）、Conftest 跨多 config format（不只 K8s）且用 Rego。跟 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> Config 比、Trivy Config 是 <em>built-in misconfig rule</em>（開箱即用、預定義常見 anti-pattern）、Conftest 是 <em>自己寫 Rego policy</em>（客製化彈性大但要寫 rule）。</p>
<p>關鍵張力：<em>CI-time static check</em> ↔ <em>runtime admission enforcement</em> 是兩種互補機制、不是替代。CI 抓在 deploy 之前、但 manifest 不一定都走 PR（kubectl apply 直接打 cluster 就漏接）；admission 抓 runtime 寫入、但 deploy 後才 fail 已經慢。production 通常 CI（Conftest / Trivy Config）+ admission（Gatekeeper / Kyverno）雙層覆蓋。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Conftest 在 policy-as-code stack 中承擔哪一段（CI gate）、跟 admission runtime 怎麼分工</li>
<li>Rego policy directory / <code>conftest test</code> / <code>conftest verify</code> / Bundle / Combine flag 的 ownership 跟工程化做法</li>
<li>Conftest vs Trivy Config vs Checkov vs OPA + custom CI wrapper 的取捨</li>
<li>何時用 Conftest、何時走 Trivy Config（不想學 Rego）或 Gatekeeper（runtime enforcement）</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Conftest 導入是否健康、最少看四件事：</p>
<ul>
<li><strong>Policy directory 走版控</strong>：Rego files（<code>policy/*.rego</code>）跟 application code 同 repo、或抽到中央 policy repo + Bundle 拉取、PR review 才能改 policy</li>
<li><strong><code>conftest verify</code> 是否跑</strong>：Rego policy 本身有單元測試（<code>*_test.rego</code>）、policy 改動有 test coverage、不是寫完就上 production CI</li>
<li><strong>CI integration 點</strong>：跑在 PR check / merge gate、fail 阻斷 merge、不是只跑 warning 沒人看</li>
<li><strong>跟 admission 是否雙層</strong>：CI fail 之外、cluster 也裝 <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> / <a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a> 接 runtime；否則 kubectl apply 繞過 CI 就破口</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">Supply Chain Integrity</a> 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Policy directory（Rego files）</strong>：Conftest 預設讀 <code>./policy/</code> 目錄下所有 <code>*.rego</code> 檔。Policy 用 <code>deny[msg]</code> / <code>warn[msg]</code> / <code>violation[msg]</code> rule 表達 — <code>deny</code> 失敗整個 test、<code>warn</code> 只 print 不 fail、<code>violation</code> 給結構化輸出（含 metadata 給後續 SOAR 處理）。慣例是一個 policy 檔對一個 anti-pattern（<code>policy/k8s_privileged.rego</code> / <code>policy/terraform_public_s3.rego</code>）、不混寫。</p>
<p><strong><code>conftest test</code> command</strong>：<code>conftest test deployment.yaml</code> / <code>conftest test --policy ./custom-policy terraform.plan.json</code> 是日常入口。支援 <code>--all-namespaces</code>（K8s 多 manifest）、<code>--input</code>（強制 parser 類型）、<code>--combine</code>（跨檔 check）、<code>--output json|tap|table</code>（CI 報表格式）。CI integration 通常 <code>conftest test infra/**/*.yaml --output github</code> 直接 emit GitHub Actions annotation。</p>
<p><strong>Parser（多 format 支援）</strong>：Conftest 原生支援 HCL（Terraform）/ YAML / JSON / TOML / INI / Dockerfile / CUE / Jsonnet / EDN / XML / VCL（Fastly）/ Cyclonedx SBOM 等。同一份 Rego 可跑多 format — parser 把不同 format normalize 成 Rego input JSON、policy 寫 <code>input.spec.containers[_].securityContext.privileged == true</code> 不管原本是 YAML 還是 JSON。這是 Conftest 比 Checkov / Trivy Config 客製化彈性更大的關鍵：同一個 policy 引擎處理跨 format misconfig。</p>
<p><strong>Combine flag（跨檔 check）</strong>：<code>conftest test --combine *.yaml</code> 把多檔合併成單一 input array、policy 可跨檔 reference。實務場景：K8s deployment 必須有對應 service + configmap + networkpolicy、缺一就 fail；Terraform module 跨檔 reference（VPC + subnet + security group）必須一致。沒有 Combine 就只能單檔檢查、跨檔 invariant 抓不到。</p>
<p><strong><code>conftest verify</code>（policy unit test）</strong>：Policy 本身要有測試 — <code>policy/k8s_privileged_test.rego</code> 寫 <code>test_privileged_denied</code> / <code>test_non_privileged_allowed</code>、<code>conftest verify</code> 跑這些測試。Policy 改動先跑 verify、再 merge policy 到 production CI。沒做 verify 的 policy 是「policy 自己 broken 沒人發現」的常見破口。</p>
<p><strong>Bundle（OPA bundle 拉 policy）</strong>：<code>conftest pull</code> 從 OCI registry / HTTP / git / S3 拉 policy bundle、policy 集中在 central repo、各 service repo 不重複維護。Bundle 包含 Rego files + data files + manifest、可簽章驗證（配 <a href="https://docs.sigstore.dev/">Sigstore cosign</a>）。大組織通常 platform team 維護 policy bundle、application team 在 CI 拉最新版本跑。</p>
<p><strong>CI integration</strong>：GitHub Actions（<code>open-policy-agent/conftest-action</code>）/ GitLab CI / Jenkins / CircleCI 都有現成 step。跑點通常在 PR check 階段（review 前 fail fast）+ merge gate（防止繞過）。失敗訊息含 file / line / policy name、SOC / SRE 看 annotation 就知道哪行違規。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Conftest</th>
          <th>Trivy Config</th>
          <th>Checkov</th>
          <th>OPA + custom CI wrapper</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>規則來源</td>
          <td>自己寫 Rego（彈性大、要學 Rego）</td>
          <td>內建 misconfig rule（開箱即用）</td>
          <td>內建 + 自訂 Python rule</td>
          <td>自己寫 Rego + 自己包 CI</td>
      </tr>
      <tr>
          <td>學習曲線</td>
          <td>中 — Rego 語法 + Conftest CLI</td>
          <td>緩 — <code>trivy config</code> 一個指令</td>
          <td>緩 — 內建 rule、自訂 Python 稍重</td>
          <td>陡 — Rego + 自己組 CI 跑點</td>
      </tr>
      <tr>
          <td>Format 支援</td>
          <td>廣 — Terraform / K8s / Dockerfile 等</td>
          <td>中 — Terraform / K8s / CloudFormation</td>
          <td>中 — Terraform / K8s / Serverless</td>
          <td>看自己包</td>
      </tr>
      <tr>
          <td>客製彈性</td>
          <td>高 — 任意 Rego policy</td>
          <td>低 — 內建 rule、客製要寫 plugin</td>
          <td>中 — Python custom rule</td>
          <td>高</td>
      </tr>
      <tr>
          <td>跨檔 check</td>
          <td>強 — <code>--combine</code> flag</td>
          <td>弱 — 主要單檔</td>
          <td>中</td>
          <td>看自己寫</td>
      </tr>
      <tr>
          <td>Policy 共享</td>
          <td>OPA Bundle（OCI / git / HTTP）</td>
          <td>Trivy DB（中央更新）</td>
          <td>Checkov rule pack</td>
          <td>自己管</td>
      </tr>
      <tr>
          <td>計費</td>
          <td>OSS Apache 2.0</td>
          <td>OSS（Aqua 商業版有加值）</td>
          <td>OSS（Bridgecrew 商業版）</td>
          <td>OSS（OPA）</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>客製化 policy、Rego 已用、跨 format</td>
          <td>開箱即用、團隊不想學 Rego</td>
          <td>Terraform-heavy、Python team 熟</td>
          <td>OPA 已是 runtime、CI 想複用 policy</td>
      </tr>
  </tbody>
</table>
<p>選 Conftest 的核心訴求：<em>組織有 custom policy 需求</em> + <em>已用 OPA / Rego（admission 走 Gatekeeper、CI 走 Conftest 統一語言）</em> + <em>跨多 config format 需要同一個 policy 引擎</em>。如果只是要 K8s privileged container / Terraform public S3 這類常見 anti-pattern 攔截、直接 Trivy Config 開箱即用更划算。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong><code>conftest verify</code>（policy unit test lifecycle）</strong>：Policy 是 code、code 要有測試。<code>policy/k8s_privileged_test.rego</code> 寫 <code>test_privileged_denied { count(deny) &gt; 0 with input as {...} }</code>、CI 跑 <code>conftest verify ./policy</code> 把 policy test 當 unit test。Policy change 走 PR → verify pass → 部署到 central bundle → application CI 拉新版本。沒 verify 的 policy 是「沒人知道 policy 自己壞掉、所有 application CI 都 silently pass」的 systemic 風險。</p>
<p><strong>Bundle 從 OCI registry pull + 簽章驗證</strong>：<code>conftest pull oci://registry.example.com/policy-bundle:v1.2.3</code> 從 OCI registry 拉 policy bundle、policy distribution 走 container image 同一套 supply chain。配 <a href="https://docs.sigstore.dev/">Sigstore cosign</a> 簽章驗證、policy bundle 也走 <a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性</a> 的 release gate 邏輯 — policy 本身就是 artifact、需要 signing + verification。</p>
<p><strong>跟 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> Config 混用</strong>：實務上 <em>Trivy Config 跑預設 rule</em>（CIS / NSA / OWASP baseline、開箱即用）+ <em>Conftest 跑客製 rule</em>（organization-specific：必須有特定 label、必須走特定 namespace、必須引用特定 ConfigMap）。兩者 CI 階段都跑、報表合併。不是二選一、是 baseline + custom 的分工。</p>
<p><strong>跟 admission 雙層</strong>：CI 階段 Conftest fail 之外、cluster 也裝 <a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> 接 admission。Gatekeeper 用 ConstraintTemplate（也是 Rego）、同一份 Rego policy 理論上 CI / runtime 共用 — 但實務上 admission 場景跟 static check 場景的 input shape 不同（admission 拿 AdmissionReview object、static 拿 raw manifest）、policy 通常分兩份維護或寫 abstraction layer 共用。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>Policy pass 但 production 還是 misconfig</strong>：CI 沒卡在 merge gate、或有 <code>kubectl apply</code> 繞過 PR — 加 admission controller（<a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> / <a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a>）做 runtime 雙層</li>
<li><strong>Rego policy 自己 broken / silently pass</strong>：沒寫 <code>*_test.rego</code> + <code>conftest verify</code> — 補 policy unit test、CI 跑 verify 才 promote</li>
<li><strong><code>conftest test</code> 跑出 0 violations 但 manifest 有問題</strong>：policy directory 沒讀對、或 parser 自動偵測選錯 — 顯式 <code>--policy ./policy --input yaml</code></li>
<li><strong>跨檔 invariant 抓不到</strong>（deployment 沒對應 service）：忘記用 <code>--combine</code> flag — 改 <code>conftest test --combine *.yaml</code></li>
<li><strong>Bundle 拉到舊版本 / policy drift</strong>：沒固定 bundle tag、用 <code>latest</code> 漂移 — bundle reference 用 digest（<code>sha256:...</code>）或 immutable tag</li>
<li><strong>False positive 多 / team 開始 ignore CI</strong>：policy 寫得太寬、沒考慮合理例外 — Rego 加 exception list（<code>data.exceptions</code>）、走 <a href="/blog/backend/07-security-data-protection/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">Exception Workflow</a> lifecycle</li>
<li><strong>Policy 散落各 application repo / 維護不一致</strong>：沒走 central bundle — 抽 policy 到中央 repo、各 application 拉 bundle</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>開箱即用、不想學 Rego</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy Config</a></td>
      </tr>
      <tr>
          <td>K8s admission runtime</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a> / <a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a></td>
      </tr>
      <tr>
          <td>Runtime application policy</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/opa/" data-link-title="Open Policy Agent (OPA)" data-link-desc="CNCF general-purpose policy engine、Rego Datalog-like 語言、decoupled decision &#43; enforcement、跨 K8s / API / Terraform / SQL 統一 policy">OPA</a></td>
      </tr>
      <tr>
          <td>Terraform-heavy + Python team</td>
          <td>Checkov / tfsec</td>
      </tr>
      <tr>
          <td>Cloud-native CNAPP</td>
          <td>Wiz / Prisma Cloud</td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>Rego 完整語法 reference、<code>every</code> / <code>walk</code> / built-in function 進階用法</li>
<li>OPA Bundle 的 server-side 實作（policy publish pipeline）</li>
<li>Conftest 跟 Open Policy Agent runtime 的內部架構差異</li>
<li>Sigstore cosign 的 keyless signing flow 細節</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Conftest 在 07 案例庫沒有直接 vendor-level 事件、但所有 supply chain case 都是 CI-time policy gate 的對照：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Conftest 的關係（對照啟示）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/solarwinds-2020-sunburst/" data-link-title="7.R7.2.1 SolarWinds 2020：更新鏈被濫用" data-link-desc="合法更新流程遭植入後，攻擊者如何長期潛伏與橫向擴散">SolarWinds 2020 Sunburst</a></td>
          <td>Conftest 在 CI 階段檢查 Terraform / K8s manifest 是否符合 image signing policy（image 必須來自 signed registry、必須有 cosign attestation）</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/log4shell-cve-2021-44228-component-chain/" data-link-title="7.R7.2.7 Log4Shell 2021：共用元件風險與修補鏈" data-link-desc="共用元件漏洞如何同步影響多服務，並迫使團隊建立依賴治理 workflow">Log4Shell CVE-2021-44228</a></td>
          <td>Conftest 配 SBOM 檔案做 CI-time vulnerable component check、補 admission 之前的 gate（image 含 log4j-core &lt;2.17 直接 PR fail）</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性 (section)</a></td>
          <td>Conftest 是 release gate 在 CI 階段的 policy enforcement 工具、跟 admission 雙層覆蓋、policy bundle 本身也走 cosign 簽章 supply chain</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性與 artifact 信任</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/opa/" data-link-title="Open Policy Agent (OPA)" data-link-desc="CNCF general-purpose policy engine、Rego Datalog-like 語言、decoupled decision &#43; enforcement、跨 K8s / API / Terraform / SQL 統一 policy">OPA</a>、<a href="/blog/backend/07-security-data-protection/vendors/gatekeeper/" data-link-title="OPA Gatekeeper" data-link-desc="OPA 官方 K8s admission controller、ConstraintTemplate &#43; Constraint 兩層、Rego policy &#43; Audit &#43; Mutation">Gatekeeper</a>、<a href="/blog/backend/07-security-data-protection/vendors/kyverno/" data-link-title="Kyverno" data-link-desc="K8s-native policy engine、YAML policy（非 Rego）、五類 rule（Validate / Mutate / Generate / Verify Images / Cleanup）、CNCF Incubating">Kyverno</a>、<a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a></li>
<li>跨類：<a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GitHub Advanced Security</a>（CI security check pipeline 共用）</li>
<li>官方：<a href="https://www.conftest.dev/">Conftest Documentation</a></li>
</ul>
]]></content:encoded></item><item><title>Falco</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/falco/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/falco/</guid><description>&lt;p>Falco 是 CNCF Graduated 的 runtime cloud-native threat detection engine、原 Sysdig 開源、Apache 2.0 license。它在 host / container 上用 eBPF（或 kernel module / userspace fallback）攔截 syscall、跟 Plugin 拉到的 audit log 串成同一條 event stream、丟給 Rule engine 比對 YAML rule、命中後 alert 到 stdout / Falcosidekick / SIEM。它跟商業 CNAPP runtime 模組（&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/datadog-security/" data-link-title="Datadog Security" data-link-desc="Datadog observability platform 上的 security suite：Cloud SIEM &amp;#43; CSPM &amp;#43; CWS &amp;#43; AAP &amp;#43; Sensitive Data Scanner、跟 observability 同 plane">Datadog CWS&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/lacework/" data-link-title="Lacework" data-link-desc="CNAPP 走 Polygraph ML behavioral baseline 路線、2024 跟 Fortinet 合併成 FortiCNAPP、自動學 normal、anomaly 自動 alert">Lacework Polygraph&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/prisma-cloud/" data-link-title="Prisma Cloud" data-link-desc="Palo Alto CNAPP、agent (Defender) &amp;#43; agentless 雙軌、五模組（Compute / CSPM / Code / Data / CIEM）、Compliance template 強">Prisma Cloud Defender&lt;/a>）的差異在 &lt;em>OSS rule-based vs SaaS ML-based + 平台廣度 + 自動 response 的工程責任歸屬&lt;/em>、偵測技術本身相近。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Falco 的核心定位是 &lt;em>K8s container runtime detection engine 的 OSS 基準&lt;/em>、不是 full CNAPP、也不是 inline enforcement。底層 Driver 分三層：&lt;em>modern eBPF&lt;/em>（Linux 5.8+、預設）、&lt;em>legacy kernel module (kmod)&lt;/em>（舊 kernel fallback）、&lt;em>pdig userspace probe&lt;/em>（沒 root 或非 Linux）；Driver 抓 syscall 跟 K8s audit / cloud audit event、送進 Falco engine；engine 用 Sysdig filter syntax 比對 YAML rule、命中後吐 alert。Plugin 系統讓 Falco 看到非 syscall event（K8s audit log、Okta event、GitHub audit、AWS CloudTrail）— 變成 &lt;em>general detection engine&lt;/em>、不只 host runtime。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cilium-tetragon/" data-link-title="Cilium Tetragon" data-link-desc="eBPF-based runtime security &amp;#43; inline enforcement、跟 Cilium CNI 同生態、TracingPolicy CRD、process credentials tracking &amp;#43; KillerAction">Cilium Tetragon&lt;/a> 比、Falco 走 &lt;em>rule engine + alert-only&lt;/em>、Tetragon 走 &lt;em>eBPF + 可 enforce kill action&lt;/em>；Falco 偵測為主、Tetragon 偵測 + 防護。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/datadog-security/" data-link-title="Datadog Security" data-link-desc="Datadog observability platform 上的 security suite：Cloud SIEM &amp;#43; CSPM &amp;#43; CWS &amp;#43; AAP &amp;#43; Sensitive Data Scanner、跟 observability 同 plane">Datadog Security&lt;/a>（CWS）比、Datadog 是 SaaS observability 上加 runtime security view、ML-based behavioral baseline 內建、但 vendor lock + per-host 計費；Falco 是 OSS 自管、rule 完全可寫、但 ML baseline / threat intel / cross-source correlation 要自己接 SIEM。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/lacework/" data-link-title="Lacework" data-link-desc="CNAPP 走 Polygraph ML behavioral baseline 路線、2024 跟 Fortinet 合併成 FortiCNAPP、自動學 normal、anomaly 自動 alert">Lacework&lt;/a> Polygraph 比、Lacework 走 behavior graph 自動建 baseline、Falco 走 rule-explicit、邊界看得到也好 audit。&lt;/p></description><content:encoded><![CDATA[<p>Falco 是 CNCF Graduated 的 runtime cloud-native threat detection engine、原 Sysdig 開源、Apache 2.0 license。它在 host / container 上用 eBPF（或 kernel module / userspace fallback）攔截 syscall、跟 Plugin 拉到的 audit log 串成同一條 event stream、丟給 Rule engine 比對 YAML rule、命中後 alert 到 stdout / Falcosidekick / SIEM。它跟商業 CNAPP runtime 模組（<a href="/blog/backend/07-security-data-protection/vendors/datadog-security/" data-link-title="Datadog Security" data-link-desc="Datadog observability platform 上的 security suite：Cloud SIEM &#43; CSPM &#43; CWS &#43; AAP &#43; Sensitive Data Scanner、跟 observability 同 plane">Datadog CWS</a> / <a href="/blog/backend/07-security-data-protection/vendors/lacework/" data-link-title="Lacework" data-link-desc="CNAPP 走 Polygraph ML behavioral baseline 路線、2024 跟 Fortinet 合併成 FortiCNAPP、自動學 normal、anomaly 自動 alert">Lacework Polygraph</a> / <a href="/blog/backend/07-security-data-protection/vendors/prisma-cloud/" data-link-title="Prisma Cloud" data-link-desc="Palo Alto CNAPP、agent (Defender) &#43; agentless 雙軌、五模組（Compute / CSPM / Code / Data / CIEM）、Compliance template 強">Prisma Cloud Defender</a>）的差異在 <em>OSS rule-based vs SaaS ML-based + 平台廣度 + 自動 response 的工程責任歸屬</em>、偵測技術本身相近。</p>
<h2 id="服務定位">服務定位</h2>
<p>Falco 的核心定位是 <em>K8s container runtime detection engine 的 OSS 基準</em>、不是 full CNAPP、也不是 inline enforcement。底層 Driver 分三層：<em>modern eBPF</em>（Linux 5.8+、預設）、<em>legacy kernel module (kmod)</em>（舊 kernel fallback）、<em>pdig userspace probe</em>（沒 root 或非 Linux）；Driver 抓 syscall 跟 K8s audit / cloud audit event、送進 Falco engine；engine 用 Sysdig filter syntax 比對 YAML rule、命中後吐 alert。Plugin 系統讓 Falco 看到非 syscall event（K8s audit log、Okta event、GitHub audit、AWS CloudTrail）— 變成 <em>general detection engine</em>、不只 host runtime。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/cilium-tetragon/" data-link-title="Cilium Tetragon" data-link-desc="eBPF-based runtime security &#43; inline enforcement、跟 Cilium CNI 同生態、TracingPolicy CRD、process credentials tracking &#43; KillerAction">Cilium Tetragon</a> 比、Falco 走 <em>rule engine + alert-only</em>、Tetragon 走 <em>eBPF + 可 enforce kill action</em>；Falco 偵測為主、Tetragon 偵測 + 防護。跟 <a href="/blog/backend/07-security-data-protection/vendors/datadog-security/" data-link-title="Datadog Security" data-link-desc="Datadog observability platform 上的 security suite：Cloud SIEM &#43; CSPM &#43; CWS &#43; AAP &#43; Sensitive Data Scanner、跟 observability 同 plane">Datadog Security</a>（CWS）比、Datadog 是 SaaS observability 上加 runtime security view、ML-based behavioral baseline 內建、但 vendor lock + per-host 計費；Falco 是 OSS 自管、rule 完全可寫、但 ML baseline / threat intel / cross-source correlation 要自己接 SIEM。跟 <a href="/blog/backend/07-security-data-protection/vendors/lacework/" data-link-title="Lacework" data-link-desc="CNAPP 走 Polygraph ML behavioral baseline 路線、2024 跟 Fortinet 合併成 FortiCNAPP、自動學 normal、anomaly 自動 alert">Lacework</a> Polygraph 比、Lacework 走 behavior graph 自動建 baseline、Falco 走 rule-explicit、邊界看得到也好 audit。</p>
<p>關鍵張力：<em>偵測 vs 防護</em> 跟 <em>rule-explicit vs ML-baseline</em> 是兩條取捨軸。Falco 預設只發 alert、要 inline kill / cordon 要靠 Falco Talon 或外接 SOAR；rule 完全可寫是優點也是負擔 — 自家 anti-pattern 要自己寫成 condition、不像 SaaS CNAPP 預設有 ML baseline。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Falco 在 K8s runtime security stack 中承擔哪一段（syscall detection / audit log detection / alert forwarding）、哪些要外接（Talon / SIEM / SOAR）</li>
<li>Driver 選擇（modern eBPF / kmod / pdig）跟 kernel 環境 / 部署模型 的對應、選錯會 silent miss event</li>
<li>Rule 寫作的 ownership 設計（誰寫、誰 review、staging 怎麼觀察 false positive）</li>
<li>何時用 Falco、何時改走 Tetragon（要 enforcement）或商業 CNAPP（要 ML baseline + 跨雲 posture）</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Falco deployment 是否健康、最少看四件事：</p>
<ul>
<li><strong>Driver 是否符合 kernel 環境</strong>：modern eBPF on 5.8+ / kmod on legacy / pdig on serverless 或 non-root container；driver 跟 kernel 不對等於 silent miss，要看 <code>falco --version</code> 跟啟動 log 確認 driver 載入成功</li>
<li><strong>Rule ownership 跟 lifecycle</strong>：Falco 內建 rule（<code>falco_rules.yaml</code> / <code>k8s_audit_rules.yaml</code>）+ 自家 custom rule 是否走 Git PR review、staging tenant 跑幾小時觀察 false positive、再 promote production</li>
<li><strong>Alert sink + downstream routing</strong>：Falco 預設輸出 stdout / file / syslog、production 幾乎都接 Falcosidekick 做 fan-out（Slack / SIEM / S3 / Webhook），跟 <a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a> / <a href="/blog/backend/07-security-data-protection/vendors/elastic-security/" data-link-title="Elastic Security" data-link-desc="Elastic Stack 上的 SIEM &#43; EDR &#43; Cloud Security 套件、OSS 起源、KQL/EQL/Lucene/ES|QL 多查詢語言、resource-based pricing">Elastic Security</a> / <a href="/blog/backend/07-security-data-protection/vendors/datadog-security/" data-link-title="Datadog Security" data-link-desc="Datadog observability platform 上的 security suite：Cloud SIEM &#43; CSPM &#43; CWS &#43; AAP &#43; Sensitive Data Scanner、跟 observability 同 plane">Datadog Security</a> 的接點明確</li>
<li><strong>Response 是 alert-only 還是有 enforcement</strong>：純 alert 走 <a href="/blog/backend/08-incident-response/" data-link-title="模組八：事故處理與復盤" data-link-desc="用 IR 領域詞彙建問題節點、以服務級案例庫累積事故脈絡，先建概念與案例庫再進實作交接">8 事故處理</a> routing；要自動 kill pod / cordon node 需 Falco Talon 或 SOAR、且 high-impact action 走 approval gate</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/detection-coverage-and-signal-governance/" data-link-title="7.13 偵測覆蓋率與訊號治理" data-link-desc="定義偵測覆蓋、訊號品質與誤報成本的治理問題">Detection Coverage and Signal Governance</a> 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Driver layer</strong>：Falco 三種 driver — <em>modern eBPF</em>（CO-RE、Linux 5.8+、預設、不需 kernel header）、<em>legacy kernel module</em>（kmod、舊 kernel 唯一選、要 DKMS build）、<em>pdig</em>（userspace、ptrace-based、非 root container 或 macOS dev 環境用、效能差）。production K8s deployment 幾乎都走 modern eBPF、DaemonSet 部署到每個 node、kernel 版本不夠才走 kmod；不要混用 driver、否則 alert source 難對齊。</p>
<p><strong>Rule YAML 結構</strong>：Falco rule 由 <code>condition</code>（Sysdig filter syntax、類 SQL where）、<code>output</code>（alert template、含 field interpolation）、<code>priority</code>（emergency / alert / critical / error / warning / notice / informational / debug）、<code>tags</code>（mitre / cis / NIST 對應）組成。<code>condition</code> 寫法跟 Linux syscall 緊耦合（<code>evt.type=execve</code>、<code>fd.name=/etc/passwd</code>、<code>proc.name=nc</code>）— rule engineer 要對 syscall 跟 process tree 熟悉。<code>macro</code> 跟 <code>list</code> 讓 rule 可重用（<code>macro: container_started</code> / <code>list: shell_binaries</code>）、production rule 庫應該 macro-first、不是每條 rule 重寫 condition。</p>
<p><strong>Plugin ecosystem</strong>：Plugin 把 Falco 從 host syscall 擴張到任意 event source — <em>k8saudit plugin</em> 接 K8s API server audit log（看 RBAC change / Secret access）、<em>cloudtrail plugin</em> 接 AWS CloudTrail、<em>okta plugin</em> 接 Okta system log、<em>github plugin</em> 接 GitHub audit log。Plugin 讓 Falco 成為 <em>general detection engine</em>、不只 container runtime；但 plugin event source 跟 SIEM 重疊、要清楚 ownership — <em>Falco 做近 host 即時偵測、SIEM 做跨來源歷史 correlation</em>、別兩邊都跑同一條 rule。</p>
<p><strong>Falcosidekick + alert fan-out</strong>：Falco engine 預設輸出 stdout / file / gRPC、production 接 Falcosidekick（DaemonSet 旁邊或單獨 Deployment）做 fan-out — 同一個 alert 同時 forward 到 Slack（SOC chat）、Splunk HEC / Elastic / Loki（SIEM 持久化）、S3（合規 archive）、Webhook（自家 dashboard）、Prometheus（metrics）。Sidekick 是 stateless forwarder、不做 dedup / aggregation、那層要在 SIEM 處理。</p>
<p><strong>Falco Talon + 自動 response</strong>：Talon 是 response orchestrator、訂閱 Falcosidekick 的 webhook output、依照 rule action 自動執行 — kill pod、cordon node、加 NetworkPolicy、call webhook 通知 SOAR。Talon 把 <em>偵測 → 處置</em> 從手動 SOC playbook 變 declarative YAML、但 high-impact action（kill prod pod、cordon node）必須走 approval gate 或限制在 staging namespace、不能黑箱 fire-and-forget。對應 <a href="/blog/backend/07-security-data-protection/blue-team/detection-to-response-routing/" data-link-title="7.B2 從偵測到回應的路由" data-link-desc="建立資安偵測訊號如何轉成 triage、severity、升級與 incident workflow 的大綱">Detection to Response Routing</a> 的章節原則。</p>
<p><strong>Helm chart 部署 + GitOps</strong>：Falco 官方 Helm chart 把 DaemonSet（Falco engine + driver）、Deployment（Falcosidekick）、ConfigMap（rule YAML）、ServiceAccount + RBAC 包成一組。生產 deployment 走 Argo CD / Flux 同步 Helm value、rule YAML 進 Git PR review、merge 觸發 staging tenant deploy、人工觀察 24-48hr false positive、再 promote production。Rule 直接改 ConfigMap、不走版控等於 detection drift、後續審計接不上。</p>
<p><strong>跟 SIEM / 8 事故處理整合</strong>：Falco alert 經 Falcosidekick 進 <a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a> / <a href="/blog/backend/07-security-data-protection/vendors/elastic-security/" data-link-title="Elastic Security" data-link-desc="Elastic Stack 上的 SIEM &#43; EDR &#43; Cloud Security 套件、OSS 起源、KQL/EQL/Lucene/ES|QL 多查詢語言、resource-based pricing">Elastic Security</a> / <a href="/blog/backend/07-security-data-protection/vendors/datadog-security/" data-link-title="Datadog Security" data-link-desc="Datadog observability platform 上的 security suite：Cloud SIEM &#43; CSPM &#43; CWS &#43; AAP &#43; Sensitive Data Scanner、跟 observability 同 plane">Datadog Security</a> 後、走跟其他 detection signal 同一條 correlation + triage 管線、不獨立 channel。Notable / high-priority alert 進 <a href="/blog/backend/08-incident-response/" data-link-title="模組八：事故處理與復盤" data-link-desc="用 IR 領域詞彙建問題節點、以服務級案例庫累積事故脈絡，先建概念與案例庫再進實作交接">8 事故處理</a> 的 IR queue、走 incident commander handoff。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Falco</th>
          <th>Cilium Tetragon</th>
          <th>Datadog CWS</th>
          <th>Lacework Polygraph</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>License</td>
          <td>Apache 2.0 OSS</td>
          <td>Apache 2.0 OSS</td>
          <td>Commercial SaaS</td>
          <td>Commercial SaaS</td>
      </tr>
      <tr>
          <td>Detection 模型</td>
          <td>Rule-explicit（YAML + Sysdig filter）</td>
          <td>Rule-explicit（YAML + TracingPolicy）</td>
          <td>ML-based behavioral baseline + rule</td>
          <td>Behavior graph 自動 baseline</td>
      </tr>
      <tr>
          <td>Enforcement</td>
          <td>Alert-only（Talon 補 response）</td>
          <td>Inline enforce（kill / signal、可阻擋）</td>
          <td>Inline enforce（Datadog Agent）</td>
          <td>Alert + workload baseline drift</td>
      </tr>
      <tr>
          <td>Driver</td>
          <td>modern eBPF / kmod / pdig</td>
          <td>eBPF only（cilium ecosystem）</td>
          <td>eBPF（Datadog Agent）</td>
          <td>eBPF（Lacework Agent）</td>
      </tr>
      <tr>
          <td>涵蓋面</td>
          <td>Container + host + plugin (audit log)</td>
          <td>Container + host（cilium 整合 network）</td>
          <td>Container + host + cloud + app</td>
          <td>Cloud + container + workload + IaC posture</td>
      </tr>
      <tr>
          <td>Cross-source</td>
          <td>靠 Plugin + Falcosidekick → SIEM</td>
          <td>靠 Cilium Hubble + 外接 SIEM</td>
          <td>內建（Datadog observability plane）</td>
          <td>內建（Polygraph graph）</td>
      </tr>
      <tr>
          <td>學習曲線</td>
          <td>中 — Sysdig filter + macro</td>
          <td>中 — TracingPolicy + cilium 知識</td>
          <td>緩 — 沿用 Datadog UI / Workload Security</td>
          <td>緩 — SaaS console</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>OSS-first、SIEM 已部署、rule 想完全可寫</td>
          <td>要 inline enforcement、cilium CNI 已用</td>
          <td>Datadog 已用、cloud-native、預算允許</td>
          <td>CNAPP + posture 一站、跨雲</td>
      </tr>
      <tr>
          <td>退場成本</td>
          <td>低 — rule 是 YAML、可移植 Sigma</td>
          <td>中 — TracingPolicy 跟 cilium 綁定</td>
          <td>高 — Workload Security rule 跟 platform 綁</td>
          <td>高 — Polygraph data 跟 platform 綁</td>
      </tr>
  </tbody>
</table>
<p>選 Falco 的核心訴求：<em>K8s container runtime detection、OSS + rule-customizable、SIEM 已部署、SOC 有 detection engineer 寫得了 Sysdig filter rule</em>。要 inline enforcement 直接走 Tetragon；要 ML baseline + 跨雲 posture + 不想自管 rule lifecycle 直接走 Datadog CWS / Lacework / <a href="/blog/backend/07-security-data-protection/vendors/wiz/" data-link-title="Wiz" data-link-desc="Agentless CNAPP、Security Graph &#43; Toxic Combination 風險優先級、API-only scan 不需 workload agent">Wiz</a> + <a href="/blog/backend/07-security-data-protection/vendors/crowdstrike-falcon-cs/" data-link-title="CrowdStrike Falcon Cloud Security" data-link-desc="CrowdStrike 在 Falcon endpoint EDR 之上的 CNAPP、agent 統一跨 endpoint &#43; workload &#43; container、CrowdStrike Intelligence 內建">CrowdStrike Falcon CS</a>。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Custom rule 設計</strong>：production rule 庫應該 <em>macro-first</em>、把可重用條件抽成 macro（<code>container_started</code> / <code>sensitive_mount</code> / <code>shell_in_container</code>）跟 list（<code>shell_binaries</code> / <code>sensitive_files</code>）；rule 引用 macro 而非重寫 condition、修改 macro 等於同時更新所有引用 rule。Rule 反例是 <em>single-event noisy rule</em>（看到一個 shell exec 就 alert）— production rule 應該 <em>context-bounded</em>（shell exec <strong>in container</strong> + parent <strong>不在 allowlist</strong> + image <strong>非 trusted registry</strong>）+ priority 階梯（生產 Notice、staging Warning、新規則先 Informational 觀察）。</p>
<p><strong>eBPF driver vs kmod 取捨</strong>：modern eBPF 用 CO-RE（Compile Once, Run Everywhere）、不需 per-kernel build、運行時動態 attach；kmod 需要 DKMS 在 host build、跟 kernel version 強耦合、升級 kernel 要重 build。所有現代 Linux distro 預設都該走 modern eBPF；只有 RHEL 7 / 老 Ubuntu LTS（kernel &lt; 5.8）才有理由用 kmod。pdig 給沒 root / 沒 eBPF 的環境（某些 serverless container、macOS dev）、效能差不適合 production。</p>
<p><strong>Falco Talon 自動 response 設計</strong>：Talon 把「Falco alert → 自動處置」變 declarative — rule action 可以是 <em>kubernetes:terminate-pod</em>、<em>kubernetes:label-pod</em>、<em>kubernetes:cordon-node</em>、<em>aws:disable-iam-user</em>、<em>calico:add-networkpolicy</em>。production 用 Talon 的關鍵原則：<em>high-impact action 走 approval gate</em>（PagerDuty incident → human approve → execute）、<em>containment-first not deletion</em>（先 cordon + label、再人工決定是否 terminate）、<em>blast radius 限制</em>（只能影響特定 namespace / label selector）、<em>audit trail</em>（每個 action 進 Splunk + IR queue）。</p>
<p><strong>Plugin ecosystem 邊界</strong>：Plugin 把 Falco 變 general detection engine、但要明確 plugin event 跟 SIEM 重疊處的 ownership。建議：<em>host syscall + container runtime → Falco rule</em>（即時 + low latency）、<em>K8s audit + cloud audit + IdP audit → 同時跑 Falco plugin（近即時 alert） + SIEM（歷史 correlation）</em>、<em>純跨來源 correlation（多 user 多 source 多時段）→ SIEM 為主</em>。別讓 Falco plugin 跟 SIEM rule 跑重複條件、會 double-alert 也 double-cost。</p>
<p><strong>Sigstore + SBOM 整合的位置</strong>：Falco 不做 image scan / SBOM 驗證（那是 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> / <a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft &amp; Grype</a> 的位置）、但 runtime detection 是 <a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">Supply Chain Integrity</a> 縱深防禦的最後一層 — image scan 過、簽章驗證過、但 runtime 出現異常 syscall（log4shell 觸發 outbound LDAP、SolarWinds 合法簽章但行為異常）、Falco rule 是最後抓的點。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>Falco 啟動成功但完全沒 event</strong>：driver 沒載入（modern eBPF 在舊 kernel fallback 失敗）— 看啟動 log 確認 <code>driver loaded successfully</code>、<code>falco --version</code> 對 driver 版本、舊 kernel 改 kmod</li>
<li><strong>大量 false positive 淹沒 SOC</strong>：rule 寫太寬（<code>shell in container</code> 但合法 debug shell 也 trigger）— staging tenant 跑 48hr 統計 FP、加 exception list 或改 macro 排除已知合法 source、新 rule 先 Informational priority 觀察</li>
<li><strong>Alert 沒進 SIEM</strong>：Falcosidekick 沒接、或 output channel 設錯 — 確認 Falcosidekick Deployment up、output webhook 對、SIEM HEC token 沒過期；Falco engine 本身的 stdout / file output 仍會留、不會 silent miss</li>
<li><strong>Rule update 後 detection drift</strong>：直接改 ConfigMap、沒走 Git PR + staging 觀察 — 強制 GitOps（Argo CD / Flux）、ConfigMap immutable、rule change 必須走 PR review + staging promote</li>
<li><strong>Plugin event lag / 漏抓</strong>：plugin polling cloud audit log（CloudTrail / Okta）的 latency 跟 API rate limit、不是即時 — 純即時偵測別靠 plugin、改靠 SIEM streaming ingest；plugin 適合補 syscall 看不到的層</li>
<li><strong>Talon 自動 response 誤殺 prod</strong>：rule action 直接 kill pod、沒 approval gate — 高影響 action 拆成兩步（先 label + cordon、再人工 approve terminate）、blast radius 限 namespace / label selector、audit trail 全進 SIEM</li>
<li><strong>eBPF driver 跟 kernel 升級不對齊</strong>：node kernel 升級後 modern eBPF 仍 CO-RE 自動適配、但 Falco 版本太舊不支援新 syscall — Falco engine 跟著定期升級、別 pin 在兩年前的 version</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>要 inline kill / enforcement</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cilium-tetragon/" data-link-title="Cilium Tetragon" data-link-desc="eBPF-based runtime security &#43; inline enforcement、跟 Cilium CNI 同生態、TracingPolicy CRD、process credentials tracking &#43; KillerAction">Cilium Tetragon</a></td>
      </tr>
      <tr>
          <td>ML behavioral baseline + 跨雲</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/datadog-security/" data-link-title="Datadog Security" data-link-desc="Datadog observability platform 上的 security suite：Cloud SIEM &#43; CSPM &#43; CWS &#43; AAP &#43; Sensitive Data Scanner、跟 observability 同 plane">Datadog Security</a>、<a href="/blog/backend/07-security-data-protection/vendors/lacework/" data-link-title="Lacework" data-link-desc="CNAPP 走 Polygraph ML behavioral baseline 路線、2024 跟 Fortinet 合併成 FortiCNAPP、自動學 normal、anomaly 自動 alert">Lacework</a>、<a href="/blog/backend/07-security-data-protection/vendors/wiz/" data-link-title="Wiz" data-link-desc="Agentless CNAPP、Security Graph &#43; Toxic Combination 風險優先級、API-only scan 不需 workload agent">Wiz</a></td>
      </tr>
      <tr>
          <td>Full CNAPP + posture + runtime</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/prisma-cloud/" data-link-title="Prisma Cloud" data-link-desc="Palo Alto CNAPP、agent (Defender) &#43; agentless 雙軌、五模組（Compute / CSPM / Code / Data / CIEM）、Compliance template 強">Prisma Cloud</a>、<a href="/blog/backend/07-security-data-protection/vendors/crowdstrike-falcon-cs/" data-link-title="CrowdStrike Falcon Cloud Security" data-link-desc="CrowdStrike 在 Falcon endpoint EDR 之上的 CNAPP、agent 統一跨 endpoint &#43; workload &#43; container、CrowdStrike Intelligence 內建">CrowdStrike Falcon CS</a></td>
      </tr>
      <tr>
          <td>Image scan / SBOM / SCA</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a>、<a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft &amp; Grype</a>、<a href="/blog/backend/07-security-data-protection/vendors/snyk/" data-link-title="Snyk" data-link-desc="跨 SCM 多模組 application security platform：Open Source (SCA) &#43; Code (SAST) &#43; Container &#43; IaC &#43; Cloud (CSPM)、Reachability analysis">Snyk</a></td>
      </tr>
      <tr>
          <td>Cross-source SIEM correlation</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a>、<a href="/blog/backend/07-security-data-protection/vendors/elastic-security/" data-link-title="Elastic Security" data-link-desc="Elastic Stack 上的 SIEM &#43; EDR &#43; Cloud Security 套件、OSS 起源、KQL/EQL/Lucene/ES|QL 多查詢語言、resource-based pricing">Elastic Security</a>、<a href="/blog/backend/07-security-data-protection/vendors/google-security-operations/" data-link-title="Google Security Operations" data-link-desc="Google 雲原生 SIEM &#43; SOAR &#43; Mandiant threat intel 三合一（前 Chronicle）、UDM &#43; YARA-L、fixed-price by data tier、PB-scale 友善">Google Security Operations</a></td>
      </tr>
      <tr>
          <td>Incident routing</td>
          <td><a href="/blog/backend/08-incident-response/vendors/" data-link-title="事故處理 Vendor 清單" data-link-desc="規劃 on-call、incident response、status page 與 postmortem 工具的服務頁撰寫順序與判準">8 事故處理 vendor 清單</a></td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>Sysdig filter syntax 完整 reference、syscall field 細目</li>
<li>Falco source code 內部架構（libsinsp / libscap）</li>
<li>Sysdig Secure（Falco 的商業版、Sysdig Inc. 維護、含 ML baseline + cloud posture）的功能對照細節</li>
<li>Container image scan / SBOM 驗證（屬 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> / <a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft &amp; Grype</a> 的位置）</li>
<li>Kubernetes RBAC / Pod Security Standards / NetworkPolicy 的設計（屬 K8s 平台層、不在 runtime detection 範圍）</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Falco 在 07 案例庫沒有直接 vendor-level 事件、但多個 runtime / supply chain case 都是 Falco rule 第一線該抓的場景：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Falco 的關係（對照啟示）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/3cx-2023-desktopapp-supply-chain/" data-link-title="7.R7.2.8 3CX 2023：桌面軟體更新鏈攻擊" data-link-desc="合法更新流程被植入後，桌面端供應鏈事件如何傳到企業端點">3CX 2023 Desktop App Supply Chain</a></td>
          <td>Falco rule 偵測 desktop app process spawn 異常子程序 + outbound callback、補簽章驗證之外的 runtime 行為層</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/log4shell-cve-2021-44228-component-chain/" data-link-title="7.R7.2.7 Log4Shell 2021：共用元件風險與修補鏈" data-link-desc="共用元件漏洞如何同步影響多服務，並迫使團隊建立依賴治理 workflow">Log4Shell CVE-2021-44228</a></td>
          <td>Falco rule 偵測 JNDI lookup 觸發的 outbound LDAP / DNS、補 <a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> image scan 之外的 runtime detection</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/solarwinds-2020-sunburst/" data-link-title="7.R7.2.1 SolarWinds 2020：更新鏈被濫用" data-link-desc="合法更新流程遭植入後，攻擊者如何長期潛伏與橫向擴散">SolarWinds 2020 Sunburst</a></td>
          <td>合法簽章 binary 但 runtime 行為異常（process tree / outbound C2 / 異常 file access）、Falco rule + Talon containment 是最後一層</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/data-exfiltration/snowflake-2024-credential-abuse/" data-link-title="7.R7.4.2 Snowflake 2024：憑證濫用與資料竊取" data-link-desc="外洩憑證與 MFA 缺口如何在資料平台形成高風險外送事件">Snowflake 2024 Credential Abuse</a></td>
          <td>對照啟示：Falco 主場是 host / container runtime、cloud-native data warehouse 行為偵測要走 SIEM + 平台層 audit、非 Falco 範圍</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/blue-team/detection-engineering-lifecycle/" data-link-title="7.B5 Detection Engineering Lifecycle" data-link-desc="把偵測規則視為可維護資產，建立從來源、測試、調校到退場的完整生命週期">Detection Engineering Lifecycle (section)</a></td>
          <td>Falco rule + macro + list 走 propose → staging tune → promote → review 的工程 lifecycle、不是 ConfigMap 直改</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/blue-team/alert-fatigue-and-signal-quality/" data-link-title="7.B10 Alert Fatigue and Signal Quality" data-link-desc="建立告警疲勞治理方法，讓訊號品質、分級一致性與處置效率同步提升">Alert Fatigue and Signal Quality (section)</a></td>
          <td>Falco rule priority 階梯（新規則先 Informational、staging 觀察 48hr、再 promote Warning / Critical）是 alert fatigue 的工程化解法</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/detection-coverage-and-signal-governance/" data-link-title="7.13 偵測覆蓋率與訊號治理" data-link-desc="定義偵測覆蓋、訊號品質與誤報成本的治理問題">7.13 偵測覆蓋率與訊號治理</a>、<a href="/blog/backend/07-security-data-protection/blue-team/detection-engineering-lifecycle/" data-link-title="7.B5 Detection Engineering Lifecycle" data-link-desc="把偵測規則視為可維護資產，建立從來源、測試、調校到退場的完整生命週期">Detection Engineering Lifecycle</a>、<a href="/blog/backend/07-security-data-protection/blue-team/detection-to-response-routing/" data-link-title="7.B2 從偵測到回應的路由" data-link-desc="建立資安偵測訊號如何轉成 triage、severity、升級與 incident workflow 的大綱">Detection to Response Routing</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/cilium-tetragon/" data-link-title="Cilium Tetragon" data-link-desc="eBPF-based runtime security &#43; inline enforcement、跟 Cilium CNI 同生態、TracingPolicy CRD、process credentials tracking &#43; KillerAction">Cilium Tetragon</a>、<a href="/blog/backend/07-security-data-protection/vendors/datadog-security/" data-link-title="Datadog Security" data-link-desc="Datadog observability platform 上的 security suite：Cloud SIEM &#43; CSPM &#43; CWS &#43; AAP &#43; Sensitive Data Scanner、跟 observability 同 plane">Datadog Security</a>、<a href="/blog/backend/07-security-data-protection/vendors/lacework/" data-link-title="Lacework" data-link-desc="CNAPP 走 Polygraph ML behavioral baseline 路線、2024 跟 Fortinet 合併成 FortiCNAPP、自動學 normal、anomaly 自動 alert">Lacework</a>、<a href="/blog/backend/07-security-data-protection/vendors/prisma-cloud/" data-link-title="Prisma Cloud" data-link-desc="Palo Alto CNAPP、agent (Defender) &#43; agentless 雙軌、五模組（Compute / CSPM / Code / Data / CIEM）、Compliance template 強">Prisma Cloud</a></li>
<li>下游：<a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a> / <a href="/blog/backend/07-security-data-protection/vendors/elastic-security/" data-link-title="Elastic Security" data-link-desc="Elastic Stack 上的 SIEM &#43; EDR &#43; Cloud Security 套件、OSS 起源、KQL/EQL/Lucene/ES|QL 多查詢語言、resource-based pricing">Elastic Security</a> / <a href="/blog/backend/07-security-data-protection/vendors/google-security-operations/" data-link-title="Google Security Operations" data-link-desc="Google 雲原生 SIEM &#43; SOAR &#43; Mandiant threat intel 三合一（前 Chronicle）、UDM &#43; YARA-L、fixed-price by data tier、PB-scale 友善">Google Security Operations</a>（Falco alert 進 SIEM 做 cross-source correlation）</li>
<li>跨類：<a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> / <a href="/blog/backend/07-security-data-protection/vendors/syft-grype/" data-link-title="Syft &#43; Grype" data-link-desc="Anchore 開源姐妹工具：Syft 產 SBOM (CycloneDX / SPDX) &#43; Grype scan 漏洞、Unix philosophy、cosign attestation 整合">Syft &amp; Grype</a>（image scan + SBOM、跟 runtime detection 構成 supply chain 縱深）、<a href="/blog/backend/07-security-data-protection/vendors/wiz/" data-link-title="Wiz" data-link-desc="Agentless CNAPP、Security Graph &#43; Toxic Combination 風險優先級、API-only scan 不需 workload agent">Wiz</a> / <a href="/blog/backend/07-security-data-protection/vendors/crowdstrike-falcon-cs/" data-link-title="CrowdStrike Falcon Cloud Security" data-link-desc="CrowdStrike 在 Falcon endpoint EDR 之上的 CNAPP、agent 統一跨 endpoint &#43; workload &#43; container、CrowdStrike Intelligence 內建">CrowdStrike Falcon CS</a>（商業 CNAPP runtime 對照）</li>
<li>跨模組：<a href="/blog/backend/08-incident-response/vendors/" data-link-title="事故處理 Vendor 清單" data-link-desc="規劃 on-call、incident response、status page 與 postmortem 工具的服務頁撰寫順序與判準">8 事故處理 vendor 清單</a>（Falco notable alert → IR routing）、<a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">Supply Chain Integrity</a>（artifact trust 跟 runtime detection 的縱深關係）</li>
<li>官方：<a href="https://falco.org/docs/">Falco Documentation</a>、<a href="https://github.com/falcosecurity/rules">Falco Rules Repository</a></li>
</ul>
]]></content:encoded></item><item><title>Gitleaks</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/gitleaks/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/gitleaks/</guid><description>&lt;p>Gitleaks 是 &lt;em>純 CLI 的 OSS secret scanner&lt;/em>、MIT License、Go 寫、單一 binary 跑遍 macOS / Linux / Windows。它只做一件事 — 對 git history、working tree 或 staged changes 跑 regex + entropy + path filter 找 secret、輸出 JSON / SARIF / CSV 給下游消化。它沒有 dashboard、沒有 SaaS、沒有 cross-platform scan、也沒有 incident workflow — 這些刻意拿掉的東西是它跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &amp;#43; remediation SaaS、350&amp;#43; Detector &amp;#43; Validation endpoint、跨 SCM &amp;#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &amp;#43; Secret Scanning &amp;#43; Dependency Review &amp;#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Secret Scanning&lt;/a> 的核心分界。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Gitleaks 的核心定位是 &lt;em>git-aware secret scan 的 CLI 原語&lt;/em>、不是 secret 治理平台。Rule 寫在 &lt;code>.gitleaks.toml&lt;/code>、輸出走標準格式（SARIF / JSON / CSV）、跟下游 pipeline（CI、SIEM、GHAS Code Scanning）解耦。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &amp;#43; remediation SaaS、350&amp;#43; Detector &amp;#43; Validation endpoint、跨 SCM &amp;#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian&lt;/a> 比、GitGuardian 是 SaaS + dashboard + remediation workflow + validation endpoint（呼叫真實 API 驗證 secret 是否有效降 FP）+ honeytoken decoy、Gitleaks 沒有任一項 — 它只回答「這個 string 看起來像不像 secret」。GitGuardian 適合大型組織 + 預算允許 + 要跨 Slack / Jira / Notion 等 SaaS scan；Gitleaks 適合預算敏感 + 只需要 git scope + 內部已有 CI / SIEM 接 SARIF 的場景。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &amp;#43; Secret Scanning &amp;#43; Dependency Review &amp;#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Secret Scanning&lt;/a> 比、GHAS 限 GitHub 平台、提供 push protection（partner pattern 在 push 前直接擋）跟 partner 自動 revoke 等深度整合、但只覆蓋 GitHub repo；Gitleaks 跨 GitHub / GitLab / Bitbucket / 自架 Gitea、CLI 跑哪都行、缺點是沒有 partner revoke 跟 push protection 要自己用 hook 接。&lt;/p></description><content:encoded><![CDATA[<p>Gitleaks 是 <em>純 CLI 的 OSS secret scanner</em>、MIT License、Go 寫、單一 binary 跑遍 macOS / Linux / Windows。它只做一件事 — 對 git history、working tree 或 staged changes 跑 regex + entropy + path filter 找 secret、輸出 JSON / SARIF / CSV 給下游消化。它沒有 dashboard、沒有 SaaS、沒有 cross-platform scan、也沒有 incident workflow — 這些刻意拿掉的東西是它跟 <a href="/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &#43; remediation SaaS、350&#43; Detector &#43; Validation endpoint、跨 SCM &#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian</a> / <a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Secret Scanning</a> 的核心分界。</p>
<h2 id="服務定位">服務定位</h2>
<p>Gitleaks 的核心定位是 <em>git-aware secret scan 的 CLI 原語</em>、不是 secret 治理平台。Rule 寫在 <code>.gitleaks.toml</code>、輸出走標準格式（SARIF / JSON / CSV）、跟下游 pipeline（CI、SIEM、GHAS Code Scanning）解耦。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &#43; remediation SaaS、350&#43; Detector &#43; Validation endpoint、跨 SCM &#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian</a> 比、GitGuardian 是 SaaS + dashboard + remediation workflow + validation endpoint（呼叫真實 API 驗證 secret 是否有效降 FP）+ honeytoken decoy、Gitleaks 沒有任一項 — 它只回答「這個 string 看起來像不像 secret」。GitGuardian 適合大型組織 + 預算允許 + 要跨 Slack / Jira / Notion 等 SaaS scan；Gitleaks 適合預算敏感 + 只需要 git scope + 內部已有 CI / SIEM 接 SARIF 的場景。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Secret Scanning</a> 比、GHAS 限 GitHub 平台、提供 push protection（partner pattern 在 push 前直接擋）跟 partner 自動 revoke 等深度整合、但只覆蓋 GitHub repo；Gitleaks 跨 GitHub / GitLab / Bitbucket / 自架 Gitea、CLI 跑哪都行、缺點是沒有 partner revoke 跟 push protection 要自己用 hook 接。</p>
<p>跟 TruffleHog OSS 比、兩者都是 OSS CLI secret scanner、TruffleHog 強在 <em>verifier</em>（對 200+ secret type 呼叫對應 API 驗證真偽）、Gitleaks 強在 <em>rule TOML 表達力跟 SARIF output 成熟度</em>。實務上很多組織兩個一起跑、用不同的 rule 覆蓋面互補。</p>
<p>關鍵張力：<em>Allowlist 治理</em> ↔ <em>FP 噪音</em> 是 Gitleaks 客戶最大的長期問題。OSS 沒有 validation endpoint、entropy + path filter 一定會誤判 test fixture / mock token / sample config、allowlist 不持續 review 會膨脹成「全部都白名單」最後 rule 失效。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Gitleaks 在 secret scan stack 中承擔哪一段（pre-commit / CI scan / historical audit）、哪些要外接（<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> rotate、<a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Code Scanning</a> 收 SARIF dashboard）</li>
<li>Custom rule 跟 allowlist 的 ownership 設計（誰寫 rule、誰核准 allowlist、定期 review 週期）</li>
<li><code>detect</code> vs <code>protect</code> 兩個子命令的職責切分、跟 pre-commit framework / CI 整合的位置</li>
<li>何時用 Gitleaks、何時升級到 <a href="/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &#43; remediation SaaS、350&#43; Detector &#43; Validation endpoint、跨 SCM &#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian</a> / <a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Secret Scanning</a> 的取捨</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Gitleaks 部署是否健康、最少看四件事：</p>
<ul>
<li><strong>誰能改 <code>.gitleaks.toml</code></strong>：rule 跟 allowlist 是否走 Git PR review、commit message 是否帶 allowlist 原因、是否有 owner 簽核</li>
<li><strong><code>detect</code> vs <code>protect</code> 是否都接</strong>：CI 跑 <code>gitleaks detect</code>（掃 history + working tree）、pre-commit hook 跑 <code>gitleaks protect</code>（只掃 staged changes）— 缺 protect 等於 leak 進 history 才知道、缺 detect 等於既有 leak 永遠不發現</li>
<li><strong>SARIF 是否上傳 dashboard</strong>：CI output 是否 upload 到 <a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Code Scanning</a> 或內部 SIEM、不然 finding 散在 CI log 沒人看</li>
<li><strong>Allowlist 是否定期 review</strong>：allowlist entry 是否帶 expire date / reason / owner、每季是否 revisit 把過期項目刪掉、不然 allowlist 會膨脹到掩蓋真實 leak</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/detection-coverage-and-signal-governance/" data-link-title="7.13 偵測覆蓋率與訊號治理" data-link-desc="定義偵測覆蓋、訊號品質與誤報成本的治理問題">Detection Coverage and Signal Governance</a> 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Rule TOML / JSON</strong>：rule 結構是 <code>id</code> + <code>regex pattern</code> + 可選 <code>entropy threshold</code>（高熵字串通常是 secret、避開 lorem ipsum FP）+ 可選 <code>path filter</code>（限定 / 排除路徑）。預設 rule library 涵蓋 AWS / GCP / Azure / Stripe / Slack token 等 100+ pattern；organization 通常 <em>先 import 預設、再加自家 token format custom rule</em>。Custom rule 必須給 valid + invalid sample 跑 unit test、不然 regex 寫錯會大量 FP。</p>
<p><strong><code>gitleaks detect</code>（historical scan）</strong>：掃整個 git history + working tree、CI 跑、適合 <em>發現既有 leak</em>。預設掃 HEAD 到根、可用 <code>--log-opts</code> 限定 commit range 加速。實務上 PR scan 限定 <code>--log-opts=&quot;--since=...$(git merge-base origin/main HEAD)&quot;</code> 只看本 PR 新增 commit、避免每次跑整個 history 慢死。</p>
<p><strong><code>gitleaks protect</code>（pre-commit）</strong>：只掃 staged changes、pre-commit hook 跑、適合 <em>攔住未來 leak</em>。它不掃 history、意義是 <em>commit 前的最後一道閘</em>；配合 pre-commit framework（<code>pre-commit-hooks</code> 或 <a href="https://pre-commit.com/">pre-commit.com</a>）的 <code>repos: gitleaks</code> 配置直接接入。</p>
<p><strong>Report 格式（JSON / SARIF / CSV）</strong>：JSON 是 raw 結構、適合 script 處理；SARIF 是 OASIS 標準、跟 GHAS Code Scanning / 商業 SAST dashboard 共用；CSV 適合人讀 / Excel 二次處理。Production 通常 <em>CI 輸出 SARIF + 上傳 GHAS Code Scanning</em>、把 OSS scanner 的 finding 跟商業 SAST 同 dashboard、SOC 不用切多工具。</p>
<p><strong>跟 CI 整合</strong>：GitHub Actions 用 <code>gitleaks/gitleaks-action</code>、GitLab CI 用 official Docker image、Jenkins 用 binary download + shell step。CI 失敗策略要決定 — <em>block PR</em> 還是 <em>warn only</em>：嚴格組織 block PR、寬鬆組織 warn + 上 SARIF 讓 SOC 自行 triage、避免初期高 FP 阻塞所有 merge。</p>
<p><strong>跟 pre-commit framework 整合</strong>：<code>.pre-commit-config.yaml</code> 加 <code>- repo: https://github.com/gitleaks/gitleaks</code> 條目、<code>pre-commit install</code> 後每次 commit 自動跑。注意 <em>pre-commit 只在開發者 machine 跑</em>、繞過很簡單（<code>git commit --no-verify</code>）、所以一定要配 CI scan 兜底、不能只信 pre-commit。</p>
<p><strong>Allowlist 治理</strong>：<code>.gitleaks.toml</code> 裡 <code>[allowlist]</code> section 寫 <code>paths</code> / <code>regexes</code> / <code>commits</code> / <code>stopwords</code>。每個 entry 應該帶 reason（<code># allowlist reason: test fixture for OAuth flow, expire 2026-Q4</code>）、PR review 時要問「為什麼這個是 FP、什麼時候會過期」。Quarterly 跑 audit 把過期項目刪掉、避免 allowlist 變成「全部都白名單」。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Gitleaks</th>
          <th>GitGuardian</th>
          <th>GHAS Secret Scanning</th>
          <th>TruffleHog OSS</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>License</td>
          <td>MIT OSS</td>
          <td>Proprietary SaaS（free tier 限個人）</td>
          <td>GitHub Enterprise add-on</td>
          <td>AGPL OSS（Enterprise 商業）</td>
      </tr>
      <tr>
          <td>Scope</td>
          <td>Git only（history + tree + staged）</td>
          <td>Git + Slack + Jira + Notion + 自訂 source</td>
          <td>GitHub repo only</td>
          <td>Git + S3 + filesystem + more</td>
      </tr>
      <tr>
          <td>Dashboard</td>
          <td>無、輸出 SARIF / JSON 自己接</td>
          <td>內建 incident workflow + remediation</td>
          <td>GitHub Security tab</td>
          <td>無（CLI / API）</td>
      </tr>
      <tr>
          <td>Validation</td>
          <td>無（只看 regex + entropy）</td>
          <td>有（呼叫 API 驗證真偽）</td>
          <td>Partner pattern 自動 revoke</td>
          <td>有（200+ verifier）</td>
      </tr>
      <tr>
          <td>Push protection</td>
          <td>無、要自己 wire pre-commit</td>
          <td>有（透過 ggshield）</td>
          <td>有（partner pattern、push 前擋）</td>
          <td>無</td>
      </tr>
      <tr>
          <td>部署模型</td>
          <td>CLI binary、跑哪都行</td>
          <td>SaaS only</td>
          <td>GitHub SaaS / Enterprise Server</td>
          <td>CLI binary</td>
      </tr>
      <tr>
          <td>計費</td>
          <td>免費</td>
          <td>Per-developer / per-repo</td>
          <td>Per-committer</td>
          <td>免費（OSS） / 商業另計</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>OSS-friendly、預算敏感、CI / SARIF 已有</td>
          <td>跨 SaaS scan + remediation workflow</td>
          <td>GitHub-only + push protection 為主</td>
          <td>多 source + verifier 為主</td>
      </tr>
      <tr>
          <td>退場成本</td>
          <td>低 — rule TOML 可移植到 GitGuardian</td>
          <td>高 — incident history / workflow 綁定</td>
          <td>中 — SARIF 可移植但 push protection 限 GHAS</td>
          <td>低</td>
      </tr>
  </tbody>
</table>
<p>選 Gitleaks 的核心訴求：<em>OSS + 預算敏感 + 只需要 git scope + 內部 CI / SIEM 已能消化 SARIF</em>、且願意自己投入 rule / allowlist 治理。要跨 SaaS scan + incident workflow 升 GitGuardian、要 push protection + partner revoke 走 GHAS Secret Scanning。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Custom rule 寫法（regex + entropy + path）</strong>：自家 internal token 通常有特定 prefix（<code>xy_live_</code> / <code>int_token_</code>）、寫 custom rule 就是 <code>regex = '''xy_live_[A-Za-z0-9]{32}'''</code> + <code>entropy = 4.0</code> + <code>path = '''.*\.go$'''</code>。Entropy threshold 越高 FP 越少但 FN 越多、實務值 3.5–4.5 之間 tune。每個 rule 一定要在 repo 加 unit test fixture（valid + invalid sample）、CI 跑 rule 自我驗證、避免 regex 寫錯後 silent break。</p>
<p><strong>跟 SARIF + GHAS Code Scanning 整合補位</strong>：Gitleaks CI 跑完輸出 SARIF、用 <code>github/codeql-action/upload-sarif</code> 上傳到 GHAS Code Scanning。GHAS Code Scanning 不限 CodeQL 來源、任何 SARIF tool 都收。意義是 <em>OSS scanner + GHAS dashboard</em> 是預算友善組合 — 不買 GHAS Secret Scanning license、但 finding 集中在 Security tab 跟 SAST 共看。對應 <a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Advanced Security</a> 的 Code Scanning section。</p>
<p><strong>跟 Vault 自動 rotation pipeline</strong>：Gitleaks 找到 leak 不是終點、是 <em>rotation trigger</em>。CI 把 finding 推 SOAR（或自家 webhook）、SOAR 呼叫 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> API 對該 credential type rotate（dynamic credential 直接 revoke、static secret 換新版本）、再 broadcast 給依賴該 secret 的 service rolling restart。沒這條 pipeline、Gitleaks 只是 finding 列表沒實際治理價值。</p>
<p><strong>Allowlist 治理（FP 不能無限）</strong>：OSS 沒 validation endpoint、test fixture / mock token / sample config 一定觸發 FP。allowlist 治理三原則 — <em>每個 entry 帶 reason + owner + expire date</em>、<em>PR review 必問「為什麼 FP」</em>、<em>quarterly audit 刪過期項目</em>。沒這個治理 allowlist 會在 6–12 個月內膨脹到「半個 repo 都在白名單」、那時候 rule 已經沒用、refactor 成本比一開始嚴格更高。</p>
<p><strong>跟 Trivy secret scan 重疊</strong>：<a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a> 內建 secret scanner（用同樣的 regex pattern）、container image / filesystem 都掃。Gitleaks 跟 Trivy secret scan 在 <em>container build pipeline</em> 階段會重疊 — 實務分工：Gitleaks 掃 source repo（git history + working tree）、Trivy 掃 built artifact（image layer + filesystem）。兩者覆蓋不同階段、不衝突。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>FP 太多、開發者開始忽略 Gitleaks finding</strong>：rule 沒 tune entropy threshold 或 path filter — 對 high-FP rule 加 <code>entropy = 4.0</code> 跟 <code>paths = ['''!test/.*''']</code>、staging branch 跑 1 週統計 FP 再 promote</li>
<li><strong>Pre-commit 被繞過（<code>--no-verify</code>）</strong>：開發者本機跑不過直接 bypass — pre-commit 不能當唯一防線、CI <code>gitleaks detect</code> block PR 才是真實 gate</li>
<li><strong>Historical scan 太慢、CI timeout</strong>：每次掃整個 git history — PR scan 限定 <code>--log-opts=&quot;$(git merge-base origin/main HEAD)..HEAD&quot;</code> 只看本 PR commit、nightly job 才跑 full history</li>
<li><strong>SARIF 上傳失敗 / GHAS dashboard 沒 finding</strong>：<code>github/codeql-action/upload-sarif</code> 權限不足或 <code>security-events: write</code> permission 沒給 — 補 GitHub Actions permission、或改 upload 內部 SIEM</li>
<li><strong>Allowlist 膨脹、規則失效</strong>：FP 全部塞 allowlist、沒 reason 沒 expire — quarterly audit、刪過期項目、把高 FP rule 改寫成更窄的 regex 而不是 allowlist 蓋過</li>
<li><strong>既有 leak 沒被發現、新 commit 攔得很乾淨</strong>：只接 <code>protect</code> 沒接 <code>detect</code> — CI 加 <code>detect</code> job、找出 history 中已 leak 的 secret 一次性 rotate（<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> 自動化）</li>
<li><strong>Custom rule 寫錯、silent skip 真 leak</strong>：rule regex 沒 unit test fixture、production 才發現 — 強制 custom rule 加 valid + invalid sample、CI 跑 rule 自驗</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>跨 Slack / Jira / Notion / 自架 SaaS scan</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &#43; remediation SaaS、350&#43; Detector &#43; Validation endpoint、跨 SCM &#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian</a></td>
      </tr>
      <tr>
          <td>Push protection + partner auto-revoke</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Secret Scanning</a></td>
      </tr>
      <tr>
          <td>Validation endpoint（驗證 secret 真偽）</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &#43; remediation SaaS、350&#43; Detector &#43; Validation endpoint、跨 SCM &#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian</a> 或 TruffleHog Enterprise</td>
      </tr>
      <tr>
          <td>Honeytoken decoy 主動防禦</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &#43; remediation SaaS、350&#43; Detector &#43; Validation endpoint、跨 SCM &#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian</a>（內建 honeytoken）</td>
      </tr>
      <tr>
          <td>Container image secret scan</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a>（內建 secret scanner）</td>
      </tr>
      <tr>
          <td>Secret 找到後自動 rotate</td>
          <td>配 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a> dynamic credential</td>
      </tr>
      <tr>
          <td>SAST / SCA dashboard 整合</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Code Scanning</a>（收 SARIF）</td>
      </tr>
  </tbody>
</table>
<h2 id="不在本頁內的主題">不在本頁內的主題</h2>
<ul>
<li>Gitleaks v8 跟 v7 的 rule 格式遷移細節</li>
<li>Gitleaks 內部 git odb 解析跟性能 tuning（large monorepo 加速）</li>
<li>Pre-commit framework 本身的安裝跟治理（屬開發者工作流、不在資安範圍）</li>
<li>Rotation playbook 完整實作（屬 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> / <a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">AWS Secrets Manager</a> 章節）</li>
<li>Secret 治理整體政策（屬 <a href="/blog/backend/07-security-data-protection/secrets-and-machine-credential-governance/" data-link-title="7.6 秘密管理與機器憑證治理" data-link-desc="以問題驅動方式整理 secret、token、key 與機器身份治理">Secrets Management section</a> 上層原則）</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Gitleaks 在 07 案例庫沒有直接 vendor-level 事件、所有 secret leak case 都是 git history scan + rotation pipeline 的對照：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Gitleaks 的關係（對照啟示）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/circleci-2023-secrets-rotation/" data-link-title="7.R7.2.3 CircleCI 2023：CI secrets 輪替壓力" data-link-desc="工程端點入侵後，CI 平台 secrets 如何成為高風險擴散點">CircleCI 2023 Secrets Rotation</a></td>
          <td>Gitleaks <code>detect</code> 跑整個 git history 找出已 leaked secret、配合 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> rotation 流程清乾淨</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/supply-chain/github-oauth-2022-token-supply-chain/" data-link-title="7.R7.2.2 GitHub OAuth 2022：第三方 token 供應鏈風險" data-link-desc="第三方整合 token 被竊後，如何形成跨組織存取風險">GitHub OAuth 2022 Token Supply Chain</a></td>
          <td>Pre-commit <code>protect</code> 攔未來 leak、但對既有 leak 要 historical scan 補位、單一防線不夠</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/failure-credential-rotation-without-scope/" data-link-title="7.C9 反例：憑證輪替未分 Scope" data-link-desc="憑證輪替若未分域分批，容易造成跨系統連鎖中斷。">Failure: Credential Rotation Without Scope</a></td>
          <td>Gitleaks 找出 leaked static secret 是第一步、長期解是 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> dynamic credential 取代 long-lived secret</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/secrets-and-machine-credential-governance/" data-link-title="7.6 秘密管理與機器憑證治理" data-link-desc="以問題驅動方式整理 secret、token、key 與機器身份治理">7 章 Secrets Management section</a>、<a href="/blog/backend/07-security-data-protection/detection-coverage-and-signal-governance/" data-link-title="7.13 偵測覆蓋率與訊號治理" data-link-desc="定義偵測覆蓋、訊號品質與誤報成本的治理問題">Detection Coverage and Signal Governance</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/gitguardian/" data-link-title="GitGuardian" data-link-desc="Secret scanning &#43; remediation SaaS、350&#43; Detector &#43; Validation endpoint、跨 SCM &#43; SaaS（Slack / Notion）、Honeytokens decoy">GitGuardian</a>、<a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Secret Scanning</a>、<a href="/blog/backend/07-security-data-protection/vendors/trivy/" data-link-title="Trivy" data-link-desc="Aqua Security 開源 all-in-one scanner：Container / Filesystem / K8s / IaC &#43; Secret &#43; License &#43; SBOM、Apache 2.0、CI 友善">Trivy</a></li>
<li>下游：<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a>（找到 leak 後 rotate）、<a href="/blog/backend/07-security-data-protection/vendors/aws-secrets-manager/" data-link-title="AWS Secrets Manager" data-link-desc="AWS 原生 secret store &#43; 內建 RDS / Redshift rotation Lambda、Resource Policy 跨帳號共享、KMS 加密">AWS Secrets Manager</a> / <a href="/blog/backend/07-security-data-protection/vendors/google-secret-manager/" data-link-title="Google Secret Manager" data-link-desc="GCP 原生 secret store、CMEK &#43; Workload Identity Federation 整合、rotation 走自寫 Cloud Function 而非 built-in Lambda">Google Secret Manager</a> / <a href="/blog/backend/07-security-data-protection/vendors/azure-key-vault/" data-link-title="Azure Key Vault" data-link-desc="Azure 三合一 service（Secret &#43; Key &#43; Certificate）、整合 Managed Identity &#43; Entra ID RBAC、Premium tier 走 HSM">Azure Key Vault</a></li>
<li>跨類：<a href="/blog/backend/07-security-data-protection/vendors/github-advanced-security/" data-link-title="GitHub Advanced Security" data-link-desc="GitHub 內建 4 大模組：Code Scanning (CodeQL) &#43; Secret Scanning &#43; Dependency Review &#43; Dependabot、跟 PR / Security tab 深度整合">GHAS Code Scanning</a>（收 SARIF dashboard）、<a href="/blog/backend/07-security-data-protection/vendors/splunk/" data-link-title="Splunk" data-link-desc="業界 SIEM 標準、forwarder &#43; indexer &#43; search head 架構、SPL 為核心查詢語言、ingestion-based 計費跟偵測覆蓋率的 trade-off">Splunk</a> / <a href="/blog/backend/07-security-data-protection/vendors/elastic-security/" data-link-title="Elastic Security" data-link-desc="Elastic Stack 上的 SIEM &#43; EDR &#43; Cloud Security 套件、OSS 起源、KQL/EQL/Lucene/ES|QL 多查詢語言、resource-based pricing">Elastic Security</a>（finding 進 SIEM）</li>
<li>官方：<a href="https://github.com/gitleaks/gitleaks">Gitleaks GitHub</a>、<a href="https://github.com/gitleaks/gitleaks/blob/master/README.md">Gitleaks Documentation</a></li>
</ul>
]]></content:encoded></item><item><title>XZ Utils 2024:開源維護者信任壓力</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/blue-team/materials/field-cases/xz-utils-2024-open-source-maintainer-pressure/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/blue-team/materials/field-cases/xz-utils-2024-open-source-maintainer-pressure/</guid><description>&lt;p>本案例的責任是提供開源維護者信任壓力素材。XZ Utils 事件顯示,當攻擊者用兩年時間累積維護者信任、再把 backdoor 植入特定 release artifact 時,只有上游建置時序、發行前測試與快速 distro 回應能在量產前攔截下來。&lt;/p>
&lt;h2 id="來源">來源&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>來源&lt;/th>
 &lt;th>可引用範圍&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://www.cisa.gov/news-events/alerts/2024/03/29/reported-supply-chain-compromise-affecting-xz-utils-data-compression-library-cve-2024-3094">CISA alert:XZ Utils CVE-2024-3094&lt;/a>&lt;/td>
 &lt;td>影響版本、降版建議、hunting 指引&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://securitylabs.datadoghq.com/articles/xz-backdoor-cve-2024-3094/">Datadog Security Labs:XZ backdoor 分析&lt;/a>&lt;/td>
 &lt;td>maintainer 接管時間線、artifact 注入機制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://www.akamai.com/blog/security-research/critical-linux-backdoor-xz-utils-discovered-what-to-know">Akamai:XZ Utils backdoor 摘要&lt;/a>&lt;/td>
 &lt;td>sshd 行為改變、影響面、distro 回應&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://nvd.nist.gov/vuln/detail/cve-2024-3094">NVD:CVE-2024-3094&lt;/a>&lt;/td>
 &lt;td>官方紀錄、影響版本範圍&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="defender-pressure">Defender Pressure&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>壓力&lt;/th>
 &lt;th>服務判讀&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Maintainer trust pressure&lt;/td>
 &lt;td>開源元件治理需要納入維護者社群動態&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Pre-release detection pressure&lt;/td>
 &lt;td>量產前需要有 build artifact 與 sshd 行為驗證&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Distro response pressure&lt;/td>
 &lt;td>受影響 distro 需要快速降版與通報&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Composition awareness pressure&lt;/td>
 &lt;td>服務需要知道自己的 image / package 是否含受影響版本&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="control-gap">Control Gap&lt;/h2>
&lt;p>控制缺口的核心是開源元件信任只看版本與簽章,缺少對維護者活動與 build artifact 行為的監控。XZ Utils 的 backdoor 只在特定 release 路徑啟用,單純依賴上游版本號與 license 檢查會漏掉這類風險。&lt;/p>
&lt;h2 id="detection-route">Detection Route&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>訊號&lt;/th>
 &lt;th>判讀用途&lt;/th>
 &lt;th>下一步&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>受影響版本出現在 image 或 package 清單&lt;/td>
 &lt;td>判斷曝險範圍&lt;/td>
 &lt;td>啟動降版與重建&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>sshd 行為與基線出現偏移&lt;/td>
 &lt;td>判斷 backdoor 啟用可能&lt;/td>
 &lt;td>啟動 forensic preserve&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>上游 maintainer 出現異常活動&lt;/td>
 &lt;td>判斷信任邊界&lt;/td>
 &lt;td>啟動 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/artifact-provenance/" data-link-title="Artifact Provenance" data-link-desc="說明交付物的來源、完整性與簽章關聯如何建立信任">artifact provenance&lt;/a> review&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="exercise-hook">Exercise Hook&lt;/h2>
&lt;p>本案例可支撐 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/blue-team/materials/scenarios/supply-chain-artifact-drill/" data-link-title="Supply Chain Artifact Drill" data-link-desc="以 artifact provenance 偏移設計供應鏈 release gate 與 rollback 演練">Supply chain artifact drill&lt;/a> 的開源變體。演練重點是確認團隊能在上游 advisory 出現時,快速比對 SBOM、降版受影響元件並驗證 sshd 行為。&lt;/p>
&lt;h2 id="write-back-target">Write-back Target&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性與 Artifact 信任&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/security-risk-in-release-gate/" data-link-title="7.22 資安風險如何進入 Release Gate" data-link-desc="把資安風險、例外與驗證證據納入 release gate，建立可稽核的放行判準">7.22 資安風險如何進入 Release Gate&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/blue-team/materials/control-patterns/detection-lifecycle-pattern/" data-link-title="Detection Lifecycle Pattern" data-link-desc="定義偵測規則如何管理來源、邏輯、測試事件、誤報與退場">Detection lifecycle pattern&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/blue-team/materials/control-patterns/vulnerability-response-pattern/" data-link-title="Vulnerability Response Pattern" data-link-desc="定義漏洞回應如何從 observed 推進到 assessed、mitigated、patched、validated 與 closed">Vulnerability response pattern&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>本案例的責任是提供開源維護者信任壓力素材。XZ Utils 事件顯示,當攻擊者用兩年時間累積維護者信任、再把 backdoor 植入特定 release artifact 時,只有上游建置時序、發行前測試與快速 distro 回應能在量產前攔截下來。</p>
<h2 id="來源">來源</h2>
<table>
  <thead>
      <tr>
          <th>來源</th>
          <th>可引用範圍</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="https://www.cisa.gov/news-events/alerts/2024/03/29/reported-supply-chain-compromise-affecting-xz-utils-data-compression-library-cve-2024-3094">CISA alert:XZ Utils CVE-2024-3094</a></td>
          <td>影響版本、降版建議、hunting 指引</td>
      </tr>
      <tr>
          <td><a href="https://securitylabs.datadoghq.com/articles/xz-backdoor-cve-2024-3094/">Datadog Security Labs:XZ backdoor 分析</a></td>
          <td>maintainer 接管時間線、artifact 注入機制</td>
      </tr>
      <tr>
          <td><a href="https://www.akamai.com/blog/security-research/critical-linux-backdoor-xz-utils-discovered-what-to-know">Akamai:XZ Utils backdoor 摘要</a></td>
          <td>sshd 行為改變、影響面、distro 回應</td>
      </tr>
      <tr>
          <td><a href="https://nvd.nist.gov/vuln/detail/cve-2024-3094">NVD:CVE-2024-3094</a></td>
          <td>官方紀錄、影響版本範圍</td>
      </tr>
  </tbody>
</table>
<h2 id="defender-pressure">Defender Pressure</h2>
<table>
  <thead>
      <tr>
          <th>壓力</th>
          <th>服務判讀</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Maintainer trust pressure</td>
          <td>開源元件治理需要納入維護者社群動態</td>
      </tr>
      <tr>
          <td>Pre-release detection pressure</td>
          <td>量產前需要有 build artifact 與 sshd 行為驗證</td>
      </tr>
      <tr>
          <td>Distro response pressure</td>
          <td>受影響 distro 需要快速降版與通報</td>
      </tr>
      <tr>
          <td>Composition awareness pressure</td>
          <td>服務需要知道自己的 image / package 是否含受影響版本</td>
      </tr>
  </tbody>
</table>
<h2 id="control-gap">Control Gap</h2>
<p>控制缺口的核心是開源元件信任只看版本與簽章,缺少對維護者活動與 build artifact 行為的監控。XZ Utils 的 backdoor 只在特定 release 路徑啟用,單純依賴上游版本號與 license 檢查會漏掉這類風險。</p>
<h2 id="detection-route">Detection Route</h2>
<table>
  <thead>
      <tr>
          <th>訊號</th>
          <th>判讀用途</th>
          <th>下一步</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>受影響版本出現在 image 或 package 清單</td>
          <td>判斷曝險範圍</td>
          <td>啟動降版與重建</td>
      </tr>
      <tr>
          <td>sshd 行為與基線出現偏移</td>
          <td>判斷 backdoor 啟用可能</td>
          <td>啟動 forensic preserve</td>
      </tr>
      <tr>
          <td>上游 maintainer 出現異常活動</td>
          <td>判斷信任邊界</td>
          <td>啟動 <a href="/blog/backend/knowledge-cards/artifact-provenance/" data-link-title="Artifact Provenance" data-link-desc="說明交付物的來源、完整性與簽章關聯如何建立信任">artifact provenance</a> review</td>
      </tr>
  </tbody>
</table>
<h2 id="exercise-hook">Exercise Hook</h2>
<p>本案例可支撐 <a href="/blog/backend/07-security-data-protection/blue-team/materials/scenarios/supply-chain-artifact-drill/" data-link-title="Supply Chain Artifact Drill" data-link-desc="以 artifact provenance 偏移設計供應鏈 release gate 與 rollback 演練">Supply chain artifact drill</a> 的開源變體。演練重點是確認團隊能在上游 advisory 出現時,快速比對 SBOM、降版受影響元件並驗證 sshd 行為。</p>
<h2 id="write-back-target">Write-back Target</h2>
<ul>
<li><a href="/blog/backend/07-security-data-protection/supply-chain-integrity-and-artifact-trust/" data-link-title="7.12 供應鏈完整性與 Artifact 信任" data-link-desc="定義 build provenance、artifact 信任與交付鏈風險問題">7.12 供應鏈完整性與 Artifact 信任</a></li>
<li><a href="/blog/backend/07-security-data-protection/security-risk-in-release-gate/" data-link-title="7.22 資安風險如何進入 Release Gate" data-link-desc="把資安風險、例外與驗證證據納入 release gate，建立可稽核的放行判準">7.22 資安風險如何進入 Release Gate</a></li>
<li><a href="/blog/backend/07-security-data-protection/blue-team/materials/control-patterns/detection-lifecycle-pattern/" data-link-title="Detection Lifecycle Pattern" data-link-desc="定義偵測規則如何管理來源、邏輯、測試事件、誤報與退場">Detection lifecycle pattern</a></li>
<li><a href="/blog/backend/07-security-data-protection/blue-team/materials/control-patterns/vulnerability-response-pattern/" data-link-title="Vulnerability Response Pattern" data-link-desc="定義漏洞回應如何從 observed 推進到 assessed、mitigated、patched、validated 與 closed">Vulnerability response pattern</a></li>
</ul>
]]></content:encoded></item></channel></rss>