Database Support Blog

  • Oracle Cloud
2024.09.10

管理者ユーザー必見!OCI IAMポリシーでwhere句を使い条件式を設定する方法

OCIでは、ユーザーがComputeやブロックボリュームなどのOCIサービスを利用する場合、適切な操作権限(参照、作成など)をOCI IAMポリシーで設定します。

OCI IAMポリシーは、where句を使った条件式を使用することで、柔軟な権限付与が可能になります。

今回は、where句による条件式の設定例およびwhere句の有無による違いについてご紹介します。

OCI IAMポリシーのおさらい

まずは、OCI IAMポリシーをおさらいしましょう。

OCI IAMポリシーは、ユーザーに許可する操作権限を、OCIで定められた構文で記載する必要があります。
基本構文は以下のとおりです。

基本構文

allow group <group_name> to <verb> <resource-type> in <location>
{where <condition>}

どのグループが 』『 どのような操作を 』『 どのリソース(サービス)に 』アクセス可能か記載します。
また、操作範囲として『 テナンシ全体またはコンパートメント 』から指定できます。

さらに、本記事のwhere句をオプションで指定することで『 条件 』を付与することが可能です。

where句による条件式の用途とルール

前述のとおりwhere句はオプションで指定する構文であるため、OCI IAMポリシーはwhere句を使用せずとも設定できます。where句を使用することで、さらに操作権限を絞ることが可能です。

例えば、コンパートメント内で指定した条件に合致するリソースのみ操作可能にする、といった細かい権限付与が可能になります。

なお、where句で条件を使用する場合、変数を利用します。
代表的な変数には、以下のようなものがあります。

変数名 説明
request.user.id リクエスト・ユーザーのOCID
request.groups.id リクエスト・ユーザーが属するグループのOCID
target.compartment.id 条件に合致させるリソースを含むコンパートメントのOCID

※こちらは一部です。詳細は以下のマニュアルもご参照ください。


また、条件式(シンタックス)としては以下が利用できます。

条件式(シンタックス) 説明
<変数>=<値> 一致条件
<変数>!=<値> 不一致条件
all {<条件式1>,<条件式2>, …} すべての条件を満たす(AND条件)
any {<条件式1>,<条件式2>, …} 一部の条件を満たす(OR条件)

where句の例(ユーザーを条件にした制御)

それでは、where句を使用してみましょう。

1. ポリシーの設定

今回の例では、以下のユーザー、グループ、ポリシーを用意しています。

Computeインスタンスの停止/起動を可能とするポリシー構文に、where句の条件としてN03781ユーザーのOCIDを指定しています。

ユーザー N03781、N03782
グループ名 Compute_Manage_Group
※N03781ユーザーとN03782ユーザーは、このグループに属しています。
ポリシー名 Compute_Manage_Policy
ポリシー構文 Allow group 'Default'/'Compute_Manage_Group' to manage instance-family in tenancy where request.user.id='ocid1.user.oc1..xxxxxxxxxx'
Allow group 'Default'/'Compute_Manage_Group' to read app-catalog-listing in tenancy where request.user.id='ocid1.user.oc1..xxxxxxxxxx'
Allow group 'Default'/'Compute_Manage_Group' to use volume-family in tenancy where request.user.id='ocid1.user.oc1..xxxxxxxxxx'
Allow group 'Default'/'Compute_Manage_Group' to use virtual-network-family in tenancy where request.user.id='ocid1.user.oc1..xxxxxxxxxx'

2. 動作確認

N03781ユーザーは、以下のとおりComputeインスタンスの停止/起動を実行できます。

画像1:Computeインスタンスの停止中ステータスの画面

画像2:Computeインスタンスの起動ステータスの画面


しかし、N03782ユーザーには操作権限が付与されていないため、Computeインスタンスが表示されません。

画像3:操作権限が付与されていない場合の画面

where句を使用しない場合、N03781ユーザーとN03782ユーザーは同じグループに所属しているため一律の権限が与えられます。しかし、where句を使用することで、ユーザーごとに権限を制御するような細かい制御が可能です。

where句の例(タグを条件にした制御)

もう一つ、where句の例をご紹介します。

先ほどの例ではユーザーのOCIDを条件式に使用しましたが、今度はタグを条件式に使用してみましょう。

タグを利用することで、OCIの複数の異なるサービスをタグ名で検索・管理できるようになります。
詳細は以下のマニュアルもご参照ください。

それでは、タグの作成からwhere句の条件式の設定までの流れを見てみましょう。

1. タグ・ネームスペースを作成

コンソールの左上メニューから、[ガバナンスと管理] → [タグ・ネームスペース]を選択します。

画像4:OCIコンソールのメニュー画面


[Create Tag Namespace]をクリックします。

画像5:Create Tag Namespaceボタン


任意のコンパートメントを選択し、「ネームスペース名」と「説明」を入力後、[ネームスペース定義の作成]をクリックします。
※今回はルートコンパートメントに作成しています。

画像6:ネームスペース定義の作成画面


作成したタグ・ネームスペース名をクリックし、タグ・ネームスペースの詳細画面に移ったあと、[タグ・キー定義の作成]をクリックします。

画像7:タグ・ネームスペースの詳細画面


「タグ・キー」と「説明」を入力後、[タグ・キー定義の作成]をクリックします。

画像8:タグ・キー定義の作成画面

2. Computeインスタンスにタグを追加

次に、ComputeインスタンスのOEL8_Computeにタグを追加します。

Computeインスタンスの詳細画面の[その他のアクション]から[タグの追加]をクリックします。

画像9:Computeインスタンスの詳細画面


1. タグ・ネームスペースを作成」で作成したタグ・ネームスペースとタグ・キーを選択し、任意のタグ値を入力後、[タグの追加]をクリックします。

画像10:タグの追加画面


Compute詳細画面の[タグ]タブをクリックし、追加したタグが表示されていることを確認します。

画像11:タグの確認画面

3. ポリシーの修正

次に、ポリシーを修正します。

where句の例(ユーザーを条件にした制御)」で用意していたポリシー「Compute_Manage_Policy」を以下の赤字のように修正します。

where句の変数および条件式を「request.user.id='リクエスト・ユーザーのOCID'」から「target.resource.tag.<タグ・ネームスペース>.<タグ・キー>='<タグ値>'」に変更しています。これにより、Compute_Manage_Groupグループに所属するユーザーは、タグを追加した「OEL8_Compute」のみ操作可能になります。

ポリシー構文 Allow group 'Default'/'Compute_Manage_Group' to manage instance-family in tenancy where target.resource.tag.Compute_Manage_tag.OEL8_tag='compute1'
Allow group 'Default'/'Compute_Manage_Group' to read app-catalog-listing in tenancy where target.resource.tag.Compute_Manage_tag.OEL8_tag='compute1'
Allow group 'Default'/'Compute_Manage_Group' to use volume-family in tenancy where target.resource.tag.Compute_Manage_tag.OEL8_tag='compute1'
Allow group 'Default'/'Compute_Manage_Group' to use virtual-network-family in tenancy where target.resource.tag.Compute_Manage_tag.OEL8_tag='compute1'
Allow group 'Default'/'Compute_Manage_Group' to read all-resources in tenancy(※)

(※)タグを条件式に使用する場合、Computeインスタンス名などを表示するために、all-resourcesに対してinspect以上を設定する必要がありますが、inspectの場合はComputeインスタンス名が下図のようにOCID表記になるため、今回は最後のAllow文でreadを指定しています。

画像12:OCID表記の場合の画面例


4. 動作確認

それでは、動作を確認してみましょう。

権限の違いによる動作の差異を確認するために、Computeインスタンスを二つ準備しています。

・OEL8_Compute:「2. Computeインスタンスにタグを追加」でタグを追加したComputeインスタンス
・OEL9_Compute:環境作成後のデフォルト状態のComputeインスタンス

画像13:Computeインスタンスの一覧画面

「OEL8_Compute」には、「2. Computeインスタンスにタグを追加」でタグを追加していますが、「OEL9_Compute」にはタグを追加していません。

画像14:タグが追加されていないことを確認する画面

それでは、「where句の例(ユーザーを条件にした制御)」で、Computeインスタンスの停止/起動が実行可能であった「N03781」ユーザーで「OEL9_Compute」を停止してみましょう。

Computeインスタンスの停止を実行しようとすると、権限が無い旨のメッセージが表示されました。

画像15:インスタンスの停止画面

次に「where句の例(ユーザーを条件にした制御)」でComputeインスタンスが表示されなかった「N03782」ユーザーで「OEL8_Compute」を停止してみます。

今までは表示されなかったComputeインスタンスが表示されました。

画像16:Computeインスタンスの一覧画面

さらに、停止も実行できました。

画像17:Computeインスタンスの停止中画面

しかし、タグが追加されていない「OEL9_Compute」は、やはり操作できませんでした。
この結果から、想定どおり、操作権限がないことを確認できました。

画像18:Computeインスタンスの停止失敗画面

まとめ

いかがでしたでしょうか。
OCIに限らず、クラウド環境では以下のような観点から、権限を適切に管理する必要があります。

・ユーザーによる誤操作の防止
・コンソールで閲覧可能な情報の最小化
・ユーザー情報漏洩時の影響最小化
など

今回ご紹介した条件式を利用することで、さらに柔軟かつ強固な権限管理が可能です。
本記事がお客様の管理業務のお役に立てば幸いです。

執筆者情報

いちじょう だいさく プロフィール画像

2018年アシスト入社後、Oracle Databaseフィールド業務に従事。2019年からはOracle Cloudのフィールド業務とサポート業務を兼務中 ...show more


■本記事の内容について
 本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。

■商標に関して
 ・Oracle®、Java、MySQL及びNetSuiteは、Oracle、その子会社及び関連会社の米国及びその他の国における登録商標です。
 ・Amazon Web Services、AWS、Powered by AWS ロゴ、[およびかかる資料で使用されるその他の AWS 商標] は、Amazon.com, Inc. またはその関連会社の商標です。
  文中の社名、商品名等は各社の商標または登録商標である場合があります。

関連している記事

  • Oracle Cloud
  • Oracle Database
2024.10.11

Oracle Cloud VMware Solutionを構築してみました!

前回の記事でOCVSの概要やメリットをお伝えしました。 本記事では実際にOCVSを構築する手順、および作成したvCenterへ実際に接続する手順をお伝えします!

  • Oracle Cloud
2024.09.19

OCIに構築したWindowsサーバーの管理者ユーザーのパスワードリセット方法 ~その②~

本記事では「インスタンス・コンソール接続」で、より簡単にパスワードをリセットする方法をご紹介します。

  • Oracle Cloud
  • Oracle Database
2024.09.03

Computeインスタンスを再作成せずにブートボリュームをリストアする方法とは?

2024年5月のアップデートで、Computeインスタンスを再作成せずにブートボリュームをリストアできるブートボリューム置き換えの機能が追加されました。この機能追加により、従来のリストア方法よりも手順が少なくなり、障害発生時にも迅速な復旧が可能になりました。

ページの先頭へ戻る