AWS Secrets Manager Agent の使用
Secrets Manager Agent の仕組み
AWS Secrets Manager Agent は、コンピューティング環境全体で Secrets Manager からシークレットを使用する方法を標準化するのに役立つクライアント側の HTTP サービスです。これは次のサービスと併用できます。
-
AWS Lambda
-
Amazon Elastic Container Service
-
Amazon Elastic Kubernetes Service
-
Amazon Elastic Compute Cloud
Secrets Manager Agent はシークレットを取得してメモリにキャッシュするため、アプリケーションは Secrets Manager を直接呼び出す代わりに localhost からシークレットを取得できます。Secrets Manager Agent はシークレットのみを読み取ることができます。シークレットを変更することはできません。
Secrets Manager Agent は、環境からの AWS 認証情報を使用して Secrets Manager を呼び出します。これには、シークレットセキュリティの向上に役立つ Server Side Request Forgery (SSRF) に対する保護が含まれています。Secrets Manager Agent は、デフォルトで最高優先度のキー交換としてポスト量子 ML-KEM キー交換を使用します。
Secrets Manager Agent のキャッシュについて
Secrets Manager Agent はインメモリキャッシュを使用するため、Secrets Manager Agent を再起動するとキャッシュがリセットされます。以下に基づいて、キャッシュされたシークレット値を定期的に更新します。
Secrets Manager Agent にはキャッシュ無効化は含まれません。キャッシュエントリの有効期限が切れる前にシークレットがローテーションすると、Secrets Manager Agent は古いシークレット値を返すことがあります。
Secrets Manager Agent は、GetSecretValue のレスポンスと同じ形式でシークレット値を返します。シークレット値はキャッシュ内で暗号化されません。
Secrets Manager Agentをビルドする
開始する前に、プラットフォーム用の標準開発ツールと Rust ツールがインストールされていることを確認してください。
macOS で fips 機能を有効にしてエージェントを構築するには、現在次の回避策が必要です。
- RPM-based systems
-
RPM ベースのシステム上に構築するには
-
リポジトリで提供されている install スクリプトを使用します。
スクリプトは、起動時にランダムな SSRF トークンを生成し、ファイル /var/run/awssmatoken に保存します。トークンは、インストールスクリプトが作成する awssmatokenreader グループによって読み取り可能です。
-
アプリケーションがトークンファイルを読み取れるようにするには、アプリケーションが実行するユーザーアカウントを awssmatokenreader グループに追加する必要があります。例えば、次の usermod コマンドを使用してトークンファイルを読み取るアクセス許可をアプリケーションに付与できます。ここで <APP_USER> は、アプリケーションを実行するユーザー ID です。
sudo usermod -aG awssmatokenreader <APP_USER>
開発ツールのインストール
AL2023 などの RPM ベースのシステムでは、開発ツールグループをインストールします。
sudo yum -y groupinstall "Development Tools"
-
Rust のインストール
「Rust ドキュメント」の「Rust のインストール」の指示に従います。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Follow the on-screen instructions
. "$HOME/.cargo/env"
-
エージェントの構築
cargo build コマンドを使用して Secrets Manager Agent をビルドします。
cargo build --release
実行ファイルは target/release/aws_secretsmanager_agent にあります。
- Debian-based systems
-
Debian ベースのシステム上に構築するには
-
開発ツールのインストール
Ubuntu などの Debian ベースのシステムでは、build-essential パッケージをインストールします。
sudo apt install build-essential
-
Rust のインストール
「Rust ドキュメント」の「Rust のインストール」の指示に従います。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Follow the on-screen instructions
. "$HOME/.cargo/env"
-
エージェントの構築
cargo build コマンドを使用して Secrets Manager Agent をビルドします。
cargo build --release
実行ファイルは target/release/aws_secretsmanager_agent にあります。
- Windows
-
Windows でビルドするには
-
開発環境のセットアップ
「Microsoft Windows ドキュメント」の「Windows for Rust で開発環境をセットアップする」の手順に従います。
-
エージェントの構築
cargo build コマンドを使用して Secrets Manager Agent をビルドします。
cargo build --release
実行ファイルは target/release/aws_secretsmanager_agent.exe にあります。
- Cross-compile natively
-
ネイティブにクロスコンパイルするには
-
クロスコンパイルツールをインストールする
Ubuntu など、mingw-w64 パッケージが利用可能なディストリビューションでは、クロスコンパイルツールチェーンをインストールします。
# Install the cross compile tool chain
sudo add-apt-repository universe
sudo apt install -y mingw-w64
-
Rust ビルドターゲットを追加する
Windows GNU ビルドターゲットをインストールします:
rustup target add x86_64-pc-windows-gnu
-
Windows 用にビルドする
Windows 用の エージェントをクロスコンパイルします:
cargo build --release --target x86_64-pc-windows-gnu
実行ファイルは target/x86_64-pc-windows-gnu/release/aws_secretsmanager_agent.exe にあります。
- Cross compile with Rust cross
-
Rust cross を使用してクロスコンパイルするには
クロスコンパイルツールがシステムでネイティブに利用できない場合、Rust のクロスプロジェクトを使用できます。詳細については、「https://github.com/cross-rs/cross」を参照してください。
ビルド環境には 32GB のディスク容量をお勧めします。
-
Docker をセットアップ
Docker をインストールして構成します:
# Install and start docker
sudo yum -y install docker
sudo systemctl start docker
sudo systemctl enable docker # Make docker start after reboot
-
Docker アクセス許可を設定する
ユーザーを Docker グループに追加します:
# Give ourselves permission to run the docker images without sudo
sudo usermod -aG docker $USER
newgrp docker
-
Windows 用にビルドする
クロスをインストールし、実行可能ファイルを構築します:
# Install cross and cross compile the executable
cargo install cross
cross build --release --target x86_64-pc-windows-gnu
Secrets Manager Agent をインストールする
次のインストールオプションからコンピューティング環境を選択します。
- Amazon EC2
-
Amazon EC2 で Secrets Manager Agent をインストールするには
-
設定ディレクトリに移動する
設定ディレクトリに変更します:
cd aws_secretsmanager_agent/configuration
-
インストールスクリプトを実行する
リポジトリで提供されている install スクリプトを実行します。
スクリプトは、起動時にランダムな SSRF トークンを生成し、ファイル /var/run/awssmatoken に保存します。トークンは、インストールスクリプトが作成する awssmatokenreader グループによって読み取り可能です。
-
アプリケーションのアクセス許可を設定する
アプリケーションが実行されるユーザーアカウントを awssmatokenreaderグループに追加します:
sudo usermod -aG awssmatokenreader APP_USER
APP_USER を、アプリケーションが実行されるユーザー ID に置き換えます。
- Container Sidecar
-
Docker を使用して、Secrets Manager Agent をアプリケーションと一緒にサイドカーコンテナとして実行できます。その後、アプリケーションは Secrets Manager Agent が提供するローカル HTTP サーバーからシークレットを取得できます。Docker の詳細については、「Docker ドキュメント」を参照してください。
Secrets Manager Agent のサイドカーコンテナを作成するには
-
エージェント Dockerfile を作成する
Secrets Manager Agent サイドカーコンテナ用の Dockerfile を作成します:
# 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 を作成する
クライアントアプリケーション用の Dockerfile を作成します。
-
Docker Compose ファイルを作成する
Docker Compose ファイルを作成して、共有ネットワークインターフェイスで両方のコンテナを実行します:
アプリケーションが Secrets Manager Agent を使用できるようにするには、AWS 認証情報と SSRF トークンをロードする必要があります。Amazon EKS と Amazon ECS については、以下を参照してください。
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 を使用してコンテナを構築して実行します:
docker-compose up --build
-
次のステップ
クライアントコンテナから、Secrets Manager Agent を使用してシークレットを取得できるようになりました。詳しくは、「Secrets Manager Agent を使用してシークレットを取得する」を参照してください。
- Lambda
-
Secrets Manager Agent を 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 拡張機能を作成するには
-
エージェントレイヤーをパッケージ化する
Secrets Manager Agent コードパッケージのルートから、次のコマンドを実行します:
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` example 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')
-
SSRF トークンを設定する
エージェントのデフォルト設定では、SSRF トークンは、事前に設定された AWS_SESSION_TOKEN または AWS_CONTAINER_AUTHORIZATION_TOKEN 環境変数 (SnapStart が有効になっている Lambda 関数の後半変数) で設定された値に自動的に設定されます。または、Lambda 関数の任意の値を使用して AWS_TOKEN 環境変数を定義することもできます。これは、この変数が他の 2 つよりも優先されるためです。AWS_TOKEN 環境変数を使用する場合は、その環境変数を lambda:UpdateFunctionConfiguration 呼び出しで設定する必要があります。
-
レイヤーを関数にアタッチする
レイヤーバージョンを Lambda 関数にアタッチします:
# Attach the layer version to the Lambda function
aws lambda update-function-configuration \
--function-name $LAMBDA_ARN \
--layers "$LAYER_VERSION_ARN"
-
関数コードの更新
X-Aws-codes-Secrets-Token ヘッダー値を上記の環境変数から取得した SSRF トークンの値に設定して http://localhost:2773/secretsmanager/get?secretId=MyTest のクエリを実行するように Lambda 関数を更新し、シークレットを取得します。Lambda 拡張機能の初期化と登録の遅延に対応するため、アプリケーションコードに再試行ロジックを実装してください。
-
関数をテストする
Lambda 関数を呼び出して、シークレットが正しく取得されていることを確認します。
Secrets Manager Agent を使用してシークレットを取得する
シークレットを取得するには、シークレットの名前または ARN をクエリパラメータとして含めて、ローカルの Secrets Manager Agent エンドポイントを呼び出します。デフォルトでは、Secrets Manager Agent はシークレットの AWSCURRENT バージョンを取得します。別のバージョンを取得するには、versionStage または versionId パラメータを使用します。
Secrets Manager Agent を保護するためには、各リクエスト X-Aws-Parameters-Secrets-Token の一部として SSRF トークンヘッダーを含める必要があります。Secrets Manager Agent は、このヘッダーを持たないリクエストや無効な SSRF トークンを持つリクエストを拒否します。Secrets Manager Agent の構成 で SSRF ヘッダー名をカスタマイズできます。
必要なアクセス許可
Secrets Manager Agent は AWS の認証情報プロバイダーチェーンを使用する AWS SDK for Rust を使用します。これらの IAM 認証情報の ID は、Secrets Manager Agent がシークレットを取得するためのアクセス許可を決定します。
権限の詳細については、「AWS Secrets Manager のアクセス許可に関するリファレンス」を参照してください。
シークレット値が Secrets Manager Agent に取り込まれると、コンピューティング環境と SSRF トークンにアクセスできるすべてのユーザーが Secrets Manager Agent キャッシュからシークレットにアクセスできます。詳しくは、「セキュリティに関する考慮事項」を参照してください。
リクエストの例
- curl
-
例 – 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 を使用してシークレットを取得する
次の 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 というパラメータをサポートしています。このパラメータを使用して、シークレットの値の即時更新を強制し、キャッシュをバイパスして最新の情報を取得できます。
- デフォルトの動作 (
refreshNow なし)
-
-
TTL の有効期限が切れるまでキャッシュされた値を使用します
-
TTL の後にのみシークレットを更新します (デフォルトは 300 秒)
-
キャッシュの有効期限が切れる前にシークレットがローテーションすると、古い値を返す可能性があります
refreshNow=true での動作
-
シークレット値を強制更新する
refreshNow の初期値は false です。true に設定すると、Secrets Manager Agent 設定ファイルで指定された TTL が上書きされ、Secrets Manager への API コールが行われます。
- curl
-
例 – 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 を使用してシークレットを強制更新する
次の 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_secretsmanager_agent --config
config.toml を呼び出します。
設定オプション
log_level
-
Secrets Manager Agent のログで報告される詳細レベル: DEBUG、INFO、WARN、ERROR、または NONE。デフォルトは INFO です。
log_to_file
-
ファイルまたは stdout/stderr にログを記録するかどうか: trueまたは false。デフォルトは true です。
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、AWS_CONTAINER_AUTHORIZATION_TOKEN です。
path_prefix
-
リクエストがパスベースのリクエストかどうかを判断するために使用される URI プレフィックス。デフォルトは「/v1/」です。
max_conn
-
Secrets Manager Agent が許可する HTTP クライアントからの接続の最大数で、範囲は 1~1000 です。デフォルトは 800 です。
オプション機能
Secrets Manager Agent は、--features フラグを cargo build に渡すことで、オプション機能で構築できます。利用できる機能は次のとおりです。
構築機能
prefer-post-quantum
-
X25519MLKEM768 を最も優先度の高いキー交換アルゴリズムにします。それ以外にした場合も利用可能ですが、最高の優先度にはなりません。X25519MLKEM768 は、ハイブリッドのポスト量子セキュアキーキー交換アルゴリズムです。
fips
-
エージェントで使用される暗号スイートを FIPS 承認の暗号のみに制限します。
ログ記録
- ローカルなログ記録
-
Secrets Manager Agent は log_to_file 設定変数に応じて、エラーを logs/secrets_manager_agent.log ファイルまたは stdout/stderr にローカルでログに記録します。アプリケーションが Secrets Manager Agent を呼び出してシークレットを取得すると、それらの呼び出しはローカルログに表示されます。CloudTrail ログには表示されません。
- ログローテーション
-
Secrets Manager Agent は、ファイルが 10 MB に達すると新しいログファイルを作成し、合計で最大 5 つのログファイルを保存します。
- AWS サービスロギング
-
ログは Secrets Manager、CloudTrail、または CloudWatch には送信されません。Secrets Manager Agent からシークレットを取得するリクエストは、これらのログに表示されません。Secrets Manager Agent が Secrets Manager を呼び出してシークレットを取得すると、その呼び出しは aws-secrets-manager-agent を含むユーザーエージェント文字列とともに CloudTrail に記録されます。
Secrets Manager Agent の構成 でログ記録オプションを設定できます。
セキュリティに関する考慮事項
- 信頼ドメイン
-
エージェントアーキテクチャの場合、信頼ドメインは、エージェントエンドポイントと SSRF トークンにアクセスできる場所であり、通常はホスト全体です。同じセキュリティ体制を維持するために、Secrets Manager Agent の信頼ドメインは、Secrets Manager 認証情報が利用可能なドメインと一致する必要があります。例えば、Amazon EC2 では、Secrets Manager Agent の信頼ドメインは、Amazon EC2 のロールを使用する場合の認証情報のドメインと同じになります。
Secrets Manager 認証情報がアプリケーションにロックダウンされたエージェントソリューションをまだ使用していない、セキュリティ意識の高いアプリケーションでは、言語固有の AWS SDK またはキャッシュソリューションの使用を検討する必要があります。シークレットの詳細については、「シークレットの取得」を参照してください。