AWS CLI での IAM ロールの使用
AWS Identity and Access Management (IAM) ロールは、追加の (または異なる) アクセス許可や、別の AWS アカウントでアクションを実行するためのアクセス許可を IAM ユーザーが取得できるようにする認証ツールです。
IAM ロールを使用するように AWS Command Line Interface (AWS CLI) を設定するには、~/.aws/credentials
ファイルでロールのプロファイルを定義します。
次の例は marketingadmin
という名前のロールプロファイルを示しています。--profile marketingadmin
を使用して (または AWS_PROFILE 環境変数でこれを指定して) コマンドを実行する場合、CLI はプロファイル user1
で定義された認証情報を使用して Amazon リソースネーム (ARN) arn:aws:iam::
のロールを引き受けます。このロールに割り当てられたアクセス権限で許可される任意のオペレーションを実行することができます。
123456789012
:role/marketingadminrole
[
marketingadmin
] role_arn = arn:aws:iam::123456789012
:role/marketingadminrole
source_profile = user1
その後、このロールを使用するアクセス許可がある IAM ユーザー認証情報を含む別の名前付きプロファイルを示す source_profile
を指定できます。前の例では、marketingadmin
プロファイルは user1
プロファイル内の認証情報を使用しています。AWS CLI コマンドでのプロファイル marketingadmin
の使用を指定すると、CLI はリンクされた user1
プロファイルの認証情報を自動的に検索し、その認証情報を使用して、指定された IAM ロールの一時的な認証情報を要求します。CLI は、sts:AssumeRole オペレーションをバックグラウンドで使用してこれを達成します。これらの一時的な認証情報は、次にリクエストされた CLI コマンドを実行するために使用されます。指定されたロールには、リクエストされた
CLI コマンドを実行できる IAM アクセス許可ポリシーがアタッチされている必要があります。
Amazon EC2 インスタンスまたは Amazon ECS コンテナ内から CLI コマンドを実行する場合、インスタンスプロファイルまたはコンテナにアタッチされた
IAM ロールを使用することができます。プロファイルを指定しない、または環境変数を設定しない場合、そのロールが直接使用されます。これにより、存続期間の長いアクセスキーをインスタンスで保存することを回避できます。これらのインスタンスまたはコンテナのロールは、別のロールの認証情報を取得するためにのみ使用できます。これを行うには、credential_source
(source_profile
の代わりに) を使用して、認証情報を検索する方法を指定します。credential_source
属性では、以下の値がサポートされます。
-
Environment
– 環境変数からソース認証情報を取得するためです。 -
Ec2InstanceMetadata
– Amazon EC2 インスタンスプロファイルにアタッチされた IAM ロールを使用するためです。 -
EcsContainer
– Amazon ECS コンテナにアタッチされた IAM ロールを使用するためです。
次の例では、Amazon EC2 インスタンスプロファイルを参照することで使用される、同じ marketingadminrole
ロールを示しています。
[profile marketingadmin] role_arn = arn:aws:iam::123456789012:role/marketingadminrole credential_source = Ec2InstanceMetadata
ロールを呼び出すとき、多要素認証や外部 ID (サードパーティ企業がクライアントのリソースにアクセスするために使用する) の使用などを必須としたり、AWS CloudTrail ログで簡単に監査できる一意のロールセッション名を指定したりできる追加オプションがあります。
セクション
ロールの設定と使用
IAM ロールを指定するプロファイルを使用してコマンドを実行すると、AWS CLI はソースプロファイルの認証情報を使用して AWS Security Token
Service (AWS STS) を呼び出し、指定したロールの一時的な認証情報を要求します。ソースプロファイルのユーザーは、指定されたプロファイルのロール用の sts:assume-role
を呼び出すアクセス許可を持っている必要があります。ロールには、ソースプロファイルのユーザーがこのロールを使用できる信頼関係が必要です。ロールの一時的な認証情報を取得して使用するプロセスを、一般にロールを引き受けると呼びます。
『AWS Identity and Access Management ユーザーガイド』の「IAM ユーザーにアクセス許可を委任するロールの作成」の手順に従って、ユーザーが引き受けるアクセス許可を使用して、IAM で新しいロールを作成できます。ロールとソースプロファイルの IAM ユーザーが同じアカウントに存在する場合、ロールの信頼関係を設定するときに、独自のアカウント ID を入力することができます。
ロールを作成した後、IAM ユーザー (または AWS アカウントのユーザー) が引き受けることを許可するように信頼関係を変更します。
次の例では、ロールにアタッチできる信頼ポリシーを示します。このポリシーは、アカウント 123456789012 の任意の IAM ユーザーによるロールの引き受けを許可します。ただし、これはそのアカウントの管理者が明示的に sts:assumerole
アクセス許可をそのユーザーに付与した場合に限ります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:root" }, "Action": "sts:AssumeRole" } ] }
信頼ポリシーは、実際にはアクセス許可を付与しません。アカウントの管理者は、適切なアクセス許可を持つポリシーをアタッチすることによって、ロールを引き受けるアクセス許可を個々のユーザーに委任する必要があります。次の例では、IAM
ユーザーにアタッチして、ユーザーが marketingadminrole
ロールのみを引き受けることを許可するポリシーを示しています。ロールを引き受けるためにユーザーアクセスを付与することの詳細については、『IAM ユーザーガイド』の「ロールを切り替えるユーザーアクセス権限の付与」を参照してください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::
123456789012
:role/marketingadminrole
" } ] }
IAM ユーザーには、ロールプロファイルを使用して CLI コマンドを実行するための追加のアクセス許可は必要ありません。代わりに、コマンドを実行するためのアクセス権限は、ロールにアタッチされたアクセス権限によって提供されます。アクセス許可ポリシーをロールにアタッチして、どの AWS リソースに対してどのアクションを実行できるかを指定します。ロールにアクセス権限をアタッチすること (IAM ユーザーにも同様に機能) についての詳細は、『IAM ユーザーガイド』の「IAM ユーザーに対するアクセス権限の変更」を参照してください。
ロールプロファイル、ロールのアクセス許可、ロールの信頼関係およびユーザーアクセス許可が適切に設定されたので、コマンドラインで --profile
オプションを呼び出してロールを使用できます。たとえば、次のコマンドは、このトピックの冒頭の例で定義された marketingadmin
ロールにアタッチされたアクセス許可を使用して Amazon S3 ls
コマンドを呼び出します。
$
aws s3 ls --profile
marketingadmin
いくつかの呼び出しにロールを使用するには、コマンドラインから、現在のセッションに対して AWS_DEFAULT_PROFILE
環境変数を設定することができます。この環境変数が定義されている場合、各コマンドで --profile
オプションを指定する必要はありません。
Linux, macOS, or Unix
$
export AWS_PROFILE=marketingadmin
Windows
C:\>
setx AWS_PROFILE marketingadmin
IAM ユーザーおよびロールの設定の詳細については、『IAM ユーザーガイド』の「ID (ユーザー、グループ、ロール)」および「IAM ロール」を参照してください。
多要素認証を使用する
セキュリティを高めるには、ロールプロファイルを使用して呼び出しを試みるときに、多要素認証 (MFA) デバイスから生成された一回限りのキー、U2F デバイス、またはモバイルアプリケーションを指定するようにユーザーに要求することができます。
最初に、IAM ロールで信頼関係を変更して MFA を要求するように選択できます。これにより、すべてのユーザーは最初に MFA を使用して認証しなくてはロールを使用できなくなります。例として、次の例の
Condition
行を参照してください。このポリシーでは、anika
という名前の IAM ユーザーが、MFA を使用して認証した場合にのみ、ポリシーがアタッチされているロールを引き受けることを許可しています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/anika" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:multifactorAuthPresent": true } } } ] }
次に、ロールプロファイルに、ユーザーの MFA デバイスの ARN を指定する行を追加します。次のサンプル config
ファイルエントリでは、2 つのロールプロファイルを示しています。どちらも IAM ユーザー anika
のアクセスキーを使用してロール cli-role
の一時的な認証情報をリクエストします。ユーザー anika
には、ロールの信頼ポリシーによって付与されたロールを引き受けるためのアクセス権限があります。
[profile role-without-mfa] region = us-west-2 role_arn= arn:aws:iam::128716708097:role/cli-role source_profile=cli-user [profile role-with-mfa] region = us-west-2 role_arn= arn:aws:iam::128716708097:role/cli-role source_profile = cli-user mfa_serial = arn:aws:iam::128716708097:mfa/cli-user [profile anika] region = us-west-2 output = json
この mfa_serial
設定では、次に示すような ARN またはハードウェア MFA トークンのシリアル番号を使用できます。
最初のプロファイル role-without-mfa
では、 MFA は不要です。ただし、前の例でロールにアタッチされた信頼ポリシーが MFA を必要とするため、このプロファイルを使用してコマンドを実行しても失敗します。
$
aws iam list-users --profile role-without-mfa
An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied
2 番目のプロファイルエントリ role-with-mfa
は、使用する MFA デバイスを識別します。このプロファイルを使用して CLI コマンドを実行すると、CLI からユーザーに対して、MFA デバイスによって提供されるワンタイムパスワード
(OTP) の入力を求めるプロンプトが表示されます。MFA 認証が成功したらその後に、コマンドによってリクエストされたオペレーションが実行されます。OTP は画面に表示されません。
$
aws iam list-users --profile role-with-mfa
Enter MFA code for arn:aws:iam::123456789012:mfa/cli-user: { "Users": [ { ...
クロスアカウントロールと外部 ID
クロスアカウントロールとしてロールを設定することにより、IAM ユーザーが別のアカウントに属しているロールを使用できるようにすることができます。「IAM ユーザーにアクセス許可を委任するロールの作成」の説明に従って、ロールの作成中にロールタイプを [別の AWS アカウント] に設定します。必要に応じて、[MFA が必要] を選択します。[MFA が必要] オプションは、「多要素認証を使用する」で説明されているように、信頼関係の適切な条件を設定します。
複数のアカウント間で誰がロールを使用できるかを、外部 ID を使ってさらに制御する場合、ロールプロファイルに external_id
パラメータも追加する必要があります。これは通常、もう一方のアカウントが社外または組織外のユーザーによって制御される場合にのみ使用します。
[profile crossaccountrole] role_arn = arn:aws:iam::
234567890123
:role/SomeRole
source_profile = default mfa_serial = arn:aws:iam::123456789012
:mfa/saanvi
external_id =
123456
監査を容易にするためのロールセッション名の指定
ロールが多くの個人間で共有されると、監査はより難しくなります。そこで、呼び出された各オペレーションを、アクションを呼び出した個人に関連付けることが必要になります。ただし、個人がロールを使用する場合、個人によるロールの引き受けはオペレーションの呼び出しとは別のアクションであるため、この 2 つを手動で相互に関連付ける必要があります。
ユーザーがロールを引き受けるときに一意のロールセッション名を指定すれば、この手順を簡素化できます。これを行うには、ロールを指定する config
ファイルの各名前付きプロファイルに role_session_name
パラメータを追加します。role_session_name
値が AssumeRole
オペレーションに渡され、ロールセッションの ARN の一部になります。また、ログに記録されたすべてのオペレーションの AWS CloudTrail ログにも含まれます。
たとえば、次のようにロールベースのプロファイルを作成できます。
[profile namedsessionrole] role_arn = arn:aws:iam::
234567890123
:role/SomeRole
source_profile = default role_session_name =Session_Maria_Garcia
これにより、ロールセッションに次の ARN が付与されます。
arn:aws:iam::
234567890123
:assumed-role/SomeRole
/Session_Maria_Garcia
また、すべての AWS CloudTrail ログには、各オペレーションでキャプチャされた情報にロールセッション名が含まれます。
ウェブ ID を使用したロールの継承
プロファイルを設定して、AWS CLI がウェブ ID フェデレーションと Open ID Connect (OIDC) を使用してロールを引き受ける必要があることを示すことができます。これをプロファイルで指定すると、AWS CLI は自動的に対応する AWS STS AssumeRoleWithWebIdentity
呼び出しを行います。
注記
IAM ロールを使用するプロファイルを指定すると、AWS CLI は適切な呼び出しを行い、一時的な認証情報を取得します。取得された認証情報は ~/.aws/cli/cache
に保存されます。同じプロファイルを指定するそれ以降の AWS CLI コマンドでは、有効期限が切れるまで、キャッシュされた一時的な認証情報が使用されます。有効期限が切れると、AWS
CLI は自動的に認証情報を更新します。
ウェブ ID フェデレーションを使用して一時的な認証情報を取得、使用するには、共有プロファイルで以下の設定値を指定します。
- role_arn
-
継承するロールの ARN を指定します。
- web_identity_token_file
-
OAuth 2.0 アクセストークンまたは ID プロバイダによって提供される OpenID Connect ID トークンを含むファイルへのパスを指定します。AWS CLI はこのファイルをロードし、その内容を
WebIdentityToken
引数としてAssumeRoleWithWebIdentity
オペレーションに渡します。 - role_session_name
-
このロール継承セッションに適用されるオプションの名前を指定します。
ウェブ ID を使用するロール継承プロファイルの設定に必要な最小限の構成例を次に示します。
# In ~/.aws/config [profile web-identity] role_arn=arn:aws:iam:
123456789012
:role/RoleNameToAssume
web_identity_token_file=/path/to/a/token
この設定は、環境変数を使用して提供することもできます。
- AWS_ROLE_ARN
-
継承するロールの ARN。
- AWS_WEB_IDENTITY_TOKEN_FILE
-
ウェブ ID トークンファイルへのパス。
- AWS_ROLE_SESSION_NAME
-
このロール継承セッションで適用される名前です。
注意
これらの環境変数は現在、ウェブ ID プロバイダを使用したロール継承にのみ適用され、一般的なロール継承プロバイダ設定には適用されません。
キャッシュされた認証情報のクリア
ロールを使用する際、AWS CLI は、有効期限が切れるまで一時的な認証情報をキャッシュします。次回この一時的な認証情報を使用しようとすると、AWS CLI はユーザーに代わってこの情報の更新を試みます。
ロールの一時的な認証情報が取り消された場合、自動的には更新されず、使用しようとすると失敗します。ただし、キャッシュを削除して、AWS CLI で新しい認証情報を取得するように強制することができます。
Linux, macOS, or Unix
$
rm -r ~/.aws/cli/cache
Windows
C:\>
del /s /q %UserProfile%\.aws\cli\cache