OCIインスタンスの起動・停止用の最低限の権限を付与する方法

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。
# 初めに
セキュリティの考慮で、あるユーザ（オペレーター）に対し、オラクル・クラウド上のインスタンス(Compute/Oracle_DB/ADB/MySQL)を起動・停止するため、最低限の権限を付与したいですが、それは可能ですか？答えは、可能です。ポリシーを作れば簡単に実現できますので、実施方法を紹介したいと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/aebc6313-6a5f-e3d3-951c-d92464b4722c.png", width="650">
インスタンスの種類により少し差異がありますが、考え方は同じです。

[事前準備](#事前準備)
[1. Compute (VM)](#1-compute-vm)
[2. Oracle DB](#2-oracle-db)
[3. Autonomous DB](#3-autonomous-db)
[4. MySQL DB](#4-mysql-db)

# 事前準備
作業対象インスタンスが、PoCというコンパートメントの下に格納されます。
以下の各リソースを用意しておきます。対象ユーザをそれぞれのグループに入れます。

|インスタンス|グループ名|ポリシー名|関連権限|
|--|--|--|--|
|Compute|Compute_Power_Group|Compute_Power_Policy|INSTANCE_POWER_ACTIONS|
|Oracle DB|DB_Node_Power_Group|DB_Node_Power_Policy|DB_NODE_POWER_ACTIONS|
|ADB|ADB_Update_Group|ADB_Update_Policy|AUTONOMOUS_DATABASE_UPDATE|
|MySQL DB|MySQL_Power_Group|MySQL_Power_Policy|MYSQL_INSTANCE_START<br>MYSQL_INSTANCE_STOP|


# 1. Compute (VM)
__ポリシー・ステートメント__
下記２つの書き方を検証して、同じく動作できることを確認しました。差異点は、２行目です。

__構文-１__ (Where条件あり)
Allow group \<Group_Name> to <font color=blue>read instances</font> in compartment \<Compartment_Name>
Allow group \<Group_Name> to <font color=blue>manage instances</font> in compartment \<Compartment_Name> where <strong>request.permission</strong>=<font color=blue>'INSTANCE_POWER_ACTIONS'</font>

↑これは、一般的な書き方です。注意点："request.operation"ではなく、"request.permission"となります。

必要に応じて、Compartmentではなく、テナンシでも指定できます（以下の例も同様）。
"to"を省略しても同じ結果です（以下の例も同様）。

__構文-２__  (Where条件なし)
Allow group \<Group_Name> to <font color=blue>read instances</font> in compartment \<Compartment_Name>
Allow group \<Group_Name> to <font color=blue>{INSTANCE_POWER_ACTIONS}</font> in compartment \<Compartment_Name>

__ステートメントの例__ (構文-２)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7f4551f2-715d-4b6e-5164-4328f916d5cb.png)

権限付与後、そのユーザが特定のコンパートメント(PoC)の下に、全てのComputeインスタンスが参照できます。それらのインスタンスに対し、<font color=blue>起動・停止・再起動</font>しか実施できません。

# 2. Oracle DB
__ポリシー・ステートメント__
下記２つの書き方を検証して、同じく動作できることを確認しました。差異点は、２行目です。

__構文-１__ (Where条件あり)
Allow group \<Group_Name> to <font color=blue>read database-family</font> in compartment \<Compartment_Name>
Allow group \<Group_Name> to <font color=blue>manage db-nodes</font> in compartment \<Compartment_Name> where <strong>request.permission</strong>=<font color=blue>'DB_NODE_POWER_ACTIONS'</font>

__構文-２__ (Where条件なし)
Allow group \<Group_Name> to <font color=blue>read database-family</font> in compartment \<Compartment_Name>
Allow group \<Group_Name> to <font color=blue>{DB_NODE_POWER_ACTIONS}</font> in compartment \<Compartment_Name>

__ステートメントの例__ (構文-２)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/cbb26f41-8e1c-451e-843b-c2da5003b71f.png)

権限付与後、そのユーザが特定のコンパートメント(PoC)の下に、全ての「Oracle DB System」が参照できます。それらのインスタンスに対し、DBノードの<font color=blue>起動・停止・再起動</font>しか実施できません。

# 3. Autonomous DB
__ポリシー・ステートメント__
下記２つの書き方を検証して、同じく動作できることを確認しました。差異点は、２行目です。

ADBは起動・停止専用の権限がないので、最低限の権限を付与するのに、"AUTONOMOUS_DATABASE_UPDATE"は必要です。

__構文-１__ (Where条件あり)
Allow group \<Group_Name> to <font color=blue>read autonomous-databases</font> in compartment \<Compartment_Name>
Allow group \<Group_Name> to <font color=blue>manage autonomous-databases</font> in compartment \<Compartment_Name> where <strong>request.permission</strong>=<font color=blue>'AUTONOMOUS_DATABASE_UPDATE'</font>

__構文-２__ (Where条件なし)
Allow group \<Group_Name> to <font color=blue>read autonomous-databases</font> in compartment \<Compartment_Name>
Allow group \<Group_Name> to <font color=blue>{AUTONOMOUS_DATABASE_UPDATE}</font> in compartment \<Compartment_Name>

__ステートメントの例__ (構文-２)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/0f773fe5-57a2-132e-0570-33e506ae2537.png)


権限付与後、そのユーザが特定のコンパートメント(PoC)の下に、全ての「Autonomous DB」が参照できます。それらのインスタンスに対し、起動・停止・再起動を含む一部の更新操作ができますが、ADBの新規作成、削除、クーロン、リストアなどの操作ができません。

# 4. MySQL DB
__ポリシー・ステートメント__
下記２つの書き方を検証して、同じく動作できることを確認しました。差異点は、２行目です。

__構文-１__ (Where条件あり)
Allow group \<Group_Name> to <font color=blue>read mysql-instances</font> in compartment \<Compartment_Name>
Allow group \<Group_Name> to <font color=blue>manage mysql-instances</font> in compartment \<Compartment_Name> where <strong>any</strong> {<strong>request.permission</strong>=<font color=blue>'MYSQL_INSTANCE_START'</font>, <strong>request.permission</strong>=<font color=blue>'MYSQL_INSTANCE_STOP'</font>}

__構文-２__ (Where条件なし)
Allow group \<Group_Name> to <font color=blue>read mysql-instances</font> in compartment \<Compartment_Name>
Allow group \<Group_Name> to <font color=blue>{MYSQL_INSTANCE_START,MYSQL_INSTANCE_STOP}</font> in compartment \<Compartment_Name>

__ステートメントの例__ (構文-２)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d13d378a-423d-fb22-d4c8-7a03dd56bc52.png)

権限付与後、そのユーザが特定のコンパートメント(PoC)の下に、全てのMySQL DBインスタンスが参照できます。それらのインスタンスに対し、<font color=blue>起動・停止・再起動</font>しか実施できません。

__サマリ__
上記はオペレーターに対し、一般的な権限設定例です。OCIポリシーを利用すれば、いろいろな細かい設定ができます。よく利用場面を想定する共通ポリシーも用意されています。詳細は、[こちら](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Concepts/commonpolicies.htm)のドキュメントをご参照ください。

以上

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)

__ドキュメント__
[コア・サービスの詳細](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Reference/corepolicyreference.htm)
[ベア・メタルおよび仮想マシンDBシステムのポリシー詳細](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Reference/dbsystempolicyreference.htm#Policy_Details_for_Bare_Metal_Virtual_Machine_and_Exadata_DB_Systems)
[Autonomous Databaseのポリシー詳細](https://docs.oracle.com/ja-jp/iaas/Content/Identity/Reference/adbpolicyreference.htm#Policy_Details_for_Autonomous_Database)
[MySQLデータベース・サービスのポリシー詳細](https://docs.oracle.com/ja-jp/iaas/mysql-database/doc/policy-details-mysql-database-service.html)