如果不小心把 API 金鑰公開到 GitHub,上面真的有人會發現並幫忙攔下來嗎?GitHub 有一套稱為「秘密掃描」的機制。不過,這套機制是否也能保護你正在使用的系統金鑰,以及是否需要自己做任何設定,並不是很多人都知道。
本文將根據 GitHub、GitLab 等官方文件,以及將 IT 整合地圖中確認有 API 的 65 個商用系統與 GitHub 對照表交叉比對的結果,回答 4 個問題。開頭的圖就是這 4 個問題與答案的總覽。引用的原文與詳細數字,都逐行列在調查頁面 什麼是秘密掃描 — 外洩的金鑰由誰攔下 中。
秘密掃描是 GitHub 在已放置於 GitHub 的程式碼中,搜尋具有 API 金鑰「樣式」的字串的機制。樣式指的是金鑰字串排列的規則。發行金鑰的提供方會把自家金鑰的樣式送交給 GitHub。
圖的上半部,是樣式已被送交的金鑰(如 Slack、Google、HubSpot 等)的情況。GitHub 會在 push 時找到金鑰,並在程式碼送出之前先攔下來(推送保護)。另外,GitHub 也會在發現已公開的金鑰時通知該金鑰的提供方。
圖的下半部,則是樣式未被送交的金鑰。GitHub 無法將這段字串辨識為金鑰,因此金鑰會直接公開,且不會通知提供方。
📎 機制原文(GitHub Docs)可見於 什麼是秘密掃描 的「機制」。
GitHub 所做的,只到通知提供方為止。要不要撤銷金鑰,則由發行該金鑰的提供方決定。例如 Anthropic(Claude 的提供方)會自動停用外洩的金鑰;另一方面,AWS 則只是替外洩的金鑰加上限制部分操作的設定,金鑰本身仍保持可用狀態。
而且,外洩的金鑰往往不會很快被撤銷。研究人員故意將 AWS 金鑰放到 GitHub 的實驗中,第三方在 1~5 分鐘內就使用了該金鑰。另外,Truffle Security 的調查顯示,GitHub 上外洩的金鑰中,有 74% 在 31 天後仍可使用。
📎 各提供方的處理方式與實驗原文可見於 什麼是秘密掃描 的「攔下來的是提供方」。
IT 整合地圖編輯部將 65 個確認具有 API 的商用系統,與 GitHub 公開的對照表進行比對。對照表中有名稱的只有 12 個,而日本民間 SaaS 41 個全都沒有列入對照表。
使用中的系統公開儲存庫中若金鑰外洩Google・Microsoft・HubSpot・Notion・Shopify・SlackGitHub 會找到金鑰並通知提供方SalesforceGitHub 會找到金鑰,但不會通知提供方;通知只會送給儲存庫擁有者freee・Money Forward・SmartHR・kintone 等日本民間 SaaSGitHub 無法辨識為金鑰,也不會通知提供方日本商用 SaaS 的金鑰,一旦外洩,就要以「不會有任何人通知我們」為前提,自行管理才安全。
📎 65 個系統的清單與各提供方的處理差異,可見於 什麼是秘密掃描 的「你正在使用的系統金鑰,沒問題嗎」。
儲存庫不做任何設定也會運作的項目需要自己設定的項目公開GitHub 會免費搜尋金鑰,並通知提供方。當使用者 push 含有金鑰的程式碼時,GitHub 會攔下來整個儲存庫的推送保護,需要由儲存庫管理者啟用公司(組織)的私人儲存庫秘密掃描不會運作公司需訂閱 GitHub Team 以上,並啟用付費的 GitHub Secret Protection個人的私人儲存庫秘密掃描不會運作只有企業管理使用者(Enterprise Managed Users)帳號,才能使用秘密掃描如果公司的程式碼放在私人儲存庫中,不代表 GitHub 一定有在搜尋金鑰。請先確認公司的合約與設定。即使對照表中沒有的金鑰,只要是組織的儲存庫,組織也可以自己補上金鑰樣式,讓 GitHub 幫忙搜尋。不過這種情況下,通知也只會在公司內部流通,金鑰仍需要由你們自己撤銷。
📎 是否需要設定的原文可見於 什麼是秘密掃描 的「需不需要自己設定」。
GitLab 也有相同的機制。不過,GitLab 只有最頂級的 Ultimate 方案才會在送出前攔下金鑰。GitLab 也只有在公開或 Ultimate 專案中,針對 AWS、Google Cloud 等 4 種金鑰,才會通知提供方。Bitbucket 的雲端版則是由使用者在 CI 中加入元件來搜尋金鑰。Azure DevOps 的金鑰搜尋功能則屬於付費附加功能。
Gitleaks 和 TruffleHog 是在本機電腦上搜尋金鑰的工具。這些工具可以在 commit 之前攔下金鑰,但不會通知提供方。調查範圍內,沒有找到會通知日本商用 SaaS 提供方的服務。
📎 各家官方文件原文可見於 什麼是秘密掃描 的「GitHub 以外呢」。
使用金鑰的公司,建議先做好以下 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 整合地圖編輯部。若發現錯誤,請使用 更正窗口(免費・無需帳號)。更正紀錄也會公開。