Key Management Service (KMS) エージェントは、KMS のインタラクションを一元化することでシークレットの取得を簡素化するクライアント側の HTTP プロキシです。 アプリケーションは、直接 SDK を統合する代わりにローカル HTTP リクエストを介してシークレットを取得するため、コードの変更を最小限に抑え、統一されたセキュリティポリシーを確保できます。 エージェントは、(すべてのアプリケーションに対して一度設定される)シークレット管理、メモリ内キャッシュ、および定期的なシークレット更新を処理して、SDK 呼び出し頻度とネットワークオーバーヘッドを削減します。 ローカル環境、Elastic Compute Service (ECS) などの仮想マシン、およびコンテナ化システムにデプロイできます。
仕組み
エージェントはメモリを使用してシークレット値をキャッシュし、設定した Time To Live (TTL) に基づいてキャッシュされたシークレット値を定期的に更新します。 アプリケーションが HTTP リクエストを介してエージェントからシークレット値をリクエストすると、エージェントは Server-Side Request Forgery (SSRF) トークンファイルを使用してリクエストの正当性を検証します。 キャッシュに有効なシークレット値が存在する場合、それらが返されます。 それ以外の場合は、リクエストは KMS サービスに転送されます。 サービスがエージェントの ID を検証した後、KMS サービスからシークレットを復号化して返します。 エージェントはキャッシュを更新し、HTTP メッセージを介してアプリケーションにシークレット値を返します。 プロセスは次の図に示されています。
キャッシュヒットプロセス
キャッシュミス(キャッシュなしまたは期限切れのキャッシュ)プロセス
ローカルの物理サーバー、仮想マシン (ECS など)、コンテナー (Kubernetes ポッドなど) など、さまざまな環境でアプリケーションと一緒にエージェントをデプロイします。 コードリポジトリについては、alibabacloud-kms-agent にアクセスしてください。
アーキテクチャコンポーネント
エージェントは、HTTP サーバー、キャッシュ、KMS クライアント、ログの 4 つのコンポーネントで構成されています。
以下で説明するように、構成ファイルを使用してこれら 4 つのコンポーネントを構成できます。 ソースコードについては、alibabacloud-kms-agent をご参照ください。
# すべての設定項目
[Server]
# オプション、デフォルト値は 2025、エージェントのデフォルトのリスニングアドレスは 127.0.0.1:2025
HttpPort = 2025
# オプション、デフォルト値は ["X-KMS-Token", "X-Vault-Token"]。
# エージェントへのアクセスには SSRF ヘッダーが必要です。そうでない場合はアクセスが禁止されます。
SSRFHeaders = ["X-KMS-Token"]
# オプション、デフォルト値は ["KMS_TOKEN", "KMS_SESSION_TOKEN", "KMS_CONTAINER_AUTHORIZATION_TOKEN"]、変数値は特定の値、または file:///var/run/awssmatoken などのファイルパスにすることができます。
# エージェントは Env から SSRF トークンを取得し、アプリケーションアクセスヘッダーに含まれるトークンと比較します。一致する場合にのみアクセスが許可されます。
SSRFEnvVariables = ["KMS_TOKEN"]
# オプション、デフォルト値は "/v1/"。
# パスベースのアクセスの URI プレフィックス
PathPrefix = "/v1/"
# オプション、デフォルト値は 800
# 同時リクエストの最大数
MaxConn = 800
# オプション、デフォルト値は 0
# 0: シークレットコンテンツは KMS GetSecretvalue API レスポンス形式で返されます。 1: シークレットコンテンツは AWS SeceretManager GetSecretvalue API レスポンス形式で返されます。 2: HashiCorp KV 構造で返されます。
ResponseType = 0
# オプション、デフォルト値 true
# IgnoreTransientErrors が true の場合、キャッシュが無効でリモート KMS へのアクセスに失敗した場合、レスポンスはメモリ内の期限切れのシークレットを返します。
IgnoreTransientErrors = true
[Kms]
# オプション、デフォルト値は cn-hangzhou
# KMS が配置されているリージョン
Region = "cn-hangzhou"
# オプション、デフォルト値は kms.cn-hangzhou.aliyuncs.com
# エンドポイントは、共有ゲートウェイエンドポイントまたは専用ゲートウェイエンドポイントにすることができます
Endpoint = "kms.cn-hangzhou.aliyuncs.com"
[Cache]
# オプション、デフォルトは InMemory、現在サポートされているのはメモリキャッシュのみです
CacheType = "InMemory"
# オプション、デフォルトのキャッシュサイズは 1000 シークレット、CacheSize=0 の場合、キャッシュは使用されず、各リクエストはリモート KMS にアクセスします。
CacheSize = 1000
# オプション、キャッシュの時間有効性、デフォルト値は 300 秒。
TtlSeconds = 300
# オプション、キャッシュエビクションポリシー、デフォルトは入力されていない場合は false です。
# キャッシュシークレットが CacheSize 制限に達した場合、false はキャッシュ時間に基づいて最も古いキャッシュシークレットを削除することを意味し、true は使用頻度に基づいて最近使用されていないシークレットをエビクトすることを意味します。
EnableLRU = false
[Log]
# オプション、デフォルトのログレベル Debug
LogLevel = "Debug"
# オプション、アプリケーション起動ディレクトリの ./logs/ にデフォルトのログストレージ
LogPath = "./logs/"
# オプション、デフォルトの単一ログサイズ 100M
MaxSize = 100
# オプション、デフォルトで 2 つのログファイルを保持
MaxBackups = 2HTTP サーバー
シークレットを取得するためのアプリケーションリクエストに応答するために使用されます。 デフォルトでは、エージェントによって返されるシークレット値は、GetSecretValue と同じレスポンス形式になります。 または、構成ファイルの ResponseType パラメーターを設定して、他の形式を返すこともできます。
キャッシュ
エージェントには組み込みのメモリキャッシュ機構があります。 シークレット値はキャッシュ内で暗号化されず、アプリケーションはローカルキャッシュから読み取るため、KMS への頻繁なリクエストが削減されます。 キャッシュ時間、キャッシュサイズ、およびエビクションポリシーを設定して、期限切れのシークレットによってビジネスが中断されないようにすることができます。
メモリ保護機構の設定、適切な KMS エージェントプロセスアクセス権限の設定、メモリリーク検出ツールのデプロイなどの対策を通じて、キャッシュ内のシークレット値のストレージセキュリティを強化します。
KMS クライアント
リージョンとゲートウェイエンドポイントの設定をサポートしています。 共有ゲートウェイエンドポイントと専用ゲートウェイエンドポイントの両方がサポートされています。
専用ゲートウェイエンドポイントを使用する場合、エージェントにはすべてのリージョンの専用ゲートウェイの CA 証明書が組み込まれているため、CA 証明書を構成する必要はありません。
ログ
一般的な Zap ロギングフレームワークに基づいて、エージェントは JSON 形式でログを提供し、個々のログファイルのサイズ制限と保持するログファイルの最大数の構成をサポートします。
セキュリティ
認証と承認
KMS にアクセスするエージェント
credentials.NewDefaultCredentialsProvider () で特定の初期化メソッドが提供されていない限り、エージェントは Alibaba Cloud の デフォルトのクレデンシャルプロバイダーチェーン (環境変数を優先し、次に OIDC IdP RAM ロール、config.json、ECS RAM ロール、最後にクレデンシャル URI) を使用して KMS にアクセスします。
RAM ポリシーを使用して KMS 経由でシークレットにアクセスするには、エージェントにシークレットを取得および復号化する権限が必要です。 これらの権限を構成する際は、最小権限の原則を適用してください。
エージェントにアクセスするアプリケーション
エージェントの HTTP サーバーには、組み込みの SSRF 保護が組み込まれています。 起動時に SSRF トークンファイル ( /var/run/kmstoken など) が作成されます。 アプリケーションは、認証のためにリクエストヘッダーにこのトークンを含める必要があります。 次のデプロイシナリオでは、アクセスが制限されます。
Linux: デフォルトでは、SSRF トークンファイルへのアクセスをエージェントとアプリケーションのユーザーのみに制限します。
サイドカーコンテナー: アプリケーションのポッド内にデプロイされます。 デフォルトでは、SSRF トークンアクセスをポッドに制限します。
通信セキュリティ
エージェントと KMS サービス間の通信では、Transport Layer Security (TLS) を使用して盗聴や攻撃を防ぎます。 セキュリティを強化するには、共有ゲートウェイエンドポイントではなく専用ゲートウェイエンドポイントを使用します。 これにより、トラフィックが VPC ネットワークに制限され、パブリックインターネットへの露出が防止されます。
エージェントは 127.0.0.1 のみでリッスンするため、ローカルマシンへのアクセスが制限されます。
監査とロギング
エージェントは、設定可能なログファイルサイズと保持ポリシーを使用して、すべてのシークレット取得操作を JSON 形式 (Zap ロギングフレームワークを使用) でログに記録します。 これにより、監査可能な運用記録が保証されます。
安定性
エージェントは、自己チェック、再試行メカニズム、その他の対策を通じて、複雑なネットワーク環境や突然の障害シナリオにおけるサービスの継続性を保証します。
起動時の自己チェックメカニズム。
エージェントが起動すると、KMS への接続を確認します。 検証に失敗した場合、起動は終了します。
エラー再試行メカニズム。
エージェントは Alibaba Cloud SDK (V2) に依存して KMS と通信します。 ネットワーク例外が発生した場合、Alibaba Cloud SDK (V2) の組み込みエラー再試行ロジックを使用してリクエストを自動的に再送信します。 サーバー側のスロットリング (HTTP 429) または内部サーバーエラー (HTTP 500) が発生した場合、間隔時間に指数バックオフ方式を使用して 3 回再試行します。
障害発生時の期限切れキャッシュの使用。
エージェント構成ファイルで IgnoreTransientErrors パラメーターを設定することにより、ネットワークまたはサーバー側の障害が発生した場合、古いキャッシュデータをチェックして返し、短期間の障害のためにアプリケーションがシークレットの取得に失敗しないようにします。 IgnoreTransientErrors パラメーターはデフォルトで有効になっています。
systemd またはサイドカーコンテナーに基づく高可用性保証。
Linux (systemd): Linux では
systemdによって管理され、エージェントプロセスがクラッシュした場合に自動的に再起動します。サイドカーコンテナー: init コンテナーとしてデプロイされます。エージェントが失敗するとコンテナーの再起動がトリガーされ、アプリケーションの安定性が保証されます。
メリット
パフォーマンスと信頼性
エージェントはシークレット値をメモリにキャッシュし、高頻度アクセスシナリオで KMS サービスへの頻繁なリクエストを削減し、高頻度アクセスによって発生する可能性のあるスロットリングを回避することで、パフォーマンスとビジネスの可用性を向上させます。
互換性
エージェントは標準化された HTTP インターフェースに基づいてサービスを提供し、あらゆるプログラミング言語のアプリケーションからの呼び出しをサポートします。 アプリケーションで異なる言語を使用する場合、エージェントは統合の難しさを軽減します。
簡素化された統合
エージェントを介して、アプリケーションを KMS から分離できます。 これにより、アプリケーションが KMS サービスと対話するために必要な複雑さが軽減されます。 アプリケーションは、KMS サービスにアクセスするときに、認証、API 呼び出しなどの側面を処理することなく、エージェントと通信するだけで済みます。
一元管理とスケーラビリティ
エンタープライズレベルのマルチアプリケーションシナリオでは、エージェントはアクセス権限の管理と制御を統合し、各クライアントでの権限の構成を削減し、さまざまなアプリケーションの統合プロセスにおける均一性を確保します。 ビジネスを拡大する必要がある場合、エージェントは新しいアプリケーションの統合を促進し、SDK の使用によって発生する可能性のある権限構成とコード変更を削減します。
KMS エージェントとシークレットクライアント
KMS エージェントは中間層として機能し、アプリケーションはエージェントを介して KMS サービスに間接的にアクセスします。 シークレットクライアントを使用するには、アプリケーションが SDK を介して KMS サービスの API を呼び出す必要があります。 2 つの違いを次の表に示します。
側面 | KMS エージェント | シークレットクライアント |
推奨シナリオ | 複数のアプリケーションと多様なプログラミング言語を持つ企業。一元的な権限制御と簡素化された標準化された統合が必要です。 | 単純なアクセス制御要件を持つ小規模または個々のアプリケーション。 |
デプロイメント | アプリケーションから分離された独立したプロセス。 | ライブラリとしてアプリケーションコード内に統合されています。 |
統合の複雑さ | シンプル | 複雑 |
アクセス制御 | 単一のアクセスポイントを介した一元化されたポリシーの適用。 | 分散型: 各アプリケーションはポリシーを自己管理します。 |
言語サポート | あらゆる言語をサポート (ユニバーサル HTTP インターフェースを使用)。 | Java 8 以降、Python、および Go をサポートしています。 |
パフォーマンス | メモリ内キャッシュにより、高頻度アクセスにおけるレイテンシとスロットリングが最小限に抑えられます。 | 高頻度アクセスにより、KMS スロットリングが発生する可能性があります。 |
シークレットローテーション | シークレットは設定可能な TTL でキャッシュされ、必要に応じて KMS から自動的に更新されて、取得エラーを防ぎます。 | 更新メカニズムと再試行ロジックを使用して、シークレットが KMS から自動的に取得されます。 |
メンテナンスコスト | 低: すべてのアプリケーションに対して単一の構成。 | 高: アプリケーションごとに個別の構成。 |