OCIのクロステナンシ・ポリシーを設定してみる

## はじめに

Oracle Cloud Infrastructureの権限設定を行う際には、Identity and Access Management (IAM)でIAMポリシーを作成してどのグループにどのようなOCI上の操作権限を与えるかを定義していきます。

基本的なIAMポリシーについてはここでは詳細は説明しませんので、一般的なIAMの説明は公開資料やマニュアルなどを参照していきましょう。

- 参考資料
  - [OCI技術資料 : IDおよびアクセス管理 (IAM) 概要](https://speakerdeck.com/ocise/ociji-shu-zi-liao-idoyobiakusesuguan-li-iam-gai-yao)
  - [OCI技術資料 : IDおよびアクセス管理 (IAM) 詳細](https://speakerdeck.com/ocise/ociji-shu-zi-liao-idoyobiakusesuguan-li-iam-xiang-xi)

通常IAMポリシーでテナンシ内の権限付与を行う際には、以下のようなポリシー構文を使っているかと思います。

`Allow group <group_name> to <verb> <resource-type> in compartment <compartment_name>`

`Allow group <group_name> to <verb> <resource-type> in tenancy`

このような通常のAllow文では**自テナンシ内**の権限を付与することが可能です。



## クロステナンシのポリシーって何？

この記事では、自テナンシ以外の他のテナンシと連携して操作する場合に必要となる、**クロステナンシ・ポリシー**を試してみます。

たとえば、以下のように同じFastConnect回線をテナンシをまたがって共有して利用したいという場合、異なるテナンシ内のDRGとVCNをアタッチすることができます。このようなテナンシをまたいだ操作をする際に必要になるのが**クロステナンシ・ポリシー**です。

![image-20231204145507665.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/725f8668-b08b-43eb-8617-32df2c841b19.png)



クロステナンシで実行できる操作というのは非常に限られています。**特定の機能のみがクロステナンシで実施可能**です。クロステナンシでの操作が可能な機能は、それらのサービスや機能の各マニュアルにその旨が記載されています。IAMポリシーの設定方法も、利用する各機能のマニュアルを参照する形になっています。

- 例）オブジェクト・ストレージのドキュメント内の[「テナンシをまたがったオブジェクト・ストレージ・リソースへのアクセス」](https://docs.oracle.com/ja-jp/iaas/Content/Object/Concepts/accessingresourcesacrosstenancies.htm)



さて、クロステナンシ・ポリシーの構文を見ていきましょう。

クロステナンシのポリシーでは、Define、Endorse、Admitという特殊なIAMステートメントを用いて、両方のテナンシ内で相互に適切なポリシー設定を行う必要があります。

- **Defineは、自テナンシ以外のリソースに対して、そのポリシー内での名前を決めてあげる**構文です。その後ろに続くEndorse文やAdmit文の中で指定する名前（テナンシ名およびグループ名）を**必ずポリシー冒頭に定義**します。ここで定義する名前は、**実際のリソース名とは異なっていても構いません**。
- **Endorseは、自テナンシ内のグループに別テナンシの権限付与することを支持する、推薦する**という意味合いです。Admitとセットになっている必要があります。
- **Admitは、別テナンシからEndorseされたグループに対して自テナンシ内の操作を認める**という意味合いです。Endorseとセットになっている必要があります。

また、**これらのポリシーは、rootコンパートメントに配置する必要があります。**



ちょっとわかりにくいかもしれないですが、イメージ図としてはこのような形になります。

![image-20231204145634168.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/ec7e6696-a365-f30d-d32b-52babe39593a.png)

![image-20231204145643144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/e576948a-6b2a-73f0-e801-d546cb4d2bb9.png)



## 実際にクロステナンシのポリシーを作成して使ってみる

さて、前置きが長くなりましたが、Endorse, Admit, Defineの構文の意味がわかったところで実際に設定してみます。

今回は、冒頭にも例示したような、同一リージョン内の2つのテナンシ間で、DRGとVCNのアタッチを行うためのクロステナンシ・ポリシーを設定していきます。実際にクロステナンシのポリシー設定していく中で、どっちがどっちのテナンシだったけ？？とわからなくなることもあるかもしれませんが、このように自分が設定したい構成図などを書いてみて整理すると良いと思います。

- 参考：[VCNアタッチメントを使用した他のテナンシ内のVCNへのアクセス](https://docs.oracle.com/ja-jp/iaas/Content/Network/Tasks/drg-iam.htm)

![image-20231204151236890.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/1a8b8d0d-f02c-17eb-81b8-5d560ed7a110.png)




1. まず、両テナンシのOCIDを確認します。テナンシの詳細ページを開いて、OCIDをコピーしておきます。
![image-20231204152743383-17016712844321.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/1ee7c5e2-13fc-e9a8-59ec-a3d83c23e090.png)


2. また、それぞれのテナンシでのDRGおよびVCNの操作を行うユーザグループのOCIDを確認します。

   -  アイデンティティ・ドメインなしのIAMの場合はこちらの画面で確認します。
      ![image-20231204153945572.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/6f16ada9-9db8-5861-beac-2d4e1b50efa5.png)

   -  アイデンティティ・ドメインありのIAMの場合はこちらの画面で確認します。
      ![image-20231204153826387.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/83741b7e-afb6-2d17-a7c9-fdc4aea2a5b0.png)


3. 続いて、テナンシAにDRG、テナンシBにVCNが存在していることを確認します。
   - テナンシA内のDRG
        ![image-20231204153213827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/1705783c-3e73-2aec-f28b-d5b53a50768b.png)
   - テナンシB内のVCN
        ![image-20231204153013728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/73f02fd9-6efb-7f14-d261-9375666d9b38.png)

4. テナンシAで以下のポリシーを作成します。どちらもrootコンパートメント内に作成します。さきほどオブジェクト・ストレージの例で例示した形式からさらに派生して、ここでは、**おたがいにendorse, admitを行うことで、両テナンシからお互いの権限付与を行う**ように設定しています。
   - **テナンシA(DRGが存在するほうのテナンシ)のIAMポリシー**
    ・自テナンシ内のグループがテナンシBのDRGアタッチメントを管理できるように支持する。
    ・テナンシBのグループが自テナンシ内のDRGを管理できるように認める。
     ```
     define tenancy VCN_Tenancy as <テナンシBのOCID>
     define group VCN_Admin as <テナンシBのグループのOCID>
     
     endorse group member-tomoko.konishi_admins to manage drg-attachment in tenancy VCN_Tenancy
     admit group VCN_Admin of tenancy VCN_Tenancy to manage drg in tenancy 
     ```

   ![image-20231204155318414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/d2357688-aec5-ee8e-1872-46448098c131.png)


5. テナンシBで以下のポリシーを作成します。ポリシービルダーで「手動エディタの表示」を選ぶとまとめて記載できます。
   - **テナンシB(VCNが存在するほうのテナンシ)のIAMポリシー**
    ・テナンシAのグループが自テナンシ内のDRGアタッチメントを管理できるように認める。
    ・自テナンシ内のグループがテナンシAのDRGを管理できるように支持する。
     ```
     define tenancy DRG_Tenancy as <テナンシAのOCID>
     define group DRG_Admin as <テナンシAのグループのOCID>
     
     admit group DRG_Admin of tenancy DRG_Tenancy to manage drg-attachment in tenancy
     endorse group tkgroup1 to manage drg in tenancy DRG_Tenancy
     ```
   ![image-20231204155101504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/7c4d18ba-3ef0-cffa-66f1-7b156c014b0c.png)

6. ポリシーができたので、実際にアタッチしていきます。まず、テナンシB側のVCNの画面から、テナンシAのDRGをアタッチしてみます。

   1. VCNの詳細画面→リソース→動的ルーティング・ゲートウェイのアタッチメント→「DRGアタッチメントの作成」をクリック![image-20231204155525255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/ee6d7680-728e-fd76-064b-f10f31e54f3b.png)


   2. DRGの場所で「別のテナンシ」を選択し、DRGのOCIDを手動入力し、「DRGアタッチメントの作成」をクリック
      ![image-20231204155952444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/f47c9350-8e9a-9ef1-c1eb-8f6eb7cdc6c6.png)

   3. 少し待つとステータスが「アタッチ中」から、
      ![image-20231204160107305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/20da9a47-d3ea-1ddd-6ff2-6d07914ef4bf.png)

        「アタッチ済」になったので、成功です！
      ![image-20231204160121009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/e3fc4170-2d3f-2583-18ea-c3b6b1b27f81.png)


   4. それでは、テナンシAのDRG側の画面からも見てみましょう。DRG詳細ページの「クロステナンシ・アタッチメント」からも、同じクロステナンシのアタッチメントが表示されていることが分かります。
   ![image-20231204165652327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/2bfefd8e-8091-19b6-4978-8bea9f48bf92.png)

ということで、無事クロステナンシでの操作ができました！


   ## おまけ

- Define文はendorseやadmitより前に必要。順番を逆にすると "DEFINE statement must be at the beginning"というエラーになる。

  ![image-20231204161830398.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/39aae07e-f357-a0ff-2066-3ea5a827873e.png)


   

- クロステナンシのポリシーをrootコンパートメント以外に置こうとすると "ENDORSE policies may only be written in the root compartment" といったエラーになる。
![image-20231204164415519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524827/f203161e-199a-b7b1-1da2-e1a62020d8e3.png)