AWS Single Sign-OnでAWSマネジメントコンソールとIBM Cloudポータルをシングルサインオンする

# 目的

AWS Single Sign-On（以下、AWS SSO）はSAML IdPになることができます。一方、IBM Cloudのポータル、CLI等はIAMのIDプロバイダーとして、IBM IDだけでなくApp IDに対応し、App IDはSAMLのSPになることができます。というわけで、AWS SSOのIdPを使ってIBM CloudのポータルやCLIの認証をしてみます。

# 利点

デフォルトではIBM CloudのポータルにアクセスするためにIBM IDを取得し、アカウントから招待してもらう必要があります。このマルチクラウド時代に、AWSとIBM Cloudでそれぞれユーザー管理をしなければいけないうのは、ユーザー数が増えてきたら管理者にとってはかなりの負担になります。

また、会社のメールアドレスを使ってIBM IDを取得するという行為が特にエンタープライズな環境では抵抗を受けるケースもあります。

AWS SSOのIdPと連携することで、次のようなメリットがあります。

* ユーザーはIBM IDの登録が不要
* AWS IdPのユーザーでIBM CloudにログインするとIBM Cloudにユーザーが自動登録される
* AWS SSOを使ったアプリケーションとIBM Cloud ConsoleやApp IDを使ったアプリケーションでSSOできる

# 手順

## AWS SSOの初期設定

当然AWSのアカウントが必要です。アカウントに管理者でログインしたら``AWS Single Sign-On``サービスを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/55f29c05-df7e-43dd-a310-8ac1d22cfa33.png)

初めての場合は``AWS SSOを有効にする``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/0da4a3bf-deb5-bdba-e733-175c8f6b3b12.png)

初めての場合は``AWS 組織の作成``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/f468c73a-ebf7-5b16-df80-a90a2a403694.png)

``3 クラウドアプリケーションへの SSO アクセスの管理``を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/265f4d74-1dff-c17e-d4fa-269d883e9496.png)

``新規アプリケーションの追加``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/09919205-489b-95f3-3535-3b0bd567321c.png)

``カスタム SAML 2.0 アプリケーションの追加``を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/a514d4b5-a48d-966e-99c7-1c3a8e2629c6.png)

``表示名``と``説明``に任意の値を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/028c6963-6635-dd27-c5ce-b8660e3c16fd.png)

ここで、

* ``AWS SSO SAML メタデータファイル``をダウンロードします
* ``AWS SSO サインイン URL``を控えておきます
* ``AWS SSO 証明書``をダウンロードします

画面をそのままにしてApp IDの設定画面を開きます。

## App IDの初期設定

App IDのインスタンスを用意しておきます。

わかりやすさのために``SAML 2.0連携``以外のIDプロバイダーを無効化し、``SAML 2.0連携``の編集をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/9888138e-0c69-dc1c-a96d-66884c66fff7.png)

プロバイダ名に任意の値を入力し、``SAML メタデータ・ファイルのダウンロード``をクリックします。これはいわゆるSPメタデータです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/9471d0bb-cb81-fa31-3687-6ef746c2d2b5.png)

画面右側の値を入力します。

項目|値
---|---
エンティティーID|先ほどダウンロードしたAWSのIdPメタデータをテキストエディタで開き、1行目のentityId値を入力
サインインURL|先ほど控えたAWS SSOのサインインURLを入力
1次証明書|先ほどダウンロードしたAWS SSO証明書の中身を入力

``保存``をクリックします。

## AWS SSOのSPメタデータ取り込みと属性マッピング

再びAWSに戻り、先ほどダウンロードしたSPメタデータをアップロードし``変更の保存``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/d4c6e37d-72e8-6846-ada8-9cc59f825cb0.png)

``属性マッピング``タブをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/6590b0d9-9237-0d42-95c4-014cf3231b9c.png)

AWS SSO IdPのアサーションとSP間で属性のマッピングをします。

> 参考）https://cloud.ibm.com/docs/account?topic=account-idp-integration

最低限下記のマッピングを追加します。

アプリケーションのユーザー属性|この文字列または AWS SSO のユーザー属性にマッピング|形式|意味
---|---|---|---
Subject|${user:email}|emailAddress|App IDのユーザープロファイルの識別に使用（必須）
familyName|${user:familyName}|basic|IBM Cloudのユーザープロファイルで名前の表示に使用（姓部分）
givenName|${user:givenName}|basic|IBM Cloudのユーザープロファイルで名前の表示に使用（名部分）
name|${user:preferredUsername}|basic|App IDのユーザープロファイルで名前の表示に使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/fba941ee-d4cf-1647-d404-aa9e6b08ea18.png)

入力後、``変更を保存``をクリックします。

## AWS SSOのユーザー追加

AWS SSOを利用できるユーザーを追加します。``ユーザー``メニューから``ユーザーを追加``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/37099eba-9d7e-61f4-c1d2-c8c096d999fc.png)

必要な情報を入力し、``次: グループ``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/1ff98efe-5353-99ab-b7d3-ba2b4e1c0e0a.png)

グループはSSOには不要なので、``ユーザーを追加``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/d2f5812a-c6c0-41fb-50ca-58f778a25f53.png)

ユーザーが追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/cba0a3d9-9855-8629-b62b-ed5f30c24bf3.png)

メールアドレス宛にインビテーションメールが送信されますので、メールを開きリンクをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/adafe327-cf56-fb44-9474-9b06b9f80a06.png)

パスワードを設定し``新しいパスワードの設定``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/4e403b9c-04af-6c20-e60a-2a472ffb9e25.png)

## AWSマネジメントコンソールのユーザー権限設定

AWS SSOのユーザーでAWSマネジメントコンソールを利用できるようにします。これで、IBM CloudとAWSでポータルのSSOが実現できるようになります。

ダッシュボードで``2 AWSアカウントへの SSO アクセスの管理``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/a4c334ae-6652-870d-98f7-5466fc63104a.png)

初めての場合はアクセス権限セットがないので``アクセス権限``多分をクリックし``アクセス権限セットを作成``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/606f5348-8abf-4f15-ccc9-b3b9dc097f72.png)

必要に応じてどちらかを選択します。今回は``既存の職務機能ポリシーを使用``を選択して``次: 詳細``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/32ec99d1-2408-f7b0-cc9e-251bb928678e.png)

今回はとりあえず``PowerUserAccess``を選択し``次: タグ``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/73e54710-dc16-f7f6-28aa-48d1a1cdca4c.png)

今回は何もせず``次: 確認``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/fc9c2e8c-682c-ff39-f013-56ca01914aa8.png)

確認し``作成``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/98c4e2ef-65f9-4d2a-474d-336d00cd5bc3.png)

アクセス権限セットが作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/ca357d95-ecb8-3a7f-76b0-d1b0a7cc0d3e.png)

``AWS組織``タブをクリックし、アカウントを選択して``ユーザーの割り当て``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/320434ae-670e-fc5c-1b6f-b50b9ceda57d.png)

ユーザーを選択して``次: アクセス権限セット``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/081c1ee7-1031-e307-0efd-762d86be8a59.png)

アクセス権限セットを選択し``完了``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/ef7e93bb-1cc4-888e-90f2-6aab79c8baa8.png)

少し待つと完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/caf07db2-a5f7-a501-c6f2-5cd139604b9b.png)

AWS SSO側の設定はこれで完了です。

## App IDの接続テスト

SAML 2.0連携画面で``テスト``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/a67f2b76-9f3d-e670-7f63-a6861c4dc219.png)

設定がうまくいっていればAWSのサインイン画面が表示されるので、先ほど登録したAWS SSOのユーザー名を入力して``次の``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/21a7751b-9929-a353-5e74-4b1330e2f5f2.png)

先ほど設定したパスワードを入力し``サインイン``を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/af4d65ef-497d-c621-1e4b-93bea32054f8.png)

設定がうまくいっていれば``Good job, It works``と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/cc4ba9bb-07f6-3c2d-232a-540593005524.png)

ユーザープロファイルを確認します。初回ログイン時にプロファイルが自動登録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/d92f0b6f-976c-dc3a-fa8d-26de14f52c4c.png)

これでApp ID側の作業は完了です。

## IBM CloudポータルのIDプロバイダー設定

IAMのIDプロバイダーを設定します。過去記事「[App IDのユーザーでIBM Cloudのポータルを利用する](https://qiita.com/teruq/items/af2c29d8bab6d6cbe91e#iam%E3%81%AE%E8%A8%AD%E5%AE%9A)」を参照ください。ここでApp IDとの連携とSSOログイン用のIdP URLを生成します。

## IBM CloudポータルへのSSOログイン

設定が終わったら、IdP URLをブラウザで開きます。ブラウザにAWS SSOの認証情報が残っていればIBM Cloud Consoleのダッシュボードが表示されます。残っていなければAWS SSOのサインイン画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/647bd068-840d-5064-5f54-681cbe198e02.png)

IBM Cloudのダッシュボードが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/b1868470-31f4-913c-56ed-69d0d94c034c.png)

IAMを確認するとAWS SSOのユーザーが登録されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/e13fb270-ff6d-6fdf-2fb3-9aff2024ff9d.png)

うまくSAML連携することができました。

## AWSマネジメントコンソールへのSSOログイン

AWS SSOユーザーは通常のマネジメントコンソールへのログイン画面は使いません。かわりにユーザーポータルを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/d796504b-d708-70ea-4805-bb54a602f88d.png)

ユーザーポータルで``AWS Account``を選択し、``Management console``をクリックします。

> ちなみにIBM Cloud App IDが見えていますがここをクリックしてもエラーになります。なぜなら、IBM Cloudとの連携はSP Initiatedのため、IdPであるAWS SSOからここをクリックしても行先がないからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/86ffbc11-d67f-b600-7bb7-6f4fefe61ae1.png)

無事、マネジメントコンソールが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/7e6232be-f6a9-8357-3cb6-8ea216f26f57.png)

これで、AWSとIBM Cloud両方にSSOできるようになりました。

# 考慮点

## ユーザーの権限設定

AWS SSOでサインインしたユーザーはIBM Cloudに対して何の権限も持っていませんので、管理者が別途必要な権限を付与するか、アクセスグループの動的ルール機能を使って自動付与することもできます。

> 参考）[App IDのユーザーでIBM Cloudのポータルを利用する際に動的にアクセスグループを設定する](https://qiita.com/teruq/items/e72fececdab8d8736176)

しかしこの方法だと、IdPはAWS SSOなのに、App IDでユーザーにカスタム属性を付与することになり、少々面倒です。AWS SSOで属性を設定しそれをIBM Cloudに渡すことができないか、別途調査してみます。

## CLIの利用

CLIを利用する場合はユーザー・パスワード方式ではなくSSO方式になります。

```
$ ibmcloud login -u teruq@******.jp --sso
API エンドポイント: https://cloud.ibm.com
リージョン: jp-tok

Get a one-time code from https://identity-1.ap-north.iam.cloud.ibm.com/identity/passcode to proceed.
デフォルトのブラウザーで URL を開きますか? [Y/n] > y
One-time code >
```

このとき表示されるURLは残念ながらIBM IDによるログイン画面になってしまい、AWS SSOユーザーの認証をすることができません。これは次の手順を踏むことで回避できました。

* ブラウザでIBM CloudのIdP URLからAWS SSOを使って認証しておく
* CLIのログインコマンド（--sso）を打ち、表示されたURLを同じブラウザのURL欄にコピー＆ペーストして開く
* ワンタイムパスワードが発行される

## AWS SSOのログアウト

AWS SSOを使ってログインするとおそらくはCookieが残り、ブラウザを閉じて開きなおしてもログイン状態が維持されます。IBM Cloud ConsoleでログアウトしてもAWS SSOには効果ありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/dd3c0e48-5b87-930d-c215-264b9cecfea4.png)

AWS SSOをログアウトするためには、次の方法が考えられます。まず、IBM Cloud Consoleが開く直前に下記の画面が数秒間表示されますので、その隙に右上の``Sign out``をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/c1de9647-548e-906e-3a41-5e0fcc83220b.png)

もう1つの方法は、AWS SSOの``ユーザーポータル``を利用します。AWSの設定画面からURLを知ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/d3e3e26c-873f-1352-0473-e74b0d6c53b8.png)

このURLにアクセスし、右上の``Sign out``をクリックすることでログアウトすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/820e2243-2d20-5e3a-a04b-7106b4df0b19.png)

以上です。