本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS Secrets Manager 客服人員
AWS Secrets Manager 代理程式是一種用戶端HTTP服務,可用來標準化 Secrets Manager 在 Amazon Elastic Container Service AWS Lambda、Amazon Elastic Kubernetes Service 和 Amazon Elastic Compute Cloud 等環境中的秘密使用。Secrets Manager Agent 可以擷取和快取記憶體中的秘密,讓您的應用程式可以直接從快取取用秘密。這表示您可以從 localhost 擷取應用程式所需的秘密,而不是呼叫 Secrets Manager。Secrets Manager 代理程式只能向 Secrets Manager 提出讀取請求,無法修改秘密。
Secrets Manager Agent 會使用您在環境中提供的 AWS 登入資料來呼叫 Secrets Manager。Secrets Manager Agent 提供對伺服器端請求偽造 (SSRF) 的保護,以協助改善秘密安全性。您可以設定 Secrets Manager Agent,方法是設定連線數量上限、存留時間 (TTL)、localhost HTTP 連接埠和快取大小。
由於 Secrets Manager Agent 使用記憶體內快取,因此會在 Secrets Manager Agent 重新啟動時重設。Secrets Manager Agent 會定期重新整理快取的秘密值。當您嘗試在 TTL 過期後從 Secrets Manager Agent 讀取秘密時,會發生重新整理。預設重新整理頻率 (TTL) 為 300 秒,您可以使用組態檔案使用--config
命令列引數傳遞給 Secrets Manager Agent 的 來變更頻率。Secrets Manager Agent 不包含快取失效。例如,如果秘密在快取項目過期之前輪換,Secrets Manager Agent 可能會傳回過時的秘密值。
Secrets Manager Agent 會以與 回應相同的格式傳回秘密值GetSecretValue
。秘密值不會在快取中加密。
若要下載原始程式碼,請參閱 https://github.com/aws/aws-secretsmanager-agent 上的 GitHub。
步驟 1:建置 Secrets Manager 代理程式二進位檔
若要原生建置 Secrets Manager Agent 二進位檔,您需要標準開發工具和 Rust 工具。或者,您可以針對支援它的系統進行交叉編譯,也可以使用 Rust 交叉進行交叉編譯。
- RPM-based systems
-
-
在 RPM型系統上,例如 AL2023,您可以使用 開發工具 群組來安裝開發工具。
sudo yum -y groupinstall "Development Tools"
-
請遵循 Rust 文件中的安裝 Rust 說明。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
-
使用貨運組建命令建置代理程式:
cargo build --release
您可以在 下找到可執行檔target/release/aws-secrets-manager-agent
。
- Debian-based systems
-
-
在 Ubuntu 等 Debian 系統上,您可以使用 build-essential 套件安裝開發人員工具。
sudo apt install build-essential
-
請遵循 Rust 文件中的安裝 Rust 說明。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
-
使用貨運組建命令建置代理程式:
cargo build --release
您可以在 下找到可執行檔target/release/aws-secrets-manager-agent
。
- Windows
-
若要在 Windows 上建置,請遵循 Microsoft Windows 文件中的在 Windows for Rust 上設定開發環境的指示。
- Cross-compile natively
-
在提供 mingw-w64 套件的分佈上,例如 Ubuntu,您可以原生跨編譯。
# Install the cross compile tool chain
sudo add-apt-repository universe
sudo apt install -y mingw-w64
# Install the rust build targets
rustup target add x86_64-pc-windows-gnu
# Cross compile the agent for Windows
cargo build --release --target x86_64-pc-windows-gnu
您可以在 找到可執行檔target/x86_64-pc-windows-gnu/release/aws-secrets-manager-agent.exe
。
- Cross compile with Rust cross
-
如果跨編譯工具無法在 系統上原生使用,您可以使用 Rust 跨專案。如需詳細資訊,請參閱https://github.com/cross-rs/交叉。
# Install and start docker
sudo yum -y install docker
sudo systemctl start docker
sudo systemctl enable docker # Make docker start after reboot
# Give ourselves permission to run the docker images without sudo
sudo usermod -aG docker $USER
newgrp docker
# Install cross and cross compile the executable
cargo install cross
cross build --release --target x86_64-pc-windows-gnu
步驟 2:安裝 Secrets Manager 代理程式
根據運算類型,您有幾個安裝 Secrets Manager Agent 的選項。
- Amazon EKS, Amazon EC2, and Amazon ECS
-
安裝 Secrets Manager 代理程式
-
使用 儲存庫中提供的install
指令碼。
指令碼會在啟動時產生隨機SSRF字符,並將其存放在 檔案 中/var/run/awssmatoken
。安裝指令碼建立的awssmatokenreader
群組可讀取權杖。
-
若要允許應用程式讀取權杖檔案,您需要將應用程式執行所在的使用者帳戶新增至 awssmatokenreader
群組。例如,您可以使用下列 usermod 命令授予應用程式讀取權杖檔案的許可,其中 <APP_USER>
是應用程式執行所在的使用者 ID。
sudo usermod -aG awssmatokenreader <APP_USER>
- Docker
-
您可以使用 Docker 將 Secrets Manager Agent 作為附屬容器與應用程式一起執行。然後,您的應用程式可以從 Secrets Manager Agent 提供的本機HTTP伺服器擷取秘密。如需 Docker 的相關資訊,請參閱 Docker 文件。
使用 Docker 為 Secrets Manager Agent 建立附屬容器
-
為 Secrets Manager Agent 附屬容器建立 Dockerfile。下列範例會使用 Secrets Manager Agent 二進位檔建立 Docker 容器。
# Use the latest Debian image as the base
FROM debian:latest
# Set the working directory inside the container
WORKDIR /app
# Copy the Secrets Manager Agent binary to the container
COPY secrets-manager-agent .
# Install any necessary dependencies
RUN apt-get update && apt-get install -y ca-certificates
# Set the entry point to run the Secrets Manager Agent binary
ENTRYPOINT ["./secrets-manager-agent"]
-
為您的用戶端應用程式建立 Dockerfile。
-
建立 Docker Compose 檔案以執行兩個容器,確保它們使用相同的網路介面。這是必要的,因為 Secrets Manager Agent 不接受來自 localhost 介面外部的請求。下列範例顯示 Docker Compose 檔案,其中 network_mode
金鑰會將secrets-manager-agent
容器連接至client-application
容器的網路命名空間,這可讓它們共用相同的網路界面。
您必須載入 AWS 登入資料和SSRF字符,應用程式才能使用 Secrets Manager Agent。請查看以下內容:
version: '3'
services:
client-application:
container_name: client-application
build:
context: .
dockerfile: Dockerfile.client
command: tail -f /dev/null # Keep the container running
secrets-manager-agent:
container_name: secrets-manager-agent
build:
context: .
dockerfile: Dockerfile.agent
network_mode: "container:client-application" # Attach to the client-application container's network
depends_on:
- client-application
-
將secrets-manager-agent
二進位檔複製到包含 Dockerfiles 和 Docker Compose 檔案的相同目錄。
-
使用下列docker-compose
命令,根據提供的 Dockerfiles 建置和執行容器。
docker-compose up --build
在您的用戶端容器中,您現在可以使用 Secrets Manager Agent 擷取秘密。如需詳細資訊,請參閱步驟 3:使用 Secrets Manager Agent 擷取秘密。
- AWS Lambda
-
您可以封裝 Secrets Manager Agent 做為 AWS Lambda 延伸模組。然後,您可以將它做為圖層新增至 Lambda 函數,並從 Lambda 函數呼叫 Secrets Manager Agent 以取得秘密。
下列指示說明如何MyTest
使用 secrets-manager-agent-extension.sh
中的範例指令碼來取得名為 的秘密,https://github.com/aws/aws-secretsmanager-agent以安裝 Secrets Manager Agent 做為 Lambda 延伸模組。
建立封裝 Secrets Manager Agent 的 Lambda 延伸模組
建立 Python Lambda 函數,查詢http://localhost:2773/secretsmanager/get?secretId=MyTest
以取得秘密。請務必在應用程式程式碼中實作重試邏輯,以因應 Lambda 延伸模組的初始化和註冊延遲。
-
從 Secrets Manager Agent 程式碼套件的根目錄,執行下列命令來測試 Lambda 延伸模組。
AWS_ACCOUNT_ID=<AWS_ACCOUNT_ID>
LAMBDA_ARN=<LAMBDA_ARN>
# Build the release binary
cargo build --release --target=x86_64-unknown-linux-gnu
# Copy the release binary into the `bin` folder
mkdir -p ./bin
cp ./target/x86_64-unknown-linux-gnu/release/aws_secretsmanager_agent ./bin/secrets-manager-agent
# Copy the `secrets-manager-agent-extension.sh` script into the `extensions` folder.
mkdir -p ./extensions
cp aws_secretsmanager_agent/examples/example-lambda-extension/secrets-manager-agent-extension.sh ./extensions
# Zip the extension shell script and the binary
zip secrets-manager-agent-extension.zip bin/* extensions/*
# Publish the layer version
LAYER_VERSION_ARN=$(aws lambda publish-layer-version \
--layer-name secrets-manager-agent-extension \
--zip-file "fileb://secrets-manager-agent-extension.zip" | jq -r '.LayerVersionArn')
# Attach the layer version to the Lambda function
aws lambda update-function-configuration \
--function-name $LAMBDA_ARN \
--layers "$LAYER_VERSION_ARN"
叫用 Lambda 函數來驗證是否正確擷取秘密。
步驟 3:使用 Secrets Manager Agent 擷取秘密
若要使用 代理程式,請呼叫本機 Secrets Manager Agent 端點,並將秘密的名稱或 ARN 包含為查詢參數。根據預設,Secrets Manager Agent 會擷取秘密的AWSCURRENT
版本。若要擷取不同的版本,您可以設定 versionStage
或 versionId
。
為了協助保護 Secrets Manager Agent,您必須在每個請求中包含權SSRF杖標頭:X-Aws-Parameters-Secrets-Token
。Secrets Manager 代理程式拒絕沒有此標頭或具有無效SSRF字符的請求。您可以在 中自訂SSRF標頭名稱組態檔案。
Secrets Manager Agent 會使用 AWS SDK for Rust,其會使用預設的登入資料提供者鏈。這些IAM登入資料的身分決定 Secrets Manager Agent 擷取秘密的許可。
必要許可:
如需詳細資訊,請參閱許可參考。
將秘密值提取至 Secrets Manager Agent 之後,任何可存取運算環境和SSRF字符的使用者都可以從 Secrets Manager Agent 快取存取秘密。如需詳細資訊,請參閱安全考量。
- curl
-
下列 curl 範例示範如何從 Secrets Manager Agent 取得秘密。此範例依賴於 檔案中的 SSRF ,也就是安裝指令碼存放的位置。
curl -v -H \
"X-Aws-Parameters-Secrets-Token: $(</var/run/awssmatoken)" \
'http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>
'; \
echo
- Python
-
下列 Python 範例示範如何從 Secrets Manager Agent 取得秘密。此範例依賴於 檔案中的 SSRF ,也就是安裝指令碼存放的位置。
import requests
import json
# Function that fetches the secret from Secrets Manager Agent for the provided secret id.
def get_secret():
# Construct the URL for the GET request
url = f"http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>
"
# Get the SSRF token from the token file
with open('/var/run/awssmatoken') as fp:
token = fp.read()
headers = {
"X-Aws-Parameters-Secrets-Token": token.strip()
}
try:
# Send the GET request with headers
response = requests.get(url, headers=headers)
# Check if the request was successful
if response.status_code == 200:
# Return the secret value
return response.text
else:
# Handle error cases
raise Exception(f"Status code {response.status_code} - {response.text}")
except Exception as e:
# Handle network errors
raise Exception(f"Error: {e}")
設定 Secrets Manager Agent
若要變更 Secrets Manager Agent TOML 的組態,請建立組態檔案,然後呼叫 ./aws-secrets-manager-agent --config config.toml
。
下列清單顯示您可以為 Secrets Manager Agent 設定的選項。
log_level – Secrets Manager Agent 日誌中報告的詳細資訊層級:DEBUG、INFOWARN、、 ERROR或 NONE。預設值為 INFO。
http_port – 本機HTTP伺服器的連接埠,範圍為 1024 到 65535。預設值為 2773。
region – AWS 用於請求的區域。如果未指定區域,Secrets Manager Agent 會從 決定區域SDK。如需詳細資訊,請參閱《 AWS SDK for Rust 開發人員指南》中的指定您的登入資料和預設區域。
ttl_seconds – 快取項目的秒TTL數,範圍介於 1 到 3600。預設值為 300。如果快取大小為 0,則不會使用此設定。
cache_size – 快取中可存放的秘密數目上限,範圍介於 0 到 1000。0 表示沒有快取。預設為 1000。
ssrf_headers – Secrets Manager Agent 檢查SSRF字符的標頭名稱清單。預設值為「X-Aws-Parameters-Secrets-Token X-Vault-Token」。
ssrf_env_variables – Secrets Manager Agent 檢查SSRF字符的環境變數名稱清單。環境變數可以包含權杖或權杖檔案的參考,如 所示AWS_TOKEN=file:///var/run/awssmatoken
。預設值為 "AWS_TOKEN, AWS_SESSION_TOKEN"。
path_prefix – 用來判斷請求是否為路徑型請求的URI字首。預設值為 "/v1/"。
max_conn – Secrets Manager Agent 允許的最大HTTP用戶端連線數,範圍介於 1 到 1000。預設值為 800。
日誌
Secrets Manager Agent 會在本機將錯誤記錄到檔案 logs/secrets_manager_agent.log
。當您的應用程式呼叫 Secrets Manager Agent 以取得秘密時,這些呼叫會出現在本機日誌中。它們不會出現在 CloudTrail 日誌中。
Secrets Manager 代理程式會在檔案達到 10 MB 時建立新的日誌檔案,並總共存放最多五個日誌檔案。
日誌不會前往 Secrets Manager CloudTrail, 或 CloudWatch。從 Secrets Manager Agent 取得秘密的請求不會出現在這些日誌中。當 Secrets Manager Agent 呼叫 Secrets Manager 以取得秘密時,該呼叫會以包含 CloudTrail 的使用者代理程式字串記錄在 中aws-secrets-manager-agent
。
您可以在 中設定記錄組態檔案。
安全考量
對於代理程式架構,信任網域是可以存取代理程式端點和SSRF字符的地方,通常是整個主機。Secrets Manager Agent 的信任網域應該與可使用 Secrets Manager 登入資料的網域相符,以維持相同的安全狀態。例如,在 Amazon EC2 上使用 Amazon 的角色時,Secrets Manager Agent 的信任網域會與登入資料的網域相同EC2。
尚未使用代理程式解決方案且已將 Secrets Manager 登入資料鎖定至應用程式的安全意識應用程式,應考慮使用語言特定 AWS SDKs或快取解決方案。如需詳細資訊,請參閱從中獲取秘密 AWS Secrets Manager。