VPCエンドポイント経由のアクセスのみSecrets Managerへのリクエストを受け付けるようにリソースのアクセス許可設定をする

VPCエンドポイント経由のアクセスのみSecrets Managerへのリクエストを受け付けるようにリソースのアクセス許可設定をする

Secrets Managerの「リソースのアクセス許可」を設定することによって、VPCエンドポイント経由していないリクエストをアクセス拒否するような設定にすることができます。

例えばサーバレスLambdaからのアクセスを拒否し、VPC Lambdaからのアクセスを許可するようなことが可能です。

VPCエンドポイント

Secrets ManagerのVPCエンドポイントが以下とします。

VPCエンドポイント経由のアクセスのみSecrets Managerへのリクエストを受け付けるようにリソースのアクセス許可設定をする

Secrets Manager

リソースのアクセス許可を、以下のように設定します。

{
    "Version":"2012-10-17",
    "Statement": [
    {
      "Sid": "RestrictGetSecretValueoperation",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpce": "vpce-03cc67177ae485e10" ★ Secrets ManagerのVPCエンドポイントID
        }
      }
    }
    ]
}

Lambda or VPC Lambda(node.js v16)

Lambdaソースです。

import { SecretsManager } from '@aws-sdk/client-secrets-manager'
const client = new SecretsManager({
  region: 'ap-northeast-1'
});

const params = {
  SecretId:'secretmanager' // シークレット名
};

const data = await client.getSecretValue(params)
export async function handler() {
  const {username,password,engine,port,host,dbClusterIdentifier} = JSON.parse(data.SecretString)
  console.log(`username:${username}`)
  console.log(`password:${password}`)
  console.log(`engine:${engine}`)
  console.log(`port:${port}`)
  console.log(`host:${host}`)
  console.log(`dbClusterIdentifier:${dbClusterIdentifier}`)
  const response = {
    statusCode: 200,
    body: data.SecretString
  }
  return response
};

サーバレスLambdaで実行するとAccessDeniedExceptionが発生します。

VPCエンドポイント経由のアクセスのみSecrets Managerへのリクエストを受け付けるようにリソースのアクセス許可設定をする

VPC Lambda(エンドポイントと同一のVPC上)にして実行するとシークレット値を取得することができるようになります。

参考サイト

AWS Secrets Manager のアクセス許可ポリシーの例 - AWS Secrets Manager
アクセス許可ポリシーは JSON 構造化テキストです。「 JSON policy document structure 」(JSON ポリシードキュメント構造) を参照してください。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました