<?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>Transport on Tarragon</title><link>https://tarrragon.github.io/blog/tags/transport/</link><description>Recent content in Transport on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/transport/index.xml" rel="self" type="application/rss+xml"/><item><title>Transport 安全</title><link>https://tarrragon.github.io/blog/monitoring/07-security-privacy/transport-security/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/07-security-privacy/transport-security/</guid><description>&lt;p>Transport 安全保護監控資料在從 SDK 傳送到 collector 的過程中不被竊聽或篡改。即使 SDK 端做了 redaction，傳輸中的資料仍然包含使用者行為、系統狀態、error 訊息等有價值的資訊 — 這些資訊在未加密的傳輸中可以被同網段的任何人攔截。&lt;/p>
&lt;h2 id="同區網也要加密的理由">同區網也要加密的理由&lt;/h2>
&lt;p>自用工具的 SDK 和 collector 通常在同一台機器或同一個區域網路（LAN / Tailscale tailnet）。常見的假設是「同區網不需要加密，因為只有我自己在用」。&lt;/p>
&lt;p>這個假設在以下情境不成立：&lt;/p>
&lt;p>&lt;strong>共用網路&lt;/strong>：咖啡廳、共享辦公室、飯店 WiFi — 同一個 AP 下的其他裝置可以用 ARP spoofing 或 WiFi sniffing 攔截未加密的 HTTP 流量。&lt;/p>
&lt;p>&lt;strong>未來的網路拓撲變更&lt;/strong>：目前在同一台機器上的 SDK 和 collector，可能之後拆到不同的機器或不同的網路段。如果一開始就用 HTTPS，拓撲變更不需要額外的安全調整。&lt;/p>
&lt;p>&lt;strong>養成正確習慣&lt;/strong>：在自用工具上用 HTTP 是因為「反正只有我」，但相同的開發者在商業專案中可能延續這個習慣。從自用工具開始就用 HTTPS，讓加密傳輸成為預設行為。&lt;/p>
&lt;h2 id="https-設定">HTTPS 設定&lt;/h2>
&lt;h3 id="自簽憑證">自簽憑證&lt;/h3>
&lt;p>自用工具和內部服務用自簽憑證（self-signed certificate）就足夠。不需要購買 CA 憑證 — 自簽憑證提供加密（防竊聽）和完整性（防篡改），只是不提供身份驗證（client 無法確認 server 是不是「官方的」）。在自用場景中 server 就是自己架的，身份驗證不是問題。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days &lt;span class="m">365&lt;/span> -nodes&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Go collector 使用自簽憑證：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="nx">http&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">ListenAndServeTLS&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;:8443&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;cert.pem&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;key.pem&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">handler&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>SDK 端需要信任自簽憑證。開發期可以在 HTTP client 設定 &lt;code>badCertificateCallback&lt;/code> 接受自簽憑證；production 應該把自簽憑證加入系統的信任清單。&lt;/p>
&lt;h3 id="lets-encrypt">Let&amp;rsquo;s Encrypt&lt;/h3>
&lt;p>如果 collector 有公開的 domain name，用 Let&amp;rsquo;s Encrypt 取得免費的 CA 憑證。自動續期、不需要手動管理。適合部署在 VPS 或雲端的 collector。&lt;/p>
&lt;h2 id="basic-auth">Basic Auth&lt;/h2>
&lt;p>HTTPS 保護傳輸層（防竊聽），basic auth 保護 endpoint 層（防未授權存取）。兩者互補，缺一不可 — basic auth 在 HTTP 上傳送的是 base64 編碼的帳密，沒有 HTTPS 的加密保護等於明文傳送。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">Authorization: Basic base64(username:password)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>SDK 在每個 HTTP POST request 的 header 中帶上 basic auth。Collector 端驗證帳密，不匹配則回傳 401。&lt;/p>
&lt;p>Basic auth 的帳密管理：&lt;/p>
&lt;ul>
&lt;li>帳密存在 SDK 的設定檔或環境變數中，不硬編碼在程式碼裡&lt;/li>
&lt;li>Collector 端的帳密用 bcrypt hash 儲存，不存明文&lt;/li>
&lt;li>定期輪替帳密（自用工具半年到一年一次即可）&lt;/li>
&lt;/ul>
&lt;h2 id="api-key-替代方案">API Key 替代方案&lt;/h2>
&lt;p>如果不需要 username/password 的雙因素，單一 API key 更簡單。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">X-API-Key: sk_monitor_abc123...&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>API key 的管理比 basic auth 簡單（一個字串而非帳密對），但安全性略低（只有一個 factor）。自用工具場景下 API key 通常足夠。&lt;/p>
&lt;h2 id="下一步路由">下一步路由&lt;/h2>
&lt;ul>
&lt;li>SDK 端的 redaction → &lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/sdk-redaction-api/" data-link-title="SDK Redaction API 設計" data-link-desc="預設 redaction rule 過濾已知敏感欄位、自訂 pattern 擴展應用特有的 secret 格式 — redaction 在 SDK 端執行，敏感資料不離開 client">SDK Redaction API 設計&lt;/a>&lt;/li>
&lt;li>Collector 端的 access control → &lt;a href="https://tarrragon.github.io/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control 實作&lt;/a>&lt;/li>
&lt;li>Server-side 的 secret management → &lt;a href="https://tarrragon.github.io/blog/backend/07-security-data-protection/" data-link-title="模組七：資安與資料保護" data-link-desc="以問題驅動方式擴充資安知識網：先定義服務環節問題，再以案例作為觸發式參考">backend 07 資安&lt;/a>&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>Transport 安全保護監控資料在從 SDK 傳送到 collector 的過程中不被竊聽或篡改。即使 SDK 端做了 redaction，傳輸中的資料仍然包含使用者行為、系統狀態、error 訊息等有價值的資訊 — 這些資訊在未加密的傳輸中可以被同網段的任何人攔截。</p>
<h2 id="同區網也要加密的理由">同區網也要加密的理由</h2>
<p>自用工具的 SDK 和 collector 通常在同一台機器或同一個區域網路（LAN / Tailscale tailnet）。常見的假設是「同區網不需要加密，因為只有我自己在用」。</p>
<p>這個假設在以下情境不成立：</p>
<p><strong>共用網路</strong>：咖啡廳、共享辦公室、飯店 WiFi — 同一個 AP 下的其他裝置可以用 ARP spoofing 或 WiFi sniffing 攔截未加密的 HTTP 流量。</p>
<p><strong>未來的網路拓撲變更</strong>：目前在同一台機器上的 SDK 和 collector，可能之後拆到不同的機器或不同的網路段。如果一開始就用 HTTPS，拓撲變更不需要額外的安全調整。</p>
<p><strong>養成正確習慣</strong>：在自用工具上用 HTTP 是因為「反正只有我」，但相同的開發者在商業專案中可能延續這個習慣。從自用工具開始就用 HTTPS，讓加密傳輸成為預設行為。</p>
<h2 id="https-設定">HTTPS 設定</h2>
<h3 id="自簽憑證">自簽憑證</h3>
<p>自用工具和內部服務用自簽憑證（self-signed certificate）就足夠。不需要購買 CA 憑證 — 自簽憑證提供加密（防竊聽）和完整性（防篡改），只是不提供身份驗證（client 無法確認 server 是不是「官方的」）。在自用場景中 server 就是自己架的，身份驗證不是問題。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days <span class="m">365</span> -nodes</span></span></code></pre></div><p>Go collector 使用自簽憑證：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="ln">1</span><span class="cl"><span class="nx">http</span><span class="p">.</span><span class="nf">ListenAndServeTLS</span><span class="p">(</span><span class="s">&#34;:8443&#34;</span><span class="p">,</span> <span class="s">&#34;cert.pem&#34;</span><span class="p">,</span> <span class="s">&#34;key.pem&#34;</span><span class="p">,</span> <span class="nx">handler</span><span class="p">)</span></span></span></code></pre></div><p>SDK 端需要信任自簽憑證。開發期可以在 HTTP client 設定 <code>badCertificateCallback</code> 接受自簽憑證；production 應該把自簽憑證加入系統的信任清單。</p>
<h3 id="lets-encrypt">Let&rsquo;s Encrypt</h3>
<p>如果 collector 有公開的 domain name，用 Let&rsquo;s Encrypt 取得免費的 CA 憑證。自動續期、不需要手動管理。適合部署在 VPS 或雲端的 collector。</p>
<h2 id="basic-auth">Basic Auth</h2>
<p>HTTPS 保護傳輸層（防竊聽），basic auth 保護 endpoint 層（防未授權存取）。兩者互補，缺一不可 — basic auth 在 HTTP 上傳送的是 base64 編碼的帳密，沒有 HTTPS 的加密保護等於明文傳送。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">Authorization: Basic base64(username:password)</span></span></code></pre></div><p>SDK 在每個 HTTP POST request 的 header 中帶上 basic auth。Collector 端驗證帳密，不匹配則回傳 401。</p>
<p>Basic auth 的帳密管理：</p>
<ul>
<li>帳密存在 SDK 的設定檔或環境變數中，不硬編碼在程式碼裡</li>
<li>Collector 端的帳密用 bcrypt hash 儲存，不存明文</li>
<li>定期輪替帳密（自用工具半年到一年一次即可）</li>
</ul>
<h2 id="api-key-替代方案">API Key 替代方案</h2>
<p>如果不需要 username/password 的雙因素，單一 API key 更簡單。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">X-API-Key: sk_monitor_abc123...</span></span></code></pre></div><p>API key 的管理比 basic auth 簡單（一個字串而非帳密對），但安全性略低（只有一個 factor）。自用工具場景下 API key 通常足夠。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>SDK 端的 redaction → <a href="/blog/monitoring/07-security-privacy/sdk-redaction-api/" data-link-title="SDK Redaction API 設計" data-link-desc="預設 redaction rule 過濾已知敏感欄位、自訂 pattern 擴展應用特有的 secret 格式 — redaction 在 SDK 端執行，敏感資料不離開 client">SDK Redaction API 設計</a></li>
<li>Collector 端的 access control → <a href="/blog/monitoring/07-security-privacy/collector-access-control/" data-link-title="Collector Access Control 實作" data-link-desc="認證（誰在送資料）/ 授權（允許送什麼）/ access log（誰在什麼時候送了什麼）— collector 端的三層存取控制">Collector Access Control 實作</a></li>
<li>Server-side 的 secret management → <a href="/blog/backend/07-security-data-protection/" data-link-title="模組七：資安與資料保護" data-link-desc="以問題驅動方式擴充資安知識網：先定義服務環節問題，再以案例作為觸發式參考">backend 07 資安</a></li>
</ul>
]]></content:encoded></item></channel></rss>