Google の権限を利用して AWS にアクセスする方法
はじめに
最近、サービスは AWS に構築され、分析環境は Google Cloud に構築するケースが多くあります。その場合、Google Cloud 環境から AWS 環境にアクセスする必要があります。たとえば、Google Cloud の分析システムから AWS S3 のデータバケットにアクセスするといった用例です。
一般的には AWS のアクセスキーを使用してアクセスを行いますが、これは永続的な権限情報を持つアクセスキーを発行する形になるため AWS のセキュリティを低下させる可能性があります。そこで、Google Cloud の権限を使用して AWS にアクセスする方法を検証しました。
参考情報
Google Cloud の権限を利用して、 AWS のアクセスを利用する際、AWS 側は OIDC フェデレーションにより Google Cloud の権限を 認証しています。
OIDC フェデレーションについて
OIDC ( OpenID Connect )フェデレーションは、外部の ID プロバイダー( IdP )を使用して AWS リソースへのアクセスを管理する強力な認証メカニズムです。この方法では、一時的な AWS セキュリティ認証情報を使用して、長期的な IAM ユーザー認証情報を作成・管理する必要なく AWS リソースにアクセスできます。
OIDC フェデレーションの主な利点は以下の通りです:
-
セキュリティの向上:長期的な認証情報を使用せず、一時的なトークンを使用するため、セキュリティリスクが軽減されます。
-
中央集権的な ID 管理:既存の ID プロバイダー(この場合は Google Cloud )を使用して、複数のクラウドプラットフォーム間で一貫した ID 管理が可能になります。
-
細かなアクセス制御:特定の条件や属性に基づいて、きめ細かなアクセス制御ポリシーを設定できます。
-
運用の簡素化:個別の IAM ユーザーを作成・管理する必要がなくなり、運用負荷が軽減されます。
OIDC フェデレーションのプロセスは以下のようになります:
- ユーザーが Google Cloud で認証を行います。
- Google Cloud が JWT ( JSON Web Token )を発行します。
- このトークンを使用して、AWS の STS ( Security Token Service )に対して一時的な認証情報を要求します。
- AWS が一時的な認証情報を発行し、これを使用して AWS リソースにアクセスします。
この方法により、 Google Cloud のアイデンティティを使用して AWS リソースに安全にアクセスすることが可能になります。
AWS における具体的な手順について
今回の検証の手順として参考にしたブログは次の URL です:
Access AWS using a Google Cloud Platform native Workload Identity
参考 URL では GCE のサービスアカウントを使用して JWT トークンを取得していますが、分析環境に GCE を必ずしも使用するわけではありません。そのため、個人の Google Cloud アカウントの権限を使って AWS にアクセスする方法を試しました。
JWT トークンの取得
Google Cloud 経由の JWT トークンは下記のコマンドで取得できます:
gcloud auth print-identity-token
取得した JWT トークンは次のサイトで audience や subject を確認することができます:
IAM ロールの作成
JWT トークンで確認した情報を基に IAM ロールを作成します。条件については必要に応じて設定しますが、この場合は個人の Google Cloud アカウントとテスト用に作成した Google Cloud サービスアカウントを信頼するように設定しました。次に作成した信頼ポリシーを読み込んでください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRoleWithWebIdentity",
"Principal": {
"Federated": "accounts.google.com"
},
"Condition": {
"StringEquals": {
"accounts.google.com:email": "XXXXX@hogeticlab.com",
"accounts.google.com:oaud": "XXXXX.apps.googleusercontent.com"
}
}
},
{
"Effect": "Allow",
"Action": "sts:AssumeRoleWithWebIdentity",
"Principal": {
"Federated": "accounts.google.com"
},
"Condition": {
"StringEquals": {
"accounts.google.com:sub": "XXXXX",
"accounts.google.com:oaud": "XXXXX.apps.googleusercontent.com"
}
}
}
]
}
この信頼ポリシーを利用して、Switch Role を実行します。
ROLE_ARN="arn:aws:iam::<AWS_ACCOUNT_ID>:role/<作成したIAMロール名>"
jwt_token=$(gcloud auth print-identity-token)
jwt_sub=$(jq -R 'split(".") | .[1] | @base64d | fromjson' <<< "$jwt_token" | jq -r '.sub')
credentials=$(aws sts assume-role-with-web-identity --role-arn $ROLE_ARN --role-session-name $jwt_sub --web-identity-token $jwt_token | jq '.Credentials' | jq '.Version=1')
echo $credentials
参考 URL には、このコマンドをスクリプトにして AWS CLI の外部認証として設定する方法が記載されていますが、今回はテストのため、環境変数を利用しました。
下記の通り、出力されたトークンを使用し S3 にアクセスすると、正常にアクセスすることに成功しました。
export AWS_ACCESS_KEY_ID="XXXXX"
export AWS_SECRET_ACCESS_KEY="XXXXX"
export AWS_SESSION_TOKEN="XXXXX"
aws s3 ls s3://<S3_BUCKET_NAME>
おわりに
上記のように Google Cloud の権限を利用して、Google Cloud サービスアカウント、個人の Google Cloud アカウントとも AWS にアクセスできることが確認できました。
本手順は特定の Google Cloud の特定のサービスアカウントに対して、 AWS へのアクセス権を付与することができ、また永続的なアクセス情報を取得することなく、Google Cloud から AWS へのデータ連携や AWS のサービスを利用することが可能になるので、検証のための一時的なアクセスだけでなく、バッチ処理などで Google Cloud から AWS へアクセスする必要がある実際のプロジェクトでも役立つのではないかと考えます。
※ データ分析、データ基盤構築、及び AI 活用に関するご相談は、以下よりお気軽にお問い合わせください。
お問い合わせフォーム
Discussion