IDCSとOCI IAMの違いを掘り下げる

<font color="red">2021/11にOCI IAM Identity Domainsがリリースされました。新しく払い出されたテナントでは、こちらを使ってください。</font>
* [Oracle Blog: OCI IAM Identity Domains のご紹介](https://blogs.oracle.com/sec/post/introducing-oci-iam-identity-domains-jp)
* [マニュアル：アイデンティティ・ドメインのあるIAM](https://docs.oracle.com/ja-jp/iaas/Content/Identity/home.htm)
* [SpeakerDeck: OCI IAM Identity Domains機能概要](https://speakerdeck.com/oracle4engineer/oci-identity-domains-technical-basic)

# 1. はじめに

Oracle Cloud Infrastructureのアカウント管理に、IDCS（Identity Cloud Service）と、IAMのどちらを使用するかは悩ましい問題だ。概要は以下の記事を読んでもらうとして、ここではもう少し掘り下げたい。

* [IDCSとOCI IAMの比較](https://blogs.techvan.co.jp/oci/2019/10/18/idcs%e3%81%a8oci-iam%e3%81%ae%e6%af%94%e8%bc%83/)

### 1-1. TL;DR

* OCIにはIDCSとIAMの２つのアカウント管理方法があり、初心者には違いがわかりづらい
* 一般にはIDCSが推奨されているように思うが、注意点やデメリットもある 

### 1-2. 対象環境

* Oracle Cloud Infrastructure

### 1-3. 参考情報

* [OCIマニュアル：「IAM（日本語）」](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Identity/Concepts/overview.htm) [「英語」](https://docs.cloud.oracle.com/en-us/iaas/Content/Identity/Concepts/overview.htm)
* [IDおよびアクセス管理 (IAM) 概要 L100（speakerdeck.com）](https://speakerdeck.com/ocise/ociji-shu-zi-liao-idoyobiakusesuguan-li-iam-gai-yao)
* [Identity and Access Management L200（PDF）](https://www.oracle.com/a/ocom/docs/iam-200.pdf)
* [OCIの認証・認可機能の総まとめ（speakerdeck.com）](https://speakerdeck.com/mmarukaw/ocifalseren-zheng-ren-ke-ji-neng-falsezong-matome)

# 2. IDCS or IAM

Oracle Cloud Infrastructureを使い始めて、最初に悩むのはログイン方法ではないだろうか。管理コンソールのログイン画面では、以下のように２つの選択肢がある。
![idcs01new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/6502a122-5f66-a9c5-b23c-d2490f2819c7.png)

アカウントをアクティベーションした段階では、IDCSとIAMの両方のユーザーが作成されているため、どちらも同じユーザー名／パスワードでログインできる。**しかし、まったく別のものなので、片方のパスワードを変更しても、それがもう一方には伝搬しない。**

管理コンソールで作成済みユーザーを確認すると、初期段階ではIDCSユーザーとIAMユーザーが作成されている。**これ以降、ユーザーを追加作成するときは、どちらにするのか決める必要がある。**

**注意：**
<font color="blue">IDCSユーザーは正確に言うとIDCS連携済みユーザー（Federated User）だ。IDCS上のユーザー情報と、IAM上のユーザー情報を連携させることで、認証・認可を実現している。</font>

次の図は、[Advanced Training (Level 200)](https://www.oracle.com/cloud/iaas/training/advanced.html)の[Identity and Access Management L200（PDF）](https://www.oracle.com/a/ocom/docs/iam-200.pdf)に載っていた図をカスタマイズしたものだ。IDCSとIAMの関係を描いている。
![IDCS01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/122f7876-d1a8-6aed-bd60-d5bfacd84afa.png)

# 3. どちらを使用するか考える 

2019年まではIDCS利用が推奨されているように感じたが、現在は必ずしもIDCS推奨では無い。純粋に「何をやりたいか」が判断基準になる。

<font color="blue">2020/3追記</font>
「 [サインイン・オプションの理解](https://docs.cloud.oracle.com/ja-jp/iaas/Content/GSG/Concepts/signinoptions.htm)」というページがマニュアルに追加されていた。みんな戸惑うのだろう。これを読む限りは、必ずしもIDCSが推奨されているわけではなさそうだ。

### 3-1. IDCS、IAM比較表
次の表はIDCSとIAM比較表だ。それぞれ順番に説明する。

| 機能 | IDCS | IAM |
|:--|:--|:--|
| 管理コンソールのアクセス元IP制限  | 可  | 可（※1） |
| MFA  | 有償版IDCSが必要※ | 無償で利用可能 |
| MFAの種類  | SMS, モバイルアプリのパスコード、モバイルアプリ通知、セキュリティ質問、Eメール  | モバイルアプリのパスコード |
| パスワードポリシー  | 変更可能。有効期限なしも可 | 変更可能 |
| 対象サービス | OCI以外のPaaS | Oracle Cloud Infrastructureのみ |
| 他クラウドサービスとの連携 | Oracle Cloud, SAML, OAuthなど | Azure Directory, Okta, SAMLなど|
| API | IDCS固有（SCIM準拠）  | OCI標準 |

※1. IAMでも、2020/9/1からコンソールアクセス元IPの制限ができるようになった。[参考:Network source restrictions for signing in to the Console](https://docs.cloud.oracle.com/en-us/iaas/releasenotes/changes/e5cc1ae9-089b-478c-84e6-539f7435db4c/)
※2. IDCS Enterprise User（有償版）の価格は、1ユーザー/月あたり、Monthly Flex：3.2ドル（2020年9月現在）。
https://www.oracle.com/cloud/security/pricing.html

### 3-2. 管理コンソールのアクセス元IP制限と多要素認証（MFA）

最初の判断基準が「アクセス元IP制限」と「MFA」の２つだろう。いろいろな記事で取り上げられている。

以前、管理コンソールのアクセス元IPをホワイトリストで制限できるのはIDCSだけだったが、現在はIAMでも利用できる。MFAはどちらでも利用できるが機能に違いがある。

**IDCS**

* [Oracle CloudにおけるMulti-Factor Authentication (多要素認証)の実装](https://www.oracle.com/jp/technical-resources/articles/keys-to-the-oracle-cloud-07.html)
* [OracleCloud MFA(多要素認証)を使用してセキュリティを高める](https://qiita.com/sugimount/items/37369cd138f57630b970)
* [IDCSによる2段階認証をしてみた](https://blogs.techvan.co.jp/oci/2019/11/30/idcs%e3%81%ab%e3%82%88%e3%82%8b2%e6%ae%b5%e9%9a%8e%e8%aa%8d%e8%a8%bc%e3%82%92%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f/)
* [IDCSによる認証を接続元IPで制限してみる](https://blogs.techvan.co.jp/oci/2019/10/31/idcs%e3%81%ab%e3%82%88%e3%82%8b%e8%aa%8d%e8%a8%bc%e3%82%92%e6%8e%a5%e7%b6%9a%e5%85%83ip%e3%81%a7%e5%88%b6%e9%99%90%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b/)

**IAM**

* [[Oracle Cloud] IAMアカウントでのログインにMFA（多要素認証）を設定する](https://itedge.stars.ne.jp/oci-iam-mfa/)
* [OCIへのコンソール・ログインをセキュアにする](https://qiita.com/NSO-KC/items/39e5b3da967f97704f9e)
* [IAMによる2段階認証をしてみた](https://blogs.techvan.co.jp/oci/2019/12/17/iam%e3%81%ab%e3%82%88%e3%82%8b2%e6%ae%b5%e9%9a%8e%e8%aa%8d%e8%a8%bc%e3%82%92%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f/)

#### 3-2-1. 管理コンソールのアクセス元IP制限について

管理コンソールのアクセス元IPを制限するには、次のいずれかの機能を使用する。

* IAMのNetwork Source Restrictions
* IDCSのネットワーク・ペリメータ

マニュアルリンク：

* [IAM:認証設定の管理](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Identity/Tasks/managingpasswordrules.htm)
* [Oracle Identity Cloud Serviceネットワーク・ペリメータの管理](https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/uaids/manage-oracle-identity-cloud-service-network-permieters.html)

インターネットにはNAT経由で接続することがほとんどなので、NATで使用するパブリックIPをホワイトリストとして指定する。すると、それ以外のIPアドレスからは管理コンソールにアクセスできなくなる。間違って設定するとリカバリーが大変なので気をつけること。

企業の場合、ネットワーク部門に確認するのがいいだろう。ある程度歴史のある企業では、複数持っていることが普通なので注意したい。また以下のサイトでも簡単に現在のパブリックIPを確認できる。

https://www.whatismyip.com/


### 3-3. ほかのPaaSを利用するか

IAMはOracle Cloud Infrastructureのサービスだけを管理できるのに対し、IDCSではBlockchainやJava CloudなどのPaaSも利用できる。

以下のスクリーンショットはIDCSとIAMでログインしたときの管理コンソールの違いだ。IDCSでは、「その他のOracle Cloudサービス」メニューに「プラットフォーム・サービス」「クラシック・データ管理サービス」「クラシック・インフラストラクチャ・サービス」が表示されている。

<font color="red">下記のスクリーンショットは2020年2月時点もの。「その他のOracle Cloudサービス」のサービスには、OCIネイティブにアクセスできるように変更されたものもある。</font>

**IDCSでログインしたとき**
![oci_paas01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/bc12a236-6269-1eef-5309-74366bbbfcd0.png)

**IAMでログインしたとき**
![oci_paas02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/325fefbe-306a-af46-d679-e04453b7e582.png)

### 3-4. ほかのクラウドサービスやID連携が必要か

ID管理サービスの**IDCS**と、OCIの認証・認可システムの**IAM**を比較するのはミスマッチだが、IDCSではOracleだけでなく他社のクラウドサービスと連携して、シングルサインオンを実現できる。IDCSの詳細は以下のマニュアルを参照してほしい。

* [Oracle Identity Cloud Serviceの概念について](https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/uaids/oracle-identity-cloud-service-concepts.html#GUID-D00FA725-7B0C-4111-A71E-24894240D84B)
* [アプリケーション統合の理解](https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/uaids/understand-application-integration1.html)
* [Oracle Identity Cloud Service - アプリケーション・カタログ](https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/appcatalog/index.html)


<font color="blue">**ヒント：**
IDCSやOkta、Active Directoryなどの認証機能を提供するサービスを**IdP**（Identity Provider）と呼ぶ。</font>

IAMだけで利用できるサービスはOCIに限られる。しかし、下記マニュアルにあるようにIDCSやActive Directory、OktaなどのID管理サービスと連携させることで、ほかのサービスを利用できる。つまり「IDCS+IAM」ではなく「ほかのID管理サービス＋IAM」という運用も可能だ。

https://docs.oracle.com/en-us/iaas/Content/Identity/Concepts/federation.htm

> Oracle Cloud Infrastructure supports federation with Oracle Identity Cloud Service,and Microsoft Active Directory (via Active Directory Federation Services (AD FS)), Microsoft Azure Active Directory, Okta, and other identity providers that supports the Security Assertion Markup Language (SAML) 2.0 protocol.

ただし、下記マニュアルには**「フェデレーテッド・ユーザーがサポートされているのはIDCSとOktaだけ」**という記述がある。

https://docs.oracle.com/en-us/iaas/Content/Identity/Tasks/managingusersfederated.htm

> Prerequisites
> Management of user capabilities for federated users is supported for Oracle Identity Cloud Service and Okta federations only.

これを解釈すると次のようになるのだろうか。実際にやったことが無いので推測だが．．．。

* **IDCSとOkta：**OCIのフェデレーテッド・ユーザー機能を利用でき、OCIコンソールからシングル・サインオンが可能
* **それ以外のID管理サービス：**ID管理サービス側からシングル・サインオンしてOCIを利用可能

### 3-5. IDCS無償版と有償版の違い

IAMの認証機能はシンプルなのに対し、IDCSにはさまざまな機能がある。たとえばバスワードの複雑性は、ともに変更できるが、パスワードの有効期限を変更できるのはIDCSに限られる。

またIDCSには、追加費用なしで使える**Foundation**と、追加費用が必要な**Standard**の２種類がある。それぞれの機能の詳細は以下のマニュアルを参照のこと。

* [Oracle Identity Cloud Service価格設定モデルについて](https://docs.oracle.com/cd/E83857_01/paas/identity-cloud/uaids/oracle-identity-cloud-service-pricing-models.html#GUID-05F56DF0-0F71-436C-A103-3A10AEB38650)
* [About Oracle Identity Cloud Service Pricing Models](https://docs.oracle.com/en/cloud/paas/identity-cloud/uaids/oracle-identity-cloud-service-pricing-models.html#GUID-05F56DF0-0F71-436C-A103-3A10AEB38650)

<font color="red">追加費用がかかる**Standard**は、1ユーザー/月あたり、Monthly Flexで3.2ドルだ（2020/10現在）。PAYGは、登録するユーザー数や機能の必要性によって考えたほうがいいだろう。</a>

### 3-6. APIの違い

IDCSとIAMでは、REST APIがまったく異なる。このことは自動化するとき、生産性に大きく影響するので注意したい。IAMはOCI標準のREST APIが使用できる。そのためOCI CLIやTerraform、Resource Manager、OCI SDKが利用でき、ほかのOCIサービスと同様に管理できる。

それに対してIDCSは独自のAPIなので、OCI CLIやTerraformは使用できない。SDKは提供されているが、まったく異なるAPI体系なので、別途学習コストが必要だ。OCI REST APIでも一部操作できる機能もあるが、極めて限定されている。

過去実績では、管理コンソールでは操作できても、IDCSのREST APIが公開されていない機能もあった。

<font color="blue">IDCSを利用してユーザー管理を自動化するときには、事前の調査を推奨する。</font>
 
**IAM**

* [OCI SDKs and CLI](https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdks.htm)
* [REST APIs](https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/usingapi.htm)

**IDCS**

* [REST API for Oracle Identity Cloud Service](https://docs.oracle.com/en/cloud/paas/identity-cloud/rest-api/index.html)
* [Download Oracle Identity Cloud Service SDKs and Applications](https://docs.oracle.com/en/cloud/paas/identity-cloud/uaids/download-oracle-identity-cloud-service-sdks-and-applications.html)

### 3-7. パスワード・リカバリー

IDCSとIAMでは、パスワード・ポリシーのカスタマイズ可能レベルや、パスワード・リカバリーの操作方法が異なる。よく使用する機能なので、実際に操作して確認すること推奨する。とくにIDCSは操作が複雑なので注意したい。

* [IAM - Managing Users](https://docs.cloud.oracle.com/en-us/iaas/Content/Identity/Tasks/managingusers.htm)
* [Using Oracle Identity Cloud Service - Configure User Settings](https://docs.oracle.com/en/cloud/paas/identity-cloud/usids/configure-user-settings1.html)

### 3-8. 課金情報の表示

現在はIAMの**usage-reports**ポリシーがあれば課金情報にアクセスできる。そのためIAMログインだからといって課金情報表示のデメリットはない。

~~IDCSとIAMでは課金情報を表示する権限に違いがある。結論を先に言うと以下のとおり。~~

* <font color="red">~~IAMでは、Administratorsグループに属していないと課金情報を表示できない~~
* <font color="red">~~IDCSでは、Business Admin RoleがあればOCI Classicコンソールを使用して課金情報を表示できる~~

~~いきなりでは理解できないと思うので順に説明する。~~

<font color="blue">※NICAREGIさんから、**Administrators**に属していなくても**usage-reports**ポリシーがあれば「コスト分析（Cost Analysis）」を表示できるとのコメントがありました。

<font color="blue">あらためて検証したところ、そのとおりでした。ありがとうございます。私が2019年夏に検証したときは、Administratorsグループ以外のユーザーでは表示できなかったし、マニュアルにも記述があったと記憶している。2019年秋にコンソールが統合されたので、そのあたりでusage-reportsポリシーが導入されたのかも。以前のPDFマニュアルを残しておけばよかった。

<font color="blue">ということで、ここから下は参考情報として残しておきます。次は[「4.おわりに」](https://qiita.com/yamada-hakase/items/c9b1176123f6f3dc3485#4-%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)へ進んでください。</font>

* [Checking Your Balance and Usage](https://docs.cloud.oracle.com/en-us/iaas/Content/GSG/Concepts/costs.htm)

#### 3-8-1. OCIコンソールとOCI Classicコンソール

Oracle Cloudの管理コンソールには次の２つのコンソールがある。呼び名は出典によって異なるが、前者がOracle Cloud Infrastructure用の新しいコンソールで、後者は以前からあるコンソールである。

* **OCIコンソール（インフラストラクチャー・コンソール）**
* **OCI Classicコンソール（マイ・サービス・コンソール）**

現在は２つのコンソールが統合されたため、Classicに属するサービスもOCIコンソールから直接アクセスできる。しかし、課金情報など一部のサービスはClassicコンソールからもアクセスできる。

#### 3-8-2. OCIコンソールの課金表示機能 

OCIコンソールで課金情報に関する機能には次のページがある。いずれも「アカウント管理（Account Management）」メニューから表示できる。

* **コスト分析（Cost Analysis）：**使用金額合計とサービスごとの詳細表示
* **予算（Budget）：**事前に予算金額を設定することで、現在の使用金額と使用率の表示
* **使用状況レポート（Usage Report）：**使用状況のCSVファイル。オブジェクト・ストレージに配置


これらのなかで中心となるのが、次の**コスト分析（Cost Analysis）**だ。このページを表示するにはAdministratorsグループに属している必要がある。

![webui-cost06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/ae091803-b6e8-1fe8-0bfe-0abab68bef9b.png)


**予算（Budget）**はusage-budgetポリシーがあればアクセスできる。しかし、事前の設定が必要で、使用サービスごとの詳細な金額は分析できない。

<font color="red">つまりIAMのときには、Administratorsグループに属していないユーザーは課金情報を管理コンソールでは表示できない。<font>

#### 3-8-3. OCI Classicコンソールの課金表示機能 

OCI Classicコンソールでは、Business Admin Roleがあれば課金情報を表示できる。IDCSでは、OCI Classicコンソールにアクセスできるので、Administratorsロールが無くても課金情報を表示できる。ロールについては、以下のマニュアルを参照のこと。

* [クラウド・アカウントのロールの理解](https://docs.oracle.com/cd/E83857_01/get-started/subscriptions-cloud/csgsg/learn-cloud-acount-roles.html)
* [Learn About Cloud Account Roles](https://docs.oracle.com/en/cloud/get-started/subscriptions-cloud/csgsg/learn-cloud-acount-roles.html)

1. ホームリージョンに移動する。
2. 管理コンソール右上の「ヒト」アイコンをクリックして、**[サービス・ユーザー・コンソール]**を選択する。
![webui-cost07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/78fd22ac-1b82-95d1-d66c-aad4c6712c2b.png)
3. OCI Classicコンソールに移動するので、**[Infrastructure Classic Dashboard]**をクリックする。
![webui-cost08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/bf789654-0181-827f-caac-08beab009ea3.png)
3. ここで金額を表示できる。さらに金額部分をクリックすれば詳細をドリルダウンできる。
![webui-cost09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/b91ebcd0-da29-2e73-7ef0-bb5a5b39d854.png)


**参考：**次のページはOCI Classicコンソールの[アカウント管理]-[ユーザー]を選択し、個別のユーザーのロールを表示したものだ。このように**「Business Admin Role」**があれば、Classicコンソールで課金情報を表示できる。
![webui-cost05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/8f38a804-a771-e6d2-8ee3-a9bd59efed88.png)


# 4. おわりに

わかりやすさのために「IDCSユーザー」と「IAMユーザー」の比較と書いたが、正しくは次のような比較だろう

* **IAM単体**
* **IDCS+IAM**
* **IDCS以外のID管理サービス+IAM**

それぞれ特色があるので、一概にどれがよいとは言えない。利用するプロジェクト次第だ。重要なことは、それぞれの違いを理解し、適切な選択をすることだ。

微妙に自信が無いので、間違っているよ、こんなことがあるよってことがあれば、気軽にコメントお願いします。

# 5. まとめ

* **OCIには、デフォルトでIDCSユーザーとIAMユーザーの２種類のユーザーがある**
* **IDCSユーザーとIAMユーザーでは、パスワード管理は別になっている**
* **どちらを使用するかは必要な機能できめる**
* **IDCSにはFoundationとStandardがあり、後者は追加料金が必要**
* **IDCSのREST APIは学習コストが高いので、自動化を検討しているときには事前調査が必要**