Azure AD と OCI (Oracle Cloud Infrastructure Console) を SAML 連携した場合の IAM の動作を確認してみた。

#はじめに
Azure AD と Oracle Cloud Infrastructure Console (以降 OCI と呼称) を SAML 連携し Azure AD ユーザーを使い OCI にシングル サインオンができる環境において、OCI 側で構成した Identity and Access Management (以降 IAM と呼称) が Azure AD に対してどのような形で割り当たって動作するかについて検証を行いました。

本検証にあたり Azure AD と OCI を SAML 連携する必要がありますが、こちらの手順については以下記事にまとめていますので今回の記事では SAML 連携の手順は割愛します。

-参考情報
Oracle Cloud Infrastructure Console と Azure AD を SAML 連携しシングル サインオンを構成するために必要な一連の手順
URL:https://qiita.com/Shinya-Yamaguchi/items/729bb70f8a10332f31de

まず、今回の検証で出てくる登場人物は以下のとおりです。
これらの登場実物の関係性を順番に説明していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/247c1247-ab8d-c99b-1a9a-b176fa9ed764.png)

Azure AD と OCI を SAML 連携する過程で、グループ マッピングの設定画面で Azure AD 側のグループと OCI グループをマッピングする必要があります。
設定は OCI のコンソール画面で行い、 Azure AD 側のグループ (グループのオブジェクト ID) と OCI 側のグループをマッピングさせます。
イメージとしては以下のような感じになります。
必ず 1 対 1 でマッピングさせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/361fe869-50bf-bbcd-a53e-e33c743e1f8e.png)

Azure AD ユーザーは Azure AD 上のグループに所属していないと OCI 側の権限を使えないので必ずいずれかのグループに所属させます。
また、OCI 側ではグループとは別に独立して***ポリシー***という概念が存在します。

このポリシーの中で***どのグループ***に対して設定した権限を付与するかを定義しますが、付与する対象は 1 つのグループでも良いですし、複数、極端な話、すべてのグループとして定義することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/b955100f-6431-5619-ec8f-6bc1af24d83f.png)

今回検証で確認したい内容は、以下図のように 1 つのユーザーが複数のグループにまたがって所属している場合、マッピングされたグループに定義された権限が片方のグループの権限しか使えないのか、それとも所属している両方のグループの権限が使えるかについて確認を行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/da3c5a9a-807e-d16d-805a-3fe8a5ff9daa.png)

#やってみる
まず、今回の検証環境における OCI 側のグループマッピングは以下のように構成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c4dd0918-f589-2697-4164-7bb2f4422cc2.png)

アイデンティティ・プロバイダ・グループ列が Azure AD 側のグループのオブジェクト ID になります。

次に、OCI 側のグループの一覧は以下のように構成されています。
Administrators というのはデフォルトで作成される Oracle Cloud 上のすべてのリソースを操作できるポリシーが割り当てられたグループになります。
この中で試しに、「Compute-Operation-Group」のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/dac97529-9a13-3bb8-b3d2-78dc9299ff65.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c74cf517-7b9c-be4d-3499-aa5468891a55.png)

グループ メンバーに何もユーザーがいないのは、想定された動作です。
今回は Azure AD 側のユーザーを使ってシングル サインオンをするのと、OCI は JIT プロビジョニングに対応しているので、OCI 側にユーザーを用意する必要がないためです。

ここにユーザーが表示されるケースは、OCI 側でローカルのユーザーを作成するか、Azure AD からユーザーをプロビジョニングする構成をして、OCI 側にユーザーを同期させた場合になります。

今回注目して欲しい点はこのグループの画面にどのようなポリシー、つまり、権限が付与されているかグループの画面内では確認ができない、という点です。
Azure を利用したことがある方はイメージしやすいと思いますが、Azure の場合は RBAC というロール ベースのアクセス制御方法があり、ユーザー、グループ、サービス プリンシパルなどの単位でロール (権限) を付与して、それぞれの単位でどのロールが割り当たっているのかを確認できますが、OCI の場合は***ポリシー***という単位で権限を割り当て、確認する必要があります。

この辺りはクラウド サービスによりお作法が異なるのでそれぞれ違う管理方法があるんだ、というくらいでとどめたいと思います。
IAM という大きな括りで見ると、そこまで大きな違いではないかなと思います。

OCI のポリシーは OCI コンソール画面のグループと同じ「アイデンティティ」の欄にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/6d0c0ecf-c8a9-807f-5c32-2d82a5dc02aa.png)

こちらがポリシーの一覧になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/89991f38-c57c-f791-10a4-27c04c04c559.png)

既定では、「Tenant Admin Policy」と「PSM-root-policy」の 2 つのポリシーしかありません。
例として手動で作成した「instance-family」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/d6cce4ea-c205-afc3-2449-aa4653f045e0.png)

こちらが手動で作成したポリシーの中身になります。
ここで大事なのが ***ステートメント***の項目になります。

ポリシーを作成する際に必ずステートメントを最低でも 1 つ定義する必要がありますが、ここで***どのグループ***に権限を付与するかどうかを記述しています。

このステートメントを書く時の構文は明確に定義されています。

-参考情報
ポリシー構文
URL:https://docs.cloud.oracle.com/ja-jp/iaas/Content/Identity/Concepts/policysyntax.htm

構文、つまり、ステートメントの書き方は以下になります。

```
Allow <subject> to <verb> <resource-type> in <location> where <conditions>
```

ポリシー名「instance-family」を例に見てみましょう。

```
Allow group Compute-Operation-Group to manage instance-family in tenancy
```

このステートメントの意味は、グループ名「Compute-Operation-Group」を対象に、リソースタイプ「instance-family」に対してすべてのオペレーションが行える「manage」を与えています。

ここでは詳細は割愛しますが、上記の  <verb> <resource-type> <location> <conditions> については、以下 Oracle 社の公開情報に細かく記載されていますのでご確認ください。

-参考情報
ポリシー参照
URL:https://docs.cloud.oracle.com/ja-jp/iaas/Content/Identity/Reference/policyreference.htm#Resource

前置きが長くなりましたが、test008 ユーザーから OCI にシングルサインオンして権限付与の動作がどうなるか確認していきましょう。

#####test008 ユーザーの動作

test008 ユーザーに関するマッピングは以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/3fbaa041-2716-1179-63a2-10b84da62bc3.png)

Azure AD のアクセス パネル (myapps.microsoft.com) に test008 ユーザーでサインインしたのが以下画面ショットです。
ここに表示されている OCI のアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/a84c3236-aa5b-87fb-1666-ac2322fde3a0.png)

シングル サインオンの欄にある Continue をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/f2fda502-a718-3fd7-8a16-2bc14d9ca3bf.png)

OCI コンソール画面にシングル サインオンできました。
コンソール画面の左ペインにある、「コンピュート」→「インスタンス」の順にクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/dee0f8ca-d37b-6c45-9f30-78479f863c59.png)

下記画面ショットのようにインスタンスの「リソースを表示する権限がない」と表示されていることが分かります。
これは、「test008」に所属しているグループ名「Group001」とマッピングされている OCI グループ名「non-policy-group001」には、何もポリシーが割り当てられていない、つまり、閲覧も含む何も権限がないグループにマッピングされているためとなり、想定された動作になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/8b6053f5-19cf-a73d-31bc-e5eabba7a648.png)

#####test009 ユーザーの動作

test009 ユーザーに関するマッピングは以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/8d9fe325-4efe-59f6-01cd-6582c7fa32a8.png)

同様にアクセス パネルにサインインし、 OCI のアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/6e770d26-8c3e-e3e0-573b-18b9a9fb2b81.png)

シングル サインオンの欄にある Continue をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/30ca01e8-c8d4-0998-aca3-8dbd0c8fa453.png)

OCI コンソール画面にシングル サインオンできました。
同じようにコンソール画面の左ペインにある、「コンピュート」→「インスタンス」の順にクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/e5e2c301-ea6c-9ac9-41f6-17b605488b93.png)

下記画面ショットのようにインスタンスの「リソースを表示する権限がない」と表示されていることが分かります。
test009 もコンピュートに関する権限が付与されていないのでこの動作は想定どおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/6573c26b-4445-a02a-1da7-b1ae1e43225f.png)

同画面の左ペインより、「ネットワーキング」→「概要」の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/903ad037-df4e-4419-85d7-fdb8852a9236.png)

ネットワーキングの画面にて「VNCウィザードの起動」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/783e822a-9c60-f7c9-44ce-ba16863e270f.png)

VNC の作成画面で VNC 名に任意の名前を入力し「次」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/23411e73-a5c8-7141-9d04-5b75ea70f7a1.png)

VNC の作成画面で画面左下の「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/fa19096c-05c7-28b9-1c8f-1daeadade5eb.png)

仮想クラウド ネットワークが作成されました。と表示されました。左下の「仮想クラウド ネットワークの表示」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/4c2583ac-0da8-be6d-cceb-dae21c52e120.png)

下記画面ショットのように TEST001 の仮想クラウド ネットワークが作成されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/4c184bbb-4adc-2dfa-8524-061ec08d1a5f.png)

ここで重要なのは、仮想クラウド ネットワークの設定値ではなく、仮想クラウド ネットワークが***作成***でき***表示***の確認ができたことです。
test009 は下記ステートメントのとおり、ネットワーク関連のリソースを対象とするリソース タイプ「virtual-network-family」にたいして、すべての操作を行える権限「manage」を割り当てているためです。

```
Allow group Network-Operation-Group to manage virtual-network-family in tenancy
```

ここまでは想定された動作です、正しいステートメントに対して正しいグループ マッピングをした結果、想定された動作になりました。
最後に、 1 つの Azure AD ユーザーが複数の Azure AD グループにまたがった場合の動作を確認してみます。

#####test010 ユーザーの動作

test010 ユーザーに関するマッピングは以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/75beba3f-5976-5481-8fb9-4401ee62b544.png)

test010 は Group002 にも Group003 にも所属しています。
そのため、OCI 側のグループ マッピングも 2 つのグループにまたがっていることが分かります。
この絵を見ただけでなんとなく想像はできると思いますが、実際に動作を確認してみます。

同様にアクセス パネルにサインインし、 OCI のアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/627a3a55-77f8-3fd9-875b-186adfb5a895.png)

シングル サインオンの欄にある Continue をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/c5469e72-d078-0f2f-7a60-df7c3e250877.png)

OCI コンソール画面にシングル サインオンできました。
同じようにコンソール画面の左ペインにある、「コンピュート」→「インスタンス」の順にクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/83dad887-c604-3dab-d39b-f4784c1567e5.png)

下記画面ショットのようにインスタンスのインスタンスの一覧が***表示***されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/aa9a9053-beae-e7f5-f143-51284def58a2.png)

同画面の左ペインより、「ネットワーキング」→「概要」の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/022a43e5-7a8f-4802-d271-aae70dc9db25.png)

ネットワーキングの画面にて「VNCウィザードの起動」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/89ce1158-d5f3-6ba4-af84-953b00423963.png)

VNC の作成画面で VNC 名に任意の名前 (TEST002) を入力し「次」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/9f8e21b9-cabb-23bd-d2a1-74dca927f05b.png)

VNC の作成画面で画面左下の「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/091d37f1-6342-4531-c305-5b7763f92d50.png)

仮想クラウド ネットワークが作成されました。と表示されました。左下の「仮想クラウド ネットワークの表示」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/575cab65-7d84-4536-c897-bf8da67961d9.png)

下記画面ショットのように TEST002 の仮想クラウド ネットワークが作成されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373423/0bb388e8-4c69-f8a9-d06f-f9569bdbd0fa.png)

これで test010 は test009 と同じ Group002 に所属していることからネットワーク リソースの操作ができることが確認できました。

```
Allow group Network-Operation-Group to manage virtual-network-family in tenancy
```

また「コンピュート」のインスタンス一覧が確認できたように、「コンピュート」リソースの操作ができることも確認できています。

Group003 は下記ステートメントのとおり、コンピュート関連のリソースを対象とするリソース タイプ「instance-family」に対して、すべての操作を行える権限「manage」を割り当てているためです。

```
Allow group Compute-Operation-Group to manage instance-family in tenancy
```

つまり、グループにまたがって所属している Azure AD ユーザーは OCI にマッピングされている***それぞれのステートメント***に記載されている***ポリシー***が割り当たる動作になります。

#####まとめ
Azure AD 側のユーザーが複数のグループにまたがって所属している場合、そのグループとマッピングされている OCI 側のグループに割り当てられたポリシーが***AND 条件***としてユーザーに付与されます。

今回の例で言うと、test010 はポリシー名「virtual-network-family」と「instance-family」両方の権限が利用できる動作になります。

この動作を避けたい場合は、Azure AD 側で複数のグループにまたがらないように管理するか、OCI とのマッピングを構成する際に、ポリシーが重複しないように設計する必要があります。

特に管理者権限を付与させたくない一般ユーザーの取り扱いについては意識する必要があります。

#おわりに
今回は Azure AD と OCI が SAML 連携した環境において、Azure AD のグループと OCI グループをマッピングした場合に付与される IAM の動作を検証してみました。

前提として OCI にシングル サインオンできる Azure AD ユーザーは Azure AD 側の「ユーザーとグループ」に明示的に割り当てられたユーザーもしくはグループに限定されます。

その上で、OCI 側にシングル サインオンした際に付与される権限を OCI コンソールの「グループ マッピング」で定義する必要があります。
この定義を適切に行わないと、本来コンピュートの操作をさせたくないユーザーに対して必要以上の権限が割り当たってしまう動作が起こりうるので、そこを意識してグループ マッピングを定義しましょう。

また、複数のグループまたがった Azure AD ユーザーがいる場合は、AND 条件で権限が付与されるので、こちらの点も押さえておくポイントになります。

今回の記事が少しでも参考になれば幸いです。