1. 導入
クラウド環境の構築において、AzureとAWSを併用するマルチクラウド構成は一般的です。しかし、認証情報の管理には常にリスクが伴います。特にAzureからAWSのS3やDynamoDB等のリソースへアクセスする際、アクセスキーとシークレットキーを環境変数にハードコードしたり、設定ファイルに記述したりすることは、情報漏洩の大きな原因となります。本記事では、認証情報をソースコードから排除し、IAMロールとOIDC(OpenID Connect)を活用した「シークレットレス」な連携手法を解説します。
2. 基礎知識
シークレットレス連携とは、長期的な認証情報(アクセスキーなど)を発行せず、一時的な認証情報(セッショントークン)を用いてリソースへアクセスする仕組みです。
今回利用するのはOIDC(OpenID Connect)です。Azure AD(Microsoft Entra ID)をIDプロバイダー(IdP)として、AWS側でIAM OIDCプロバイダーを作成することで、AzureのマネージドIDやサービスプリンシパルからAWSのIAMロールを「引き受ける(AssumeRole)」ことが可能になります。これにより、認証情報を手動で管理する必要が一切なくなります。
3. 実装/解決策
実装のステップは以下の通りです。
1. AWS上にOIDCプロバイダーを作成し、Azureのテナント情報を登録します。
2. AWS側で「信頼されたエンティティ」としてAzureのIDを指定したIAMロールを作成します。
3. Azure側でAWS SDKを利用し、OIDCトークンを取得してSTS(Security Token Service)のAssumeRoleWithWebIdentityを呼び出します。
4. サンプルプログラム
以下は、Python(boto3)を使用した一時的な認証情報を取得するための実装サンプルです。
import boto3
import os
Azureで取得したOIDCトークンを環境変数から読み込む想定
oidc_token = os.environ.get(“AZURE_OIDC_TOKEN”)
role_arn = “arn:aws:iam::123456789012:role/AzureToAwsRole”
def get_aws_session():
# STSクライアントを作成
sts_client = boto3.client(‘sts’)
# AssumeRoleWithWebIdentityを使用して一時的な権限を取得
assumed_role = sts_client.assume_role_with_web_identity(
RoleArn=role_arn,
RoleSessionName=”AzureAppSession”,
WebIdentityToken=oidc_token
)
# 取得した一時的な認証情報でセッションを構築
return boto3.Session(
aws_access_key_id=assumed_role[‘Credentials’][‘AccessKeyId’],
aws_secret_access_key=assumed_role[‘Credentials’][‘SecretAccessKey’],
aws_session_token=assumed_role[‘Credentials’][‘SessionToken’]
)
使用例: S3バケット一覧を取得
session = get_aws_session()
s3 = session.client(‘s3’)
print(s3.list_buckets())
5. 応用・注意点
この手法を用いる際、最も重要なのはIAMポリシーの最小権限設定です。AssumeRoleWithWebIdentityで引き受けるロールには、業務に必要な最低限の権限のみを付与するようにしてください。
また、陥りやすいバグとして、OIDCトークンの有効期限切れがあります。トークンは短寿命であるため、アプリケーション側で再取得のロジックを実装するか、あるいはAWS SDKのCredential Provider機能を活用して、自動的にトークンをリフレッシュする実装(DefaultCredentialProviderChain等)に任せるのが安全です。これにより、運用上の手間を減らしつつ、強固なセキュリティを維持することが可能です。

コメント