在 Docker 中保護密碼
一、概述
在 Docker 中保護密碼是保護容器化應用程序安全性的一個重要方面。外部服務和數據庫通常需要密碼驗證。缺乏適當的保護可能會危及數據安全。
在本教程中,我們將解釋在 Docker 中保護密碼的不同方法。
2.密碼安全的重要性
密碼是驗證外部服務或數據庫的常用方法。雲服務、數據庫和其他第三方服務不斷需要身份驗證。但是,如果這些密碼沒有得到妥善保護,它們可能會被未經授權的用戶洩露。因此,敏感數據可能會暴露給未經授權的個人。
容器化環境通常持續很短的時間並且是短暫的,這使得保護密碼變得更加重要。
3.使用環境變量
將密碼傳遞給容器的最簡單方法是使用ENV
變量。運行容器時,可以使用-e
標誌在運行時設置環境變量。為了說明,我們可以使用以下命令將密碼作為ENV
變量傳遞:
$ docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
在此mysql
映像中,密碼是從環境變量MYSQL_ROOT_PASSWORD
中檢索的。為了設置 root 帳戶的密碼,我們將 env 變量傳遞給docker run
命令。
環境變量不存儲在圖像本身中,因此它們不會意外提交到源代碼存儲庫。我們不需要修改圖像來更改ENV
。環境變量在多租戶環境中是不可靠的,其中多個容器共享一個主機和環境。容器內運行的任何進程都可以訪問它。所以,我們不應該將它用於敏感數據存儲。
4. 使用秘密管理系統
我們可以使用像 Vault 這樣的秘密管理系統來安全地管理和存儲密碼。這些系統通常提供用於存儲和檢索機密的安全 API。此外,我們可以將它與我們的容器化環境集成,以在運行時向容器提供這些秘密。
4.1.使用保險庫
我們可以將密碼作為秘密存儲在保險庫中,然後在容器啟動時使用保險庫的 API 檢索密碼。在我們的應用程序中,我們可以使用 vault 的命令行客戶端或客戶端庫。
讓我們在 Docker 環境中運行 vault 來存儲密碼並在另一個 Docker 容器中檢索它:
$ docker run -itd --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200'
-p 8200:8200 --name vault vault
在上面的命令中, VAULT_DEV_ROOT_TOKEN_ID
設置為myroot
, VAULT_DEV_LISTEN_ADDRESS
設置為0.0.0.0:8200
,因此所有可用的網絡接口都將在端口8200
上偵聽。 docker run
命令的-p
選項在主機的端口8200
8200
讓我們來看看如何在保險庫中創建秘密密碼:
$ export VAULT_ADDR='http://127.0.0.1:8200'
上面的命令告訴 vault 命令行工具與運行在127.0.0.1
端口8200
上的服務器進行通信。讓我們登錄到保險庫服務器並創建一個密碼:
$ vault login myroot
$ vault kv put secret/test password=mysecretpasswordtest
Vault login嘗試使用令牌myroot
登錄到服務器。此令牌處理用戶的身份驗證和授權。 vault kv put
命令使用鍵值對在路徑secret/test
中創建密鑰。這允許我們在服務器上存儲敏感信息並在以後檢索它。
4.2.找回秘密
讓我們運行另一個容器,從上面的保管庫服務器檢索密碼:
$ docker run --rm --network=host -e 'VAULT_ADDR=http://127.0.0.1:8200' -e 'VAULT_TOKEN=myroot'
vault sh -c 'apk add --update curl jq && vault login -method=token token=${VAULT_TOKEN}
&& PASSWORD=$(vault kv get -field=password secret/test) && echo ${PASSWORD}'
通過運行上述命令,將創建一個帶有vault
映像的新容器,並設置環境變量VAULT_ADDR
和VAULT_TOKEN
。此外,它還連接到在端口8200
上運行的本地主機的保管庫服務器。之後,它向保險庫服務器進行身份驗證,從secret/test
獲取密碼密鑰值,然後將其打印出來。授權方只能訪問提供額外安全層的秘密。但是秘密管理系統的設置和管理起來很複雜。此外,它還增加了我們應用程序的成本。
5. 使用 Docker Secrets
Docker secrets 是Docker Swarm模式中的一項功能,它允許我們在 Docker 環境中安全地管理敏感信息,例如密碼。使用 Docker 機密,我們可以將配置文件、敏感信息和命令行參數保留在圖像之外。這總體上降低了暴露的風險。
5.1.創建 Docker Secret
首先,我們需要初始化 Docker swarm 以使用 Docker secrets:
$ docker swarm init
下一步,我們將使用 echo 將密碼通過管道傳輸到 docker secret create 中:
$ echo "testpassword" | docker secret create mysql_external_secret -
上面的命令創建了一個名為“mysql_external_secret”
的唯一秘密,其值為“testpassword”
。使用docker-compose.yml,
我們可以在 Docker 服務中安裝 MySQL 服務器,環境變量MYSQL_ROOT_PASSWORD_FILE
通過 Docker 秘密傳遞:
version: '3.1'
services:
mysql:
image: mysql
secrets: # secrets block only for 'mysql' service
- mysql_external_secret
environment:
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_external_secret
secrets: # top level secrets block
mysql_external_secret:
external: true
secrets 塊表示mysql_external_secret
是我們主機上已經存在的外部機密。
5.2.部署堆棧
Docker 機密在主機上創建機密並在運行時將它們傳遞給容器。這種機制最終降低了暴露的風險。要運行該服務,讓我們部署堆棧:
$ docker stack deploy --compose-file=docker-compose.yml mysql_secret_test
上面的命令部署在docker-compose.yml
文件中定義的堆棧並創建服務mysql_secret_test
。使用這種方法,我們可以在我們的 Docker 環境中安全地管理敏感信息,例如密碼。
6. 最佳實踐
Docker 中的密碼安全是一項至關重要的任務,需要全面規劃和實施。在 Docker 中保護密碼需要一種多層方法,包括使用環境變量、加密、Docker 機密和定期更新密碼。
6.1.加密敏感數據
加密是保護 Docker 容器中密碼的一個重要方面。我們應該在將數據存儲或傳遞給容器之前對其進行加密。這提供了額外的安全層,使未經授權的訪問更加困難。 AES、RSA 和 Blowfish 是可用的加密算法。算法的選擇取決於資源可用性和安全要求。
6.2.敏感信息訪問受限
將對敏感信息(例如密碼)的訪問權限限制為只有需要的人才能訪問,這一點很重要。使用 RBAC,我們可以授予某些用戶訪問權限。我們可以只向需要它的用戶授予訪問權限,並在他們不再需要時撤銷它。因此,未經授權的用戶無法訪問敏感數據,從而降低了數據洩露的可能性。
6.3.定期更新密碼
定期更新密碼是維護容器安全的一個非常簡單和有用的步驟。我們應該至少每三到六個月更新一次密碼。這確保即使密碼被洩露,敏感信息的風險也受到限制。此外,我們應該使用難以猜測的強密碼。
七、結論
在本文中,我們討論了在 Docker 中保護密碼的幾種方法,包括使用環境變量、秘密管理系統和密鑰管理系統。在 Docker 中保護密碼的最佳方法取決於我們的特定用例和要求。
環境變量可用於輕鬆保護少量密碼。但是,如果我們需要存儲許多密碼,秘密或密鑰管理系統可能是更好的選擇。