ユーザ用ツール

サイト用ツール


aws:iam:assumerole

【重要】AWS スイッチロールするためのAssumeRoleアクションの設定方法(クロスアカウント)

Switch Roleとは

「Switch Role(ロールの切り替え)」とは、別のIAMロールに一時的に切り替えて、そのロールの権限で操作を行う機能のことです。
これにより、ユーザーは1つのアカウントにログインしたまま、別の権限やアカウントの操作を安全に実行できます。

主な用途

複数アカウントの管理

企業では、開発用アカウント・本番用アカウント・監査用アカウントなどを分けるのが一般的です。
Switch Roleを使うと、一度ログインするだけで他アカウントの操作ができるようになります。

社員が増えたり、減ったりしますが、1環境のみユーザを作ればよく、各アカウントごとにユーザを作る必要がなくなります。

最小権限の原則

普段は権限の少ないユーザーとして動き、必要なときだけ管理者ロールに切り替えることでセキュリティを向上できます。

作業者と権限の分離

特定のIAMロールにだけ操作権限を持たせ、通常のユーザーはそのロールにスイッチして操作します。
例:S3フルアクセスは特定のロールでのみ可能にする。


Assume Roleアクションとは

Assume Roleアクション」は他者にAWSアカウントの権限を委譲する仕組みです。
他者にスイッチロールができるようになります。
設定は、各ロールで「信頼関係」を設定することで、権限を付与することができます。

スイッチロールするときに、
AWS STS(Security Token Service)のAssume Roleアクションによって、IAMロールから一時的認証情報(アクセスキーID、シークレットアクセスキー、セッショントークン)を取得して使用します。


スイッチロールのために、Assume Roleアクションの設定手順

【スイッチ元】スイッチロールできるポリシーを設定(委任元のアカウント)

方法1:EC2のプロファイルにロールを割り与える方法


方法2:ユーザに割り与えるポリシーを作成する方法

スイッチロールするポリシーを作成し、それをユーザに割り当てましょう。

  • [ポリシー][ポリシーの作成](例:SwitchRole-Infra, AllowAssumeRoleWithSourceIPRestriction)
  • 「JSON」を選択し、以下のようにします。


例1
{
  "Version": "2012-10-17",
  "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole"
      "Resource": "*"
    }
}
例2

1234567890の誰にでもスイッチロールできる。

{
  "Version": "2012-10-17",
  "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole"
      "Resource": "arn:aws:iam::1234567890:role/*"
    }
}
例3(おすすめ)

1234567890のsw-admin-writeロールにスイッチロールできる。

{
  "Version": "2012-10-17",
  "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole"
      "Resource": [
          "arn:aws:iam::1234567890:role/sw-admin-write",
          "arn:aws:iam::9988776655:role/sw-admin-write"
       ]
    }
}
例4

特定 IP のみ特権ロールの AssumeRole を許可する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAssumeRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::xxxxxxxxxx:role/AssumedAdministratorAccessRole"
        },
        {
            "Sid": "SourceIPRestriction",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx/32"
                    ]
                }
            }
        }
    ]
}


【スイッチロール先】ロールの作成(委任先のアカウント)

他のアカウントが利用できるロールを作成して、どこからスイッチロールを許可するかの信頼関係と操作できるロールの設定する

管理コンソールでの操作方法

  • [ロール] - [ロールを作成]
  • 「別のAWSアカウント」を選択
  • 「123456789012」のようなスイッチロールしてくるAWSアカウントIDを入力する。
  • ポリシーを選択する。(例:ReadOnlyAccess、AdministratorAccess)
  • 「ロール名」を入力して、「ロールの作成」(例:switchrole-dev, switchrole-infra)
    • スイッチロールする時に指定するロール名
  • 作成したロールを選択し、信頼関係タブで、「信頼関係の編集」をクリックします。

(例1)信頼関係の例(接続元のユーザとソースIPを設定)

スイッチロールされるロールの「信頼関係」で、許可するユーザを追加します。

特定 IP からのみIAM ユーザーがこのロールを引き受けられるように設定します。

スイッチロールされるロールの「信頼関係」に以下のように設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
        "arn:aws:iam::xxxxxxxxxxxxxxx:user/xxxxxxxxx",
        "arn:aws:iam::xxxxxxxxxxxxxxx:user/xxxxxxxxx",
        "arn:aws:iam::xxxxxxxxxxxxxxx:user/xxxxxxxxx",
        "arn:aws:iam::xxxxxxxxxxxxxxx:user/xxxxxxxxx"
        ]
      },
      "Action": "sts:AssumeRole"
      "Condition": {
        "IpAddress": {
            "aws:SourceIp": "x.x.x.x/32"
        }
      }
    }
  ]
}

(例2)信頼関係の例(接続元のユーザー名をアスタリスクで指定する)

スイッチロールされるロールの「信頼関係」に以下のように設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::aaaaaaaa:root"
      },
      "Action": "sts:AssumeRole"
      "Condition": {
        "ArnLike": {
            "aws:PrincipalArn": "arn:aws:iam::aaaaaaaaaa:user/*_infra"
        }
      }
    }
  ]
}

(例3)信頼関係の例(接続元のグループを使いたい。接続元のロールを使う)

スイッチロールされるロールの「信頼関係」に以下のように設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}




スイッチロールの切り替え手順

方法1:AWS管理コンソールでのロールの切り替え手順

SwichRoleのIAMを変更したら、ログアウト、ログインして確認しましょう。
そのままスイッチロールだけ確認すると、ログインできたり、できなかったりおかしい状態になります。

(1)右上のアカウント名をクリックし、「ロールの切り替え」を選択します。

(2)以下を入力し、「ロールの切り替え」をクリックします。

項目 設定 説明
アカウント 12345678901 スイッチロール先のアカウント
ロール sw-service1-infra スイッチロール先のロール名
大文字小文字注意
表示名 オプション
オプション


方法2: AWS CLIを使用して、手動でスイッチロールをする

  • --role-arnは、スイッチ先のIAM RoleのARN
aws sts assume-role --role-arn "arn:aws:iam::12345678901:role/sw-service1-infra" --role-session-name sw-service1-infraSession

# 環境変数を設定
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxx
export AWS_SESSION_TOKEN=xxxxxxxxxxxxxxxxx

# 確認
aws sts get-caller-identity

# 環境変数を削除
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN


方法3: インスタンスプロファイルが設定された EC2 から他アカウントの IAM ロールを assume する

credential_source=Ec2InstanceMetadata (よく利用する方法)
$HOME/.aws/credential

[dst-role]
role_arn = arn:aws:iam::123456789012:role/some-role
credential_source=Ec2InstanceMetadata

Ec2InstanceMetadata : EC2 インスタンスプロファイルを利用

$ aws s3 ls --profile dst-role

参考:AWS CLIでインスタンスプロファイルからのAssumeRoleが簡単になりました | DevelopersIO


方法4:AWS CLIのConfigを利用する方法

source_profileでdummyのIAMクレデンシャルを利用する

例1

$HOME/.aws/config

[profile dev]
region = ap-northeast-1
output = json

[profile prod-readonly]
role_arn = arn:aws:iam::222222222222:role/ReadOnlyFromDev
source_profile = dev
region = ap-northeast-1

$HOME/.aws/credential

[dev]
aws_access_key_id = AKIAxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxx

開発用クレデンシャルを使って自動的に本番アカウントのロールにスイッチして、その権限でコマンドが実行されます。

$ aws s3 ls --profile prod-readonly
例2

$HOME/.aws/credential

[operator]
aws_access_key_id = dummy_access_key
aws_secret_access_key = dummy_secret_key

[dst-role]
role_arn = arn:aws:iam::123456789012:role/some-role
source_profile = operator
$ aws s3 ls --profile dst-role

参考:AWS CLIでインスタンスプロファイルからのAssumeRoleが簡単になりました | DevelopersIO


参考

aws/iam/assumerole.txt · 最終更新: by kurihara

ページ用ツール