AWS CLI で IAM ロールの使用 - AWS コマンドラインインターフェイス

Python 2.7、3.4、3.5 は AWS CLI バージョン 1 では非推奨です。詳細については、 「AWS CLI バージョンについて」 の「AWS CLI バージョン 1」セクションを参照してください。

AWS CLI で IAM ロールの使用

AWS Identity and Access Management (IAM) ロールは、IAM ユーザーが追加の (または異なる) アクセス権限を取得したり、別の AWS アカウントでアクションを実行するためのアクセス許可を取得できる認証ツールです。

~/.aws/config ファイル内のロールのプロファイルを定義することで、IAM ロールを使用するように AWS コマンドラインインターフェイス (AWS CLI) を設定できます。

次の例は marketingadmin という名前のロールプロファイルを示しています。--profile marketingadmin を使用して (または AWS_PROFILE 環境変数でこれを指定して) コマンドを実行する場合、CLI は別のプロファイル user1 で定義された認証情報を使用して Amazon リソースネーム (ARN) arn:aws:iam::123456789012:role/marketingadminrole のロールを引き受けます。このロールに割り当てられたアクセス権限で許可される任意のオペレーションを実行することができます。

[profile 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 Elastic コンピュートクラウド (Amazon EC2) インスタンスまたは Amazon Elastic コンテナサービス (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_PROFILE 環境変数を設定することができます。この環境変数が定義されている場合、各コマンドで --profile オプションを指定する必要はありません。

Linux または macOS

$ export AWS_PROFILE=marketingadmin

Windows

C:\> setx AWS_PROFILE marketingadmin

IAM ユーザーとロールの設定の詳細については、IAM ユーザーガイドの「ユーザーとグループ」と「ロール」を参照してください。

多要素認証を使用する

セキュリティを高めるには、ロールプロファイルを使用して呼び出しを試みるときに、多要素認証 (MFA) デバイスから生成された一回限りのキー、U2F デバイス、またはモバイルアプリケーションを指定するようにユーザーに要求することができます。

まず、MFA を要求するために IAM ロールの信頼関係を変更することを選択できます。これにより、すべてのユーザーは最初に 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フ ァイルエントリは、IAM ユーザーanika のアクセスキーを使用してロール cli-role の一時認証情報をリクエストする 2 つのロールプロファイルを示しています。ユーザー 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 はこのファイルをロードし、その内容を AssumeRoleWithWebIdentity オペレーションの WebIdentityToken 引数として渡します。

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 プロバイダーのロールを継承する場合にのみ適用されます。これらは、AssumeRole プロバイダーの設定には適用されません。

キャッシュされた認証情報のクリア

ロールを使用すると、AWS CLI は一時認証情報を有効期限が切れるまでローカルにキャッシュします。次回それらを使用しようとすると、AWS CLI はユーザーに代わってそれらの更新を試みます。

ロールの一時的な認証情報が取り消された場合、それらは自動的には更新されず、使用しようとすると失敗します。ただし、キャッシュを削除して AWS CLI で新しい認証情報を強制的に取得することはできます。

Linux または macOS

$ rm -r ~/.aws/cli/cache

Windows

C:\> del /s /q %UserProfile%\.aws\cli\cache