將秘密掃描的 4 個問題與答案並排呈現的圖。1 什麼是秘密掃描:GitHub 等服務會自動找出程式碼中寫入的金鑰(例如 API 金鑰)。GitHub 會在含有金鑰的程式碼送到公開儲存庫之前先攔下來。已經公開出去的金鑰,會通知發行該金鑰的提供方(例如 Google 或 Slack)。如此一來可防止金鑰外洩與濫用。2 所有系統的金鑰都會受到保護嗎:不會。GitHub 只能辨識出提供方已將金鑰格式送交給 GitHub 的那些金鑰。在 65 個有 API 的商用系統中,GitHub 對照表中有名稱的只有 12 個,日本民間 SaaS 41 個則都沒有出現在對照表中。3 需要自己設定嗎:公開儲存庫中,GitHub 會免費自動搜尋金鑰。公司內部的私人儲存庫,則需要公司付費訂閱 GitHub Secret Protection 並加以啟用。4 除了 GitHub 之外呢:GitLab 只有最頂級的 Ultimate 方案才會在送出前攔截金鑰。調查範圍內,找不到會把日本商用 SaaS 的金鑰通知提供方的服務

如果不小心把 API 金鑰公開到 GitHub,上面真的有人會發現並幫忙攔下來嗎?GitHub 有一套稱為「秘密掃描」的機制。不過,這套機制是否也能保護你正在使用的系統金鑰,以及是否需要自己做任何設定,並不是很多人都知道。

本文將根據 GitHub、GitLab 等官方文件,以及將 IT 整合地圖中確認有 API 的 65 個商用系統與 GitHub 對照表交叉比對的結果,回答 4 個問題。開頭的圖就是這 4 個問題與答案的總覽。引用的原文與詳細數字,都逐行列在調查頁面 什麼是秘密掃描 — 外洩的金鑰由誰攔下 中。


1. 先統一用語

言詞意義金鑰系統用來確認「是否為可使用的對象」的秘密字串。包含密碼、API 金鑰、存取權杖等。本文將這些統稱為「金鑰」API 金鑰金鑰的一種。程式在呼叫其他系統的 API 時,用來表示自己身分而送出的字串。持有 API 金鑰的人可以做出與金鑰持有人相同的操作GitHub用來儲存與分享程式文字(程式碼)的服務儲存庫GitHub 上各開發專案的程式碼放置位置。持有人將儲存庫設為公開後,世界上的任何人都能閱讀該程式碼commit・push開發者在本機記錄程式碼變更稱為 commit,將記錄後的變更送到 GitHub 稱為 push提供方發行金鑰的公司。freee、Google、AWS 等推送保護當含有金鑰的程式碼被 push 時,GitHub 會在接收該程式碼前先阻擋的功能2. 秘密掃描是怎麼運作的

以使用者本機電腦、GitHub、提供方、第三方這 4 方之間的互動,依時間順序由上而下說明秘密掃描機制的流程圖。事先由提供方將自家金鑰的樣式(字串排列規則)送交給 GitHub。開發者把含有金鑰的程式碼 commit 後 push 到 GitHub 時,GitHub 會與樣式比對。樣式已被送交的金鑰(例如 Slack、Google、HubSpot)會在 push 前被攔下並通知;若在公開儲存庫中發現,則會通知提供方,由提供方決定是否撤銷。樣式未被送交的金鑰(例如 freee、kintone、SmartHR)則無法辨識而直接公開,第三方可在數分鐘內撿走,且不會通知提供方,只能靠自己發現並撤銷

秘密掃描是 GitHub 在已放置於 GitHub 的程式碼中,搜尋具有 API 金鑰「樣式」的字串的機制。樣式指的是金鑰字串排列的規則。發行金鑰的提供方會把自家金鑰的樣式送交給 GitHub。

圖的上半部,是樣式已被送交的金鑰(如 Slack、Google、HubSpot 等)的情況。GitHub 會在 push 時找到金鑰,並在程式碼送出之前先攔下來(推送保護)。另外,GitHub 也會在發現已公開的金鑰時通知該金鑰的提供方。

圖的下半部,則是樣式未被送交的金鑰。GitHub 無法將這段字串辨識為金鑰,因此金鑰會直接公開,且不會通知提供方。

📎 機制原文(GitHub Docs)可見於 什麼是秘密掃描 的「機制」。

3. 發現後,會幫忙攔下來嗎

GitHub 上外洩的金鑰在 31 天後確認的結果圓餅圖。74% 仍可使用,26% 已無法使用(Truffle Security)

GitHub 所做的,只到通知提供方為止。要不要撤銷金鑰,則由發行該金鑰的提供方決定。例如 Anthropic(Claude 的提供方)會自動停用外洩的金鑰;另一方面,AWS 則只是替外洩的金鑰加上限制部分操作的設定,金鑰本身仍保持可用狀態。

而且,外洩的金鑰往往不會很快被撤銷。研究人員故意將 AWS 金鑰放到 GitHub 的實驗中,第三方在 1~5 分鐘內就使用了該金鑰。另外,Truffle Security 的調查顯示,GitHub 上外洩的金鑰中,有 74% 在 31 天後仍可使用。

📎 各提供方的處理方式與實驗原文可見於 什麼是秘密掃描 的「攔下來的是提供方」。

4. 如果是我們正在使用的系統金鑰,就安全嗎

將 65 個具有 API 的商用系統與 GitHub 對照表比對的圓餅圖。對照表中有名稱的有 12 個(18.5%,如 Google、Microsoft、HubSpot 等海外 7 家),沒有名稱的有日本民間 SaaS 41 個(63.1%,如 freee、Money Forward、SmartHR、kintone 等)、政府機關 9 個(13.8%,如 e-Gov、e-Tax、eLTAX 等)、海外產品 3 個(4.6%,如 FileMaker、Jotform、Zoho CRM)

IT 整合地圖編輯部將 65 個確認具有 API 的商用系統,與 GitHub 公開的對照表進行比對。對照表中有名稱的只有 12 個,而日本民間 SaaS 41 個全都沒有列入對照表。

使用中的系統公開儲存庫中若金鑰外洩Google・Microsoft・HubSpot・Notion・Shopify・SlackGitHub 會找到金鑰並通知提供方SalesforceGitHub 會找到金鑰,但不會通知提供方;通知只會送給儲存庫擁有者freee・Money Forward・SmartHR・kintone 等日本民間 SaaSGitHub 無法辨識為金鑰,也不會通知提供方日本商用 SaaS 的金鑰,一旦外洩,就要以「不會有任何人通知我們」為前提,自行管理才安全。

📎 65 個系統的清單與各提供方的處理差異,可見於 什麼是秘密掃描 的「你正在使用的系統金鑰,沒問題嗎」。

5. 需要自己設定嗎

儲存庫不做任何設定也會運作的項目需要自己設定的項目公開GitHub 會免費搜尋金鑰,並通知提供方。當使用者 push 含有金鑰的程式碼時,GitHub 會攔下來整個儲存庫的推送保護,需要由儲存庫管理者啟用公司(組織)的私人儲存庫秘密掃描不會運作公司需訂閱 GitHub Team 以上,並啟用付費的 GitHub Secret Protection個人的私人儲存庫秘密掃描不會運作只有企業管理使用者(Enterprise Managed Users)帳號,才能使用秘密掃描如果公司的程式碼放在私人儲存庫中,不代表 GitHub 一定有在搜尋金鑰。請先確認公司的合約與設定。即使對照表中沒有的金鑰,只要是組織的儲存庫,組織也可以自己補上金鑰樣式,讓 GitHub 幫忙搜尋。不過這種情況下,通知也只會在公司內部流通,金鑰仍需要由你們自己撤銷。

📎 是否需要設定的原文可見於 什麼是秘密掃描 的「需不需要自己設定」。

6. GitHub 以外的情況如何

比較 GitHub 以外服務是否能搜尋金鑰、在送出前攔截、以及通知提供方的表格。GitHub 在公開儲存庫可免費自動搜尋、可在送出前攔截、並通知對照表中的提供方。GitLab 全方案皆可搜尋,但需在 CI 中加入設定;只有最頂級的 Ultimate 才能在送出前攔截;通知提供方則僅限公開或 Ultimate 專案中的 AWS、Google Cloud 等 4 種。Bitbucket Cloud 可透過在 CI 加入元件來搜尋,但無法找到攔截與通知的機制。Azure DevOps 則是付費附加功能,且不是通知,而只是詢問該金鑰是否可用。手邊工具(如 Gitleaks、TruffleHog)可在 commit 前攔截,但不會通知提供方。這些服務中,都沒有找到會把日本商用 SaaS 的金鑰通知提供方的機制

GitLab 也有相同的機制。不過,GitLab 只有最頂級的 Ultimate 方案才會在送出前攔下金鑰。GitLab 也只有在公開或 Ultimate 專案中,針對 AWS、Google Cloud 等 4 種金鑰,才會通知提供方。Bitbucket 的雲端版則是由使用者在 CI 中加入元件來搜尋金鑰。Azure DevOps 的金鑰搜尋功能則屬於付費附加功能。

Gitleaks 和 TruffleHog 是在本機電腦上搜尋金鑰的工具。這些工具可以在 commit 之前攔下金鑰,但不會通知提供方。調查範圍內,沒有找到會通知日本商用 SaaS 提供方的服務。

📎 各家官方文件原文可見於 什麼是秘密掃描 的「GitHub 以外呢」。

7. 漏之前,與漏之後

使用金鑰的公司,建議先做好以下 5 件事:

  1. 確認正在使用的系統金鑰是否列在 GitHub 對照表中
  2. 確認公司私人儲存庫中的秘密掃描與推送保護是否已啟用
  3. 在外洩之前先整理好金鑰撤銷畫面,以及撤銷金鑰後會中斷哪些整合
  4. 一旦金鑰外洩,先撤銷並重新建立金鑰;從程式碼歷史紀錄中移除金鑰可以放在之後再做
  5. 若產品支援權限較小或有期限的金鑰,優先使用這類金鑰

關於金鑰期限與撤銷方式,請參考 API 權杖什麼時候到期、如何撤銷;關於金鑰會從哪裡外洩,請參考 API 金鑰是從哪裡外洩的;關於把金鑰交給 AI Agent 時的注意事項,請參考 把金鑰交給 AI Agent 也沒問題嗎。至於金鑰該放哪裡,請參考 .env 只改名稱就安全嗎 — 備用鑰匙的放置位置。

一次來源

來源內容GitHub Docs: About secret scanning公開儲存庫免費自動掃描;私人儲存庫需要 Secret ProtectionGitHub Docs: About push protection推送保護的種類與初始狀態GitHub Docs: Secret scanning partner program提供方送交金鑰樣式的機制GitHub Docs: Supported secret scanning patterns對照表GitHub Docs: About GitHub Advanced SecuritySecret Protection 的購買條件GitLab Docs: Secret detectionGitLab 的 3 種機制GitLab Docs: Automatic response to leaked secrets通知提供方的條件Microsoft Learn: Azure DevOps 的 Secret scanning付費附加功能Atlassian: git-secrets-scan pipeBitbucket Cloud 的搜尋方式Anthropic: API key best practices自動停用外洩金鑰AWS: AWSCompromisedKeyQuarantineV3限制部分操作的設定Unit 42: 外洩 IAM 金鑰的濫用5 分鐘內即被使用的實驗Truffle Security: 多數公開外洩的金鑰從未被撤銷31 天後仍有 74% 可用引用的原文與出處,都已逐行公開在調查頁面中。若想進一步確認,請參閱 什麼是秘密掃描 — 外洩的金鑰由誰攔下。

讀者問卷進行中
如果您希望這個主題被更深入探討,請幫本文按讚。會依按讚數多寡依序進行追加調查,結果將在新文章中公告(追蹤後可收到通知)。

【可轉載】本文轉載說明

本文的文字與圖表皆可轉載。圖表請不要加以修改直接使用。轉載時請註明出處,並連結至本文完整版本 〈什麼是秘密掃描〉(renkeimap.jp)。不需要事先聯絡。

※ 作者曾任職於日立系 IT 廠商、長照軟體廠商、大學醫院 IT 部門,後來獨立,目前一邊協助中小企業進行 IT/DX 支援,一邊以第一手資料調查業務系統的「串接關係」。文中的「編輯部」指的是作者所屬的 IT 整合地圖編輯部。若發現錯誤,請使用 更正窗口(免費・無需帳號)。更正紀錄也會公開。


原文出處:https://qiita.com/songchong/items/5ee39ef5b71510e36c2a


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝54   💬2  
717
🥈
NewsData
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登