題:
為什麼在版本控制中存儲密碼是個壞主意?
d33tah
2018-08-15 16:05:52 UTC
view on stackexchange narkive permalink

我的朋友剛剛問我:“當我們僅將各種密碼存儲在私有Git服務器中時,為什麼直接在程序的源代碼中輸入各種密碼實際上有那麼糟糕?”

我給了他一個答案強調了兩點,但是覺得它組織不夠,因此決定為這個問題創建一個規範的問題可能是有意義的。

此外,在源代碼中不存儲密碼與密碼保護的原理有何關係?最低特權和信息安全的其他基礎?

這些密碼是做什麼用的?
答案很短,因為您絕不應該存儲密碼明文。甚至不在名為TotallyNotMyPasswords.txt的文件上。無處。
@EpicKip祝您部署任何類型的Web服務器都好,而無需在任何文件中存儲純文本密碼。
這更多的是行業概念,開發人員移交,開發人員角色分離,總體控制以及針對一個應用程序具有多個環境的所有原因都是代碼中沒有密碼(如果需要的話,請提供源代碼)。
因為您不想要[$ 14,000的AWS賬單](https://dev.to/juanmanuelramallo/i-was-billed-for-14k-usd-on-amazon-web-services-17fn)。
關於SO的相關信息:https://stackoverflow.com/a/1197512/5419599
一個很好的理由是,這意味著您需要兩種不同的過程來處理開源產品和閉源產品。您無法在開放源代碼產品的源代碼管理中存儲密碼。如果使用通用流程則更簡單
@DaveCarruthers除此之外,還有其他一些設置(例如,使用Windows和AD身份驗證)可以在[受保護的配置](https://stackoverflow.com/questions/4155187/securing-a-password-源代碼)
我想澄清一下:這個問題的答案應該集中在版本控制中存儲密碼的安全性方面?(我認為是的,因為它已發佈在“信息安全性”上。)我對此問題進行了思考,並且我認為有理由不將密碼與源代碼一起存儲,這超出了安全性。
使用[密碼的版本控制?](https://www.passwordstore.org/)/故意誤解有什麼問題
-1
優步[最近發現了困難的方法](https://arstechnica.com/information-technology/2015/03/in-major-goof-uber-stored-sensitive-database-key-on-public-github-page/),這是一個壞主意。
為什麼開發人員甚至會*知道*除開發/測試以外的任何環境的密碼?
@DaveCarruthers許多設置改為使用環境變量。可以手動(例如用於開發工作)或通過加密值(例如[Travis CI](https://docs.travis-ci.com/user/encryption-keys/))或通過加密的數據庫(例如[HashiCorp Vault](https://www.hashicorp.com/products/vault))或通過安全服務(例如Heroku)。這樣做的目的是將攻擊面縮小為存儲在守護程序(如Vault)或服務(如Heroku或Travis)中的單個密鑰。
至此,我認為已被廣泛認可的是,僅_hashed_密碼(可能帶有“ salt”等)根本不需要存儲。
八 答案:
d33tah
2018-08-15 16:09:37 UTC
view on stackexchange narkive permalink

我看到它的方式(不將密碼存儲在Git(或其他版本控制)中)是一種慣例。我想一個人可能會決定不以各種結果來強制執行它,但是這就是為什麼人們對此一無所知的原因:

  1. Git使您難以從源代碼歷史記錄中刪除密碼,這可能會給人以錯誤的印象認為密碼已在當前版本中刪除。
  2. 通過將密碼置於源代碼管理中,您基本上決定與可以訪問該存儲庫的任何人(包括將來的用戶)共享密碼。這會使在開發人員團隊中建立角色(可能具有不同的特權)變得複雜。
  3. 源代碼控制軟件往往變得非常複雜,尤其是“多合一”系統。這意味著該系統可能最終會受到威脅,從而導緻密碼洩漏。
  4. 其他開發人員可能不知道密碼已存儲,並且可能會錯誤處理存儲庫-源中包含密鑰意味著要格外小心共享代碼時(即使在公司內部,也必須這樣做;這可能需要加密通道)。
  5. ol>

    不能說與infosec相關的每個模式都是好的,但是在破壞它們之前,最好考慮一下威脅模型和攻擊媒介。如果這個特定的密碼洩露了,攻擊者使用它來傷害公司會有多困難?

我不確定將已知的“短密碼”的反模式稱為“ infosec約定”是否公平。
-1
這是公平的。
我支持@Adonalsium:約定無法傳達您的意思,可以使用更好的術語:糟糕的主意。不必要地冒險。等等
另外,在較小程度上,還公開了密碼* history *。如果密碼已隨時間更改,則知道以前的密碼可能有助於猜測將來應該撤消訪問的密碼。
我的意思是“其他人做的”常規工作,但也可以表示“其他(知識)的人認為這是一個好主意,並且出於某種原因而很常見”。
對我來說,“公約”意味著“除了沒有特別顯著的優勢,每個人都普遍同意這樣做,除了每個人都同意這樣做”,但您卻給出了一些相當重要的意見。優勢,更傾向於“這是一個壞主意”。刪除有關約定的部分將大大改善IMO的答案。
請注意,從源代碼管理中刪除密碼時,不需要從歷史記錄中清除密碼:您只需要更改密碼即可。
@OrangeDog,除非該密碼的歷史記錄可以很好地指示將來的密碼(如果您的密碼是安全且隨機的,則該密碼不成立),但並非總是如此。
除了第4項之外,git是一個分佈式回購系統。任何可以將存儲庫克隆到開發筆記本電腦的人都可能會丟失該筆記本電腦,現在密碼已成為該數據洩露的一部分。
@NotThatGuy不,約定僅表示“每個人都同意這樣做”。請務必注意,因為遵循約定通常本身確實很重要且很有價值。
另外,可能會有一些員工偶爾在家工作。其中一些(我已經知道一些)使用他們的家用PC而不是公司的筆記本電腦進行開發。這意味著要依靠家用PC的安全而不是公司的安全。
我要補充一點,在許多環境中,根本不允許開發人員訪問生產系統,而操作人員/管理員將必須維護所有密碼。由於密碼在許多系統上都會在45/60/90/180天內失效,因此開發人員**無法**維護密碼,並且您不希望操作員必須輸入代碼,因此您將所有憑據放入單獨的配置中文件,當ops部署構建時,他們將當前的生產密碼放入配置文件中,並在密碼過期時更新該文件。在聯邦系統上,法律上可能要求開發人員不知道生產密碼。
我同意將其稱為慣例是不准確和誤導的。約定只是習俗,或者是“社會規範”,您可以以完全不同的方式進行操作,只要其他所有人都這樣做,就可以了。典型的例子是我們行駛在街道的哪一邊。我們都同意哪一方,並遵循它。但是,左/右是任意的,無論社會選擇哪種,左(右)都將同樣有效地工作。這裡不是這種情況。如果每個人都將密碼放入版本控制中,那仍然很糟糕。
Brandon
2018-08-15 18:57:11 UTC
view on stackexchange narkive permalink

首先,非安全性原因:

密碼更改工作流程

密碼更改獨立於軟件應用程序代碼。如果DBA更改了數據庫密碼,那麼開發人員必須更新代碼,重新構建並發佈到生產環境並嘗試安排所有時間是否有意義?密碼是運行時配置工件,而不是開發工件。應該通過配置文件,環境變量或您使用的任何配置範例注入它們。

授權範圍

通常,版本控制系統提供授權控制因此,只有授權用戶才能訪問它。但是在存儲庫中,權限通常是讀/寫或只讀的,或者可能像GitHub提供的一樣。您不太可能找到允許開發人員獲取源代碼的安全約束,而不是密碼。如果可以克隆存儲庫,則可以克隆存儲庫。期。在許多環境中,開發人員無法完全訪問生產。有時他們具有對生產數據庫的只讀訪問權限,有時沒有訪問權限。如果開發人員通常確實具有訪問權限,但是您不希望所有實習生,新員工等都具有訪問權限,該怎麼辦?

環境

如果您有多個環境,例如開發環境,QA環境,登台和生產,該怎麼辦?您會將他們的所有密碼存儲在版本控制中嗎?該應用程序如何知道要使用哪個?該應用程序將需要一種了解環境的方法,最終將其作為配置設置。如果可以將環境名稱設置為配置設置,則可以將數據庫密碼設置為配置設置(以及連接字符串,用戶名等)。

歷史記錄

正如其他人提到的那樣,版本控制旨在保留歷史記錄。因此,較舊的密碼仍然可以檢索,這可能不是最好的選擇。

妥協

在某些產品的源代碼洩露給全世界的新聞中,我們看到過多少次頭條新聞?源代碼是版本控制中的任何內容。這可能是不將密碼放入版本控制中的首要原因!

但是...

也就是說,密碼需要存儲某個地方。上面提到的這些隱患不一定意味著它們根本不應該存儲在版本控制中,而是應該不存儲在版本控制中的產品的源代碼存儲庫中。為配置管理,操作等使用單獨的存儲庫是非常合理的。關鍵是要在安全性憑證方面將操作與開發分開,而不必完全避免版本控制。

此外,對於非生產環境,我將用於外部系統的密碼和API密鑰存儲在產品源代碼中的默認配置文件。為什麼?為了使開發人員在簽出代碼時不費吹灰之力,他們只需構建並運行它即可,而不必獲取額外的配置文件。這些憑證很少更改,不會導致任何商業秘密。但是我永遠不會用生產機密來做到這一點。

所以最重要的是……這取決於。

您的第一要點比聽起來要大-例如,將密碼綁定到源代碼版本控制可能無法可靠地進行“ git-bisect”查找錯誤發生的時間。
-1
+1用於建議具有更細粒度訪問權限的單獨存儲庫。
Conor Mancone
2018-08-15 17:28:41 UTC
view on stackexchange narkive permalink

切記,必鬚根據您的用例量身定制建議,這始終很重要。例如,美國國家安全局(NSA)為保護他們在下雨天所停留的所有零日時間而採取的安全措施應比為保護貓圖片張貼站點上的投票所採取的安全措施嚴格得多。在一個極端情況下,我可以考慮一個示例,將密碼/令牌/等保存在私有git存儲庫中可能是合理的:

如果該存儲庫只能由一個人訪問並且應用程序不存儲任何存儲空間任何值的信息。

在這種情況下,請前往城鎮!只需記住@ d33tah在回答中所說的內容-從git存儲庫中清除內容可能會非常困難(畢竟,要永遠保留所有內容的歷史記錄),因此,如果您決定繼續前進,與更多的人合作,但是不希望他們獲得對您所有系統的完全訪問權限,那麼您的頭上會有些頭疼。

這就是真正的問題。至。您的代碼存儲庫在某種程度上是“公共的”,即使僅與協作者共享。僅僅因為您想與某人合作並不意味著要向他們授予對您的基礎結構的完全訪問權限(實際上,這是將密碼/令牌放入代碼存儲庫時發生的情況)。很容易想到“是的,但是我信任與我合作的人!”,但是出於多種原因,這只是看待情況的錯誤方法:

  1. 在實際操作中,很大一部分數據洩漏始於內部參與者(合作者,員工)。根據一項研究,大約有43%的數據洩露是由內部參與者發起的。其中有一半是故意的,有一半是偶然的。
  2. 最後一點很重要,為什麼這不僅僅與信任有關。大約20%的數據洩露是偶然的,是內部人員造成的。我很聰明,知道我不夠聰明,無法始終保持一切正常。如果我公開我的存儲庫以為一些有趣的集成工具騰出空間,而忘記了我的證書怎麼辦?如果我有一個忘記加密的備用硬盤驅動器從辦公室走了怎麼辦?如果我的密碼之一泄露了,有人用它來猜測我的git存儲庫(咳嗽 gentoo github存儲庫咳嗽)中的帳戶密碼怎麼辦? 可能會發生許多意外錯誤,這可能會導致我的git存儲庫暴露出來,如果發生這種情況,並且我在其中找到他們的人知道他們在看什麼,我很可能會被抓住。這聽起來很像,但事實是,這就是違規行為的發生方式。
  3. 即使我信任某人,也並不意味著我必須付出他們完全可以使用所有內容[插入俗氣的有關電源如何損壞的報價]。同樣,將憑據放入git存儲庫意味著我有可能將所有基礎架構的全部訪問權限授予所有協作者。總是有可能您不認識您,也不如您想像的那樣,他們可能會決定做一些本不該做的事情。即使您親自認識並信任每個協作者中的每個人,但這並不意味著他們不會犯上述錯誤(或我沒有提到的無盡選擇)中的一些意外釋放您的代碼。
  4. ol>

    簡而言之,良好的安全性是關於分層防禦的。大多數黑客之所以發生,是因為黑客在一個區域發現了漏洞,從而使他們可以利用另一個領域的弱點,從而導致了其他地方的困境,最終使他們獲得了收益。確保您的情況有意義的盡可能多的安全保護措施可以確保整個過程的安全。這樣,當備份硬盤驅動器走出您的辦公室時,您意識到它沒有被加密,您不必問“這是否是有針對性的攻擊,我現在是否必須更改我到處都有的每個憑據,因為它們都在備份驅動器上的git存儲庫中嗎?”。同樣,根據您的情況,這可能不適用於您,但是希望這可以幫助您說明在什麼情況下這可能很重要。

為“ ...這是違反行為的方式” +1。生活是亂七八糟的隨機行為,而且令人驚奇的是,一連串看似隨機的行為可以串在一起形成一次完美的事故(違規,起火,車輛碰撞)。將密碼保留在存儲庫之外,就消除了違規將暴露密碼的可能性。
user1763251
2018-08-16 05:31:35 UTC
view on stackexchange narkive permalink

保持與源代碼分離的機密(密碼,證書,密鑰)可以根據不同的策略管理源和機密。就像所有工程師都能閱讀源代碼一樣,只有直接負責生產服務器的人員才能訪問這些機密。

這使開發人員的工作更加輕鬆,因為他們不受嚴格的安全策略約束。需要保護秘密。可以使源代碼控制策略更加方便。

作為直接負責生產服務器的人員,我可以告訴您,在任何情況下我都不希望開發人員具有質量檢查或生產環境憑據。如果他們有它們,那麼他們將通過對事物進行調整來“解決”問題,直到它們開始工作為止,不會記錄它們的更改,並且由於Wolfsbane與Newt Eye的比率不正確,整個事情將崩潰。在您的Dev環境中執行您想做的任何事情,但是給我一個乾淨的代碼包以進行部署,並提供使它正常工作所需的文檔,並且我可能授予您的唯一訪問權限是日誌只讀。
@MontyHarder那絕對是由於操作目標“不要打破,不要洩漏”和開發目標“立即修復”之間的矛盾。
@WayneWerner這不僅是“不要打破,也不要洩漏”,而是“確保我可以可靠地複制它”。開發人員和操作人員之間的角色分離迫使他們明確傳達依賴關係,以便我們可以進行可靠的複制。現在在開發人員中對其進行修復,並為我記錄一下您進行了哪些修復,以便我可以在質量檢查中對其進行修復,如果該方法不起作用,則說明您不夠好。再試一次。
Tom
2018-08-16 12:55:13 UTC
view on stackexchange narkive permalink

與許多其他安全“最佳做法”一樣,此約定是一種確保不會因不良習慣或例行公事而出錯的簡便方法。

如果您始終記得您的敏感密碼在版本控制系統中,並且如果,您從不授予不應訪問該存儲庫密碼的人,並且如果存儲您的存儲庫這些秘密所要求的一樣安全,並且如果,您的部署過程同樣安全,受到保護並不受未經授權的人員的保護,並且如果,您可以確保存儲庫的所有備份和副本是,並且...您可能還可以添加更多特定於上下文的“ if”。

...然後,您可以將密碼很好地存儲在版本控制系統中。

在大多數情況下,這些“如果”中的至少一個不完全符合您的條件,或者超出您的控制範圍。

例如,在許多設置中,開發人員應該無權訪問生產數據庫。或者將備份系統外包給另一個部門。或將您的構建過程外包到雲中。

這就是為什麼通常不將密碼存儲在版本控制系統中的最佳做法,可確保您不會落入這些陷阱之一,因為您沒有考慮它們。比起在版本控制下安全存儲密碼所需滿足的一長串條件而言,“ git中沒有密碼”更容易記住。

Ben
2018-08-16 20:38:49 UTC
view on stackexchange narkive permalink

其他答案很好,但也要考慮備份問題。如果代碼存儲庫備份不包含有關如何訪問服務器或管理員帳戶的敏感信息,則可以更靈活地存儲代碼存儲庫備份的位置,方式和時間。

從另一個更高的安全性-集中的角度來看,只是您的代碼備份可能是您業務中不道德競爭者的有趣目標。根據您的業務,“法治”國家/地區中的大多數競爭對手都不會碰它。密碼 密碼備份將成為對您的用戶數據感興趣或對勒索您的公司感興趣的任何犯罪組織的目標。

由於違反代碼存儲庫而造成的損害是出於類似原因,請使用密碼。您是要竊取和發布源代碼,還是讓所有用戶遭受身份盜竊,可能因無法保護其私人數據而對您提起訴訟甚至刑事訴訟(例如GDPR)?

Santiago Blanco
2018-08-18 12:29:01 UTC
view on stackexchange narkive permalink

“當我們遠離文明生活時,為什麼直接將鑰匙直接放在大門上真的有那麼糟糕?”

因為想做壞事的人會做事容易,為他們努力的代價不是太高。隨身攜帶鑰匙,不要靠近門。常識。

私人回購?有多少人可以下載它?多少人連接到其計算機?然後……他們都擺脫了危險嗎?

延伸這個比喻:我們是為每位員工製作辦公室門鑰匙的副本,還是只是根據需要分發它們?
gnasher729
2018-08-19 16:34:11 UTC
view on stackexchange narkive permalink

這也取決於源代碼控制系統。

Git的態度是源代碼控制系統應為您提供可靠的項目歷史記錄。擁有一個不錯的態度。但是,結果是,如果您將密碼簽入git,很難將其從存儲庫中刪除。

為此,Perforce有一個“ obliterate”命令。如果您簽入了密碼,或者有人簽入了8 GB未壓縮的視頻文件,或者有人簽入了某些侵犯他人版權並且永遠都不應被簽入的第三方代碼,或者被解雇了許多色情內容,他們上班的最後一天,您可以“抹去”它。它已完全從存儲庫和歷史記錄中刪除。

[可以很容易地從Git歷史記錄中刪除密碼](http://www.davidverhasselt.com/git-how-to-remove-your-password-from-a-repository/)和[根據您的喜好重寫歷史記錄](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History)。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...