AWS IAM Role を GCP から STS 認証で利用する設定例
[履歴] [最終更新] (2022/08/25 21:16:56)
最近の投稿
注目の記事

概要

こちらのページでは GCP Service Account を AWS から STS で利用する設定例を記載しました。本ページでは、逆に GCP から AWS IAM Role を利用するための設定例を記載します。

GCP Service Account の作成

Service Account を作成して Unique ID を確認します。

Uploaded Image

AWS IAM Role の作成

Trust relationship の設定は Web Identity を選択します。Identity Provider として登録されている Google を選択して、Service Account の Unique ID を Audience に指定します。

Uploaded Image

以下のような Trust relationship となります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "accounts.google.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "accounts.google.com:aud": "102032064262318603671"
        }
      }
    }
  ]
}

Uploaded Image

参考資料: Creating a role for web identity or OpenID connect federation (console)

GCP VM の作成

作成した Service Account を紐付けて作成します。

Uploaded Image

AWS CLI をインストールします。

sudo apt install python3-pip
python3 -m pip install -U pip
python3 -m pip install -U awscli
python3 -m pip install -U boto3

STS 認証

GCP VM Metadata によるトークン取得

metadata.google.internal によって VM のメタデータを取得できます。

$ curl -sS -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/name
instance-2

$ curl -sS -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/project/project-id
myproject-20210411

VM に紐付けられた Service Account の identity トークンを取得します。Fetching identity and access tokens using the metadata server

curl -sS -H 'Metadata-Flavor: Google' 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?format=standard&audience=gcp'

Cloud SDK が利用できる場合は、以下のようにしても同様です。

gcloud auth print-identity-token

AWS STS による一時認証情報の取得

import boto3
sts = boto3.client('sts', aws_access_key_id='', aws_secret_access_key='')

res = sts.assume_role_with_web_identity(
    RoleArn='arn:aws:iam::123412341234:role/my-gcp-role-20211031',
    WebIdentityToken='xxxxxxxxxxxxxxxxxxxxxx',
    RoleSessionName='my-role-session-name')

以下のようなレスポンスが得られます。

{'Credentials': {'AccessKeyId': 'xxxxxxxxxxxxxxxxxxxx',
  'SecretAccessKey': 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
  'SessionToken': 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
  'Expiration': datetime.datetime(2021, 10, 31, 6, 54, 40, tzinfo=tzlocal())},
 'SubjectFromWebIdentityToken': '102032064262318603671',
 'AssumedRoleUser': {'AssumedRoleId': 'AROA3JUBRISFUP3BXDZ4A:my-role-session-name',
  'Arn': 'arn:aws:sts::123412341234:assumed-role/my-gcp-role-20211031/my-role-session-name'},
 'Provider': 'accounts.google.com',
 'Audience': '102032064262318603671',
 'ResponseMetadata': {'RequestId': '5c16dbd6-ccc8-427c-b123-745bce02b40c',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'x-amzn-requestid': '5c16dbd6-ccc8-427c-b123-745bce02b40c',
   'content-type': 'text/xml',
   'content-length': '1394',
   'date': 'Sun, 31 Oct 2021 05:54:39 GMT'},
  'RetryAttempts': 0}}

一時的な認証情報として得られた結果を ~/.aws/credentials に格納してみます。

[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
aws_session_token = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

確かに AWS API を利用できることを確認します。

$ python3 -m awscli s3 ls
2021-08-31 01:10:04 my-bucket-1
2020-06-19 22:58:33 my-bucket-2

credential_process の利用

上記 STS 認証を自動化するための設定例は以下のとおりです。

$ cat .aws/credentials
[default]
credential_process = /home/myuser/bin/janus.py arn:aws:iam::123412341234:role/my-gcp-role-20211031

credential_process で指定するコマンドは以下のように準備しておきます。

wget https://raw.githubusercontent.com/doitintl/janus/master/janus.py

python3 -m pip install -U requests
chmod +x ./bin/janus.py

動作確認

$ python3 -m awscli s3 ls
2021-08-31 01:10:04 my-bucket-1
2020-06-19 22:58:33 my-bucket-2

参考資料:

関連ページ
    Access Advisor と Access Analyzer 最小権限の原則に関連する、名称が似た機能です。 Access Advisor IAM 権限について、使用状況を確認できます。 Viewing last accessed information for IAM Access Analyzer