タスク用の IAM ロール - Amazon Elastic Container Service

タスク用の IAM ロール

Amazon ECS タスクには IAM ロールを関連付けることができます。IAM ロールで付与される許可は、タスクで実行されているコンテナによって引き受けられます。

コンテナ化したアプリケーションは AWS API を呼び出す必要がある場合、AWS 認証情報でそれらの AWS API リクエストに署名する必要があります。なお、タスクの IAM ロールは、アプリケーションを使用するための認証情報を管理する戦略を利用できます。これは、Amazon EC2 インスタンスプロファイルが Amazon EC2 インスタンスに認証情報を提供する方法と似ています。AWS 認証情報を作成してコンテナに配布したり、Amazon EC2 インスタンスのロールを使用したりする代わりに、IAM ロールを Amazon ECS のタスク定義または RunTask API オペレーションに関連付けることができます。コンテナは、AWS SDK または AWS CLI を使用して認可された AWS サービスへの API リクエストを実行できます。

次の内容は、タスクで IAM ロールを使用する利点について説明します。

  • 認証情報の分離: コンテナは、コンテナが属するタスク定義で定義された IAM ロールの認証情報のみを取得できます。コンテナは、別のタスクに属する別のコンテナを対象にした認証情報にアクセスすることはありません。

  • 許可: 許可のないコンテナは別のタスク用に定義されている IAM ロール認証情報にアクセスできません。

  • 監査性: CloudTrail にアクセスしイベントのログ記録を利用することで、遡及的な監査を確実に行えます。タスクの認証情報には、セッションにアタッチされている taskArn のコンテキストがあるため、CloudTrail ログではどのタスクがどのロールを使用しているかを表示できます。

注記

タスク用の IAM ロールを指定すると、そのタスクのコンテナ内の AWS CLI または他の SDK は、タスクロールによって提供された AWS 認証情報を排他的に使用し、Amazon EC2 または外部インスタンスで実行されていて、それらから IAM 許可を継承しなくなります。

タスク定義でタスク IAM ロールを定義するか、taskRoleArn API オペレーションでタスクを手動で実行するときに RunTask の上書きを使用できます。Amazon ECS エージェントは、ロール認証情報を含む追加のフィールドを使用してタスクを開始するペイロードメッセージを受け取ります。Amazon ECS エージェントは、一意のタスク認証情報 ID を識別トークンとして設定し、内部認証情報のキャッシュを更新して、タスクの識別トークンがペイロードで受け取ったロールの認証情報を指すようにします。Amazon ECS エージェントでは、次の相対 URI /credential_provider_version/credentials?id=task_credential_id を使用して、このタスクに属するすべてのコンテナの Env オブジェクト (docker inspect container_id コマンドで利用可能) に AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 環境変数を設定します。

コンテナ内から、以下のコマンドを使用して認証情報エンドポイントをクエリできます。

curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

出力:

{ "AccessKeyId": "ACCESS_KEY_ID", "Expiration": "EXPIRATION_DATE", "RoleArn": "TASK_ROLE_ARN", "SecretAccessKey": "SECRET_ACCESS_KEY", "Token": "SECURITY_TOKEN_STRING" }

Amazon EC2 インスタンスで、コンテナエージェントのバージョン 1.11.0 以降と、AWS CLI または SDK のサポートされているバージョンが使用されている場合、SDK クライアントは AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 変数が使用可能かどうか確認し、提供された認証情報を使用して AWS API への呼び出しが実行されます。詳細については、「Amazon EC2 または外部インスタンスでタスク IAM ロールを有効にする」および「サポートされる AWS SDK の使用」を参照してください。

認証情報プロバイダーを使用するたびに、リクエストがローカルでホストコンテナインスタンスの /var/log/ecs/audit.log.YYYY-MM-DD-HH。詳細については、「タスク認証情報の監査ログ用の &IAM; ロール」を参照してください。

重要

タスク IAM ロールを作成するときは、信頼関係またはロールに関連付けられた IAM ポリシーで aws:SourceAccount または aws:SourceArn のいずれかの条件キーを使用して、混乱した副セキュリティ問題を防止します。これらの条件キーは、信頼関係、またはロールに関連付けられた IAM ポリシーで指定できます。混乱した代理の問題と、お客様の AWS アカウントの保護方法の詳細について学ぶためには、[The confused deputy problem] (IAM ユーザーガイド) の[IAM User Guide] (混乱した代理の問題) を参照してください。

Amazon EC2 インスタンスでホストされるタスクに関する考慮事項

Amazon EC2 インスタンスで実行されているタスクで IAM ロールを使用する場合、コンテナは、Amazon EC2 インスタンスプロファイル(Amazon EC2 インスタンスメタデータサーバーを介して)提供される認証情報にアクセスすることを妨げられません。コンテナインスタンスのロールの許可は、以下に提供されるマネージド型 AmazonEC2ContainerServiceforEC2Role IAM ポリシーの許可のミニマリストに制限することをお勧めします。詳細については、「Amazon ECS コンテナインスタンスの IAM ロール」を参照してください。

Amazon EC2 インスタンスでホストされるタスクにタスク IAM ロールを使用する場合は、次の点も考慮する必要があります。

  • awsvpc ネットワークモードを使用するタスクで実行されたコンテナが、Amazon EC2 のインスタンスプロファイルに入力されている認証情報にアクセスを防止するためには (タスクロールで指定されている許可は有効)、エージェントの設定 ファイルで ECS_AWSVPC_BLOCK_IMDS エージェント 設定変数を true に設定し、そのエージェントを再起動します。詳細については、「Amazon ECS コンテナエージェントの設定」を参照してください。

  • bridge ネットワークモードを使用するタスクで実行されたコンテナが、Amazon EC2 のインスタンスプロファイルに入力されている認証情報にアクセスを防止するためには (タスクロールで指定されている許可は有効)、Amazon EC2 インスタンスで次の iptables コマンドを実行します。このコマンドは、host または awsvpc ネットワークモードを使用するタスク内のコンテナに影響を与えることはありません。詳細については、「ネットワークモード」を参照してください。

    sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP

    再起動後も有効にするには、Amazon EC2 インスタンスでこの iptables ルールを保存する必要があります。Amazon ECS に最適化された AMI を使用する場合は、次のコマンドを使用します。他のオペレーティングシステムの場合、そのオペレーティングシステムのドキュメントを参照してください。

    sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables

Amazon EC2 または外部インスタンスでタスク IAM ロールを有効にする

Amazon EC2 または外部インスタンスは、タスクの IAM ロールを有効にするために、コンテナエージェントのバージョン 1.11.0 以上が必要ですが、最新のコンテナエージェントのバージョンを使用することをお勧めします。エージェントのバージョンの確認と最新バージョンへの更新については、「Amazon ECS コンテナエージェントをアップデートする」を参照してください。Amazon ECS に最適化された AMI を使用している場合、インスタンスは、1.11.0-1 パッケージの ecs-init バージョン以降が必要です。インスタンスが最新 Amazon ECS に最適化された AMI を使用している場合、コンテナエージェントおよび ecs-init の必要なバージョンが含まれます。詳細については、「Amazon ECS に最適化された AMI」を参照してください。

コンテナインスタンスで Amazon ECS に最適化された AMI を使用していない場合、エージェントを開始する --net=host コマンドと、目的の設定に次のエージェント設定変数に必ず docker run オプションを追加してください (詳細については、「Amazon ECS コンテナエージェントの設定」を参照してください)。

ECS_ENABLE_TASK_IAM_ROLE=true

bridge および default ネットワークモードを使ったコンテナのタスクの IAM ロールを有効にします。

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

host ネットワークモードを使ったコンテナのタスクの IAM ロールを有効にします。この変数はエージェントバージョン 1.12.0 以降でのみサポートされています。

実行コマンドの例の詳細については、「Amazon ECS コンテナエージェントの手動更新(Amazon ECS 最適化以外の AMI の場合)」を参照してください。また、タスクのコンテナが AWS 認証情報を取得できるよう、次のネットワーキングコマンドをコンテナインスタンスで設定する必要があります。

sudo sysctl -w net.ipv4.conf.all.route_localnet=1 sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679

再起動後も有効にするには、コンテナインスタンスにこれらの iptables ルールを保存する必要があります。iptables-save および iptables-restore コマンドを使用して、iptables ルールを保存し、起動時にそのルールを復元します。詳細については、特定のオペレーティングシステムのドキュメントを参照してください。

タスク用の IAM ロールとポリシーの作成

タスクで使用する IAM ポリシーを作成するときは、そのポリシーはタスクのコンテナが引き受けるタスクの許可を含める必要があります。例として、既存の AWS マネージドポリシーを使用することもできます。または、特定のニーズを満たすカスタムポリシーを最初から作成できます。詳細については、IAM ユーザーガイド の「IAM ポリシーの作成」を参照してください。

重要

タスク IAM ロールを作成するときは、信頼関係またはロールに関連付けられた IAM ポリシーで aws:SourceAccount または aws:SourceArn のいずれかの条件キーを使用して、混乱した副セキュリティ問題を防止します。これらの条件キーは、信頼関係、またはロールに関連付けられた IAM ポリシーで指定できます。混乱した代理の問題と、お客様の AWS アカウントの保護方法の詳細について学ぶためには、[The confused deputy problem] (IAM ユーザーガイド) の[IAM User Guide] (混乱した代理の問題) を参照してください。

IAM ポリシーを作成したら、Amazon ECS タスク定義で参照するポリシーを含む IAM ロールを作成できます。IAM コンソールで [Elastic Container Service Task] (Elastic Container Service タスク) ユースケースを使用してロールを作成できます。それから、タスクのコンテナに必要なアクセス許可を付与するロールに特定の IAM ポリシーをアタッチできます。次の手順では、これを行う方法について説明します。

IAM のアクセス許可を必要とする複数のタスク定義またはサービスがある場合は、各タスクに提供するアクセスを最小限に抑えるために、タスクを操作するために必要な最小限のアクセス許可で特定のタスク定義またはサービスごとにロールを作成することを検討してください。

ユーザーのリージョンのサービスエンドポイントの詳細については、Amazon Web Services 全般のリファレンスガイドの「サービスエンドポイント」を参照してください。

IAM タスクロールは、ecs-tasks.amazonaws.com サービスを特定する信頼ポリシーが必要です。sts:AssumeRole 許可は、Amazon EC2 インスタンスが使用するロールとは異なる IAM ロールをタスクに引き受けられるようにします。これにより、タスクは Amazon EC2 インスタンスに関連付けられたロールを継承しません。混乱する副セキュリティ問題を防ぐために、許可をさらにスコープするために aws:SourceAccount または aws:SourceArn 条件キーを使用することをお勧めします。これらの条件キーは、信頼関係、またはロールに関連付けられた IAM ポリシーで指定できます。混乱した代理の問題と、お客様の AWS アカウントの保護方法の詳細について学ぶためには、[The confused deputy problem] (IAM ユーザーガイド) の[IAM User Guide] (混乱した代理の問題) を参照してください。

以下に示しているのは、信頼ポリシーの例です。リージョン識別子を置き換えて、タスク起動時に使用する AWS アカウント番号を特定する必要があります。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }

タスク用の IAM ポリシーを作成するには (AWS Management Console)

この例では、Amazon S3 バケットへの読み取り専用アクセスを許可するポリシーを作成します。データベース認証情報または他の秘密情報をバケットに保存し、タスクのコンテナによってバケットからの認証情報の読み取りとアプリケーションへのロードを実行できます。

  1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで、[Policies (ポリシー)] を選択し、次に [Create Policy (ポリシーの作成)] を選択します。

  3. 以下のいずれかのタブの手順に従って、ビジュアルのエディタまたは JSON エディタの使用方法を示します。

Using the visual editor
  1. [Service] で、[S3] を選択します。

  2. [アクション] の [Read (読み取り)] オプションを展開し、[GetObject] を選択します。

  3. [Resources] (リソース) の場合、[Add ARN] (ARN を追加) を選択し、Amazon S3 バケットの完全な Amazon リソースネーム (ARN) を入力します。

  4. (オプション) [Request conditions] (リクエスト条件) の場合、[Add condition] (条件を追加) を選択します。これは、混乱した代理のセキュリティ問題を防ぐためにお勧めします。混乱した代理の問題と、お客様の AWS アカウントの保護方法の詳細について学ぶためには、[The confused deputy problem] (IAM ユーザーガイド) の[IAM User Guide] (混乱した代理の問題)を参照してください。

    1. [Condition key] (条件キー) の場合、aws:SourceAccount または aws:SourceArn いずれかを選択します。これらのグローバル条件キーの詳細については、[IAM User Guide] (IAM ユーザーガイド) の「AWS グローバル条件コンテキストキー」を参照してください。

    2. [Operator] (オペレーター) の場合、aws:SourceAccount 条件キーを指定したら、StringEquals を選択します。または、aws:SourceArn 条件キーを指定した場合、ArnLike を選択します。

    3. [Value] (値) の場合、aws:SourceAccount 条件キーを指定したら、AWS アカウント ID を指定します。または aws:SourceArn 条件キーを指定した場合、Amazon ECS タスクの Amazon リソースネーム (ARN) を指定します。たとえば、aws:ecs:*:accountId:* のようなワイルドカードを使用できます。これはアカウントのすべてのタスクで機能します。

    4. [Add] (追加) を選択して条件キーを保存します。ポリシーに追加する条件キーごとに、これらのステップを繰り返します。

  5. [Next: Tags] (次へ: タグ) を選択して、整理するためのリソースタグをポリシーに追加したら、[Next: Review] (次へ: 確認) を選択します。

  6. [Review policy] (ポリシーの確認) ページで、[Name] (名前) には AmazonECSTaskS3BucketPolicy などの独自の一意の名前を入力します。必要に応じて、ポリシーの説明を指定することもできます。

  7. ポリシーが完了したら、[Create policy] (ポリシーの作成) を選択して終了します。

Using the JSON editor
  1. ポリシードキュメントのフィールドに、タスクに適用するポリシーを貼り付けます。以下の例では、my-pod-secrets-bucket Amazon S3 バケットにアクセス許可を付与します。これには、Amazon リソースネーム (ARN) または特定のアカウント ID を使用して特定のタスクを指定するために使用できる条件ステートメントが含まれています。これにより、追加セキュリティの許可をさらにスコープする方法を示します。これは、混乱した代理のセキュリティ問題を防ぐためにお勧めします。混乱した代理の問題と、お客様の AWS アカウントの保護方法の詳細について学ぶためには、[The confused deputy problem] (IAM ユーザーガイド) の[IAM User Guide] (混乱した代理の問題) を参照してください。

    アクセス許可ポリシーの例を次に示します。ポリシーを特定のニーズに応じて変更できます。リージョン識別子を置き換えて、タスク起動時に使用する AWS アカウント番号を特定する必要があります。

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }
  2. [Next: Tags] (次へ: タグ) を選択して、整理するためのリソースタグをポリシーに追加したら、[Next: Review] (次へ: 確認) を選択します。

  3. [Review policy] (ポリシーの確認) ページで、[Name] (名前) には AmazonECSTaskS3BucketPolicy などの独自の一意の名前を入力します。必要に応じて、ポリシーの説明を指定することもできます。

  4. ポリシーが完了したら、[Create policy] (ポリシーの作成) を選択して終了します。

タスク用の IAM ロールを作成するには (AWS Management Console)

  1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで [Roles]、[Create role] の順に選択します。

  3. [Select trusted entity] (信頼されたエンティティを選択) セクションで、[AWS Service] (AWS のサービス) を選択します。

  4. ドロップダウンメニューを使用して [Use case] (ユースケース) を使用する場合、Elastic Container Service を選択して、[Elastic Container Service Task] (Elastic Container Service タスク) ユースケースの後に、[Next] (次) を選択します。

  5. [Add permissions] (許可を追加) の場合、タスクで使用するポリシーを検索して選択します (この例では AmazonECSTaskS3BucketPolicy を選択し、[Next] (次) を選択します)。

  6. [Step 3: Name, review, and create] (ステップ 3: 名前を付けて、確認、作成) で、次の操作を実行します。

    1. [ロール名] に、ロールの名前を入力します。この例では、AmazonECSTaskS3BucketRole と入力してロールに名前を付けます。

    2. (オプション) [Description] (説明) の場合、この IAM ロールの説明を指定します。

    3. ロールの信頼済みエンティティと許可ポリシーを確認します。

    4. [Add tags (Optional) ] (タグの追加 (オプション) ) の場合、IAM ロールに関連付けるメタデータ タグを入力したら、[Create role] (ロールを作成) を選択します。

サポートされる AWS SDK の使用

タスクの IAM ロールのサポートは 2016 年 7 月 13 日に、AWS SDK に追加されました。タスクのコンテナは、その日付以降に作成されたバージョンの AWS SDK を使用する必要があります。AWSLinux ディストリビューションのパッケージマネージャーに含まれている SDK は、この機能をサポートするのに十分なほど新しくない可能性があります。

サポートされている SDK を使用していることを確認するには、コンテナを構築して最新バージョンを取得する際に、「アマゾン ウェブ サービスのツール」で、希望する SDK のインストール手順に従ってください。

タスク用の IAM ロールを指定する

ロールを作成し、そのロールにポリシーをアタッチした後、そのロールを引き受けるタスクを実行できます。これには複数の方法があります。

  • タスク定義でタスク用の IAM ロールを指定します。新しいタスク定義または既存のタスク定義の新しいリビジョンを作成して、前に作成したロールを指定できます。クラシックコンソールを使用してタスク定義を作成する場合、[Task Role] (タスクロール) フィールドで IAM ロールを選択します。AWS CLI または SDK を使用する場合、taskRoleArn パラメータを使用してタスクロールの Amazon リソースネーム (ARN) を指定します。詳細については、「新しいコンソールを使用したタスク定義の作成」を参照してください。

    注記

    このオプションは、Amazon ECS サービスで IAM タスクロールを使用する場合に必要です。

  • タスクを実行する際に、IAM タスクロールの上書きを指定します。タスクを実行する際に IAM タスクロールの上書きを指定できます。クラシックコンソールを使用してタスクを実行する場合、[Advanced Options] (詳細オプション) を選択し、[Task Role] (タスクロール) フィールドで IAM ロールを選択します。AWS CLI または SDK を使用する場合、overrides JSON オブジェクトの taskRoleArn パラメータを使用してタスクロールの ARN を指定します。詳細については、「[Run a standalone task] (スタンドアロンタスクを実行)」を参照してください。

注記

タスクおよびサービスを実行するために必要な標準の Amazon ECS アクセス権限を付与するだけでなく、IAM ユーザーにはタスクの iam:PassRole IAM ロールを使用する アクセス権限も必要です。