複数の Oracle Cloud (OCI) テナントに ひとつのIDCSユーザーでログインする方法

# はじめに
本記事では、１つの IDCS を 複数の OCI テナントにフェデレーションさせる手順について説明します。ユースケースは いろいろあると思いますが、例えば「１つの企業で複数テナントを運用しているが、ユーザーアカウントは１つの認証基盤で管理したい」という場合などにご活用ください。

- [OCIの認証基盤のおさらい](#ociの認証基盤のおさらい)
- [IDCSフェデレーション手順](#idcsフェデレーション手順)
 - [Step1. フェデレーションに必要な情報を確認する](#step1-フェデレーションに必要な情報を確認する)
 - [Step2. アイデンティティ・プロバイダの追加](#step2-アイデンティティプロバイダの追加)
 - [Step3. ログインの確認](#step3-ログインの確認)


# OCIの認証基盤のおさらい
Oracle Cloud Infrastructure (OCI) では、テナント開設時に、Identity Cloud Service (IDCS) と Identity Access and Management (IAM) という**２つの認証基盤がフェデレーションされた状態でプロビジョニング**されます。詳細については [AWS/Azure 経験者がはじめる OCI 入門 ～ IAM/IDCS編 ～](https://qiita.com/Skogkatter112/items/51b619026aa53a9c6069) にも まとめていますので、こちらもぜひご参照ください。

この IAM と IDCS ですが、どちらの認証基盤でユーザーを管理していくべきか？は悩むポイントだと思います。個人的な見解としては、下記の通りです。

- IAMでの管理が向いているケース
    - OCI の機能に閉じた利用である場合
- IDCSでの管理が向いているケース
    - 高度な認証オプションを使用する場合
    - PaaS などのサービスも利用する予定がある場合
    - **複数テナントを１つの認証基盤で管理していきたい場合**

なぜ最後のケースで IDCS の方が向いているかというと、
IAM でユーザー管理をしている場合、IAM とテナントの関係は 1:1 のため、複数テナントを持っている場合、例え同じユーザーであったとしても、その数だけユーザーIDが必要になります。こういった状況では、管理も煩雑になりますし、混乱・トラブルの原因となりかねません。
こういった場合、IAMユーザーではなく、１つのIDCSにユーザーを追加していき、そのIDCSを「各テナントへフェデレーションさせていく」ことで、１つの認証基盤を用いた運用が実現可能になります。

- **IAM／IDCS／テナントの関係性**  
<img width="550" alt="images.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/85eb89b1-7740-ecda-eaa5-4eb27965aa0b.png">

# IDCSフェデレーション手順
OCIのテナントにIDCSをフェデレーションする手順は、こちらの OCI ドキュメント：[Oracle Identity Cloud Serviceのフェデレート](https://docs.oracle.com/en-us/iaas/Content/Identity/Tasks/federatingIDCS.htm) にも記載があります。「もしかして この記事いらない…？」と思う程度には 結構丁寧に書かれているので、ぜひご参照ください。

本記事では、以下の構成で IDCSフェデレーションを行っていきます。
<img width="550" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/33af7b5e-7708-7431-6eb6-fdc41205fa0e.png">


### Step1. フェデレーションに必要な情報を確認する
まず、新たにフェデレーションさせたい IDCSインスタンスから、以下の情報を取得する必要があります。それぞれの取得方法を 順に見て行きましょう。

1. Oracle Identity Cloud Service ベース URL
2. クライアントID
3. クライアント・シークレット

これらの情報を参照するには、まず、新たにフェデレーションさせたい IDCSを持つ OCI テナント (本記事の場合、テナント-B) へ ログインします。この時、ユーザーは IDCSユーザー (管理者ユーザーなど) を使用してください。

次に、右上の人型アイコンの `プロファイル` → `サービス・ユーザー・コンソール` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/2d972072-2b4d-f94a-36d2-3f4c0efcd98a.png)
続いて、サービスの一覧から「Oracle Identity Cloud Service」を探し、`管理コンソール`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/04350c9a-4a7d-e048-3215-3268aab41ab6.png)
別ウィンドウで、下記 IDCSの管理コンソール画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/86b3fb29-2591-0548-d754-5e99718d7ddf.png)
上記画面のURLを見ると、`https://idcs-xxxxx.identity.oraclecloud.com/ui/v1/adminconsole` となっています。このURLの https〜 から oraclecloud.com までが、**Oracle Identity Cloud Service ベース URL** となっていますので、まず こちらを控えておきましょう。

次に、**クライアントID** および **クライアント・シークレット** を確認していきます。管理コンソール画面 左上の「`三`」メニューから `Oracle Cloud Service` をクリックして、 `COMPUTEBAREMETAL` を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/5d6776da-7853-7510-e25f-a1b573b0f0e7.png)

COMPUTEBAREMETAL アプリケーションの画面で、`Configuration` タブを開き、`General Information` から、**クライアントID** および **クライアント・シークレット** を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/bcb945e8-13a7-58bf-daa2-763367a818e3.png)

※IDCSインスタンスに COMPUTEBAREMETAL アプリケーションが存在しないケースについては、本記事では割愛しています。[ドキュメントの手順](https://docs.oracle.com/en-us/iaas/Content/Identity/Tasks/federatingIDCS.htm#Instruct)に従って確認してください。

これで、必要な情報の取得が完了しました。

### Step2. アイデンティティ・プロバイダの追加
次に、連携先の OCI テナントにログインし、アイデンティティ・プロバイダの追加を行います。(本記事の場合、テナント-A ) この時、ユーザーは、適切な権限を持つユーザーを使用してください。
アイデンティティ・プロバイダの追加は、OCI コンソールの左上「`三`」メニューから、`アイデンティティとセキュリテイ` → `フェデレーション` から行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/72117dc2-92b9-549e-2ba8-739bd311291b.png)

- `名前`：追加するアイデンティティ・プロバイダの名称を設定
- `説明`：追加するアイデンティティ・プロバイダの説明を設定
- `タイプ`："Oracle Identity Cloud Service" を選択  
その他 ADFS連携なども可.
- `Oracle Identity Cloud ServiceベースURL`：Step1 で取得した情報を貼付け
- `クライアントID`：Step1 で取得した情報を貼付け
- `クライアント・シークレット`：Step1 で取得した情報を貼付け
- `アサーションの暗号化`：本記事の手順ではチェック不要  
※チェックすると、IAMサービスが IdPから暗号化を予期されていることを認識する. チェックする場合、IDCS側でアサーションの暗号化も設定する必要がある.
- `強制認証`：チェックしたままでOK  
※チェックすると、ユーザーが既に別のセッションでサインインしている場合でも、IdPによる再認証を求められる.
- `認証コンテキストのクラス参照`：Government Cloud の場合のみ設定

設定が完了したら、`続行` ボタンをクリックします。続いて、グループのマッピングを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/65165380-6f34-8977-0c32-08dfcee4b6db.png)

リストボックスから、マッピングさせたい IDCSグループ および IAMグループを選択します。上記のイメージでは Administrator 用のグループ同士を マッピングしていますが、環境の権限設計に合わせてマッピングをしてください。

設定後、`アイデンティティ・プロバイダの追加` で作業は完了です。

### Step3. ログインの確認
アイデンティティ・プロバイダの追加が完了すると、連携先のテナント (本記事では テナント-A) のユーザー一覧でも、新たに連携された IDCSユーザー (本記事では IDCSユーザー B) が確認できるようになります。

最後に、実際に IDCSユーザー B を使って 連携先のテナント (テナント-A) にログインしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384668/0f66dd42-88f7-cc29-3e28-ffc1762c3f53.png)
ログインする際の注意点として、上記の認証基盤の選択画面があります。
ここでは、アイデンティティ・プロバイダとして、そのテナントのデフォルトのIDCS基盤(oracleidentitycloudservice) ではなく、**Step2 で作成したアイデンティティ・プロバイダ (自分のIDが登録された認証基盤) を選択** してください。

あとは、そのユーザーの ユーザー名、パスワードを入力すれば、ログインの完了です。

# おわりに
いかがでしたでしょうか。意外と簡単な手順になっていて、知ってしまえば５分とかからず連携できてしまいます。

OCIでは、１つの企業が 複数アカウントを利用しなくても 管理がし易いように、コンパートメントなどの機能もありますが、"請求情報を分けたい" ですとか、"権限管理を完全に分けたい" など、要件によって 別テナントを用意することも しばしばあるかと思います。

認証基盤を煩雑化させないため、本記事を参考に、ひとつの認証基盤 "IDCS" で一元化することもご検討頂くとよいと思います。