OCI(Oracle Cloud Infrastructure) の IAM Policy で「パスワードの作成/リセット」「ユーザーの削除」"だけ"が不可能な IAM Users管理権限 を付与してみる。

表題の通り、OCI(Oracle Cloud Infrastructure) の IAM Policy で「パスワードの作成/リセット」「ユーザーの削除」"だけ"が不可能な IAM Users管理権限 を付与してみるやで。
彡(ﾟ)(ﾟ)

# 1. OCI(Oracle Cloud Infrastructure) の 権限制御 の仕組み(ざっくり)

下記マニュアルを参照しながらざっくりと。彡(ﾟ)(ﾟ)

 > ポリシーの仕組み
 > https://docs.oracle.com/cd/E97706_01/Content/Identity/Concepts/policies.htm

OCI(Oracle Cloud Infrastructure) の権限制御は IAM User, IAM Group, IAM Policy といった仕組みで制御されます。Policy に Policy Statement という権限制御のための構文を記述して、Groupを経由して(※) IAM User に付与します。
※Groupを経由せずに直接 IAM User に付与することも可能です。

以下のようなイメージ彡(ﾟ)(ﾟ)

> IAM Policy ⇒ IAM Group ⇒ IAM User


# 2. Policy Statement の書き方(ざっくり)

やはり下記マニュアルを参照しながらざっくりと。

 > ポリシーの仕組み
 > https://docs.oracle.com/cd/E97706_01/Content/Identity/Concepts/policies.htm

例えば、あるコンパートメント内のリソースに対する権限を付与する場合は、下記のような Policy Statement を書きます。

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

IAM User のようなテナントのリソースについては、テナントの権限として Policy Statement を書きます。

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

verb や resource-type については、下記マニュアルに記載があります。

> 動詞 ※verb のことです
> https://docs.oracle.com/cd/E97706_01/Content/Identity/Reference/policyreference.htm#Verbs
> 
> Resource-Types
> https://docs.oracle.com/cd/E97706_01/Content/Identity/Reference/policyreference.htm#Resource
> 
> IAMの詳細
> https://docs.oracle.com/cd/E97706_01/Content/Identity/Reference/iampolicyreference.htm

IAM User の管理権限を付与する場合は、下記のような Policy Statement を記載します。

```
ALLOW GROUP ays-group01 to manage users in tenancy
```

上記だけだと "「パスワードの作成/リセット」「ユーザーの削除」だけが不可能" が満たせません。下記マニュアルにある where conditions句 によって、詳細な制御を行います。

 > ポリシーの構文
 > https://docs.oracle.com/cd/E97706_01/Content/Identity/Concepts/policysyntax.htm
 > ポリシー・ステートメントの全体的な構文は次のとおりです
 > `Allow <subject> to <verb> <resource-type> in <location> where <conditions>`
 > ：
 > 条件
 > 1つまたは複数の条件を指定します。 anyまたはallを論理ORまたはANDにそれぞれ複数の条件で使用します。
 > `単一の条件の構文: variable =|!= value
 > 複数の条件の構文: any|all {<condition>,<condition>,...} `
 > ：


# 3. Policy Statement の where condition句 に記載する条件

where conditions句 に記載できる variable の共通な要素については、下記マニュアルに記載があります。この中から request.permission を variable の要素としてピックアップします。


 > General Variables for All Requests
 > https://docs.cloud.oracle.com/en-us/iaas/Content/Identity/Reference/policyreference.htm#General
 > ：
 > request.permission
 > ：

Verbs と Resource-Type の組み合わせについて、下記マニュアルに記載があります。この中から「パスワードの作成/リセット」「ユーザーの削除」に対応する組み合わせの value として、users の USER_DELETE, USER_UIPASS_SET, USER_UIPASS_RESET をピックアップします。

 > Details for IAM
 >  - Details for Verbs + Resource-Type Combinations
 > https://docs.cloud.oracle.com/en-us/iaas/Content/Identity/Reference/iampolicyreference.htm
 > ：
 > + users
 > ：

これらを組み合わせて、下記のような Policy Statement を記載します。※実際には1行で記述

```shell

ALLOW GROUP ays-group01 to manage users in tenancy
    where all {
          request.permission != 'USER_DELETE'
        , request.permission != 'USER_UIPASS_SET'
        , request.permission != 'USER_UIPASS_RESET'
    }
```

下記は Policy Statement の画面スクリーンショットとなります。
![IAM001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/8854d892-b24e-16bf-f676-50122c78867d.jpeg)

# 4. Policyを付与したIAMユーザーで「パスワードの作成/リセット」「ユーザーの削除」を実行してみる。

該当の Policy を付与した IAMユーザーでログインしなおして、「パスワードの作成/リセット」「ユーザーの削除」を実行してみます。

まずはログインした IAMユーザー で お試し用の IAMユーザー を作成してみます。
![IAM002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/7290fae4-7ce6-613c-c3eb-93a5b6ac6419.jpeg)


これは上手く行きます。次に お試し用に作成した IAMユーザー の「パスワードの作成/リセット」を実行してみます。
![IAM003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/01c9cb79-9b2d-6e62-29b3-ad5801694678.jpeg)


しっかりと失敗しました。Policy Statement の where condition句 に記載した条件が上手く機能しています。「ユーザーの削除」を実行してみます。
![IAM004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/95943745-49ff-06fa-7a2b-a86ed666a118.jpeg)
![IAM005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110066/03a7562d-d6e2-7bed-1e45-58eb635a185d.jpeg)

これも失敗しました。Policy Statement の where condition句 が上手く動作している事を確認できました。


# 5. まとめ

IAM Policy廻りの権限制御は where condition句で細かい制御ができるんですが、なかなかに難解や……彡(-)(-)
マニュアルを良く読み込んで、動作確認しながら実践投入するんやで彡(ﾟ)(ﾟ)