3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCIのIAMポリシーで陥りがちなミスと解決方法   ②権限継承の問題を解決したい!編

Last updated at Posted at 2025-10-22

※この記事は①の続きとなっております。
①を読んでからこの記事を読むことをお勧めします。
前回の記事→https://qiita.com/tkhsyuk/items/92a5ea85a8e71494eaaf

目的

AWSでIAMポリシーを運用してきた経験がある方でも、OCIの独特な仕様でつまずくことがあると思います。
この記事では、実際の現場を想定したトラブル事例と効果的な解決策、そしてPython SDKを使用した動作確認を行うための検証手順を提示しております。

※記事の内容は参考までにご覧ください。

前提知識

※AWSでいうところのアカウント構成(Organizations)を、OCIでは「コンパートメント」として扱います。
AWSでは親から子への権限制御が自動的に適用されますが、OCIでは自動継承は行われず、明示的にポリシーで指定する必要があります。

そのため、AWSの仕組みをOCIの構造に置き換えて読むイメージで理解すると分かりやすいです。

トラブル事例2: 継承権限の誤り

発生している問題

親コンパートメントに権限を付与したが、子コンパートメントでアクセスできない状況が発生している。

# 親コンパートメントでは成功
parent_response = compute.list_instances(compartment_id=parent_compartment_id)

# 子コンパートメントで失敗
child_response = compute.list_instances(compartment_id=child_compartment_id)
# ServiceError: NotAuthorized

根本原因

先述の通り、AWSでは親から子へ権限の継承が自動的に行われますが、OCIでは自動的には行われません。明示的に継承を指定する必要があります。

解決策

継承を含む権限設定の書き方↓

# 子コンパートメントも含めて権限を付与
Allow group Managers to manage all-resources in compartment Production or any child compartments of Production


# 特定の階層レベルまで
Allow group TeamLeads to read all-resources in compartment Projects:TeamA or any child compartments of Projects:TeamA
Allow group TeamLeads to manage compute-instances in compartment Projects:TeamA:Development


# 読み取り専用の継承権限
Allow group Auditors to inspect all-resources in compartment Production or any child compartments of Production


# 特定リソースタイプのみの継承
Allow group NetworkAdmins to manage virtual-network-family in compartment Infrastructure or any child compartments of Infrastructure


# 条件付き継承権限
Allow group ContractorTeam to use compute-instances in compartment Development or any child compartments of Development
where target.instance.shape.name like 'VM.Standard.E*'

Python SDKでコンパートメント階層の確認(親子関係の確認)を行う手順

親子関係の確認には、以下の手順が有効です。

※ 本手順は学習・検証目的です。本番適用前に必ずテスト環境で確認してください。

【検証前準備】コンソール画面でコンパートメントを新規作成する
※既にコンパートメントを作成している方は【Python SDKでコンパートメントの階層構造を確認する手順】にスキップしてください

下記リンクからOCIのコンソール画面にログイン
https://www.oracle.com/jp/cloud/free/

コンソール画面
スクショ_01_20251009.png

①メニュー左上の「☰」をクリック
image.png

②タブの中の「Identity & Security」→「Compartments」を順にクリック
スクショ_23_20251009.png

③「Create Compartment(コンパートメントの作成)」をクリック

※初期状態では、テナンシー(root)のみが存在し、階下にコンパートメントがないと思います。

image.png

④以下の項目を入力し、「Create Compartment」をクリック(数秒で作成完了します)

・Name:Development (名前は何でもOK)
・Description:テスト用環境 (名前は何でもOK)
・Parent Compartment:rootテナンシ (デフォルトのまま)

スクショ_25_20251009.png

以下のようになっていればOK (rootの階下にコンパートメントが1つ追加されている状態)

スクショ_26_20251009.png

⑤同様に複数作成して構造を作る

・Name:Production (名前は何でもOK)
・Description:本番用環境 (名前は何でもOK)
・Parent Compartment:rootテナンシ (デフォルトのまま)
スクショ_28_20251009.png

・Name:Dev-Sub (名前は何でもOK)
・Description:テスト用サブ環境 (名前は何でもOK)
・Parent Compartment:Development (Developmentを親コンパートメントに設定)
スクショ_29_20251009.png

最終的に以下のような階層構造になります。
スクショ_30_20251009.png

イメージとしては以下のような階層構造になります。

Tenancy(ルート)
├─ Development
    └─ DEV-Sub(Developmentが親コンパートメント)
├─ Production

【Python SDKでコンパートメントの階層構造を確認する手順】

上記まで作成したら、以下のスクリプトを実行して階層構造をAPI経由で確認してみましょう。

※Python SDKの設定方法は前回の記事をご参照ください。
https://qiita.com/tkhsyuk/items/92a5ea85a8e71494eaaf

import oci

def show_compartments(config):
    identity = oci.identity.IdentityClient(config)
    tenancy_id = config["tenancy"]

    def recurse(compartment_id, level=0):
        response = oci.pagination.list_call_get_all_results(
            identity.list_compartments,
            compartment_id=compartment_id,
            lifecycle_state="ACTIVE",
            compartment_id_in_subtree=False
        )
        for comp in response.data:
            print("  " * level + f"├─ {comp.name} ({comp.id[-8:]})")
            recurse(comp.id, level + 1)

    print("=== コンパートメント階層 ===")
    print(f"Root: {tenancy_id[-8:]}")
    recurse(tenancy_id)

if __name__ == "__main__":
    config = oci.config.from_file()
    show_compartments(config)

上記のスクリプトをローカルに「Conparments.py」として保存(名前は何でもOK)

コマンドプロンプトで保存場所の階層に移動し、「python Conparments.py」で実行。
先ほどコンソールで作成したコンパートメントの階層が出力されたら成功です。

※()の中の英数字は省略されたOCIDです。

image.png

まとめ

上記の操作で、

・コンソールの構成(手動で確認)
・SDKでの出力(スクリプトで検証)
→コンソールにログインしていなくても階層構造を確認可能

の両方から、親コンパートメントと子コンパートメントの継承関係を確認できます。

参考リンク

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?