AWS Secrets Manager Agent の使用 - AWS Secrets Manager

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 を再起動するとキャッシュがリセットされます。以下に基づいて、キャッシュされたシークレット値を定期的に更新します。

  • デフォルトの更新頻度 (TTL) は 300 秒です

  • 設定ファイルを使用して TTL を変更できます。

  • 更新は、TTL の有効期限が切れた後にシークレットをリクエストしたときに発生します。

注記

Secrets Manager Agent にはキャッシュ無効化は含まれません。キャッシュエントリの有効期限が切れる前にシークレットがローテーションすると、Secrets Manager Agent は古いシークレット値を返すことがあります。

Secrets Manager Agent は、GetSecretValue のレスポンスと同じ形式でシークレット値を返します。シークレット値はキャッシュ内で暗号化されません。

Secrets Manager Agentをビルドする

開始する前に、プラットフォーム用の標準開発ツールと Rust ツールがインストールされていることを確認してください。

注記

macOS で fips 機能を有効にしてエージェントを構築するには、現在次の回避策が必要です。

  • xcrun --show-sdk-path の実行の結果に設定された SDKROOT という環境変数を作成する

RPM-based systems
RPM ベースのシステム上に構築するには
  1. リポジトリで提供されている install スクリプトを使用します。

    スクリプトは、起動時にランダムな SSRF トークンを生成し、ファイル /var/run/awssmatoken に保存します。トークンは、インストールスクリプトが作成する awssmatokenreader グループによって読み取り可能です。

  2. アプリケーションがトークンファイルを読み取れるようにするには、アプリケーションが実行するユーザーアカウントを awssmatokenreader グループに追加する必要があります。例えば、次の usermod コマンドを使用してトークンファイルを読み取るアクセス許可をアプリケーションに付与できます。ここで <APP_USER> は、アプリケーションを実行するユーザー ID です。

    sudo usermod -aG awssmatokenreader <APP_USER>
    開発ツールのインストール

    AL2023 などの RPM ベースのシステムでは、開発ツールグループをインストールします。

    sudo yum -y groupinstall "Development Tools"
  3. Rust のインストール

    Rust ドキュメント」の「Rust のインストール」の指示に従います。

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Follow the on-screen instructions . "$HOME/.cargo/env"
  4. エージェントの構築

    cargo build コマンドを使用して Secrets Manager Agent をビルドします。

    cargo build --release

    実行ファイルは target/release/aws_secretsmanager_agent にあります。

Debian-based systems
Debian ベースのシステム上に構築するには
  1. 開発ツールのインストール

    Ubuntu などの Debian ベースのシステムでは、build-essential パッケージをインストールします。

    sudo apt install build-essential
  2. Rust のインストール

    Rust ドキュメント」の「Rust のインストール」の指示に従います。

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Follow the on-screen instructions . "$HOME/.cargo/env"
  3. エージェントの構築

    cargo build コマンドを使用して Secrets Manager Agent をビルドします。

    cargo build --release

    実行ファイルは target/release/aws_secretsmanager_agent にあります。

Windows
Windows でビルドするには
  1. 開発環境のセットアップ

    Microsoft Windows ドキュメント」の「Windows for Rust で開発環境をセットアップする」の手順に従います。

  2. エージェントの構築

    cargo build コマンドを使用して Secrets Manager Agent をビルドします。

    cargo build --release

    実行ファイルは target/release/aws_secretsmanager_agent.exe にあります。

Cross-compile natively
ネイティブにクロスコンパイルするには
  1. クロスコンパイルツールをインストールする

    Ubuntu など、mingw-w64 パッケージが利用可能なディストリビューションでは、クロスコンパイルツールチェーンをインストールします。

    # Install the cross compile tool chain sudo add-apt-repository universe sudo apt install -y mingw-w64
  2. Rust ビルドターゲットを追加する

    Windows GNU ビルドターゲットをインストールします:

    rustup target add x86_64-pc-windows-gnu
  3. 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 のディスク容量をお勧めします。

  1. Docker をセットアップ

    Docker をインストールして構成します:

    # Install and start docker sudo yum -y install docker sudo systemctl start docker sudo systemctl enable docker # Make docker start after reboot
  2. Docker アクセス許可を設定する

    ユーザーを Docker グループに追加します:

    # Give ourselves permission to run the docker images without sudo sudo usermod -aG docker $USER newgrp docker
  3. 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 をインストールするには
  1. 設定ディレクトリに移動する

    設定ディレクトリに変更します:

    cd aws_secretsmanager_agent/configuration
  2. インストールスクリプトを実行する

    リポジトリで提供されている install スクリプトを実行します。

    スクリプトは、起動時にランダムな SSRF トークンを生成し、ファイル /var/run/awssmatoken に保存します。トークンは、インストールスクリプトが作成する awssmatokenreader グループによって読み取り可能です。

  3. アプリケーションのアクセス許可を設定する

    アプリケーションが実行されるユーザーアカウントを 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 のサイドカーコンテナを作成するには
  1. エージェント 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"]
  2. アプリケーション Dockerfile を作成する

    クライアントアプリケーション用の Dockerfile を作成します。

  3. 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
  4. エージェントバイナリのコピー

    secrets-manager-agent バイナリを Dockerfiles および Docker Compose ファイルと同じディレクトリにコピーします。

  5. コンテナの構築と実行

    Docker Compose を使用してコンテナを構築して実行します:

    docker-compose up --build
  6. 次のステップ

    クライアントコンテナから、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 拡張機能を作成するには
  1. エージェントレイヤーをパッケージ化する

    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')
  2. SSRF トークンを設定する

    エージェントのデフォルト設定では、SSRF トークンは、事前に設定された AWS_SESSION_TOKEN または AWS_CONTAINER_AUTHORIZATION_TOKEN 環境変数 (SnapStart が有効になっている Lambda 関数の後半変数) で設定された値に自動的に設定されます。または、Lambda 関数の任意の値を使用して AWS_TOKEN 環境変数を定義することもできます。これは、この変数が他の 2 つよりも優先されるためです。AWS_TOKEN 環境変数を使用する場合は、その環境変数を lambda:UpdateFunctionConfiguration 呼び出しで設定する必要があります。

  3. レイヤーを関数にアタッチする

    レイヤーバージョンを Lambda 関数にアタッチします:

    # Attach the layer version to the Lambda function aws lambda update-function-configuration \ --function-name $LAMBDA_ARN \ --layers "$LAYER_VERSION_ARN"
  4. 関数コードの更新

    X-Aws-codes-Secrets-Token ヘッダー値を上記の環境変数から取得した SSRF トークンの値に設定して http://localhost:2773/secretsmanager/get?secretId=MyTest のクエリを実行するように Lambda 関数を更新し、シークレットを取得します。Lambda 拡張機能の初期化と登録の遅延に対応するため、アプリケーションコードに再試行ロジックを実装してください。

  5. 関数をテストする

    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 がシークレットを取得するためのアクセス許可を決定します。

  • secretsmanager:DescribeSecret

  • secretsmanager:GetSecretValue

権限の詳細については、「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 での動作
  • キャッシュを完全にバイパスします

  • Secrets Manager から直接、最新のシークレット値を取得します

  • キャッシュを新しい値で更新し、TTL をリセットします

  • 常に最新のシークレット値を取得するようにします

シークレット値を強制更新する

重要

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 またはキャッシュソリューションの使用を検討する必要があります。シークレットの詳細については、「シークレットの取得」を参照してください。