IAM Identity Center を使おう / AWS CLI で U2F MFA

IAM Identity Center (旧 AWS SSO) は、複数 AWS アカウントの認証を統合する AWS Organizations を前提としたサービスですが、複数アカウントを利用しない場合でも以下のようなメリットがありそうです。

- MFA デバイスを複数設定可
  - IAM ユーザーにはひとつの MFA デバイスしか登録できないため、物理キーと仮想デバイスを併用したりバックアップ用に複数登録しておくといったことができません。IAM Identity Center のユーザーであれば複数設定しておき、場面によっていずれかを選択することができます。
  - [(2022/11/16) IAM ユーザーでもできるようになったようです。](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-identity-access-management-multi-factor-authentication-devices/)
- Apple TouchID や Windows Hello などのデバイス組み込みのオーセンティケータにも対応
  - 対応している PC であれば、別途ハードを用意せずにそれ自体を MFA デバイスとして使用できます。
- AWS CLI の利用に固定のアクセスキーが不要
  - IAM Identity Center ではブラウザによるログインをおこなうことで認証し、一時的なアクセスキーを発行します。このとき MFA も必須にできるため、セキュリティ的にも有効です。
- AWS CLI による Switch Role 時に認証コードの入力が不要
  - CLI で MFA 必須となっている IAM ロールを使用する場合、毎回実行時に MFA コードの入力が必要でした。ログイン時に MFA を通しているので、毎回入力する必要がなくなります。
- AWS CLI でも物理キーによる MFA が使用可能
  - MFA デバイスに物理キー (U2F Key) を設定していると AWS CLI から MFA 必須の IAM ロールを使用することができませんでしたが、これも可能になります。[^1]

AWS Organizations は 1 アカウントからでも使用できますし、AWS アカウントの追加も簡単にできるようになるので、これを期に、お試し用、ハンズオン用など、アカウント分離を活用してみるのも良いかもしれません。

## IAM Identity Center の構成概要

IAM Identity Center を使用した場合、Organizations の管理アカウント上に「ユーザー (User)」「グループ (Group)」および「許可セット (Permission set)」を作成します。Permission set はロールのような位置づけで、各アカウントに対して User/Group × Permission set の組み合わせを割り当てることで、ユーザーまたはグループのユーザーにそのアカウント上で Permission set に定義された操作を許可します。

![概要](https://hirose-public.s3-ap-northeast-1.amazonaws.com/qiita/2022/09/10/bc943b37-675b-4a38-96fb-49d6ea2e2d80.png)

従来でも IAM ユーザーを特定の AWS アカウントのみに作成して、別アカウントの IAM ロールを使用することでユーザーの管理を一元化することはできましたが、IAM Identity Center を使用した場合は「ユーザー(人間)のための IAM ロール」も不要になります。

## IAM Identity Center の設定

### IAM Identity Center の有効化

AWS Organizations を有効化していない場合は、有効化します。

 1. 管理コンソール > [AWS Organizations](https://us-east-1.console.aws.amazon.com/organizations/v2/home)
 1. 「組織を作成する」

IAM Identity Center を有効化します。

 1. 管理コンソール > [IAM Identity Center](https://ap-northeast-1.console.aws.amazon.com/singlesignon/identity/home)
 1. 「有効化」

### IAM Identity Center にユーザーを追加

 1. [IAM Identity Center](https://ap-northeast-1.console.aws.amazon.com/singlesignon/identity/home) > ユーザー
 1. 「ユーザーを追加」
 1. プライマリ情報に項目を入力して「次へ」 (その他の項目は任意)
 1. グループを選択して「次へ」 (任意)
 1. 「ユーザーを追加」

設定したメールアドレスにメールが届くので、アクティベーションおよびパスワードの設定をおこないます。


### IAM Identity Center に Permission set を追加

Permission set は事前に定義されたテンプレートが用意されているので、まずはそこから選択すると良いでしょう。例えば以下のようなものがあります。作成後にカスタマイズすることもできます。

- AdministratorAccess : 管理者用。すべての権限を与える
- ViewOnlyAccess : 参照用。すべての参照権限を与える

Permission set の中身は IAM ロールと同様のもので、マネージドポリシーのアタッチ、インラインポリシー、および許可の境界 (Permission boundary) から構成されます。

 1. [IAM Identity Center](https://ap-northeast-1.console.aws.amazon.com/singlesignon/identity/home) > 許可セット
 2. 「許可セットを作成」
 3. 事前定義された許可セットから選択、または「カスタム許可セット」を選択して「次へ」
 4. 「カスタム許可セット」を選択した場合、詳細を指定
 5. 許可セット名等を入力して「次へ」
 6. 内容を確認して「作成」

### AWS アカウントへのアクセス許可をおこなう

これまでに作成したユーザー/グループと Permission set の組み合わせを AWS アカウントに割り当てることで、そのユーザーまたはグループのユーザーが AWS アカウントのリソースへアクセスできるようになります。

 1. [IAM Identity Center](https://ap-northeast-1.console.aws.amazon.com/singlesignon/identity/home) > AWS アカウント
 2. 対象の AWS アカウントを選択(複数可)して、「ユーザーまたはグループを割り当て」
 3. 対象のユーザー/グループを選択(複数可)して、「次へ」
 4. 割り当てる Permission set を選択(複数可)して、「次へ」
 5. 内容を確認して「送信」

## ユーザー操作

IAM Identity Center のユーザーでログイン(認証)するには、「AWS アクセスポータル」にアクセスします。(ID は自動的に振られますが、別の名称にも変更可能です。)

https://(ID).awsapps.com/start

![AWS アクセスポータル](https://hirose-public.s3-ap-northeast-1.amazonaws.com/qiita/2022/09/14/67d7e46d-d350-4c08-80ea-3e73e2873282.png)

ログインすると、そのユーザーに割り当てられた AWS アカウントおよび Permission set の一覧が表示されます。対象の「Management console」というリンクから AWS 管理コンソールにアクセスします。または「Command line or programmatic access」のリンクから一時的なアクセスキーを発行し、これを使用して AWS CLI 等からアクセスすることができます。

### MFA デバイスの設定

メニュー「MFA devices」から登録することができます。

### AWS CLI の使用 (プロファイル設定)

参考) [AWS IAM Identity Center (successor to AWS Single Sign-On) を使用するための AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-sso.html)

取得できるアクセスキーは一時的なものなので、毎回設定するのは面倒です。AWS CLI にプロファイルを設定しておくことで、連携することができるようになります。

プロファイルは以下のように ~/.aws/config に記述します。`aws configure sso` コマンドでも設定することができます。アクセスする AWS アカウントと Permission set の組み合わせが複数ある場合は、それぞれに個別のプロファイルを作成します。

```
[sso-session (SSO セッション名)]
sso_start_url = https://d-XXXXXXXXXX.awsapps.com/start#/
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access

[profile (プロファイル名)]
sso_session = (SSO セッション名)
sso_account_id = XXXXXXXXXXXX
sso_role_name = AdministratorAccess
region = ap-northeast-1
output = json
```

- sso-session セクション
  - sso_start_url : AWS アクセスポータルの URL
  - sso_region : AWS アクセスポータルのリージョン
- profile セクション
  - sso_session : SSO セッション名
  - sso_account_id : アクセス先の AWS アカウント ID
  - sso_role_name : Permission set 名

プロファイルを使用してアクセスする際は、まず `aws sso login` コマンドでログインをおこないます。

```shell
$ aws sso login --sso-session (SSO セッション名)
```

## 補足: 管理コンソール利用時の注意点

シングルサインオンで複数の AWS アカウントにアクセスできるのは良いのですが、以下のように「Permission set 名 / ユーザー名」と表示され、今どの AWS アカウントを見ているかは識別できません。(AWS アクセスポータルから各アカウントに飛ぶと別タブで開くのですが、タブごとに独立しているわけでもないため、すべてのタブが最後にアクセスした AWS アカウントに切り替わってしまいます:sweat:)

![IAM Identity Center のユーザーでログインした場合の表示](https://hirose-public.s3-ap-northeast-1.amazonaws.com/qiita/2022/09/10/ae237cd9-c3a6-4db1-9d6d-aa686064a3f7.png)

IAM ロールで切り換えをおこなった場合は表示名や色を指定できるので識別が容易なのですが、このままでは誤操作の可能性がむしろ高まってしまう... そこで、ブラウザ拡張機能の [AWS Peacock Management Console](https://chrome.google.com/webstore/detail/aws-peacock-management-co/bknjjajglapfhbdcfgmhgkgfomkkaidj) をおすすめします。これを使うことで AWS アカウント名が表示されるようになり、色づけにより識別も容易になります。

![](https://hirose-public.s3-ap-northeast-1.amazonaws.com/qiita/2022/09/10/53000f2f-75a3-4e40-af79-4952bab97541.png)

[^1]: [aws/aws-cli#3607 U2F Support](https://github.com/aws/aws-cli/issues/3607)