您的開發團隊多久以明文形式向同事發送API 密鑰或其他敏感數據?雖然這是共享數據最快的方式,但它絕對不是最安全的。
當敏感數據最終出現在配置文件、源代碼或明文中時,就會發生大量洩露。這個問題被稱為秘密蔓延,它會給企業帶來不利的後果。
秘密蔓延導致的數據洩露會給公司帶來財務損失、聲譽損害和法律問題。您可以通過使用可靠的機密管理工具來降低這些風險,該工具允許您安全地共享、存儲和管理您的機密。
本文對於想要保護公司免受與秘密蔓延相關的漏洞的開發人員、安全專業人員和產品經理來說非常有用。
什麼是秘密蔓延,為什麼要關心?在軟件開發中,秘密是用於用戶授權和身份驗證並提供對系統或數據的訪問的任何信息。此類信息包括:
API 密鑰
密碼
加密密鑰
數據庫憑證
訪問令牌
秘密蔓延,也稱為秘密洩露或管理不善,是指對公司軟件和基礎設施內的秘密處理不當。管理不善的秘密對於黑客來說是有利可圖且容易攻擊的目標,他們可以利用這些秘密進行未經授權的訪問。
根據GitGuardian 的2023 年秘密蔓延狀況報告,2022 年,在公共GitHub 提交中檢測到了1000 萬個新秘密,比2021 年增加了67%。 GitGuardian 指出,更多的秘密在私人存儲庫或企業IT 資產等封閉空間中積累,這意味著GitHub 上蔓延的秘密僅佔全球公開秘密的一小部分。
為了有效降低秘密蔓延的風險,您需要知道去哪裡尋找。這些是秘密蔓延最常見的地方:
洩密對企業到底有哪些危害?以下是組織因秘密蔓延而面臨的六種最常見後果:
讓我們詳細討論每個後果。
1. 數據洩露當然,秘密蔓延最明顯的後果是數據洩露。通過暴露API 密鑰或密碼,您的公司可能面臨讓攻擊者訪問其係統、數據庫和敏感數據的風險。這會導致數據洩露,並可能導致有價值的信息被盜,包括知識產權、財務記錄,甚至用戶數據。
2、財務損失由於秘密蔓延,企業可能會通過多種方式遭受損失。黑客可以圍繞金融交易進行欺詐活動,甚至實施盜竊。他們還可以破解和配置系統,以獲得數據訪問的贖金。您可能面臨的另一類與數據洩露相關的財務損失是法律費用、監管罰款以及對受影響方的賠償。
根據IBM 的《2022 年数据泄露成本报告》 ,因憑證被盜或洩露而導致的數據洩露造成的全球平均成本為450 萬美元。在美國,這一成本甚至更高,每次洩露達到977 萬美元。
3. 名譽損害數據洩露和秘密蔓延事件可能會嚴重損害您公司的聲譽。數據洩露案件會引起負面宣傳、媒體關注和客戶強烈反對。所有這一切之後往往會失去客戶、業務合作夥伴和投資者。
聲譽受損可能會阻止客戶、合作夥伴和投資者離開您的公司,並激勵他們與您的競爭對手合作。這將為競爭對手創造額外的商機,讓他們獲得更大的市場份額。
4. 合規和法律問題客戶數據處理不當可能會導致不遵守各種數據保護和隱私法律法規,包括HIPAA、GDPR和CCPA。因此,您可能會面臨罰款、處罰和訴訟,從而導致進一步的聲譽和財務損失。更不用說您的公司需要經歷與重新認證和重新審核相關的額外壓力才能繼續其工作。
5. 運營中斷您的業務運營也可能會受到秘密蔓延的影響,因為您需要分配資源用於調查、事件響應和補救活動。您可能需要關閉系統和服務,直到它們得到保護,而這種停機的每一秒都可能造成數千美元的損失。
儘管存在這些後果,秘密蔓延事件的數量仍在逐年增加,損害了各種規模的企業。根據GitGuardian 的2023 年秘密蔓延狀況報告,僅在2022 年,許多世界知名公司就因秘密蔓延而受到數據洩露和洩露的影響:
企業應該怎樣做才能降低洩露秘密的風險?讓我們看一下保護敏感數據的最佳實踐。
最大限度降低秘密蔓延風險的最佳實踐為了防止秘密蔓延,我們Apriorit 建議在您的開發過程中採用以下最佳安全實踐:
1. 加密和訪問控制您的秘密應在靜態和傳輸過程中進行加密,以便即使信息洩露,黑客也無法訪問信息。此外,檢查誰有權訪問某些數據:根據職位和工作要求,僅向有限數量的員工授予系統訪問權限。
2. 安全開發實踐實施安全編碼實踐,例如避免在源代碼中硬編碼機密以及利用環境變量或配置文件來引用機密。
3. 定期審核和審查確保定期檢查您的系統:
滲透測試
靜態應用安全測試
動態應用安全測試
安全代碼審查
秘密掃描工具
安全審計和合規性評估
4. 保密管理制度使用秘密管理系統可以幫助您安全地存儲和控制對秘密數據的訪問。最流行的系統是HashiCorp Vault 和AWS Secrets Manager。
在許多方面,秘密管理解決方案類似於密碼管理器。大多數密碼管理器都很簡單,並且不具有每用戶權限或訪問控制列表(ACL) 等高級功能。他們可以在需要時存儲和檢索密碼,但除此之外就無能為力了。
秘密管理解決方案預計具有更複雜的功能:
創建ACL
為用戶或用戶組添加權限
內置憑證輪換
先進的訪問控制功能
本文致力於使用秘密管理系統(即HashiCorp Vault)來保護您的秘密。讓我們討論如何安裝、初始化和配置HashiCorp 機密管理工具。
什麼是HashiCorp Vault 以及它如何工作? HashiCorp Vault是一個基於身份的開源秘密和加密管理系統,具有許多用例和功能。例如,Vault 支持零信任安全架構,可以幫助您保護雲基礎設施。
HashiCorp 已通過ISO 認證。 ISO 認證可確保組織實施穩健的系統、流程和控制,以維持質量、安全性和合規性。審計報告和合規函,例如Armanino的SOC 3報告和Leidos的FIPS合規函進一步證明HashiCorp經過了嚴格的測試和評估。
您可以開始免費使用Vault 進行機密管理,或者如果您需要特定的解決方案,可以從兩個付費計劃中進行選擇。您可以在HashiCorp Vault 官方網站上查看定價政策。
Vault 具有復雜的結構,並使用稱為後端的組件來向其委派任務。 Vault 中有四個專用於不同流程的後端:身份驗證、秘密、審計和存儲。所有這些都由Vault 核心控制——Vault 架構的核心組件,它將所有用戶請求路由到特定後端。
現在讓我們更詳細地討論秘密管理庫中的後端,並討論它們的功能和目的。
1. 認證後端身份驗證後端或身份提供商負責處理身份驗證過程,並在身份驗證成功後返回用戶身份(通常作為令牌或用戶信息,如電子郵件、ID、角色等)。
令牌身份驗證是一種中心身份驗證方法,因為所有其他方法都依賴於它。它到底是如何運作的?
當用戶成功進行身份驗證時,身份提供者會返回有關用戶的信息,例如用戶名或唯一標識符。然後,Vault 獲取此身份信息並創建與該身份關聯的訪問令牌。此訪問令牌允許用戶根據配置的訪問策略和權限訪問所需的資源或在Vault 內執行特定操作。
當然,令牌認證可以單獨使用。無需使用任何其他身份提供商即可創建、撤銷和更新這些令牌。但這並不總是處理身份驗證的最佳方式。
令牌在訪問控制中也發揮著至關重要的作用,因為當創建令牌時,允許或禁止訪問資源的特定於用戶的策略會被編碼到令牌上。
與Vault 集成的身份驗證後端的一些示例包括輕量級目錄訪問協議(LDAP)、GitHub 和Azure Active Directory。您還可以使用其他受支持的身份驗證方法,例如JSON Web 令牌、Kerberos,甚至標準用戶名和密碼。
2. 存儲後端存儲後端負責存儲所有信息。普遍接受的做法是將存儲後端視為不可信實體。與許多其他機密管理解決方案一樣,Vault 僅將加密數據存儲在存儲後端,因此如果存儲遭到破壞,在不知道加密密鑰的情況下就不可能檢索機密。
Vault 支持許多存儲驅動程序,包括文件系統、內存存儲、關係數據庫和Amazon S3。每種方法都有其優點和缺點,因此哪種方法最好取決於您的特定需求和存儲驅動程序的功能。
此外,Vault還有自己的嵌入式數據存儲,稱為集成存儲。使用此集成存儲可以消除系統中的另一個依賴項,並使監控和故障排除變得更加容易,因為您只需監控Vault。
使用Vault 的本機存儲驅動程序不需要安裝任何其他軟件,並且是開箱即用的解決方案。
3. 秘密後端秘密後端,或秘密管理HashiCorp 工具中的秘密引擎,負責各種存儲秘密的方式。一些秘密引擎只能存儲和讀取數據,而另一些則具有更複雜的功能,例如動態秘密生成。
支持的引擎有很多,包括鍵值存儲、輕量級目錄訪問協議(LDAP)、數據庫(用於動態數據庫憑證生成)、用於生成基於時間的憑證的基於時間的一次性密碼(TOTP) 工具,以及來自AWS、GCP 和Azure 的引擎。我們還可以添加自定義秘密引擎。
這些引擎的行為類似於虛擬文件系統,並安裝在Vault 中的指定路徑上。我們可以讓多個引擎同時運行,並且它們都有不同的路徑。由於每個引擎都有自己的路徑,因此我們發送到Vault 的請求會自動轉發到所需的引擎。
例如,我們可以啟用一個鍵值秘密引擎來存儲我們的密碼和API 密鑰,同時擁有一個AWS 秘密引擎來動態生成AWS 訪問憑證。
4. 審計後端審核後端負責記錄Vault 處理的所有請求和響應。記錄機密管理器的活動可能看起來不安全,因為我們很可能將機密保存在日誌中。
但是,Vault 通過對請求和響應包含的大部分字符串進行哈希處理來處理此問題,以避免洩露敏感信息。散列還允許我們通過自己生成這些散列來快速將秘密值與日誌中的值進行比較。
您可以從多種審核機制中進行選擇,包括系統日誌記錄協議(Syslog)、文件或套接字。 Socket 允許您將日誌流式傳輸到TCP、UDP 或UNIX 套接字,從而允許您使用任何日誌管理平台。
現在我們了解了Vault 的工作原理及其提供的功能,讓我們使用Hashicorp Vault 安全最佳實踐在現實示例中進行演示。
安裝、配置和初始化Vault讓我們開始根據我們的需要安裝、配置和運行Vault。
安裝在本文中,我們將使用Docker Hub中的官方Docker 映像。 Docker允許應用程序容器化,方便我們在隔離的環境中運行Vault。這是嘗試Vault 的最簡單方法。現在讓我們通過在終端或命令提示符中運行以下命令來啟動Vault:
如果本地尚未提供Vault Docker 映像,這將下載該映像,並啟動一個在其中運行Vault 的新容器。
保險庫配置默認情況下,Vault 的服務器以開發模式運行:它使用內存存儲存儲所有秘密,自動初始化,並以未密封的方式啟動。開發模式對於嘗試事物很有用,但不應該在生產中使用。
在我們的例子中,我們將使用標準模式,這意味著需要手動初始化和啟封Vault。要在標準模式下運行我們的服務器,我們應該創建一個配置文件。
Vault的配置文件是用HashiCorp配置語言編寫的。它們有許多不同的選項,但我們在整篇文章中只會使用其中的幾個。
讓我們為我們的Vault 創建一個簡單的配置:
現在,我們來看看關鍵設置。首先,我們禁用了傳輸層安全協議(TLS)。請注意,您應始終在生產中使用TLS 來提供客戶端和服務器之間的安全通信。
其次,我們禁用內存鎖。儘管啟用內存鎖被認為是使用Vault 時最安全的方法,但並非所有平台都支持它,我們希望我們的示例盡可能簡單,沒有任何意外錯誤。我們還啟用了Web UI,因為有些人發現它比命令行界面(CLI) 更容易、更快。
現在我們可以通過將配置的路徑作為參數傳遞來使用新配置啟動服務器:
一切都按預期進行,但現在我們必須初始化服務器本身。
初始化保管庫為了初始化我們的服務器,我們需要另一個安裝了Vault 的Docker 容器。為了簡化該過程,我們創建了以下Dockerfile:
services:
vault_server:
image:vault
container_name:vault-server
command:['server']
cap_add:
-IPC_LOCK
ports:
-8200:8200
environment:
VAULT_LOCAL_CONFIG:'{'storage':{'file':{'path':'/vault/file'}},'listener':[{'tcp':{'address':'0.0.0.0:8200','tls_disable':true}}],'disable_mlock':true,'ui':true}'
networks:
-vault
vault_client:
image:vault
container_name:vault-client
command:['sh']
tty:true
stdin_open:true
environment:
-VAULT_ADDR=http://vault-server:8200
depends_on:
-vault_server
networks:
-vault
networks:
vault:
driver:bridge請注意,我們將配置從文件移至環境變量。這是Vault 官方Docker 鏡像提供的功能。它允許我們直接在環境中定義必要的配置參數,而不需要單獨的文件。
我們還將服務器中的TCP 端口8200 映射到Docker 主機的端口8200,以便從Docker 主機訪問Web UI。
現在我們可以使用Docker Compose來啟動我們的容器。 Docker Compose 是一個允許我們定義和管理多容器Docker 應用程序的工具。它使用YAML 文件(通常名為docker-compose.yml)來指定組成應用程序的容器的配置和依賴項。
這是我們的容器創建的樣子:
$dockercomposeup
[+]Running2/2
⠿Containervault-serverCreated
⠿Containervault-clientCreated
Attachingtovault-client,vault-server
#Vaultserveroutput此時,我們還將提供Web UI 的屏幕截圖,以展示如何在不使用命令行界面的情況下執行完全相同的操作。您可以通過從您選擇的任何瀏覽器導航到http://localhost:8200來訪問Web UI 。用戶界面如下所示:
屏幕截圖1.Vault 的Web UI
最後,我們需要將終端會話從另一個終端附加到我們的Vault-Client容器(如果您使用的是Web UI,則可以完全跳過這些CLI步驟):
您可以通過在客戶端內執行以下命令來驗證一切是否按預期運行:
從輸出中我們可以看到,Vault 是密封的且未初始化。 Vault 始終以密封狀態啟動,因此我們應該在每次啟動後將其解封。
為此,我們使用開封密鑰。該密鑰在初始化期間生成一次。 Vault 使用Shamir 的秘密共享將密鑰分割成預定義數量的部分,然後使用這些部分來重建它。這種方法降低了暴露未密封代幣的風險,因為我們只擁有其中的一部分。其他部件可以由您的同事保管或安全地存放在不同的地方。
要解封Vault,請在客戶端內運行以下命令:
指定您需要一份密鑰共享,並且密鑰閾值是一把密鑰。現在按初始化並保存生成的密鑰。
屏幕截圖2. 設置根密鑰
這將使用單個解封密鑰初始化服務器。將生成的令牌和密鑰保存到環境變量中。我們稍後會需要它們。從現在開始,我們將初始根令牌稱為ROOT_TOKEN,將Vault 服務器初始化期間生成的第一個解封密鑰(密鑰1)稱為UNSEAL_KEY。
Vault 支持多個解封密鑰,但由於我們只是在學習而不是創建可用於生產的解決方案,因此我們將使用一個。
現在您可以使用解封密鑰來解封服務器:
粘貼UNSEAL_KEY 並按Unseal。
截圖3. 解封金庫
現在一切都準備好了,我們終於可以開始使用Vault 了。