一千萬個為什麽

搜索


我們計劃在我們的項目中使用可靠的保管庫以防止git中的密碼或密鑰泄漏。

我們的想法是將所有敏感數據放入一個普通文件中,然後在推送到git之前使用密碼使用ansible-vault加密此文件。

要解密文件,我們必須將保險庫密碼傳遞給合適的人,我正在考慮3種可能性:

  • 將其存儲在服務器環境變量
  • 將它作為選項傳遞給ansible-playbook命令
  • 將其存儲到非版本文件中。

有沒有其他選擇,這是存儲密碼保護密碼的最好(也是最安全的)方式,最佳實踐文檔並沒有說明這一點。

轉載註明原文: 何處放置安全保險庫密碼

一共有 3 個回答:

這個想法是把我們所有的敏感數據[...]

在實施您計劃的解決方案之前,應該仔細分析這句話中“全部”的含義。

Ansible保險庫是一個非常有用的工具,但它應該僅用於存儲以下秘密:

  1. 安全部署特別需要
  2. 對於那些應該不了解它們的業主而言,很容易變得毫無用處,但這可能會非法“記住”它們(通常是登機員工)

第二點很關鍵。

許多人,也可能是整個DevOps團隊,都可以訪問安全的保險庫密碼,因此可以訪問所有的秘密。

因此,對於存儲在保險庫中的所有秘密,應該保持一個條件,對於未經授權訪問的人或機器應該無法使用它們,如果需要的話。

具體而言,如果您使用可以部署數據庫及其用戶,則可以將密碼存儲在保管庫中,但如果該服務可從Internet獲得,則必須非常小心(並且很可能考慮其他解決方案)並且不需要任何VPN身份驗證!

暴露於秘密的用戶(DevOps)在強加給他們的安全屏障(例如,撤銷VPN訪問)時應該無法使用“記住”的密碼。除此之外,在更改密碼之前,也應該撤銷對源代碼庫(保管庫存儲位置)的訪問。

在這些情況下,可靠的保險庫是一個非常有用的工具。

試圖存儲一個可以被保險箱中的互聯網上的任何人或機器使用的秘密將是一個錯誤(例如,用戶的VPN憑證)。

是否有其他選擇,這是存儲密碼保管密碼的最好(也是最安全的)方式

在前一段的條件下,我認為一個好的做法是:

  1. Store the vault password in an external secure vault (something like Vault from HashiCorp or any SaaS for credentials management)
  2. Allow access to the external vault item to DevOps (they will need the password for testing) and the CI/CD system or ansible controller
  3. Keep a convention to use secrets! You will not be able to review changes to the secrets and you will not be able to grep for ansible variables in secrets files! So be thorough since the beginning. A good convention is to name all variables stored in the ansible vault with a secret_ prefix. When you will see something like:

    postgres.yml:

    postgres_password: "{{ secret_postgres_password }}"
    

    you will know that the value is stored in the ansible vault.

我們計劃在我們的項目中使用可靠的保險庫,以防止git中的密碼或密碼泄漏。

既然你還沒有實施任何東西,你可能會重新考慮這一點。使用Ansible保險庫等系統存在一些安全缺陷:

  • 沒有審核記錄誰訪問過它
  • 員工離職時,他們很容易帶著秘密商店
  • 員工離職時,刪除他們的訪問權限意味著更改密碼並將其重新分配給其他人
  • 受保護的Ansible保管庫密碼可永久用於保存在版本控制中的舊版本保險庫
  • 秘密必須是靜態的

一個可能更安全,但更復雜的系統,沒有這些缺點,就是使用Hashicorp Vault來存儲你的秘密。然後,您仍然可以通過使用 https://github.com/從Ansible保管庫中輕松獲取值jhaals/ansible-vault

然後,您必須管理Hashicorp Vault的身份驗證,這是烏龜問題。對於人類而言,我認為最好的解決方案是定期提示輸入密碼,並在短時間後過期;對於機器,請使用 AWS身份驗證後端或類似內容。您永遠無法完全擺脫身份驗證的需要,但您可以讓攻擊者難以訪問它。

現在,如果設置和管理秘密服務器對您來說太過分了,那麽您當然可以使用Ansible保管庫。為什麽要在各個機器上存儲密碼?對於交互式使用,您可以提示輸入密碼,用戶可以將其存儲在他們選擇的密碼管理器中。 iTerm在OS X上有一個與Keychain.app集成的密碼管理器,這使得這個特別容易。

這很大程度上取決於您處理敏感數據的內部政策。

我想告訴你我的解決辦法並解釋我所看到的優點和缺點。我將Ansible Vault密碼保存在控制機器的一個文件中,並有一個指向它的環境變量:

export ANSIBLE_VAULT_PASSWORD_FILE=/deep/dark/place

I have that on my workstation (as I need to test & develop playbooks), some colleagues have it as well, and of course we have it on the main Ansible control machine.

優點:

  • 不在共享位置/存儲庫(您說的是非版本文件)
  • 不需要知道您的Ansible保險庫密碼即可運行遊戲(這是在您有CI工具的情況下,例如Jenkins,您可以在其中輕松啟動劇本)

缺點:

  • 不容易旋轉密碼
  • 每個在你的工作簿上工作的人都需要在他的工作站上

這些缺點確實有緩解,但這又取決於你在日常運作中采用的政策和規則。