<?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>Pam on Tarragon</title><link>https://tarrragon.github.io/blog/tags/pam/</link><description>Recent content in Pam 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/pam/index.xml" rel="self" type="application/rss+xml"/><item><title>Teleport</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/teleport/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/teleport/</guid><description>&lt;p>Teleport 是 &lt;em>Identity-Aware Proxy + PAM&lt;/em>（Privileged Access Management）、把 SSH / Database / Kubernetes / Windows Desktop / Cloud API / 內部 web app 的 &lt;em>privileged session&lt;/em> 統一收到一個 zero-trust 入口、所有 session 改走 &lt;em>short-lived cert + per-session MFA + 全程錄影&lt;/em>、取代傳統「long-lived SSH key + bastion + 手動 audit」。它跟 &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> 是兩層職責 — Okta 認證 &lt;em>人是誰&lt;/em>、Teleport 控制 &lt;em>拿到身份後 privileged session 怎麼進、留什麼證據&lt;/em>；典型部署是 &lt;em>Okta SSO into Teleport、Teleport proxies SSH/DB/K8s session&lt;/em>。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Teleport 的核心定位是 &lt;em>infrastructure access plane&lt;/em>、不是 IdP、不是 secret store、也不是 network mesh。它的責任是 &lt;em>把 admin / engineer 對 production 資源的 session 通通走可治理的入口&lt;/em>、每個 session 有 &lt;em>identity-bound short-lived cert&lt;/em>、有 &lt;em>audit log&lt;/em>、有 &lt;em>錄影&lt;/em>、有 &lt;em>MFA gate&lt;/em>。比較對象：&lt;/p>
&lt;ul>
&lt;li>跟 &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> / Azure AD 等 IdP 比、Teleport 不取代 SSO、而是 &lt;em>把 SSO identity 帶到 infrastructure layer&lt;/em> — Okta 給 user identity + group、Teleport 把這個 identity 翻譯成 SSH cert / DB cert / K8s cert&lt;/li>
&lt;li>跟傳統 bastion + SSH key 比、Teleport 把 &lt;em>long-lived SSH key&lt;/em> 換成 &lt;em>short-lived cert&lt;/em>（預設 TTL 數小時、過期自動失效）、把 &lt;em>看不到的 session&lt;/em> 換成 &lt;em>全程錄影 + searchable audit log&lt;/em>&lt;/li>
&lt;li>跟 HashiCorp Boundary 比、Teleport 走 &lt;em>protocol-aware proxy&lt;/em>（懂 SSH / PostgreSQL / Kubernetes API 協議、可以 decode keystroke 跟 query）、Boundary 走 &lt;em>generic TCP proxy&lt;/em>（協議無感、不能錄 keystroke 但部署更輕）&lt;/li>
&lt;li>跟 Tailscale SSH 比、Tailscale 是 &lt;em>network mesh 加 SSH&lt;/em>、適合小團隊 flat network；Teleport 是 &lt;em>PAM + 多協議 + 跨環境 audit&lt;/em>、適合需要 SOC handoff 的環境&lt;/li>
&lt;li>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &amp;#43; DDoS &amp;#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare Access&lt;/a> 比、Cloudflare Access 是 &lt;em>application-layer ZTNA&lt;/em>（內部 web app / API 用）、Teleport 是 &lt;em>infrastructure-layer ZTNA&lt;/em>（SSH / DB / K8s 用）、兩者互補&lt;/li>
&lt;/ul>
&lt;p>關鍵張力：&lt;em>PAM 的覆蓋完整度&lt;/em> ↔ &lt;em>operator 摩擦&lt;/em>。Teleport 開越多（per-session MFA、Access Request 要 approval、Device Trust 強制企業裝置）、helpdesk SE 那種「拿到密碼直接進 prod」的 blast radius 越小、但 on-call engineer 在凌晨三點修事故時的摩擦也越大。要根據 &lt;em>資源敏感度分層&lt;/em> 設定、不是一刀切。&lt;/p></description><content:encoded><![CDATA[<p>Teleport 是 <em>Identity-Aware Proxy + PAM</em>（Privileged Access Management）、把 SSH / Database / Kubernetes / Windows Desktop / Cloud API / 內部 web app 的 <em>privileged session</em> 統一收到一個 zero-trust 入口、所有 session 改走 <em>short-lived cert + per-session MFA + 全程錄影</em>、取代傳統「long-lived SSH key + bastion + 手動 audit」。它跟 <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> 是兩層職責 — Okta 認證 <em>人是誰</em>、Teleport 控制 <em>拿到身份後 privileged session 怎麼進、留什麼證據</em>；典型部署是 <em>Okta SSO into Teleport、Teleport proxies SSH/DB/K8s session</em>。</p>
<h2 id="服務定位">服務定位</h2>
<p>Teleport 的核心定位是 <em>infrastructure access plane</em>、不是 IdP、不是 secret store、也不是 network mesh。它的責任是 <em>把 admin / engineer 對 production 資源的 session 通通走可治理的入口</em>、每個 session 有 <em>identity-bound short-lived cert</em>、有 <em>audit log</em>、有 <em>錄影</em>、有 <em>MFA gate</em>。比較對象：</p>
<ul>
<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</a> / Azure AD 等 IdP 比、Teleport 不取代 SSO、而是 <em>把 SSO identity 帶到 infrastructure layer</em> — Okta 給 user identity + group、Teleport 把這個 identity 翻譯成 SSH cert / DB cert / K8s cert</li>
<li>跟傳統 bastion + SSH key 比、Teleport 把 <em>long-lived SSH key</em> 換成 <em>short-lived cert</em>（預設 TTL 數小時、過期自動失效）、把 <em>看不到的 session</em> 換成 <em>全程錄影 + searchable audit log</em></li>
<li>跟 HashiCorp Boundary 比、Teleport 走 <em>protocol-aware proxy</em>（懂 SSH / PostgreSQL / Kubernetes API 協議、可以 decode keystroke 跟 query）、Boundary 走 <em>generic TCP proxy</em>（協議無感、不能錄 keystroke 但部署更輕）</li>
<li>跟 Tailscale SSH 比、Tailscale 是 <em>network mesh 加 SSH</em>、適合小團隊 flat network；Teleport 是 <em>PAM + 多協議 + 跨環境 audit</em>、適合需要 SOC handoff 的環境</li>
<li>跟 <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare Access</a> 比、Cloudflare Access 是 <em>application-layer ZTNA</em>（內部 web app / API 用）、Teleport 是 <em>infrastructure-layer ZTNA</em>（SSH / DB / K8s 用）、兩者互補</li>
</ul>
<p>關鍵張力：<em>PAM 的覆蓋完整度</em> ↔ <em>operator 摩擦</em>。Teleport 開越多（per-session MFA、Access Request 要 approval、Device Trust 強制企業裝置）、helpdesk SE 那種「拿到密碼直接進 prod」的 blast radius 越小、但 on-call engineer 在凌晨三點修事故時的摩擦也越大。要根據 <em>資源敏感度分層</em> 設定、不是一刀切。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Teleport 在 access stack 中承擔哪一段（infrastructure session）、哪些不屬於它（user identity 屬 Okta、long-lived service 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>、application access 可用 Cloudflare Access）</li>
<li>Cluster / Proxy / Auth Service / Node 拓樸的部署選擇（Cloud SaaS vs Self-hosted、Trusted Cluster 跨環境）</li>
<li>Roles + Access Requests + Per-session MFA + Session Recording 四件套的工程化設定（誰能 approve、TTL 多長、錄影存哪）</li>
<li>何時用 Teleport、何時走 Boundary / Tailscale SSH / Cloudflare Access 的取捨</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Teleport deployment 是否健康、最少看四件事：</p>
<ul>
<li><strong>是否還有 long-lived credential 旁路</strong>：production host 是否仍接受 <code>~/.ssh/authorized_keys</code> 的長期 key、DB 是否仍有 shared admin password、K8s kubeconfig 是否還在 engineer laptop 永存 — Teleport 收編失敗的最大訊號是 <em>存在 bypass Teleport 的捷徑</em></li>
<li><strong>Per-session MFA 是否對 sensitive resource 強制</strong>：prod SSH / prod DB / payment system 進 session 時是否每次都 re-MFA、不是「早上登入一次後 8 小時都通行」、role 設定有沒有 <code>require_session_mfa: true</code></li>
<li><strong>Access Request 的 standing privilege 是否收零</strong>：日常 role 是否只有 read-only、所有 write / admin operation 是否走 <em>Access Request</em> + approver gate + TTL、approver 是否 SOC / SRE on-call 而非任意 lead</li>
<li><strong>Session Recording 是否真的可回查</strong>：SSH / K8s / DB session 錄影是否落地 S3 / GCS、是否可在 audit log 透過 user / time / resource 三軸搜尋並回放、recording retention 是否符合合規（金融通常 7 年）</li>
</ul>
<p>四件事任一缺失、就回到 <a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">7.2 身分與授權邊界</a> 補設定。最容易踩的是第三點 — Teleport 裝了但日常 role 仍給 standing admin、Access Request 變裝飾、helpdesk SE 場景的 mitigation 等於沒上。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Cluster + Proxy + Auth Service 拓樸</strong>：Teleport cluster 由三個 first-class component 組成 — <em>Auth Service</em>（CA、簽 cert、存 audit log、policy decision point）、<em>Proxy</em>（user 連線入口、做 protocol translation、把 SSH / DB / K8s request 轉到 Node）、<em>Node</em>（被保護的資源、裝 Teleport agent 或走 agentless 模式）。Cloud（SaaS）把 Auth + Proxy 託管、客戶只管 Node；Self-hosted 三層都自管、適合需要 data residency / FedRAMP 的環境。</p>
<p><strong>多協議 Resource Access</strong>：Teleport 是 <em>protocol-aware proxy</em>、不是 generic TCP tunnel — SSH Access 懂 OpenSSH、Database Access 懂 PostgreSQL / MySQL / MongoDB / Snowflake / Redis wire protocol、Kubernetes Access 懂 K8s API + RBAC impersonation、Desktop Access 懂 RDP、Application Access 懂 HTTP（包 AWS / GCP console 跟內部 web app）。協議感知的價值是 <em>可以錄 keystroke / query / 滑鼠移動</em>、可以做 <em>per-query approval</em>（DB Access 可設「DROP TABLE 要 approver」）、generic proxy 做不到。</p>
<p><strong>Roles + RBAC</strong>：Teleport role 是 YAML 定義的 RBAC policy、控制 <em>誰可以連哪些 resource、用什麼 OS user、執行什麼指令、session TTL 多長、要不要 per-session MFA</em>。Role 跟 Okta group 透過 SAML / OIDC attribute mapping 綁定 — Okta <code>group=sre-prod</code> 自動拿到 Teleport <code>role=prod-ssh-readonly</code>、不用 Teleport 端維護 user list。</p>
<p><strong>Access Requests（JIT approval）</strong>：standing privilege 收零的核心機制 — engineer 平常只有 read-only role、需要 write / admin 時透過 CLI / web UI 開 <em>Access Request</em>、指定 role + reason + TTL、approver 在 Slack / web 收到通知後 approve / deny、approve 後該 user 拿到該 role TTL（例如 4 小時）、過期自動 revoke。對應 <a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/mgm-2023-identity-lateral-impact/" data-link-title="7.R7.1.4 MGM 2023：身分流程被打穿後的營運中斷" data-link-desc="社交工程造成身分邊界失守後，如何演變成可用性與營運衝擊">MGM 2023</a> 的 mitigation — 即使 helpdesk SE 拿到 user 密碼、該 user 也沒有 standing admin 可用、要進 prod 必須額外開 Access Request + approver 看到 reason 異常會 deny。</p>
<p><strong>Per-session MFA</strong>：高敏 session 強制每次連線都 re-MFA、不是登入一次後 session TTL 內都通行。role 設 <code>require_session_mfa: true</code>、user <code>tsh ssh prod-db-01</code> 時會跳 Yubikey / WebAuthn 提示、過了才連得進去。對應 <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> 的 lesson — 即使 attacker 用 push fatigue 拿到 IdP session、要進 prod infrastructure 還會撞到第二道 MFA。</p>
<p><strong>Session Recording + Audit</strong>：所有 SSH / K8s / DB / Desktop session 全程錄影、SSH 錄 keystroke + output、DB 錄 SQL query、K8s 錄 API call、Desktop 錄畫面。錄影預設存 Auth Service local disk、production 應該設 <em>sync mode</em> 即時寫 S3 / GCS、不要等 session 結束才上傳（attacker 結束前 wipe）。Audit log 走結構化 JSON、可 export 到 <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、是 SOC 的 first-class signal。</p>
<p><strong>Trusted Cluster 跨環境 federation</strong>：dev / staging / prod 各自跑 Teleport cluster、用 <em>Trusted Cluster</em> 建立信任關係、user 從 root cluster 一次 login 就能 <code>tsh ssh --cluster=prod node-01</code>、不用每個環境各 login。設計重點是 <em>root cluster 是 SSO + 政策中心、leaf cluster 是各環境本地控制</em>、leaf 出事不會把 root identity 拖下水。</p>
<p><strong>跟 Okta / GitHub OIDC SSO 整合</strong>：Teleport 不做 user identity、authentication 全部委派給 IdP — Okta 設 SAML app、Teleport 設 SAML connector、user <code>tsh login</code> 跳 Okta 認證後拿 Teleport short-lived cert。GitHub Actions 也可以用 OIDC token 換 Teleport cert（給 CI 用、見下方 Machine ID）、不用埋 GitHub Actions secret。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Teleport</th>
          <th>HashiCorp Boundary</th>
          <th>Tailscale SSH</th>
          <th>Cloudflare Access</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>主要 surface</td>
          <td>Infrastructure（SSH / DB / K8s / Desktop）</td>
          <td>Infrastructure（generic TCP）</td>
          <td>Network mesh + SSH</td>
          <td>Application（web app / API）</td>
      </tr>
      <tr>
          <td>協議感知</td>
          <td>強 — 懂 SSH / DB / K8s / RDP / HTTP</td>
          <td>弱 — generic TCP proxy、不解協議</td>
          <td>弱 — SSH 為主、其他靠 network</td>
          <td>HTTP-only</td>
      </tr>
      <tr>
          <td>Short-lived cert</td>
          <td>強 — 各協議都有專屬 cert（SSH / DB / K8s）</td>
          <td>中 — 主要靠 Vault credential broker</td>
          <td>中 — SSH cert by Tailscale CA</td>
          <td>N/A（HTTP token）</td>
      </tr>
      <tr>
          <td>Session 錄影</td>
          <td>全程 keystroke / query / 畫面</td>
          <td>TCP-level 連線 metadata、不錄內容</td>
          <td>基本 SSH log、不錄 keystroke</td>
          <td>HTTP request log</td>
      </tr>
      <tr>
          <td>JIT access</td>
          <td>Access Request + approver + TTL</td>
          <td>Vault dynamic credential lease</td>
          <td>ACL tag、無 approver workflow</td>
          <td>Policy + identity gate</td>
      </tr>
      <tr>
          <td>Per-session MFA</td>
          <td>第一級支援、role 級別 toggle</td>
          <td>透過 Vault MFA、間接</td>
          <td>透過 Tailscale identity、間接</td>
          <td>App-level MFA（透過 Cloudflare）</td>
      </tr>
      <tr>
          <td>部署模型</td>
          <td>Cloud SaaS / Self-hosted（含 air-gapped）</td>
          <td>Self-hosted（OSS）+ HCP Boundary（SaaS）</td>
          <td>SaaS only</td>
          <td>SaaS only（Cloudflare 邊緣）</td>
      </tr>
      <tr>
          <td>計費</td>
          <td>Per protected resource + MAU、Cloud / Self</td>
          <td>跟 Vault Enterprise 綁定</td>
          <td>Per user / device</td>
          <td>Per user</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>需要 PAM + audit + JIT 的 admin session 治理</td>
          <td>已是 Vault 重度使用者、generic TCP 多</td>
          <td>小團隊 flat network、SSH 為主</td>
          <td>內部 web app / API 走 ZTNA、非 infra</td>
      </tr>
      <tr>
          <td>退場成本</td>
          <td>中 — role YAML / Trusted Cluster 設定多</td>
          <td>中 — Boundary target 設定</td>
          <td>低 — ACL 移植性高</td>
          <td>低 — policy 簡單</td>
      </tr>
  </tbody>
</table>
<p>選 Teleport 的核心訴求：<em>多協議 infrastructure session</em> + <em>session recording + JIT + per-session MFA 是 SOC 必要證據</em> + <em>跨環境 federation</em>（dev / staging / prod / partner）+ <em>願意承擔 cluster 維運成本（self-hosted）或 SaaS 訂閱</em>。純小團隊 flat network 走 Tailscale 更輕、純內部 web app 走 Cloudflare Access 更便宜、純 Vault-driven workflow 走 Boundary 整合更順。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Machine ID — service-to-service short-lived cert</strong>：CI / 內部 worker / cron job 也走 Teleport 拿 short-lived cert、不用埋長期 SSH key 或 DB password。Machine ID agent（<code>tbot</code>）跑在 CI runner、用 IAM role / GitHub OIDC token / Kubernetes service account 證明自己身份、Teleport 簽 short-lived SSH cert / DB cert（TTL 通常 1 小時）。對應 <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 概念、Teleport Machine ID 是 SPIRE 在 infrastructure access surface 的對等實作。</p>
<p><strong>Device Trust — 裝置驗證</strong>：除了 user identity + MFA、Teleport Enterprise 還可以強制 <em>只有企業 enrolled 裝置可以連 prod</em>。裝置透過 TPM / Secure Enclave 註冊 hardware-bound key、Teleport login 時驗證裝置 cert。對應 BYOD 風險 — 即使 attacker 拿到 user credential + MFA token、沒有企業裝置就連不進 prod。</p>
<p><strong>Moderated Session + Session Live View</strong>：高敏 session 設定 <em>需要第二人在線 moderate</em>、SOC analyst 即時看 keystroke、可以 <code>kill session</code>。對應金融 / 政府的「四眼原則」合規要求。Live View 也可以給 SOC 在 incident 進行中即時看 attacker 操作（如果 attacker 不知道被監聽）。</p>
<p><strong>FedRAMP / HIPAA / PCI compliance</strong>：Teleport Enterprise 有 FedRAMP Moderate authorization、Self-hosted 模式可部署 air-gapped 環境、audit log 滿足 HIPAA / PCI 的 access logging 要求。Cloud 版本走 SOC 2 Type II、FedRAMP 版本走 GovCloud 部署。</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> / <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> 的職責切分</strong>：Vault 管 <em>service-to-service secret</em>（DB password、API key、PKI CA）、SPIRE 管 <em>workload identity</em>（SVID、跨服務 mTLS）、Teleport 管 <em>人類 admin session + service short-lived cert（透過 Machine ID）</em>。三者互補不重疊 — Vault 不該直接給 engineer 拿 SSH key、SPIRE 不該管 helpdesk admin 怎麼進 prod、Teleport 不該變成長期 API key 倉庫。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>裝了 Teleport 但 engineer 還在用直接 SSH key</strong>：production host 沒收掉 <code>authorized_keys</code>、long-lived key 旁路存在 — host onboarding 流程強制走 Teleport Node enrollment、CI 跑 <code>sshd_config</code> audit 抓 <code>AuthorizedKeysFile</code></li>
<li><strong>Access Request 變裝飾、approver 秒按</strong>：approver 是同團隊 lead 沒看 reason、TTL 設 24 小時等於 standing — approver 改 SOC on-call / cross-team、TTL 預設 1-4 小時、high-impact role 強制兩人 approve</li>
<li><strong>Per-session MFA 開了但 user 抱怨太煩</strong>：所有 role 一刀切要 MFA — 分層：dev / staging role 只要登入 MFA、prod role 才 per-session MFA、payment / PII DB 加 moderated session</li>
<li><strong>Session recording 沒存到 S3、attacker 結束前 wipe</strong>：用 default async mode、recording 留在 Auth Service local — 改 <em>sync mode</em> 即時寫 S3、S3 開 object lock 防刪除</li>
<li><strong>Trusted Cluster leaf 出事拖累 root</strong>：leaf cluster admin 也有 root cluster 權限 — leaf 用獨立 role mapping、leaf admin 不繼承 root identity、leaf 出事只影響該環境</li>
<li><strong>Cloud SaaS 跨區 latency 高</strong>：team 在亞太但 Teleport Cloud 在 us-east — 選 Teleport Cloud 地區 / 改 Self-hosted 部署在自家最近 region</li>
<li><strong>Machine ID cert TTL 短導致 CI 中途失效</strong>：long-running job &gt; cert TTL — 在 job 內定期 <code>tbot</code> renew、或拉長 TTL 但收緊 IAM role binding</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>純內部 web app / API access</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare Access</a>（application-layer ZTNA）</td>
      </tr>
      <tr>
          <td>小團隊 flat network + SSH</td>
          <td>Tailscale SSH（network mesh + 輕量 SSH cert）</td>
      </tr>
      <tr>
          <td>已重度使用 Vault、generic TCP 為主</td>
          <td>HashiCorp Boundary（跟 Vault credential broker 整合）</td>
      </tr>
      <tr>
          <td>Service-to-service secret 跟 long-lived</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> / <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></td>
      </tr>
      <tr>
          <td>Workload identity / SVID</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></td>
      </tr>
      <tr>
          <td>人類 SSO / 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/keycloak/" data-link-title="Keycloak" data-link-desc="Open source self-hosted Identity Provider、Red Hat 主導、Realm-based multi-tenancy、適合資料主權與自訂 flow 需求">Keycloak</a></td>
      </tr>
      <tr>
          <td>Session audit 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>Teleport role YAML 完整 reference、predicate language 進階用法</li>
<li>Teleport Cloud vs Self-hosted 的 SLA / pricing 細節</li>
<li>Teleport Connect（桌面 client app）的具體操作流程</li>
<li>Air-gapped 部署的 license server 跟 update workflow</li>
<li>各協議的 wire protocol 解析（PostgreSQL / MySQL session 怎麼被 decode）</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Teleport 沒有 vendor-level 公開事故、但 07 案例庫的 identity / access 系列都是 PAM 設計的對照：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Teleport 的關係（對照啟示）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/mgm-2023-identity-lateral-impact/" data-link-title="7.R7.1.4 MGM 2023：身分流程被打穿後的營運中斷" data-link-desc="社交工程造成身分邊界失守後，如何演變成可用性與營運衝擊">MGM 2023 Identity Lateral Impact</a></td>
          <td>helpdesk SE 拿到 reset 密碼後直接進 prod admin — Teleport JIT Access Request + per-session MFA 是 first-class mitigation、standing access 收零後 SE 拿到密碼也進不了 prod</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-based MFA fail 後 attacker 拿到 standing internal tool access — Teleport per-session MFA 是第二道 gate（即使 IdP session 被劫、進 prod infra 還要 re-MFA）+ session recording 給 SOC 事後重建</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/okta-support-system-incident-2023/" data-link-title="7.C5 Okta：2023 Support System 事件" data-link-desc="支援系統憑證風險如何擴散到客戶租戶的案例。">Okta Support System 2023</a></td>
          <td>IdP 端 support tool compromise 後 attacker 拿到客戶 session token — 客戶側 Teleport audit log 仍能看到「異常 source IP / device 進 SSH session」、是 IdP 失守時的補位偵測層</td>
      </tr>
  </tbody>
</table>
<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/secrets-and-machine-credential-governance/" data-link-title="7.6 秘密管理與機器憑證治理" data-link-desc="以問題驅動方式整理 secret、token、key 與機器身份治理">7.6 秘密管理與機器憑證治理</a></li>
<li>平行：HashiCorp Boundary / Tailscale SSH / <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare Access</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</a>（IdP、user identity）、<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>（service secret）、<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）</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>（session audit log 入 SIEM）</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>（compromise session 走 IR workflow）</li>
<li>官方：<a href="https://goteleport.com/docs/">Teleport Documentation</a></li>
</ul>
]]></content:encoded></item><item><title>HashiCorp Boundary</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/boundary/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/boundary/</guid><description>&lt;p>HashiCorp Boundary 是 &lt;em>identity-based access broker&lt;/em>、把「使用者要連到某個內部資源」這件事拆成 &lt;em>identity 驗證&lt;/em> + &lt;em>target 授權&lt;/em> + &lt;em>動態 credential 注入&lt;/em> 三段、由 Boundary 統一仲介。它跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault&lt;/a> 同生態、設計上預期兩者組合：&lt;em>Boundary 控制誰能連到哪個資源、Vault 提供連線當下的 short-lived credential&lt;/em>。單獨用 Boundary 而不接 Vault、會失去它最大的價值。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Boundary 的核心定位是 &lt;em>連線層級的存取仲介&lt;/em>、不是傳統的 bastion host、也不是 identity-aware proxy。它把 &lt;em>連線發起權&lt;/em> 收回控制面、user 不需要直接拿到 SSH key / DB password / cloud token、只需要對 Boundary 認證、由 Boundary 把 &lt;em>target 資源的網路位置&lt;/em> + &lt;em>Vault 動態簽發的 credential&lt;/em> 在 session 開始時注入連線。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &amp;#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &amp;#43; session recording &amp;#43; JIT、跟 Okta / Vault 互補">Teleport&lt;/a> 比、Boundary 走 &lt;em>network broker + dynamic credential injection&lt;/em>、Teleport 走 &lt;em>identity-aware proxy + session recording&lt;/em>。Teleport 是 &lt;em>看見每一個指令、可重播&lt;/em> 的 PAM；Boundary 是 &lt;em>不存 credential、不錄影、靠 Vault short-lived token 來控制 blast radius&lt;/em>。兩者解的是同一類問題（內部資源存取治理）、但工程取捨完全不同 — Boundary 把「攻擊者拿到 credential 也只有 minutes-level 有效期」當主要防線、Teleport 把「全部 session 留下不可否認證據」當主要防線。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &amp;#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH&lt;/a> 比、Tailscale 走 mesh network + SSH-only、無 credential 仲介、無 dynamic injection；Boundary 走 broker 模式、支援 SSH / RDP / DB / TCP / HTTP 等多協議、且 credential 從 Vault 拉。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &amp;#43; Device Posture &amp;#43; IdP integration">Cloudflare Access&lt;/a> 比、Cloudflare 走 &lt;em>Zero Trust portal + identity-aware reverse proxy&lt;/em>、是 HTTP-first；Boundary 是 &lt;em>protocol-agnostic broker&lt;/em>、原生支援非 HTTP 協議（DB / SSH / RDP）。&lt;/p></description><content:encoded><![CDATA[<p>HashiCorp Boundary 是 <em>identity-based access broker</em>、把「使用者要連到某個內部資源」這件事拆成 <em>identity 驗證</em> + <em>target 授權</em> + <em>動態 credential 注入</em> 三段、由 Boundary 統一仲介。它跟 <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> 同生態、設計上預期兩者組合：<em>Boundary 控制誰能連到哪個資源、Vault 提供連線當下的 short-lived credential</em>。單獨用 Boundary 而不接 Vault、會失去它最大的價值。</p>
<h2 id="服務定位">服務定位</h2>
<p>Boundary 的核心定位是 <em>連線層級的存取仲介</em>、不是傳統的 bastion host、也不是 identity-aware proxy。它把 <em>連線發起權</em> 收回控制面、user 不需要直接拿到 SSH key / DB password / cloud token、只需要對 Boundary 認證、由 Boundary 把 <em>target 資源的網路位置</em> + <em>Vault 動態簽發的 credential</em> 在 session 開始時注入連線。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a> 比、Boundary 走 <em>network broker + dynamic credential injection</em>、Teleport 走 <em>identity-aware proxy + session recording</em>。Teleport 是 <em>看見每一個指令、可重播</em> 的 PAM；Boundary 是 <em>不存 credential、不錄影、靠 Vault short-lived token 來控制 blast radius</em>。兩者解的是同一類問題（內部資源存取治理）、但工程取捨完全不同 — Boundary 把「攻擊者拿到 credential 也只有 minutes-level 有效期」當主要防線、Teleport 把「全部 session 留下不可否認證據」當主要防線。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH</a> 比、Tailscale 走 mesh network + SSH-only、無 credential 仲介、無 dynamic injection；Boundary 走 broker 模式、支援 SSH / RDP / DB / TCP / HTTP 等多協議、且 credential 從 Vault 拉。跟 <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &#43; Device Posture &#43; IdP integration">Cloudflare Access</a> 比、Cloudflare 走 <em>Zero Trust portal + identity-aware reverse proxy</em>、是 HTTP-first；Boundary 是 <em>protocol-agnostic broker</em>、原生支援非 HTTP 協議（DB / SSH / RDP）。</p>
<p>關鍵張力：<em>Boundary + Vault 組合的工程複雜度</em> ↔ <em>不靠 session recording 的審計可信度</em>。已用 HashiCorp 生態（Terraform + Vault + Consul）的組織、Boundary 是 <em>最後一塊拼圖</em>；沒用 Vault 的組織用 Boundary 等於只剩一個 bastion 的弱化版、不如直接走 Teleport。合規強要求 keystroke audit 的場域、Boundary 預設不錄 session、要走 Enterprise add-on 才有、不如 Teleport first-class。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Boundary 在 PAM stack 中承擔哪一段（broker / target / session）、哪些要外接（Vault 給 credential、IdP 給 auth、Enterprise add-on 給 session recording）</li>
<li>Controller + Worker + Multi-hop 拓樸怎麼對應實際網路分段（DMZ / internal / restricted subnet）</li>
<li>Vault Credential Library 怎麼設計、誰負責 host catalog、role / scope 怎麼劃</li>
<li>何時用 Boundary、何時改走 Teleport / Tailscale SSH / Cloudflare Access 的取捨</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Boundary deployment 是否健康、最少看四件事：</p>
<ul>
<li><strong>是否真的接 Vault</strong>：Credential Library 是否從 Vault 拉 dynamic credential（DB / SSH cert / cloud token）、session 結束是否自動 revoke、還是仍有 static credential 存在 Boundary 或人手裡</li>
<li><strong>Scope 結構是否反映組織邊界</strong>：Global → Org → Project 的三層 scope、Org 對應 BU / tenant、Project 對應應用或環境；role / grant 是否按 Project 切、還是全部塞 Global scope 變共享密碼</li>
<li><strong>Worker 拓樸是否反映網路分段</strong>：Controller 在 control plane、Worker 在每個網路 segment（DMZ / internal / restricted DB subnet）、Multi-hop 是否走 segment-aware routing、還是把所有 worker 塞同一個 VPC</li>
<li><strong>Auth Method 是不是 IdP-backed</strong>：OIDC（<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> / Azure AD / Google）/ LDAP / Password — production 應該走 OIDC、Password auth method 只該存在於 break-glass</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">Privileged Access and Just-in-Time Authority</a> 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Controller + Worker 拓樸</strong>：Controller 負責 control plane（auth、policy、session 管理、API endpoint）、Worker 負責 data plane（實際代理連線到 target）。Controller 通常 cluster 部署（3 個以上、HA）、Worker 按網路 segment 分散部署。Controller 從不直接連 target — user 跟 Controller 認證、Controller 告訴 user 走哪個 Worker、Worker 才實際代理連線。</p>
<p><strong>Target + Host Set + Host Catalog</strong>：Target 是 user 看到的「可連對象」抽象（例如 <code>prod-db-cluster</code>）、Host Set 是 Target 對應的實際 host 集合、Host Catalog 是 host 的來源（static list 或從 cloud auto-discover）。Dynamic Host Catalog 可以從 AWS / Azure / GCP 用 tag 自動 enroll host、不需要手動維護 host list — 例如 <code>tag:role=prod-db</code> 的 EC2 自動進 <code>prod-db-cluster</code> Target。</p>
<p><strong>Credential Library（Vault 整合）</strong>：Boundary 不存 credential、靠 Credential Library 從 Vault 拉。設計支援三種：<em>Vault Generic</em>（拉任意 Vault secret path）、<em>Vault SSH Certificate</em>（拉 Vault SSH CA 簽發的 short-lived cert）、<em>Vault Database</em>（拉 Vault Database Secret Engine 簽發的 DB user / password）。session 開始時 Boundary 拉 credential、注入連線、session 結束時 Vault 自動 revoke。這是 Boundary 的核心價值 — 沒接 Vault 等於丟掉 dynamic credential rotation 這個最大賣點。</p>
<p><strong>Auth Method</strong>：支援 OIDC（OAuth2 / OpenID Connect、給 <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> / Azure AD / Google）、LDAP（給 internal directory）、Password（給 break-glass）。Production 預設走 OIDC、跟 IdP 同源、user lifecycle 隨 IdP 變動（離職 IdP 鎖、Boundary 自動失效）。Password auth method 只該存在於 break-glass account、密碼進 Vault、單獨 audit。</p>
<p><strong>Role + Grant + Scope</strong>：Boundary 的權限模型是 <em>scope-bound role</em>、role 屬於某個 scope（Global / Org / Project）、grant 是 role 內的具體權限（例如 <code>target=&lt;id&gt;;actions=authorize-session</code>）。Scope 三層分別對應：<em>Global</em> — platform-level admin、<em>Org</em> — 某 BU 或 tenant、<em>Project</em> — 應用或環境（prod / staging / dev）。設計時把 role 按 Project 切、不要全部塞 Global scope 變共享密碼。</p>
<p><strong>Session 生命週期</strong>：user 對 Boundary 認證（OIDC）→ list authorized target → 對某 target 發起 <code>authorize-session</code>、Boundary 從 Credential Library 拉 credential → user 透過 Boundary CLI / Desktop / SDK 連線、實際走 Worker 代理 → session 有 <em>max duration</em>（預設 8 小時、可調短）、過期自動斷 + Vault credential revoke。session metadata（誰、何時、target、worker、duration）一律 audit log。</p>
<p><strong>Multi-hop Worker</strong>：跨網路 segment（例如 user 在 corp 網、target 在 DMZ → internal → restricted DB subnet）時、Boundary 支援 worker chain — corp Worker 連到 DMZ Worker、DMZ Worker 連到 internal Worker、internal Worker 連到 DB。每段 worker 只看得到下一段、不需要 VPN trunk 把整個網路打通。這是 Boundary 相對 Teleport / Tailscale 的網路工程優勢、特別適合金融 / 政府 / 製造業的多層網路分段。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>HashiCorp Boundary</th>
          <th>Teleport</th>
          <th>Tailscale SSH</th>
          <th>Cloudflare Access</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>核心模式</td>
          <td>Network broker + dynamic credential injection</td>
          <td>Identity-aware proxy + session recording</td>
          <td>Mesh VPN + SSH CA</td>
          <td>Zero Trust portal + identity-aware proxy</td>
      </tr>
      <tr>
          <td>Credential 處理</td>
          <td>從 Vault 拉 short-lived、不存</td>
          <td>Teleport CA 簽發 short-lived cert</td>
          <td>Tailscale SSH CA 簽發</td>
          <td>OAuth token、無 SSH credential 處理</td>
      </tr>
      <tr>
          <td>Session recording</td>
          <td>Enterprise add-on（2023+、非 first-class）</td>
          <td>First-class（SSH / kubectl / DB 都錄）</td>
          <td>無</td>
          <td>無</td>
      </tr>
      <tr>
          <td>協議支援</td>
          <td>SSH / RDP / DB（Postgres / MySQL）/ TCP / HTTP</td>
          <td>SSH / kubectl / DB / RDP / Web Apps</td>
          <td>SSH only（mesh 內任意 TCP）</td>
          <td>HTTP / SSH（透過 cloudflared）/ RDP</td>
      </tr>
      <tr>
          <td>部署模型</td>
          <td>Self-hosted (OSS / Enterprise) / HCP (HashiCorp)</td>
          <td>Self-hosted / Teleport Cloud</td>
          <td>SaaS only</td>
          <td>SaaS only</td>
      </tr>
      <tr>
          <td>網路拓樸</td>
          <td>Controller + Worker、Multi-hop 跨 segment 友善</td>
          <td>Proxy + Agent、單層 proxy</td>
          <td>Mesh、所有節點對等</td>
          <td>Cloudflare edge + cloudflared tunnel</td>
      </tr>
      <tr>
          <td>IdP 整合</td>
          <td>OIDC / LDAP / Password</td>
          <td>OIDC / SAML / GitHub</td>
          <td>OIDC（Okta / Google / Azure）</td>
          <td>OIDC / SAML / 內建 IdP</td>
      </tr>
      <tr>
          <td>跟其他 vendor 鎖</td>
          <td>預設假設用 Vault、單獨用價值有限</td>
          <td>獨立完整、不依賴特定 secret store</td>
          <td>獨立、Tailscale 生態</td>
          <td>獨立、Cloudflare 生態</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>已用 HashiCorp 生態 + 多協議 + 多層網路分段</td>
          <td>強合規 + session audit + kubectl-heavy</td>
          <td>小團隊 + SSH-only + 不要 PAM 複雜度</td>
          <td>Cloud-native + Zero Trust portal + HTTP-first</td>
      </tr>
      <tr>
          <td>退場成本</td>
          <td>中 — Vault 整合複雜、target / role / scope 量多</td>
          <td>中 — Teleport-specific config + recording</td>
          <td>低 — Tailscale 拆掉就回 plain SSH</td>
          <td>低 — Cloudflare 拆掉就回 origin</td>
      </tr>
  </tbody>
</table>
<p>選 Boundary 的核心訴求：<em>已用 HashiCorp 生態（特別是 Vault）</em> + <em>多協議內部資源（不只 SSH、還有 DB / RDP / TCP）</em> + <em>多層網路分段需要 Multi-hop</em>、可以接受 session recording 不是 first-class。沒用 Vault 的組織、Boundary 失去最大價值、應該直接走 Teleport。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Multi-hop Worker 跟網路分段</strong>：金融 / 政府常見三段網路（corp → DMZ → restricted）、傳統做法是打 VPN trunk 把整個網路扁平化、accept 大 blast radius。Boundary 用 worker chain 反向 — 每個 segment 部署一個 worker、worker 之間用 mTLS 認證、user 只進 corp worker、後面 hop 由 Boundary control plane 編排。每段 worker 不知道後一段的 target 細節、只知道下一段 worker 的位置。配對 <a href="/blog/backend/07-security-data-protection/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">Segmentation and Blast Radius Containment</a> 的章節原則。</p>
<p><strong>Dynamic Host Catalog</strong>：手動維護 host list 在 cloud-native 環境會壞 — auto-scaling group 起一台新 EC2、沒人去 Boundary 加 target。Dynamic Host Catalog 配 cloud provider plugin（AWS / Azure / GCP）、用 tag 自動 enroll：例如 <code>tag:env=prod tag:role=app</code> 的 EC2 自動進 <code>prod-app</code> Target、scale-down 也自動移除。這配 IaC（<a href="/blog/backend/05-deployment-platform/vendors/terraform/" data-link-title="Terraform / OpenTofu" data-link-desc="Infrastructure as Code 主流工具">Terraform</a> 管 tag）是 HashiCorp 生態一致性的核心賣點。</p>
<p><strong>Session Recording（Enterprise 才有）</strong>：2023+ Boundary Enterprise 引入 session recording、支援 SSH 跟 RDP 的 keystroke + screen recording、output 加密存到 S3 / Azure Blob、metadata 走 audit。OSS Community Edition 沒有、只記 session metadata（who / when / what target / how long）。組織要 session recording 但又要 Boundary、要評估 Enterprise license cost vs Teleport license cost — 通常 Teleport 在 session recording 場景成本效益更好。</p>
<p><strong>Vault credential brokering 設計</strong>：Boundary 連 Vault 的設計支援多種 secret engine — Database（Postgres / MySQL / Redis 等、簽 short-lived DB user）、SSH Certificate（簽 short-lived SSH cert）、AWS / Azure / GCP（簽 cloud STS token）、KV v2（拉靜態 secret、不推薦）。Production 預設用 dynamic engine、不要用 KV v2 — 靜態 secret 失去 Boundary 最大價值。Vault namespace / policy 設計要對齊 Boundary scope、否則 cross-scope credential 暴露變大問題。</p>
<p><strong>HCP Boundary（HashiCorp Cloud Platform）</strong>：HashiCorp 託管的 SaaS 版、Controller 由 HashiCorp 管、user 只部署 Worker 到自己網路。優點是省去 Controller HA / upgrade 維運；缺點是 control plane 在 HashiCorp 雲、合規敏感場域要評估 data residency。SMB / 中型團隊適合走 HCP、大型 enterprise 通常 Self-hosted。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>Session 拿到 credential 但 target 連不上</strong>：Worker 跟 target 之間網路不通、或 Worker 沒部署到 target 所在 segment — 檢查 Worker tag 跟 Target worker_filter、用 <code>boundary workers list</code> 確認 Worker 健康</li>
<li><strong>OIDC login 失敗</strong>：IdP redirect URI 沒對齊、或 IdP signing key 過期 — 對照 <a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/microsoft-storm-0558-2023-signing-key-chain/" data-link-title="7.R7.1.5 Microsoft Storm-0558 2023：簽章金鑰鏈與郵件存取" data-link-desc="從簽章金鑰保護失效到雲端郵件存取，拆解身分信任鏈的關鍵控制點">Microsoft Storm-0558</a> 的啟示、Boundary OIDC auth method 依賴上游 IdP signing key、IdP 端 key rotation 不對 Boundary 通知會整批 session 認不過</li>
<li><strong>Vault credential 拉不到 / 過期太快</strong>：Boundary 服務帳戶在 Vault 的 policy 沒給 <code>creds/&lt;role&gt;</code> 權限、或 Vault 簽的 credential TTL 短於 session max duration — 對齊 TTL、加 Vault telemetry alert credential issuance 失敗</li>
<li><strong>Multi-hop 連線中斷</strong>：中間 hop 的 Worker 健康但 connection drop — 通常是中間 segment 的 firewall idle timeout 短於 session activity gap、調 firewall 或在 client 端開 keepalive</li>
<li><strong>Target 量爆炸 / role 管不動</strong>：所有 target 塞 Global scope、role 量線性漲 — 重構 scope 結構、按 Org / Project 切、role 從 Global 移到 Project 層</li>
<li><strong>Dynamic Host Catalog 漏 host</strong>：cloud tag 沒打 / IAM 沒給 Boundary 描述權限 — 檢查 cloud plugin 的 service account permission、加 catalog sync error 的 alert</li>
<li><strong>OSS Community 升 Enterprise 才發現缺 feature</strong>：選 OSS 之前沒確認需求 — session recording / SAML / 高級 RBAC / multi-region HA 都是 Enterprise 才有、評估時就要列清楚</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>強合規要 session recording / keystroke audit</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a></td>
      </tr>
      <tr>
          <td>小團隊 + SSH-only + 不要 PAM 複雜度</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH</a></td>
      </tr>
      <tr>
          <td>Cloud-native + Zero Trust portal</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &#43; Device Posture &#43; IdP integration">Cloudflare Access</a></td>
      </tr>
      <tr>
          <td>Kubernetes kubectl-first PAM</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a>（kubectl proxy first-class）</td>
      </tr>
      <tr>
          <td>Secret storage / rotation 核心</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>（Boundary 的搭檔）</td>
      </tr>
      <tr>
          <td>IdP / SSO 治理</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> / Azure AD</td>
      </tr>
      <tr>
          <td>Cloud IAM role assumption</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> / 對應雲</td>
      </tr>
      <tr>
          <td>事故路由</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>Boundary CLI / Desktop / Terraform provider 的完整指令 reference</li>
<li>HCP Boundary 跟 Self-hosted 的功能對照細節（HashiCorp 官方有 matrix）</li>
<li>Vault 內部的 secret engine 設計（在 <a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a> 頁）</li>
<li>OIDC / SAML 協議本身的攻擊面（<a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">2.3 SSO 攻擊面</a>）</li>
<li>Network segmentation 的整體設計（<a href="/blog/backend/07-security-data-protection/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">Segmentation and Blast Radius Containment</a>）</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Boundary 在 07 案例庫沒有直接 vendor-level 事件、但 PAM / credential rotation / IdP 相關 case 都是它的設計取捨對照：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Boundary 的關係（對照啟示）</th>
      </tr>
  </thead>
  <tbody>
      <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>Boundary + Vault Credential Library 直接解此 case 的 scope map 問題 — 每 session 拿 Vault 簽的 short-lived credential、session 結束自動 revoke、不需要 batch rotation、scope map 由 Vault policy + Boundary role 雙向約束</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/mgm-2023-identity-lateral-impact/" data-link-title="7.R7.1.4 MGM 2023：身分流程被打穿後的營運中斷" data-link-desc="社交工程造成身分邊界失守後，如何演變成可用性與營運衝擊">MGM 2023 Identity Lateral Impact</a></td>
          <td>helpdesk 走 SE 拿到 reset 後的密碼、但 Boundary 仍要求 session 開始時拿 Vault dynamic credential、attacker 在 Vault policy 端被擋；前提是 Boundary OIDC auth method 不依賴可被 SE 重置的 password、IdP 要走 phishing-resistant MFA</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/microsoft-storm-0558-2023-signing-key-chain/" data-link-title="7.R7.1.5 Microsoft Storm-0558 2023：簽章金鑰鏈與郵件存取" data-link-desc="從簽章金鑰保護失效到雲端郵件存取，拆解身分信任鏈的關鍵控制點">Microsoft Storm-0558 Signing Key Chain</a></td>
          <td>Boundary OIDC auth method 依賴上游 IdP signing key、IdP 出事時 Boundary access 也要 rotate；對應啟示是 <em>broker 的 trust chain 取決於上游 IdP</em>、不要把 OIDC 當無責任接口</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>static credential 在離職 / 外洩後仍可用是核心問題、Boundary + Vault Database Secret Engine 直接消除 static credential 存在、改成每 session 簽 short-lived DB user</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">Privileged Access and JIT Authority (section)</a></td>
          <td>Boundary 的 <em>authorize-session</em> 模型是 JIT authority 的具體實作、session 期限 + Vault TTL 雙重約束 blast radius</td>
      </tr>
  </tbody>
</table>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>上游：<a href="/blog/backend/07-security-data-protection/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">7.B Privileged Access and JIT Authority</a>、<a href="/blog/backend/07-security-data-protection/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">7.B Segmentation and Blast Radius Containment</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a>、<a href="/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH</a>、<a href="/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &#43; Device Posture &#43; IdP integration">Cloudflare Access</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>（Credential Library 核心）、<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>（OIDC IdP）</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>（cloud target 的 STS token 來源）、<a href="/blog/backend/05-deployment-platform/vendors/terraform/" data-link-title="Terraform / OpenTofu" data-link-desc="Infrastructure as Code 主流工具">Terraform</a>（target / scope / role 進 IaC）</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>（Boundary audit log → SIEM → IR routing）、<a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">2.3 SSO 攻擊面</a></li>
<li>官方：<a href="https://developer.hashicorp.com/boundary">Boundary Documentation</a></li>
</ul>
]]></content:encoded></item><item><title>Tailscale SSH</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/tailscale-ssh/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/tailscale-ssh/</guid><description>&lt;p>Tailscale 是 WireGuard-based zero-trust mesh VPN、Tailscale SSH 是其上的 SSH on overlay network 模組。核心 mindset 是 &lt;em>不用 SSH key、不用 jump host&lt;/em>：所有 device 加入同一個 tailnet、ACL 控制誰能 SSH 到誰、user identity 從 Tailscale 的 IdP 整合（&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> / Google / Microsoft / GitHub SSO）來。它跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &amp;#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &amp;#43; session recording &amp;#43; JIT、跟 Okta / Vault 互補">Teleport&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &amp;#43; Device Posture &amp;#43; IdP integration">Cloudflare Access&lt;/a> 的差異在 &lt;em>網路模型 + identity binding + audit 深度&lt;/em>、SSH 管理能力本身都具備 — Tailscale 走 overlay mesh + identity-bound SSH，Teleport 走 Identity-Aware Proxy + first-class session recording，Boundary 走 network broker + dynamic credential。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Tailscale 的核心定位是 &lt;em>WireGuard overlay mesh + identity-bound 連線&lt;/em>、Tailscale SSH 是其上 &lt;em>取代 sshd 的 SSH 模組&lt;/em>。底層是 Tailscale daemon（每台 device 跑、建立 WireGuard tunnel）+ Tailscale control plane（管 ACL、key exchange、IdP integration、node enrollment）。Tailscale SSH 不是把 OpenSSH 套上 VPN — 它是把 SSH server 換成 Tailscale daemon 內建版本、用 tailnet identity 取代 SSH key、ACL 跟 sshd 設定脫鉤。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &amp;#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &amp;#43; session recording &amp;#43; JIT、跟 Okta / Vault 互補">Teleport&lt;/a> 比、Tailscale 走 &lt;em>zero-config + developer-friendly&lt;/em>、Teleport 走 &lt;em>audit-first + compliance-friendly&lt;/em> — Teleport session recording / RBAC / approval workflow 是 first-class、Tailscale Enterprise 才補 session recording、approval workflow 偏簡單。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary&lt;/a> 比、Boundary 是 &lt;em>network broker&lt;/em>（client → broker → target、target 不在 client 網路上）、Tailscale 是 &lt;em>overlay network&lt;/em>（client / target 都在 tailnet 上、直接點對點）；Boundary 配 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault&lt;/a> 發 dynamic credential、Tailscale 直接 bypass credential。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &amp;#43; Device Posture &amp;#43; IdP integration">Cloudflare Access&lt;/a> 比、Cloudflare Access 走 &lt;em>application-layer reverse proxy&lt;/em>、Tailscale 走 &lt;em>network-layer mesh&lt;/em>；application（HTTP / API）走 Cloudflare、機器存取（SSH / RDP / DB port）走 Tailscale。&lt;/p></description><content:encoded><![CDATA[<p>Tailscale 是 WireGuard-based zero-trust mesh VPN、Tailscale SSH 是其上的 SSH on overlay network 模組。核心 mindset 是 <em>不用 SSH key、不用 jump host</em>：所有 device 加入同一個 tailnet、ACL 控制誰能 SSH 到誰、user identity 從 Tailscale 的 IdP 整合（<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> / Google / Microsoft / GitHub SSO）來。它跟 <a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a> / <a href="/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary</a> / <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &#43; Device Posture &#43; IdP integration">Cloudflare Access</a> 的差異在 <em>網路模型 + identity binding + audit 深度</em>、SSH 管理能力本身都具備 — Tailscale 走 overlay mesh + identity-bound SSH，Teleport 走 Identity-Aware Proxy + first-class session recording，Boundary 走 network broker + dynamic credential。</p>
<h2 id="服務定位">服務定位</h2>
<p>Tailscale 的核心定位是 <em>WireGuard overlay mesh + identity-bound 連線</em>、Tailscale SSH 是其上 <em>取代 sshd 的 SSH 模組</em>。底層是 Tailscale daemon（每台 device 跑、建立 WireGuard tunnel）+ Tailscale control plane（管 ACL、key exchange、IdP integration、node enrollment）。Tailscale SSH 不是把 OpenSSH 套上 VPN — 它是把 SSH server 換成 Tailscale daemon 內建版本、用 tailnet identity 取代 SSH key、ACL 跟 sshd 設定脫鉤。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a> 比、Tailscale 走 <em>zero-config + developer-friendly</em>、Teleport 走 <em>audit-first + compliance-friendly</em> — Teleport session recording / RBAC / approval workflow 是 first-class、Tailscale Enterprise 才補 session recording、approval workflow 偏簡單。跟 <a href="/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary</a> 比、Boundary 是 <em>network broker</em>（client → broker → target、target 不在 client 網路上）、Tailscale 是 <em>overlay network</em>（client / target 都在 tailnet 上、直接點對點）；Boundary 配 <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、Tailscale 直接 bypass credential。跟 <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &#43; Device Posture &#43; IdP integration">Cloudflare Access</a> 比、Cloudflare Access 走 <em>application-layer reverse proxy</em>、Tailscale 走 <em>network-layer mesh</em>；application（HTTP / API）走 Cloudflare、機器存取（SSH / RDP / DB port）走 Tailscale。</p>
<p>關鍵張力：<em>developer 易用性</em> ↔ <em>audit / compliance 深度</em> 是 Tailscale 客戶的最大 trade-off。Tailscale 把 SSH 變成「裝完 Tailscale 客戶端、加入 tailnet、不用設 sshd」、developer onboarding 從幾天縮到幾分鐘；但 session recording、approval workflow、keystroke audit 在 Enterprise tier 才有、且深度仍不及 Teleport。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Tailscale 在 access stack 承擔哪一段（mesh network / identity-bound SSH / Funnel external access）、哪些要外接（<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> IdP、<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> audit log、Teleport 補 session recording）</li>
<li>ACL JSON policy 的 ownership 設計（src / dst / group / tag、誰寫、誰 review、tag 命名空間如何治理）</li>
<li>Tailscale SSH vs Teleport vs Boundary vs Cloudflare Access 的選型判讀</li>
<li>何時用 Tailscale、何時補上 Teleport（compliance）、何時補上 Boundary（dynamic credential）</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Tailscale SSH deployment 是否健康、最少看四件事：</p>
<ul>
<li><strong>ACL 是否走 tag 而非 IP</strong>：production node 是否標 <code>tag:prod-*</code>、ACL 用 tag / group 寫（<code>src: [&quot;group:sre&quot;]</code>、<code>dst: [&quot;tag:prod-db:22&quot;]</code>）而非寫 device hostname；ACL JSON 是否進版控（Git → Tailscale GitOps integration）、change 經 PR review</li>
<li><strong>Identity provider 是不是組織 IdP</strong>：tailnet 是否綁 <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> / Google Workspace / Microsoft Entra ID、user 從 IdP SCIM 同步、離職時 IdP deprovision 是否連動 tailnet（不是手動撤 tailnet user）</li>
<li><strong>Tailscale SSH 是否取代 sshd</strong>：production node 是否關掉 OpenSSH 的 port 22 listener、只允許 Tailscale SSH（避免 fallback 到 SSH key auth、繞過 tailnet ACL）</li>
<li><strong>Audit log 是否進 SIEM</strong>：Tailscale audit log（device add / ACL change / SSH session start）是否串到 <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>、跟 IdP log correlation；Enterprise tier 的 SSH session recording 是否啟用</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">Identity Access Boundary</a> 的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Tailnet 與 Node enrollment</strong>：Tailnet 是一個邏輯網路（一個組織通常一個）、Node 是加入 tailnet 的 device（laptop / server / container）。Enrollment 兩種路徑 — <em>interactive</em>（人類 device 跑 <code>tailscale up</code>、瀏覽器跳 IdP 登入）、<em>auth key</em>（ephemeral / reusable / preauthorized key、CI / IaC 用）。Production server 通常用 <em>auth key + tag</em> 加入、tag 在 enrollment 時就綁定、不能事後改。</p>
<p><strong>ACL JSON policy</strong>：Tailscale ACL 是 HuJSON（JSON with comments）文件、由 <code>acls</code> / <code>groups</code> / <code>tagOwners</code> / <code>ssh</code> 區塊組成。<code>acls</code> 寫 <code>action: accept</code> + <code>src</code> + <code>dst</code> + <code>proto</code> + <code>port</code>、<code>groups</code> 把 user 抽成角色（<code>group:sre</code>、<code>group:helpdesk</code>）、<code>tagOwners</code> 控制誰能 mint 某個 tag、<code>ssh</code> 區塊定義誰能用 Tailscale SSH 連到哪些 tag（額外於 <code>acls</code>）。ACL 寫得好不好直接決定 <em>lateral movement blast radius</em>。</p>
<p><strong>Tailscale SSH（取代 sshd）</strong>：Tailscale SSH 是 daemon 內建的 SSH server、user 連線時不出示 SSH key、Tailscale 用 <em>tailnet identity</em>（從 IdP 來）做 authn、用 ACL 的 <code>ssh</code> 區塊做 authz。SSH session 的 OS user 由 ACL 指定（<code>users: [&quot;root&quot;, &quot;ubuntu&quot;]</code>）、不是 user 自己挑。意義是 <em>SSH key rotation 從 lifecycle 移除</em>、user 離職 IdP deprovision 後立即失去所有 SSH access。</p>
<p><strong>Identity provider 整合</strong>：Tailscale 自身不存 password、user identity 完全外包給 IdP。Okta / Google Workspace 通常用 SCIM 同步 user + group、GitHub SSO 走 OAuth、Microsoft Entra ID 走 SAML。Group 從 IdP 同步進 tailnet 後、ACL 直接用 <code>group:sre</code>、<code>group:contractor</code>。IdP 的 MFA / Conditional Access policy 自動套用到 tailnet authn。</p>
<p><strong>Tag-based machine identity</strong>：Tag 是 Tailscale 的 <em>machine identity primitive</em>、語意接近 <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（但 Tailscale-specific、不是 SPIFFE 標準）。Production 用 tag 把 node 分類（<code>tag:prod-db</code>、<code>tag:prod-app</code>、<code>tag:ci-runner</code>）、ACL 用 tag 寫規則。Tag 在 enrollment 時 bind、之後不能改（要重新 enroll）；<code>tagOwners</code> 控制誰能 mint 該 tag、防止 dev tag 升 prod tag。</p>
<p><strong>Subnet Router 與 Exit Node</strong>：<em>Subnet Router</em> 把 on-prem subnet（例如 <code>10.0.0.0/16</code> 的舊資料中心）route 到 tailnet、不用在每台舊機器裝 Tailscale daemon — 適合 legacy infra migration。<em>Exit Node</em> 把所有流量（不只 tailnet）走某個 node 出去、適合 remote worker 需要從固定 IP 出網。兩者都是 mesh 之外的擴展、不是 first-class、容易擴大 blast radius 要謹慎用。</p>
<p><strong>Funnel（external HTTPS access）</strong>：Funnel 把 tailnet 上的 internal service 暴露到 internet（透過 Tailscale relay、Tailscale 出 TLS cert）、適合 webhook receiver、dev preview environment、demo URL。Production-grade external access 應該走 <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &#43; Device Posture &#43; IdP integration">Cloudflare Access</a> 或 reverse proxy + WAF — Funnel 沒有 WAF、bot protection、rate limit，是 <em>zero-config 暴露</em>、不是 <em>production hardened ingress</em>。</p>
<p><strong>跟 OS firewall 互動</strong>：Tailscale 是 overlay network、不取代 OS firewall。Production node 應該用 OS firewall（iptables / nftables / Windows Firewall）封鎖 <em>非 tailnet</em> 流量到 port 22 / 3306 / 5432、只允許 <code>tailscale0</code> 介面進來；不然攻擊者拿到 node IP 後仍能繞過 ACL 直接 SSH。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Tailscale SSH</th>
          <th>Teleport</th>
          <th>Boundary</th>
          <th>Cloudflare Access</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>網路模型</td>
          <td>WireGuard overlay mesh（peer-to-peer）</td>
          <td>Identity-Aware Proxy（client → proxy → target）</td>
          <td>Network broker（client → broker → target）</td>
          <td>Application-layer reverse proxy</td>
      </tr>
      <tr>
          <td>Identity binding</td>
          <td>tailnet identity（IdP-bound、無 SSH key）</td>
          <td>Teleport cert（SSO-issued、short-lived）</td>
          <td>Boundary session token（IdP-bound）</td>
          <td>Cloudflare identity（SSO-issued、跟 ZTNA 整合）</td>
      </tr>
      <tr>
          <td>Session recording</td>
          <td>Enterprise tier、Tailscale-specific</td>
          <td>First-class、所有 tier、tsh play 回放</td>
          <td>無（依賴 target 自身）</td>
          <td>無（屬 application layer、不 record SSH）</td>
      </tr>
      <tr>
          <td>Audit 深度</td>
          <td>ACL change / device add / session start</td>
          <td>Full session recording + RBAC audit + approval</td>
          <td>Session log + dynamic credential audit</td>
          <td>HTTP request log（不適用 SSH）</td>
      </tr>
      <tr>
          <td>Credential model</td>
          <td>No credential（identity-bound）</td>
          <td>Short-lived cert（per-session）</td>
          <td>Dynamic credential（Vault-issued）</td>
          <td>OAuth / JWT（per-request）</td>
      </tr>
      <tr>
          <td>學習曲線</td>
          <td>緩 — 裝 client 即用</td>
          <td>中 — RBAC role / tsh CLI / approval workflow</td>
          <td>陡 — broker / target / credential brokering</td>
          <td>緩 — Cloudflare 既有用戶上手快</td>
      </tr>
      <tr>
          <td>部署模型</td>
          <td>SaaS（Tailscale）+ self-hosted（Headscale OSS）</td>
          <td>Self-hosted / Teleport Cloud</td>
          <td>Self-hosted（HashiCorp）/ HCP Boundary</td>
          <td>SaaS only（Cloudflare）</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>developer-heavy、SSH-first、zero-config 訴求</td>
          <td>Compliance / SOC 2 / 重 audit 場景</td>
          <td>Dynamic credential + Vault 已用</td>
          <td>Application 層存取（HTTP / API）</td>
      </tr>
      <tr>
          <td>退場成本</td>
          <td>低 — 拆 client + 開 sshd 即可</td>
          <td>中 — RBAC / approval workflow 已 codify</td>
          <td>中 — broker 設定 + Vault integration</td>
          <td>中 — ZTNA policy + IdP 整合</td>
      </tr>
  </tbody>
</table>
<p>選 Tailscale SSH 的核心訴求：<em>developer 易用性 + zero-trust mesh + 願意接受 Tailscale 控制面信任</em>、且 audit / compliance 要求是中度而非極致（SOC 2 Type II + 內部 SOX 等級就配 Enterprise tier session recording、HIPAA / FedRAMP / 重 compliance 走 Teleport）。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Tailscale SSH session recording（Enterprise）</strong>：2023 後 Enterprise tier 提供 SSH session 錄影、存到組織自己的 S3 / GCS（不是 Tailscale 控制面）、用 <em>recorder node</em>（tag:tailscale-recorder）攔流量寫盤。意義是 <em>audit 不再依賴 OS-level 工具（auditd / OSSEC）</em>；但跟 Teleport 比、Tailscale recording 仍偏簡單、approval workflow 是基本版、structured query 跟 keystroke replay UI 不如 Teleport。</p>
<p><strong>Subnet Router 的 blast radius</strong>：Subnet Router 把整個 subnet route 到 tailnet、ACL 控制粒度從 <em>device-level</em> 退到 <em>subnet-level</em>（除非搭 tag）— 一台 Subnet Router 給太多人用就是 jump host 復活。production 應該 <em>每個 subnet 至少兩個 Subnet Router</em>（HA）、tag 區分（<code>tag:subnet-router-prod</code>）、ACL 限定誰能透過它走。</p>
<p><strong>Headscale（OSS control plane alternative）</strong>：Headscale 是社群維護的 Tailscale control plane OSS 重實作、self-hosted、跟官方 Tailscale client 相容。適用 <em>資料主權 / air-gapped / 不信任 Tailscale 控制面</em> 場景。代價是 ACL JSON 編輯器 / GitOps / SCIM / IdP integration 都要自己拼、沒有官方 SaaS 的 console UX 跟 SLA。production 用 Headscale 通常配 <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 補 machine identity。</p>
<p><strong>跟 SPIRE workload identity 對照</strong>：Tailscale tag 是 Tailscale-specific 的 machine identity primitive、語意接近 SPIRE 的 SPIFFE ID（<code>spiffe://example.org/prod-db</code>）；差異在 SPIRE 走 SPIFFE 開放標準、跨 platform（Kubernetes / VM / serverless）、tag 只在 tailnet 內有意義。重 multi-platform workload identity 走 SPIRE、SSH access 為主走 Tailscale tag。</p>
<p><strong>Just-In-Time access pattern</strong>：Tailscale 預設是 <em>standing access</em>（user 在 group:sre、永遠能 SSH 到 prod-db）、不是 JIT。要做 JIT 通常 <em>IdP 端做</em>（Okta Workflows 加 user 進 group:sre-oncall、SCIM 同步進 tailnet、ACL 給 group:sre-oncall 對 prod-db 的 SSH 權限）、或 <em>Tailscale API 自寫 ACL 寫入腳本</em>。Teleport / Boundary 有 first-class JIT approval、Tailscale 要自己拼。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>ACL 改錯把全公司鎖在外面</strong>：ACL JSON 寫錯 default deny 規則、Tailscale 控制面套用後沒人能連 — 用 Tailscale 控制面的 ACL preview / test 功能、production 走 GitOps PR review、保留 <code>admin-emergency-access</code> group bypass</li>
<li><strong>離職員工還能 SSH</strong>：IdP deprovision 沒連動 tailnet（手動管 user）— 改走 SCIM 同步 + IdP group binding、ACL 用 group 而非個別 user</li>
<li><strong>OpenSSH 還在 listen port 22 給 fallback</strong>：node 沒關 sshd、攻擊者拿到 IP 後用 SSH key 繞過 tailnet ACL — production node 關掉 sshd、OS firewall 只允許 tailscale0 介面的 22 port</li>
<li><strong>tag 被誤升 prod</strong>：dev user 自己 mint <code>tag:prod-db</code> 給 node、ACL 給 prod-db SSH 權限就此擴散 — <code>tagOwners</code> 限定 <code>tag:prod-*</code> 只有 group:sre 能 mint</li>
<li><strong>Funnel 暴露 internal service</strong>：dev 為了 demo 開 Funnel、忘了關、production data 外洩 — Funnel 走 audit log + alert、預設不該開、要開走 short-lived auth key + tag isolation</li>
<li><strong>Subnet Router 變新 jump host</strong>：一台 Subnet Router 給全公司用 legacy subnet、ACL 退到 subnet-level — tag 區分 router、ACL 限定誰能透過它、HA 跑兩台以上</li>
<li><strong>Audit log 沒進 SIEM</strong>：Tailscale console 看 audit log 很慢、跟 IdP / cloud control plane 沒 correlation — 啟用 Tailscale audit log streaming 到 <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>、跨來源 correlation</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Compliance / SOC 2 / 重 audit</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a></td>
      </tr>
      <tr>
          <td>Dynamic credential + Vault 已用</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary</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 控制面">Vault</a></td>
      </tr>
      <tr>
          <td>Application 層存取（HTTP / API）</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &#43; Device Posture &#43; IdP integration">Cloudflare Access</a></td>
      </tr>
      <tr>
          <td>Workload identity 跨 platform</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></td>
      </tr>
      <tr>
          <td>External HTTPS production ingress</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare WAF</a> + reverse proxy</td>
      </tr>
      <tr>
          <td>Audit 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>
      <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>WireGuard 協定本身的密碼學細節跟 NAT traversal 機制</li>
<li>Tailscale 計費 tier 的逐項功能對照（看 Tailscale 官方 pricing page）</li>
<li>Headscale 完整部署 + GitOps + SCIM 自拼方案</li>
<li>Tailscale 跟 OPNsense / pfSense 等傳統 VPN gateway 的整合</li>
<li>Tailscale 內網 DNS（MagicDNS）跟 split-horizon DNS 的細節</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Tailscale SSH 的關係（對照啟示）</th>
      </tr>
  </thead>
  <tbody>
      <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>Tailscale SSH 走 IdP identity、push MFA fail 後 attacker 仍要拿 IdP 通過 + tailnet enrollment、雙層 mitigation 比 SSH key 強；但 standing tailnet access 本身是風險、需配合 short-lived auth key 或 JIT group assignment</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/microsoft-storm-0558-2023-signing-key-chain/" data-link-title="7.R7.1.5 Microsoft Storm-0558 2023：簽章金鑰鏈與郵件存取" data-link-desc="從簽章金鑰保護失效到雲端郵件存取，拆解身分信任鏈的關鍵控制點">Microsoft Storm-0558 Signing Key Chain</a></td>
          <td>Tailscale 上游 IdP（Okta / Google / Microsoft）signing key 出事時、tailnet enrollment 也跟著受影響、要 force re-auth；Tailscale 自身的 control plane 信任也是同一條鏈、要 audit</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/mgm-2023-identity-lateral-impact/" data-link-title="7.R7.1.4 MGM 2023：身分流程被打穿後的營運中斷" data-link-desc="社交工程造成身分邊界失守後，如何演變成可用性與營運衝擊">MGM 2023 Identity Lateral Impact</a></td>
          <td>Tailscale ACL 做 tag-based scope（helpdesk group 不能 SSH 到 <code>tag:prod-db</code>）、限制 lateral movement blast radius；對照啟示是 helpdesk 工具不該共享 tailnet 跟 prod node、或 ACL 要切乾淨</td>
      </tr>
  </tbody>
</table>
<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/entrypoint-and-server-protection/" data-link-title="7.3 入口治理與伺服器防護" data-link-desc="以問題驅動方式整理對外入口、管理平面與伺服器邊界">7.3 入口治理與伺服器防護</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a>、<a href="/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary</a>、<a href="/blog/backend/07-security-data-protection/vendors/cloudflare-access/" data-link-title="Cloudflare Access" data-link-desc="Zero Trust Network Access (ZTNA)、取代 VPN 的 application-layer access、Argo Tunnel &#43; Device Posture &#43; IdP integration">Cloudflare Access</a></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 補位）、<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">HashiCorp Vault</a>（dynamic credential 補位）</li>
<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</a>（IdP 來源）、<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>（audit log SIEM）、<a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare WAF</a>（external HTTPS production ingress）</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>（tailnet compromise IR routing）</li>
<li>官方：<a href="https://tailscale.com/kb/">Tailscale Documentation</a>、<a href="https://tailscale.com/kb/1193/tailscale-ssh/">Tailscale SSH</a>、<a href="https://github.com/juanfont/headscale">Headscale</a></li>
</ul>
]]></content:encoded></item><item><title>Cloudflare Access</title><link>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudflare-access/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudflare-access/</guid><description>&lt;p>Cloudflare Access 是 application-layer Zero Trust Network Access (ZTNA) portal、定位是 &lt;em>取代 VPN&lt;/em> — 使用者不再先撥 VPN 進內網再連 internal app、而是 IdP 認證後 Access policy 直接判斷能不能進該 application、流量走 Cloudflare global edge。它跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &amp;#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &amp;#43; session recording &amp;#43; JIT、跟 Okta / Vault 互補">Teleport&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &amp;#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH&lt;/a> / &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary&lt;/a> 解 &lt;em>不同層的 access&lt;/em> — Cloudflare Access 解 &lt;em>application 層 ZTNA&lt;/em>、Teleport 解 &lt;em>infrastructure 層 PAM + session recording&lt;/em>、Tailscale 解 &lt;em>device-level mesh VPN&lt;/em>、Boundary 解 &lt;em>credential brokering&lt;/em>。&lt;/p>
&lt;h2 id="服務定位">服務定位&lt;/h2>
&lt;p>Cloudflare Access 的核心責任是 &lt;em>application-level 認證 + authorization&lt;/em>、不是 network-level routing。一個 Application（hostname / subdomain）對應一組 Access Policy（rule with identity / device / network condition）、user 從 &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> / Google / Azure AD / GitHub 等 IdP 認證後、policy engine 決定能不能進、不能進連到 application backend 都沒機會。它是 Cloudflare Zero Trust suite 的核心、跟 &lt;em>WARP client&lt;/em>（device agent）、&lt;em>Gateway&lt;/em>（DNS / HTTP filtering、取代 Cisco Umbrella 類）、&lt;em>Argo Tunnel&lt;/em>（origin-side outbound、不開 ingress port）組成完整 SASE / Cloudflare One 平台。&lt;/p>
&lt;p>跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &amp;#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &amp;#43; session recording &amp;#43; JIT、跟 Okta / Vault 互補">Teleport&lt;/a> 比、Cloudflare Access 走 &lt;em>application-layer + Cloudflare edge&lt;/em>、Teleport 走 &lt;em>infrastructure-layer + 完整 session recording&lt;/em>。需要 keystroke / RDP / kubectl 完整錄影做合規（PCI / HIPAA）走 Teleport、需要把所有 internal web app 收進統一 ZTNA portal 走 Cloudflare Access、兩者並存常見：Teleport 管 SSH / DB / Kubernetes、Cloudflare Access 管 internal web。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &amp;#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH&lt;/a> 比、Tailscale 是 &lt;em>mesh VPN + device-to-device WireGuard&lt;/em>、Cloudflare Access 是 &lt;em>application proxy via edge&lt;/em>。Tailscale 適合 developer 直接 SSH 到雲機、Cloudflare Access 適合 internal app（GitLab / Jenkins / 內部 dashboard）統一收口。跟 &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &amp;#43; DDoS &amp;#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare WAF&lt;/a> 的關係：同 Cloudflare 控制面、共用 API token / Audit Log / Logpush、但解不同問題 — WAF 防 &lt;em>public app&lt;/em>（attacker 從外打 production web）、Access 防 &lt;em>internal app&lt;/em>（員工 / 廠商存取後台）、兩者常在同一個 Cloudflare account 共存。&lt;/p></description><content:encoded><![CDATA[<p>Cloudflare Access 是 application-layer Zero Trust Network Access (ZTNA) portal、定位是 <em>取代 VPN</em> — 使用者不再先撥 VPN 進內網再連 internal app、而是 IdP 認證後 Access policy 直接判斷能不能進該 application、流量走 Cloudflare global edge。它跟 <a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a> / <a href="/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH</a> / <a href="/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary</a> 解 <em>不同層的 access</em> — Cloudflare Access 解 <em>application 層 ZTNA</em>、Teleport 解 <em>infrastructure 層 PAM + session recording</em>、Tailscale 解 <em>device-level mesh VPN</em>、Boundary 解 <em>credential brokering</em>。</p>
<h2 id="服務定位">服務定位</h2>
<p>Cloudflare Access 的核心責任是 <em>application-level 認證 + authorization</em>、不是 network-level routing。一個 Application（hostname / subdomain）對應一組 Access Policy（rule with identity / device / network condition）、user 從 <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> / Google / Azure AD / GitHub 等 IdP 認證後、policy engine 決定能不能進、不能進連到 application backend 都沒機會。它是 Cloudflare Zero Trust suite 的核心、跟 <em>WARP client</em>（device agent）、<em>Gateway</em>（DNS / HTTP filtering、取代 Cisco Umbrella 類）、<em>Argo Tunnel</em>（origin-side outbound、不開 ingress port）組成完整 SASE / Cloudflare One 平台。</p>
<p>跟 <a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a> 比、Cloudflare Access 走 <em>application-layer + Cloudflare edge</em>、Teleport 走 <em>infrastructure-layer + 完整 session recording</em>。需要 keystroke / RDP / kubectl 完整錄影做合規（PCI / HIPAA）走 Teleport、需要把所有 internal web app 收進統一 ZTNA portal 走 Cloudflare Access、兩者並存常見：Teleport 管 SSH / DB / Kubernetes、Cloudflare Access 管 internal web。跟 <a href="/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH</a> 比、Tailscale 是 <em>mesh VPN + device-to-device WireGuard</em>、Cloudflare Access 是 <em>application proxy via edge</em>。Tailscale 適合 developer 直接 SSH 到雲機、Cloudflare Access 適合 internal app（GitLab / Jenkins / 內部 dashboard）統一收口。跟 <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare WAF</a> 的關係：同 Cloudflare 控制面、共用 API token / Audit Log / Logpush、但解不同問題 — WAF 防 <em>public app</em>（attacker 從外打 production web）、Access 防 <em>internal app</em>（員工 / 廠商存取後台）、兩者常在同一個 Cloudflare account 共存。</p>
<p>關鍵張力：<em>Cloudflare 控制面信任成本</em> ↔ <em>統一 ZTNA portal 的工程紅利</em> 是 Cloudflare Access 客戶的長期取捨。Cloudflare 自家 control plane 出事（<a href="/blog/backend/07-security-data-protection/cases/cloudflare-control-plane-token-2023/" data-link-title="7.C2 Cloudflare：2023 Control-plane Token 事件" data-link-desc="控制面 token 事件如何回寫 secrets 與機器憑證治理。">Cloudflare 2023 control plane token</a>）會直接打到 Access policy 變更權、客戶側必須有非 Cloudflare 路徑的 break-glass。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本頁、讀者能判斷：</p>
<ol>
<li>Cloudflare Access 在 ZTNA / PAM stack 中承擔哪一段（application access）、哪些要外接（<a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a> 管 infrastructure session、<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> 管 IdP source of truth）</li>
<li>Application + Access Policy + Argo Tunnel 三者的 ownership 設計（誰建 Application、誰寫 policy、誰跑 cloudflared agent）</li>
<li>Cloudflare control plane 信任邊界 — 自家事故的 blast radius 跟客戶側 break-glass 預案</li>
<li>何時用 Cloudflare Access、何時走 Teleport / Tailscale / Zscaler 的取捨</li>
</ol>
<h2 id="最短判讀路徑">最短判讀路徑</h2>
<p>判斷 Cloudflare Access deployment 是否健康、最少看四件事：</p>
<ul>
<li><strong>誰能改 Access Policy</strong>：Cloudflare account 的 Super Admin / Access Admin 人數、policy change 是否走 Terraform / API + PR review、是否有 IdP claim 跟 Cloudflare group 雙重 enforcement</li>
<li><strong>Application 收口完整度</strong>：internal web / SSH / RDP / API 是否都進 Application 清單、是否還有 <em>bypass Cloudflare 直連 origin</em> 的暴露 IP、Argo Tunnel 是否強制（origin 防火牆只開 cloudflared outbound、不開 ingress）</li>
<li><strong>Device Posture / Service Auth 治理</strong>：human user 是否有 WARP + Device Posture 檢查（OS 版本 / EDR / disk encryption）、non-human（CI / 機器）是否走 Service Auth（mTLS cert / service token）而非共用 user account</li>
<li><strong>Logpush + break-glass</strong>：Access event / Audit Log 是否 Logpush 到 <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> 或外部 SIEM、Cloudflare 自家 control plane 出事時是否有 <em>非 Cloudflare</em> 路徑可進關鍵 application（例如 emergency bastion 走獨立 IdP）</li>
</ul>
<p>四件事任一缺失、就是 <a href="/blog/backend/07-security-data-protection/identity-access-boundary/" data-link-title="7.2 身分與授權邊界" data-link-desc="以問題驅動方式整理身分、授權、會話與供應商身分鏈">Identity and Access Boundary</a> 邊界的待補項目。</p>
<h2 id="日常操作與決策形狀">日常操作與決策形狀</h2>
<p><strong>Application + Access Policy</strong>：Application 是 first-class concept、對應一個 hostname（<code>gitlab.internal.example.com</code>）或一組 subdomain。Application 綁多個 Access Policy、每個 policy 是 <em>Allow / Block / Bypass</em> rule、條件可組合 identity（IdP group / email / SAML claim）、device（Device Posture 結果 / WARP enrolled）、network（country / IP range / Service Token）。policy 順序決定優先級、第一個 match 的生效。Production 寫法是 <em>deny by default + allow specific group</em>、不是 <em>allow all + block bad</em>。</p>
<p><strong>IdP integration</strong>：Cloudflare Access 不存身份、只接 IdP — SAML / OIDC 對 <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> / Azure AD / Google Workspace、OAuth 對 GitHub / GitLab、One-Time PIN 對外部廠商（沒 IdP 的合作方）。同一個 Application 可接多 IdP、policy 用 <code>identity.email ends with @vendor.com</code> 區分。IdP 是 source of truth、Cloudflare 是 enforcement point — IdP 出事（Okta / Azure AD 故障或被打）會直接擋住所有 Access user 登入、break-glass 預案必要。</p>
<p><strong>Argo Tunnel（cloudflared）</strong>：internal app 不開 ingress port、不需要 public IP、由 <code>cloudflared</code> agent 在 origin 主動建 outbound tunnel 到 Cloudflare edge。攻擊面從「IP + port + WAF rule」收成「cloudflared agent + Tunnel token」— attacker 從外掃不到 origin，必須先拿到 Tunnel token 或 compromise cloudflared host。Argo Tunnel 的 token 是高敏 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> 或 cloud secret manager、定期 rotate。</p>
<p><strong>Browser-based SSH / RDP / VNC</strong>：Cloudflare Access 對 SSH / RDP / VNC 提供 browser-based render — user 不裝 SSH client、瀏覽器直接連、session 經 Cloudflare edge proxy。可 log session metadata（user / app / time）但 <em>不像 Teleport 完整錄 keystroke / 螢幕</em>。合規場景（PCI 要求 session recording）需要外接 Teleport 或自己跑 session recording proxy、Cloudflare Access 解決的是 access enforcement 不是 audit replay。</p>
<p><strong>Service Auth（non-human access）</strong>：CI runner / 機器人 / API client 走 Service Auth、不需要 user identity。兩種模式：<em>mTLS</em>（client cert + Cloudflare 驗 CA）、<em>Service Token</em>（HTTP header 帶 <code>CF-Access-Client-Id</code> + <code>CF-Access-Client-Secret</code>）。token 進 <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> 或 GitHub Actions secret、定期 rotate、access log 標 service token ID 做事後追蹤。</p>
<p><strong>Device Posture</strong>：跟 WARP client / Gateway 整合、policy 可加 device 條件 — OS 版本最低、EDR（CrowdStrike / SentinelOne）running、disk encryption enabled、device certificate 已 enrolled。Device Posture check fail 時 deny access 或 fallback 到只讀 application。對應 <a href="/blog/backend/07-security-data-protection/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">zero-trust workforce architecture</a> 的章節原則。</p>
<p><strong>Gateway DNS / HTTP filtering</strong>：Cloudflare Gateway 是 secure web gateway（SWG）、取代 Cisco Umbrella / Zscaler ZIA 類。WARP client 把 device DNS / HTTP traffic 導到 Gateway、policy 過濾 malicious domain / category / DLP。跟 Access 共用 Cloudflare 帳號、policy 跨 Access + Gateway + WARP 統一 — 這是 Cloudflare One / SASE 的核心賣點。</p>
<p><strong>Logpush 進 SIEM</strong>：Access event（login / policy decision / session）+ Audit Log（policy change / admin action）透過 Logpush 推到 S3 / GCS / Splunk HEC / Datadog / Elastic。跟 <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare WAF</a> 共用同一個 Logpush job 配置、SIEM 端做 cross-product correlation（WAF block + Access deny 同 IP）。</p>
<h2 id="核心取捨表">核心取捨表</h2>
<table>
  <thead>
      <tr>
          <th>取捨維度</th>
          <th>Cloudflare Access</th>
          <th>Teleport</th>
          <th>Tailscale SSH</th>
          <th>Zscaler ZIA / ZPA</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>控制層級</td>
          <td>Application layer（hostname / subdomain）</td>
          <td>Infrastructure layer（SSH / DB / k8s / RDP）</td>
          <td>Network layer（device mesh WireGuard）</td>
          <td>Network + application（SASE 整套）</td>
      </tr>
      <tr>
          <td>流量路徑</td>
          <td>Cloudflare global edge proxy</td>
          <td>Teleport proxy（self-hosted / Cloud）</td>
          <td>Device-to-device WireGuard（peer-to-peer）</td>
          <td>Zscaler global cloud</td>
      </tr>
      <tr>
          <td>Session 錄影</td>
          <td>不錄 keystroke、只記 metadata</td>
          <td>完整 keystroke / 螢幕 / kubectl 錄影</td>
          <td>不錄（mesh 性質）</td>
          <td>HTTP / web session 可錄、SSH 弱</td>
      </tr>
      <tr>
          <td>取代 VPN</td>
          <td>強 — application-layer ZTNA 核心訴求</td>
          <td>部分 — 偏 PAM、需配 VPN 補 catch-all</td>
          <td>強 — mesh VPN 直接替代</td>
          <td>強 — ZPA 核心訴求</td>
      </tr>
      <tr>
          <td>Origin 暴露</td>
          <td>Argo Tunnel：origin 零 ingress</td>
          <td>Proxy 收口：origin 只開 Teleport node port</td>
          <td>不需 ingress：mesh peer 直連</td>
          <td>App connector：類似 Argo Tunnel</td>
      </tr>
      <tr>
          <td>IdP integration</td>
          <td>SAML / OIDC / OAuth、One-Time PIN for vendor</td>
          <td>SAML / OIDC</td>
          <td>SSO via IdP（簡單）</td>
          <td>SAML / OIDC</td>
      </tr>
      <tr>
          <td>計費</td>
          <td>Free（50 user）/ Standard / Premium per-user</td>
          <td>Per-user（Teleport Cloud / Enterprise）</td>
          <td>Per-user（含 free tier）</td>
          <td>Per-user enterprise license</td>
      </tr>
      <tr>
          <td>適合場景</td>
          <td>Internal web app + browser SSH/RDP 統一 portal</td>
          <td>Infrastructure access + 合規 session recording</td>
          <td>Developer SSH mesh + 小型 team</td>
          <td>大型企業全 SASE（含 SWG / CASB / DLP）</td>
      </tr>
      <tr>
          <td>退場成本</td>
          <td>中 — policy 跟 Tunnel 改設可遷</td>
          <td>中 — session log 鎖在 Teleport</td>
          <td>低 — WireGuard 標準</td>
          <td>高 — 全 stack 鎖在 Zscaler</td>
      </tr>
  </tbody>
</table>
<p>選 Cloudflare Access 的核心訴求：<em>application-layer ZTNA 取代 VPN</em> + <em>internal web app 為主 + 偶爾 browser SSH/RDP</em> + <em>已用 Cloudflare WAF / CDN 控制面</em>。需要 infrastructure-level session recording 走 Teleport、developer SSH mesh 為主走 Tailscale、要全 SASE / SWG / CASB 套裝走 Zscaler。</p>
<h2 id="進階主題">進階主題</h2>
<p><strong>Service Auth 的 non-human access 設計</strong>：CI / 機器人 / 第三方 API client 不該共用 user account、改走 Service Token 或 mTLS。設計重點：<em>token 不進 git</em>（<a href="/blog/backend/07-security-data-protection/vendors/hashicorp-vault/" data-link-title="HashiCorp Vault" data-link-desc="Self-hosted secret management 與 dynamic credential / encryption-as-a-service / PKI engine、跨雲跨環境的 secret 控制面">Vault</a> / GitHub Actions secret）、<em>per-service token</em>（不共用、追蹤責任）、<em>rotation lifecycle</em>（90 天 / 半年 rotate）、<em>access log 標 token ID</em>（事後追責）。token leak 的處理是 <em>rotate + audit log review</em>、不是 <em>all-users password reset</em>。</p>
<p><strong>Device Posture + EDR 整合</strong>：Gateway / WARP 可接 CrowdStrike Falcon / SentinelOne / Microsoft Defender for Endpoint 的 device health、policy 可寫 <code>require posture: crowdstrike.running == true AND crowdstrike.last_check &lt; 1h</code>。意義是 endpoint compromise 時 EDR 標紅、Access policy 自動 deny — 不需要 SOC 手動把 user disable。前提是 EDR fleet coverage 接近 100%、不然 fallback 設不好會誤殺。</p>
<p><strong>Cloudflare One（Access + WARP + Gateway + Magic Transit）</strong>：Cloudflare 把 ZTNA + SWG + CASB + 網路骨幹整成 SASE 套裝、競爭對手是 Zscaler / Netskope / Palo Alto Prisma Access。買整套的紅利是 policy / log / IdP 統一、痛點是 <em>Cloudflare 控制面信任成本指數放大</em> — 一個 admin 角色失控影響 Access + Gateway + WAF + DNS 全部、不只是單一產品。</p>
<p><strong>跟 <a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare WAF</a> 共用 control plane 的取捨</strong>：紅利是同一 Logpush job / 同一 API token 管理 / 同一 Audit Log、SIEM 端 correlation 容易。信任成本是 <a href="/blog/backend/07-security-data-protection/cases/cloudflare-control-plane-token-2023/" data-link-title="7.C2 Cloudflare：2023 Control-plane Token 事件" data-link-desc="控制面 token 事件如何回寫 secrets 與機器憑證治理。">Cloudflare 2023 control plane token</a> 那類事故會同時影響 WAF rule + Access policy + DNS、客戶側必須有 <em>non-Cloudflare break-glass</em>（例如保留一條 emergency bastion 走獨立 IdP + 獨立網路、不經過 Cloudflare edge）。</p>
<h2 id="排錯與失敗快速判讀">排錯與失敗快速判讀</h2>
<ul>
<li><strong>User 一進 Application 就被 deny</strong>：policy 順序錯（Block rule 在 Allow 前面 match）、或 IdP group claim 沒帶到 — 看 Access log 的 <code>decision_reason</code>、確認 policy 順序跟 IdP claim mapping</li>
<li><strong>Argo Tunnel 斷線 / 找不到 origin</strong>：cloudflared 程序掛或 token 過期、origin 防火牆把 outbound 443 擋了 — 重啟 cloudflared、確認 outbound 規則、token rotate 後重新 deploy</li>
<li><strong>Service Token 大量 leak / 在 GitHub repo 出現</strong>：CI secret 設定錯放成 plaintext、或第三方 vendor commit 了 — Cloudflare dashboard rotate token、audit log 找受影響時間窗、補 secret scanning（<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/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><strong>Device Posture 把合法 user 鎖在外</strong>：EDR agent 暫時離線或 OS 升級導致 posture check fail — fallback 設 graceful（降級到只讀 / 加 step-up MFA）、不是直接 deny；EDR fleet coverage 沒到位前不要 hard enforcement</li>
<li><strong>IdP 出事 Access user 全進不來</strong>：Okta / Azure AD downtime 把 Access login 全鎖死 — break-glass 走 <em>Service Token + 緊急 Application</em>（不接 IdP、只接 mTLS / token），預先 staging tested</li>
<li><strong>Bypass 流量直連 origin</strong>：Application 收口不完整、origin 還有 public IP + 沒設 firewall 只接 Cloudflare IP — Argo Tunnel 收完、origin firewall 只允許 Cloudflare IP range 或完全只開 cloudflared outbound</li>
<li><strong>Cloudflare control plane 出事</strong>：Cloudflare 自家 admin token / control plane 被打、客戶側 Access policy 暫時改不了或被偷改 — 預案：保留 <em>非 Cloudflare emergency bastion</em> + 關鍵 application 的 Logpush 進外部 SIEM（不只 Cloudflare dashboard）</li>
</ul>
<h2 id="何時改走其他服務">何時改走其他服務</h2>
<table>
  <thead>
      <tr>
          <th>需求形狀</th>
          <th>改走</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Infrastructure access + 合規錄影</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a></td>
      </tr>
      <tr>
          <td>Developer SSH mesh / 小型 team</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH</a></td>
      </tr>
      <tr>
          <td>Credential brokering / 動態 DB cred</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary</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 控制面">Vault</a></td>
      </tr>
      <tr>
          <td>全 SASE 套裝（SWG + CASB + DLP）</td>
          <td>Zscaler / Netskope / Palo Alto Prisma Access</td>
      </tr>
      <tr>
          <td>Public app 入口防護</td>
          <td><a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare WAF</a> / <a href="/blog/backend/07-security-data-protection/vendors/aws-waf/" data-link-title="AWS WAF" data-link-desc="AWS-internal WAF、跟 ALB / CloudFront / API Gateway 直接整合、Web ACL &#43; Managed Rule Group &#43; Rate-based Rule、Shield Standard 內含">AWS WAF</a></td>
      </tr>
      <tr>
          <td>IdP 本體（身份 source of truth）</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> / <a href="/blog/backend/07-security-data-protection/vendors/keycloak/" data-link-title="Keycloak" data-link-desc="Open source self-hosted Identity Provider、Red Hat 主導、Realm-based multi-tenancy、適合資料主權與自訂 flow 需求">Keycloak</a></td>
      </tr>
      <tr>
          <td>SIEM 接 Access log</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>Cloudflare WARP client 完整部署 / device enrollment 細節</li>
<li>Gateway DNS / HTTP filtering 完整 policy 語法</li>
<li>Cloudflare One / Magic Transit / Magic WAN 的網路骨幹細節（屬 SD-WAN / SASE 整套架構、不在 ZTNA 範圍）</li>
<li>cloudflared agent 進階配置（multi-region / HA / load balancing）</li>
<li>Cloudflare account / API token 管理本身（屬 Cloudflare 平台治理、跨產品共用）</li>
</ul>
<h2 id="案例回寫">案例回寫</h2>
<p>Cloudflare Access 在 07 案例庫的關聯來自 <em>Cloudflare 控制面信任</em> 跟 <em>IdP 上游事故傳導</em>：</p>
<table>
  <thead>
      <tr>
          <th>案例</th>
          <th>跟 Cloudflare Access 的關係（對照啟示）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/cases/cloudflare-control-plane-token-2023/" data-link-title="7.C2 Cloudflare：2023 Control-plane Token 事件" data-link-desc="控制面 token 事件如何回寫 secrets 與機器憑證治理。">Cloudflare Control Plane Token 2023</a></td>
          <td>Cloudflare 自家 control plane 出事時、Access policy 變更權跟著受影響、客戶側必須有非 Cloudflare 路徑的 break-glass、關鍵 application 的 Logpush 進外部 SIEM</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/mgm-2023-identity-lateral-impact/" data-link-title="7.R7.1.4 MGM 2023：身分流程被打穿後的營運中斷" data-link-desc="社交工程造成身分邊界失守後，如何演變成可用性與營運衝擊">MGM 2023 Identity Lateral Impact</a></td>
          <td>Cloudflare Access 在 helpdesk SE 拿到 IdP credential 後、Device Posture + Application policy + Service Token 是額外 hop 成本、不是 IdP 一拿就全通</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/07-security-data-protection/red-team/cases/identity-access/okta-cloudflare-2023-support-supply-chain/" data-link-title="7.R7.1.2 Okta &#43; Cloudflare 2023：支援流程與身分供應鏈" data-link-desc="支援工單與第三方身份供應商路徑如何變成入侵鏈的一部分">Okta-Cloudflare 2023 Support Supply Chain</a></td>
          <td>上游 IdP（Okta）出事傳導到 Cloudflare Access enrollment、需要 force re-auth + service token rotate + Logpush audit 找受影響時間窗、IdP 跟 Access 不可同時失能</td>
      </tr>
  </tbody>
</table>
<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/blue-team/" data-link-title="7.B 防守者視角（藍隊）與控制面驗證" data-link-desc="從防守者角度整理控制面、偵測路由、驗證策略與演練回寫">zero-trust workforce architecture</a></li>
<li>平行：<a href="/blog/backend/07-security-data-protection/vendors/teleport/" data-link-title="Teleport" data-link-desc="Identity-Aware Proxy &#43; PAM、SSH / DB / K8s / Desktop session 統一 short-lived cert &#43; session recording &#43; JIT、跟 Okta / Vault 互補">Teleport</a>、<a href="/blog/backend/07-security-data-protection/vendors/tailscale-ssh/" data-link-title="Tailscale SSH" data-link-desc="WireGuard-based zero-trust mesh &#43; identity-bound SSH、ACL JSON policy、developer-friendly、跟 IdP integration 取代 SSH key">Tailscale SSH</a>、<a href="/blog/backend/07-security-data-protection/vendors/boundary/" data-link-title="HashiCorp Boundary" data-link-desc="Identity-based access broker、跟 Vault 同生態組合（Boundary 控連線 / Vault 給 credential）、Multi-hop Worker 跨網路分段">Boundary</a></li>
<li>下游：<a href="/blog/backend/07-security-data-protection/vendors/cloudflare-waf/" data-link-title="Cloudflare WAF" data-link-desc="Edge WAF &#43; DDoS &#43; Bot management 整合套件、global anycast 網路、控制面信任邊界跟客戶側補強的對照">Cloudflare WAF</a>（共用 control plane）、<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>（Logpush 目的地）</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</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>（IdP source）、<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>（Tunnel token / Service Token 儲存）</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>（Access deny / 異常登入 routing）、<a href="/blog/backend/05-deployment-platform/vendors/" data-link-title="部署平台 Vendor 清單" data-link-desc="規劃 workload runtime、orchestration、traffic、IaC 與 discovery 的服務頁撰寫順序與判準">5 deployment vendors</a>（Argo Tunnel + CI 部署整合）</li>
<li>官方：<a href="https://developers.cloudflare.com/cloudflare-one/">Cloudflare Zero Trust Documentation</a></li>
</ul>
]]></content:encoded></item></channel></rss>