IAM 利用の基本方針
IAM 利用に関しての基本方針としては、必要な権限セットは可能な限り最小限のポリシーを適用した IAM Role を利用し、この IAM Role に対する一時的な認証情報を発行する形を基本とします。
まず、AWS マネジメントコンソールへアクセスするユーザーは以下のいずれかで発行します。
- IAM Identity Center (SSO)
- IAM User
それぞれ必要に応じて最小権限のポリシーを設定した IAM Role を作成し、 IAM Identity Center (SSO) のユーザーまたは IAM User ログイン後に Switch Role していただく必要があります。おすすめは IAM Identity Center (SSO) を利用する方法です。以下のように、必要な権限の IAM Role を事前に作成した上で、必要に応じて選択してマネジメントコンソールにログインすることができます。
IAMユーザーの場合、コンソールからロールの切り替えを行うことができます。詳細は以下のドキュメントをご参照ください。
- 「ロールの切り替え (コンソール)」 https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-console.html
AWS 認証情報利用の方針
従来は IAM ユーザーを作成し、IAM ユーザーの認証情報を作成して以下のような場面で利用するケースがありました。
- AWS CLI を利用する場合
- ローカル環境からデプロイを試す場合
- AWS SDK を含むプログラムを実行する場合
しかし弊社が支援させていただくプロジェクトでは直接 AWS 認証情報を利用せず、利用中の IAM Role に対する「一時的な認証情報」を発行する形を基本と資します。必要な権限セットを可能な限り最小限にした IAM Role を利用することが前提となります。
一時的な認証情報取得方法:IAM Identity Center (SSO)
IAM Identity Center (SSO) を利用している場合、以下の画面から「Access Keys」をクリックします。
その後、OSや使い方に合わせて認証情報をコピーして環境変数に指定して利用します。
この認証情報は事前に管理アカウントから指定した有効期限(通常1時間)内のみ有効で、期限が切れると同じようなやり方で取得し直す必要があります。
一時的な認証情報取得方法:IAM Identity Center (SSO) を利用しない場合
一方、IAM Identity Center (SSO) を利用しない場合で、主に IAM User を利用する場合は以下のようなやり方で一時的な認証情報の扱いを徹底していただく必要があります。まず、認証情報が必要になった場合、以下のようにマネジメントコンソールから CloudShell を開きます(※赤枠のいずれでも開けます)
以下のようの CloudShell が開くことを確認します。
赤枠のプロンプトに、以下のようなコマンドを入力します。IAM Role の ARN を指定する部分は適宜入れ替えてください。
aws sts assume-role \
--role-arn arn:aws:iam::000011112222:role/cloudshell-temp-session-role \
--role-session-name for_1h_adhoc_session
Linux 環境の場合、以下のように jq コマンドを利用すると、出てきた文字列をそのままコピーしてターミナルで利用できるので便利です(※ jq のインストールが必要です)
aws sts assume-role \
--role-arn arn:aws:iam::000011112222:role/cloudshell-temp-session-role \
--role-session-name for_1h_adhoc_session \
| jq -r '.Credentials | .result = "export AWS_ACCESS_KEY_ID=" + .AccessKeyId + " && " + "export AWS_SECRET_ACCESS_KEY=" + .SecretAccessKey + " && " + "export AWS_SESSION_TOKEN=" + .SessionToken | .result'
一時的な認証情報の取得に関してはコンソールの UI が変われど、仕組みは基本的に変わらないので、詳細については以下のドキュメントをご参考ください。
- 「IAM の一時的な認証情報」
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html - 「一時的なセキュリティ認証情報を作成するためのアクセス権限の付与」https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_control-access_enable-create.html
外部 CI/CD サービス利用時の認証情報指定
例えば CI/CD として GitHub Actions を利用する場合、以下のように IAM のコンソールから GitHub を OpenID Connect の ID プロバイダー (IdP) として使用するように設定する必要があります。
このIdP(GitHub)と紐づく IAM Role を指定する流れになりますので、IAM Role の信頼関係に、以下のようにどのスコープまでアクセスを許可するかの設定を行います。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::000011112222:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch"
}
}
}
]
}
GitHub Actions の設定 .github/workflows/config.yml に反映するには、以下のように step を追加します。
jobs:
deploy:
# ...
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: us-esat-1
role-to-assume: 'arn:aws:iam::000011112222:role/role_name'
他の CI/CD サービスにおいても、設定の仕方は大きく変わりません。各サービスごとに該当するガイドラインがドキュメント等で公開されていますので合わせて確認いただけると良いです。GitHub との連携については、以下のように AWS 公式ドキュメントでも記載されていますのでご参考ください。
- 「GitHub OIDC ID プロバイダーのロールの設定」 https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html#idp_oidc_Create_GitHub