簡體   English   中英

python中的安全憑證存儲

[英]Secure credential storage in python

攻擊

在憑證存儲的情況下,一種可能的威脅模型是攻擊者,它具有以下能力:

  • 檢查任何(用戶)進程內存
  • 讀取本地(用戶)文件

AFAIK,這種攻擊的共識是無法阻止(因為必須將憑據存儲在內存中,程序才能實際使用它們),但是有兩種技術可以緩解這種攻擊:

  • 最小化敏感數據在內存中的存儲時間
  • 一旦不再需要數據,將覆蓋內存
  • 通過模糊措施破壞內存中的數據,繼續移動數據以及其他安全性

特別是Python

第一種技術很容易實現,可能通過密鑰環 (希望是內核空間存儲)來實現

就我所知,不編寫C模塊根本無法實現第二個(但是我很樂意在這里被證明是錯誤的,或者希望有一個現有模塊的列表)

第三個是棘手的。

特別是,由於python是具有強大的自省和反射功能的語言,因此很難阻止能夠在解釋器過程中執行python代碼的任何人訪問憑據。

似乎已經達成共識, 那就是無法強制執行私有屬性 ,而嘗試進行 私有屬性 充其量只會使其他正在使用您的代碼的程序員煩惱

問題

考慮到所有這些,如何使用python安全地存儲身份驗證憑據? 最佳做法是什么? 關於“一切都是公共的”哲學這個語言,可以做些什么嗎? 我知道“我們所有人都同意這里的成年人” ,但是我們是否應該被迫在與攻擊者共享密碼和使用另一種語言之間進行選擇?

為什么要存儲身份驗證憑據,有兩個非常不同的原因:

  1. 為了驗證您的用戶:例如,你只允許到服務的用戶訪問的用戶驗證到您的程序后,
  2. 要使用另一個程序或服務對程序進行身份驗證:例如,用戶啟動您的程序,然后使用IMAP通過Internet訪問用戶的電子郵件。

在第一種情況下,您永遠不要存儲密碼(或密碼的加密版本)。 相反,您應該使用高質量的鹽對密碼進行哈希處理 ,並確保所使用的哈希算法在計算上昂貴(以防止字典攻擊),例如PBKDF2或bcrypt。 有關更多詳細信息,請參見腌制密碼哈希-正確執行。 如果您采用這種方法,即使黑客檢索到鹽漬,哈希值低的令牌,他們也不會做太多事情。

在第二種情況下,有許多事情使秘密發現變得更加困難(正如您在問題中所概述的),例如:

  • 保持機密直到需要時才加密,按需解密,然后在之后立即重新加密
  • 使用地址空間隨機化,因此每次應用程序運行時,密鑰都存儲在不同的地址
  • 使用操作系統密鑰庫
  • 使用“硬”語言(例如C / C ++)而不是基於VM的自省語言(例如Java或Python)

這樣的方法肯定總比沒有好,但是熟練的黑客遲早會破解它。

令牌

從理論上講,認證是證明被挑戰者就是他們所說的人的行為。 傳統上,這是通過共享機密(密碼)實現的,但是還有其他方式可以證明自己,包括:

  • 帶外認證。 例如,我住的地方,當我嘗試登錄到我的網上銀行,我收到一個一次性密碼 (OTP)作為我的手機短信。 通過這種方法,我證明自己擁有一個特定的電話號碼
  • 安全令牌 :要登錄服務,我必須按令牌上的按鈕以獲取OTP,然后將其用作密碼。
  • 其他設備:

而一個更完整的列表在這里

所有這些方法之間的共同點是,最終用戶控制這些設備,並且秘密永遠不會真正離開令牌/卡/電話,並且肯定不會存儲在您的程序中。 這使它們更加安全。

會話竊取

但是(總是有一個):

讓我們假設您設法保護登錄名的安全,以便黑客無法訪問安全令牌。 現在,您的應用程序很高興與安全服務進行交互。 不幸的是,如果黑客可以在您的計算機上運行任意可執行文件,則黑客可以例如通過向服務的有效使用中注入其他命令來劫持您的會話。 換句話說,雖然您已經保​​護了密碼,但是這完全無關緊要,因為黑客仍然可以訪問“安全”資源。

正如多種跨站點腳本攻擊所顯示的那樣,這是一個非常現實的威脅(一個示例是“ 美國銀行”和“美國銀行網站易受攻擊” ,但還有更多的此類威脅)。

安全代理

如上所述,存在一個基本問題,即在第三方服務或系統上保留帳戶憑據,以便應用程序可以登錄到該帳戶,尤其是在唯一的登錄方法是用戶名和密碼的情況下。

通過將與服務的通信委托給安全代理來部分緩解此問題的一種方法,並在應用程序和代理之間開發一種安全的登錄方法。 用這種方法

  • 該應用程序使用PKI方案或兩因素身份驗證來登錄安全代理
  • 用戶將安全憑證添加到第三方系統的安全代理中。 憑據永遠不會存儲在應用程序中
  • 稍后,當應用程序需要訪問第三方系統時,它將請求發送給代理。 代理使用安全憑證登錄並發出請求,並將結果返回給應用程序。

這種方法的缺點是:

  • 用戶可能不希望信任憑據存儲的安全代理
  • 用戶可能不信任通過它流到第三方應用程序的數據的安全代理
  • 應用程序所有者具有用於運行代理的其他基礎結構和托管成本

一些答案

因此,針對特定答案:

如何使用python安全地存儲身份驗證憑據?

  • 如果存儲應用程序的密碼以驗證用戶身份,請使用PBKDF2算法,例如https://www.dlitz.net/software/python-pbkdf2/
  • 如果存儲密碼/安全令牌以訪問其他服務,則沒有絕對安全的方法。
  • 但是,請考慮使用pyscard將身份驗證策略切換到例如智能卡。 您可以使用智能卡對用戶進行身份驗證,也可以使用X.509證書對應用程序進行安全身份驗證。

關於“一切都是公共的”哲學這個語言,可以做些什么嗎? 我知道“我們所有人都同意這里的成年人”,但是我們是否應該被迫在與攻擊者共享密碼和使用另一種語言之間進行選擇?

恕我直言,用Python編寫一個特定的模塊並沒有什么錯,因為它確實可以隱瞞秘密信息,這使它成為供其他人重用的正確工具(討厭其他程序員是其目的 )。 您甚至可以用C編寫大部分代碼並鏈接到它。 但是,出於明顯的原因,請勿對其他模塊執行此操作。

但是,最終,如果黑客控制了計算機,則計算機上根本沒有隱私。 從理論上講,最壞的情況是您的程序正在VM中運行,黑客可以完全訪問計算機上的所有內存,包括BIOS和圖形卡,並且可以通過身份驗證來逐步執行您的應用程序以發現其秘密。

在沒有絕對隱私的情況下,剩下的只是混淆,而保護的級別就是混淆的難易程度與熟練的黑客想要多少信息。 眾所周知,即使對於定制硬件和價值十億美元的產品 ,這也是如何結束的

使用Python密鑰環

盡管這將相當安全地管理其他應用程序的密鑰,但所有Python應用程序都共享對令牌的訪問。 對於您擔心的攻擊類型,這一點也不安全。

我不是該領域的專家,我只是想解決您所遇到的同樣問題,但是看起來像Hashicorp的Vault之類的東西也許可以很好地幫助您。

特別是WRT,涉及到存儲第三部分服務的憑證的問題。 例如:

在現代的API驅動的世界中,許多系統還支持以編程方式創建訪問憑據。 保管箱通過一種稱為動態機密的功能來利用此支持:動態機密是按需生成的,並且還支持自動吊銷。

對於Vault 0.1,Vault支持動態生成AWS,SQL和Consul憑證。

更多鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM