
在傳統(tǒng)的開(kāi)發(fā)實(shí)踐中,開(kāi)發(fā)者常常會(huì)將 API 密鑰、數(shù)據(jù)庫(kù)憑證等敏感信息硬編碼到源代碼中或存儲(chǔ)在環(huán)境變量中。雖然這樣看似方便,但一旦代碼庫(kù)被公開(kāi)或泄露,敏感信息就會(huì)被輕易獲取。就如同在公共場(chǎng)合張揚(yáng)你的密碼,給惡意攻擊者留下可乘之機(jī)。
存儲(chǔ)在環(huán)境變量中的 API 密鑰雖然比硬編碼方式稍微安全一些,但仍然存在“秘密蔓延”的問(wèn)題。環(huán)境變量的內(nèi)容往往會(huì)在多個(gè)環(huán)境中出現(xiàn),尤其是在開(kāi)發(fā)、測(cè)試、生產(chǎn)環(huán)境中。如果不小心泄露了環(huán)境變量,攻擊者仍然可以獲取這些敏感數(shù)據(jù)。
為了減少敏感信息泄露的風(fēng)險(xiǎn),我們可以采用密碼管理器(如 1Password)來(lái)管理和保護(hù)這些 API 密鑰。密碼管理器不僅可以安全存儲(chǔ)這些密鑰,還可以通過(guò) API 調(diào)用動(dòng)態(tài)獲取密鑰,而不需要將其暴露在源代碼或環(huán)境變量中。
假設(shè)我們正在使用 OpenAI API,并且需要傳遞 API 密鑰進(jìn)行身份驗(yàn)證。通常,API 文檔會(huì)提供兩種方式來(lái)使用 API 密鑰:
然而,這兩種方式都存在安全隱患。為此,我們選擇通過(guò) 1Password 來(lái)安全地管理和引用 API 密鑰。
# 示例命令:使用 1Password CLI 獲取 API 密鑰
op run --env MY_SECRET=$(op get item "OpenAI API Key" --fields password) python myscript.py
雖然通過(guò)環(huán)境變量來(lái)存儲(chǔ)密鑰是一種常見(jiàn)的做法,但為了進(jìn)一步提升安全性,推薦使用 1Password Secrets Reference 功能,將密鑰動(dòng)態(tài)注入到運(yùn)行時(shí)環(huán)境中,而不是硬編碼或靜態(tài)存儲(chǔ)。這樣,敏感信息可以集中管理,并且隨時(shí)更新。
# 1Password CLI 示例命令
op run --env OP_API_KEY="op://my-vault/my-api-key" python script.py
當(dāng)我們?cè)谶h(yuǎn)程環(huán)境中操作時(shí),可以使用 1Password 服務(wù)賬戶 來(lái)為應(yīng)用程序提供臨時(shí)訪問(wèn)權(quán)限,而不是直接暴露賬號(hào)憑證。
# 設(shè)置服務(wù)賬戶令牌環(huán)境變量
export OP_SERVICE_ACCOUNT_TOKEN="your-token"

通過(guò) 1Password Secrets Reference 功能,開(kāi)發(fā)者可以更輕松地管理敏感信息,并確保密鑰的集中管理。尤其是在持續(xù)集成/持續(xù)部署(CI/CD)管道中,使用動(dòng)態(tài)密鑰引用可以避免靜態(tài)存儲(chǔ)和暴露。
# 示例:CI/CD 腳本中使用 Secrets Reference
op run --env MY_API_KEY=$(op get item "OpenAI API Key" --fields password) python deploy.py
始終使用 HTTPS 協(xié)議進(jìn)行 API 調(diào)用,確保通信過(guò)程中密鑰不被中間人攻擊(MITM)截獲。
使用 1Password 等密碼管理器來(lái)管理和保護(hù) API 密鑰,為開(kāi)發(fā)者提供了一種更安全、更便捷的密鑰管理方式。通過(guò)利用 Secrets Reference,我們不僅避免了硬編碼密鑰的風(fēng)險(xiǎn),還實(shí)現(xiàn)了密鑰的集中管理和實(shí)時(shí)更新。結(jié)合最佳實(shí)踐和安全措施,能夠大大提升我們的應(yīng)用程序和賬戶的安全性。
通過(guò)這種方式,我們不僅保護(hù)了敏感信息,還簡(jiǎn)化了密鑰的管理流程,有效防止了密鑰泄露和濫用,確保了開(kāi)發(fā)環(huán)境與生產(chǎn)環(huán)境的安全性。
原文引自YouTube視頻:https://www.youtube.com/watch?v=MR1N7p2fKAo