翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS Secrets Manager エージェント
AWS Secrets Manager エージェントは、Amazon Elastic Container Service、Amazon Elastic Kubernetes Service AWS Lambda、Amazon Elastic Compute Cloud などの環境全体で Secrets Manager からのシークレットの使用を標準化するために使用できるクライアント側の HTTP サービスです。Secrets Manager Agent は、シークレットをメモリに取得してキャッシュできるため、アプリケーションはキャッシュから直接シークレットを使用できます。つまり、Secrets Manager を呼び出す代わりに、アプリケーションに必要なシークレットを localhost から取得できます。Secrets Manager Agent は Secrets Manager に対してのみ読み取りリクエストを行うことができます。シークレットを変更することはできません。
Secrets Manager エージェントは、環境で指定した AWS 認証情報を使用して Secrets Manager を呼び出します。Secrets Manager Agent は、サーバーサイドリクエストフォージェリ (SSRF) に対する保護を提供し、シークレットのセキュリティを強化します。Secrets Manager Agent は、最大接続数、有効時間 (TTL)、ローカルホスト 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
のレスポンスと同じ形式でシークレット値を返します。シークレット値はキャッシュ内で暗号化されません。
ソースコードをダウンロードするには、GitHub の https://github.com/aws/aws-secretsmanager-agent を参照してください。
ステップ 1: Secrets Manager Agent バイナリをビルドする
Secrets Manager Agent バイナリをネイティブにビルドするには、標準の開発ツールと Rust ツールが必要です。または、それをサポートするシステム用にクロスコンパイルするか、Rust の cross を使用してクロスコンパイルすることもできます。
- RPM-based systems
-
-
AL2023 などの RPM ベースのシステムでは、開発ツールグループを使用して開発ツールをインストールできます。
sudo yum -y groupinstall "Development Tools"
-
Rust ドキュメントの「Rust のインストール」の指示に従います。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"
-
cargo build コマンドを使用してエージェントをビルドします。
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 コマンドを使用してエージェントをビルドします。
cargo build --release
実行ファイルは target/release/aws-secrets-manager-agent
にあります。
- Windows
-
Windows でビルドするには、Microsoft Windows ドキュメントの「Windows for Rust で 開発環境をセットアップする」の手順に従います。
- Cross-compile natively
-
Ubuntu など、mingw-w64 パッケージが利用可能なディストリビューションでは、ネイティブにクロスコンパイルできます。
# 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/cross を参照してください。
ビルド環境には 32GB のディスク容量をお勧めします。
# 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 Agent のインストール
コンピューティングの種類に応じて、Secrets Manager Agent をインストールするためのいくつかのオプションがあります。
- Amazon EKS, Amazon EC2, and Amazon ECS
-
Secrets Manager Agent をインストールするには
-
リポジトリで提供されている 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 インターフェイスの外部からのリクエストを受け入れないようにするために必要です。次の例は、network_mode
キーが secrets-manager-agent
コンテナを client-application
コンテナのネットワーク名前空間にアタッチし、同じネットワークインターフェイスを共有できるようにする Docker Compose ファイルを示しています。
Secrets Manager エージェントを使用するには、アプリケーションの AWS 認証情報と SSRF トークンをロードする必要があります。以下を参照してください。
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 を呼び出してシークレットを取得します。
次の手順は、https://github.com/aws/aws-secretsmanager-agent のサンプルスクリプト secrets-manager-agent-extension.sh
を使用して MyTest
という名前のシークレットを取得し、Secrets Manager Agent を Lambda 拡張機能としてインストールする方法を示します。
Secrets Manager Agent をパッケージ化する Lambda 拡張機能を作成するには
http://localhost:2773/secretsmanager/get?secretId=MyTest
をクエリしてシークレットを取得する Python Lambda 関数を作成します。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 を保護するためには、各リクエスト X-Aws-Parameters-Secrets-Token
の一部として SSRF トークンヘッダーを含める必要があります。Secrets Manager Agent は、このヘッダーを持たないリクエストや無効な SSRF トークンを持つリクエストを拒否します。設定ファイル で SSRF ヘッダー名をカスタマイズできます。
Secrets Manager エージェントは、デフォルトの認証情報プロバイダーチェーンを使用する AWS SDK for Rust を使用します。これらの IAM 認証情報の ID は、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}")
でシークレットを強制更新する RefreshNow
Secrets Manager Agent は、インメモリキャッシュを使用してシークレット値を保存し、定期的に更新します。デフォルトでは、この更新は有効期限 (TTL) の期限が切れた後、通常は 300 秒ごとにシークレットをリクエストしたときに発生します。ただし、このアプローチでは、特にキャッシュエントリの有効期限が切れる前にシークレットがローテーションする場合に、古いシークレット値が発生することがあります。
この制限に対応するため、Secrets Manager Agent は URL refreshNow
で というパラメータをサポートしています。このパラメータを使用して、シークレットの値を強制的に即時更新し、キャッシュをバイパスしてup-to-date最新の情報を取得できます。
- デフォルトの動作 ( なし
refreshNow
)
-
-
TTL の有効期限が切れるまでキャッシュされた値を使用します
-
TTL の後にのみシークレットを更新します (デフォルトは 300 秒)
-
キャッシュの有効期限が切れる前にシークレットがローテーションすると、古い値を返すことがあります。
- での動作
refreshNow=true
-
refreshNow
パラメータを使用すると、頻繁なシークレットローテーションが必要なシナリオでも、常に最新のシークレット値を使用できます。
refreshNow パラメータの動作
- refreshNow が
true
に設定
-
Secrets Manager エージェントが Secrets Manager からシークレットを取得できない場合、エラーが返され、キャッシュは更新されません。
- refreshNow を に設定する
false
か、指定しない
-
Secrets Manager Agent は、デフォルトの動作に従います。
refreshNow パラメータの使用
refreshNow パラメータを使用するには、Secrets Manager エージェント GET リクエストの URL にパラメータを含めます。
例 - refreshNow パラメータを使用した Secrets Manager Agent GET リクエスト
refreshNow
の初期値は false
です。に設定するとtrue
、Secrets Manager エージェント設定ファイルで指定された TTL が上書きされ、Secrets Manager への API コールが行われます。
- 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>&refreshNow=true'
\
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>
&refreshNow=true"
# 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、INFO、WARN、ERROR、または NONE。デフォルトは INFO です。
http_port – ローカル HTTP サーバーのポート範囲は 1024 ~ 65535 です。デフォルトは 2773 です。
region – リクエストに使用する AWS リージョン。リージョンが指定されていない場合、Secrets Manager Agent は SDK からリージョンを決定します。詳細については、「AWS SDK for Rust Developer Guide」の「Specify your credentials and default Region」を参照してください。
ttl_seconds – キャッシュされた項目の TTL の秒数。範囲は 0~3600 です。デフォルトは 300 です。0 はキャッシュがないことを示します。
cache_size – キャッシュに保存できるシークレットの最大数。範囲は 1~1000 です。デフォルトは 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 Agent は、ファイルが 10 MB に達すると新しいログファイルを作成し、合計で最大 5 つのログファイルを保存します。
ログは Secrets Manager、CloudTrail、または CloudWatch には送信されません。Secrets Manager Agent からシークレットを取得するリクエストは、これらのログに表示されません。Secrets Manager Agent が Secrets Manager を呼び出してシークレットを取得すると、その呼び出しは aws-secrets-manager-agent
を含むユーザーエージェント文字列とともに CloudTrail に記録されます。
設定ファイル でログ記録を設定できます。
セキュリティに関する考慮事項
エージェントアーキテクチャの場合、信頼ドメインは、エージェントエンドポイントと SSRF トークンにアクセスできる場所であり、通常はホスト全体です。同じセキュリティ体制を維持するために、Secrets Manager Agent の信頼ドメインは、Secrets Manager 認証情報が利用可能なドメインと一致する必要があります。例えば、Amazon EC2 では、Secrets Manager Agent の信頼ドメインは、Amazon EC2 のロールを使用する場合の認証情報のドメインと同じになります。
Secrets Manager の認証情報がアプリケーションにロックされたエージェントソリューションをまだ使用していないセキュリティ意識の高いアプリケーションでは、言語固有の AWS SDKs またはキャッシュソリューションの使用を検討する必要があります。詳細については、「からシークレットを取得する AWS Secrets Manager」を参照してください。