AWS Secrets Manager エージェント - AWS Secrets Manager

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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
  1. AL2023 などの RPM ベースのシステムでは、開発ツールグループを使用して開発ツールをインストールできます。

    sudo yum -y groupinstall "Development Tools"
  2. Rust ドキュメントの「Rust のインストール」の指示に従います。

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env"
  3. cargo build コマンドを使用してエージェントをビルドします。

    cargo build --release

    実行ファイルは target/release/aws-secrets-manager-agent にあります。

Debian-based systems
  1. Ubuntu などの Debian ベースのシステムでは、build-essential パッケージを使用して開発者ツールをインストールできます。

    sudo apt install build-essential
  2. Rust ドキュメントの「Rust のインストール」の指示に従います。

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env"
  3. 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 をインストールするには
  1. リポジトリで提供されている install スクリプトを使用します。

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

  2. アプリケーションがトークンファイルを読み取れるようにするには、アプリケーションが実行するユーザーアカウントを 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 のサイドカーコンテナを作成するには
  1. 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"]
  2. クライアントアプリケーション用の Dockerfile を作成します。

  3. 両方のコンテナを実行するための 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
  4. secrets-manager-agent バイナリを Dockerfiles および Docker Compose ファイルと同じディレクトリにコピーします。

  5. 次の docker-compose コマンドを使用して、提供された Dockerfiles に基づいてコンテナをビルドして実行します。

    docker-compose up --build
  6. クライアントコンテナで、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 拡張機能としてインストールする方法を示します。

注記

このサンプルスクリプトでは、Python 3.12 や Node.js 20 などの Amazon Linux 2023 ベースのランタイムに含まれる curl コマンドを使用します。Python 3.11 や Node.js 18 などの Amazon Linux 2 ベースのランタイム環境を使用する場合は、まず Lambda コンテナイメージに curl をインストールする必要があります。手順については、 AWS re:Post の「Amazon Linux 2 AMI ネイティブバイナリパッケージを Lambda で使用する方法」を参照してください。

Secrets Manager Agent をパッケージ化する Lambda 拡張機能を作成するには
  1. http://localhost:2773/secretsmanager/get?secretId=MyTest をクエリしてシークレットを取得する Python Lambda 関数を作成します。Lambda 拡張機能の初期化と登録の遅延に対応するため、アプリケーションコードに再試行ロジックを実装してください。

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

必要な許可:

  • secretsmanager:DescribeSecret

  • secretsmanager:GetSecretValue

詳細については、「アクセス許可に関するリファレンス」を参照してください。

重要

シークレット値が 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
  • キャッシュを完全にバイパスします

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

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

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

refreshNow パラメータを使用すると、頻繁なシークレットローテーションが必要なシナリオでも、常に最新のシークレット値を使用できます。

refreshNow パラメータの動作

refreshNow が true に設定

Secrets Manager エージェントが Secrets Manager からシークレットを取得できない場合、エラーが返され、キャッシュは更新されません。

refreshNow を に設定するfalseか、指定しない

Secrets Manager Agent は、デフォルトの動作に従います。

  • キャッシュされた値が TTL よりも新しい場合、Secrets Manager Agent はキャッシュされた値を返します。

  • キャッシュされた値が TTL より古い場合、Secrets Manager エージェントは Secrets Manager を呼び出します。

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」を参照してください。