OCIの拒否(Deny)ポリシーを触ってみた

2026年2月26日掲載

キービジュアル

ソフトバンクの武田です。
OCI(Oracle Cloud Infrastructure)IAMの新機能「Denyポリシー」を有効化し、挙動を確認しました。本記事ではAllowとの優先関係、落とし穴になりそうなポイント、タグを使ったABACでの動作をまとめます。

目次

  • OCIでIAMポリシーを管理する方にお読みいただきたいです。
  • Denyポリシーでできること、メタバーブ反転、タグベースのABACでの動きについての記事です。

IAMポリシーのDeny文について

これまではAllow(許可)を使ってリソースに対するアクセスを管理してきましたが、これに加えてDeny(拒否)2025年11月にリリースされました。これによって権限のブロックを明確に指定できるようになり、きめ細かな制御が可能になります。

ポイント

  • テナンシで機能の有効化が必要で、一度有効化すると元に戻せません。
  • DenyはAllowより優先され、許可されている操作でも明示的にブロックできます。
  • Denyでは動詞の優先順位が反転するため、manageをDenyしてもuse/read/inspectは止まらないことがあります。
  • タグ条件(ABAC)を併用した場合でも、条件に合致するリソースに対してDenyを適用できました。

準備

テナンシで拒否ポリシーを有効化する設定が必要です。
※一度ONにするとOFFには戻せません。まずは検証用テナンシで確認するのがおすすめです。

アイデンティティとセキュリティ > ポリシー の アクション > ポリシー設定 に進みます。

ポリシー設定の場所

IAM拒否ポリシーの有効化スイッチをONにします。
一度ONにしたら、OFFに戻すことはできませんでした。

IAM拒否ポリシーの有効化スイッチ

確認画面が出たら[有効化]を押します。

拒否ポリシーの有効化の確認

IAMDenyPolicyが自動で作成されます。これで有効化が完了します。

IAMDenyPolicy

ポリシーの作成、動きの確認

このような検証環境を準備し、動きを確認しました。

  • ドメイン:test-domain
  • グループ:testgroup
  • コンパートメント:test-cpt
  • 対象リソース:コンピュートインスタンス

実際にポリシーを作ってみました。
今回はインスタンスを1個作成・起動してから、以下のポリシーを作成して動きを確認しました。

Allow group 'test-domain'/'testgroup' to manage all-resources in compartment test-cpt
Deny group 'test-domain'/'testgroup' to manage instances in compartment test-cpt

結果はこのようになりました。
Allowでall-resourcesをmanageしていても、instancesに対するDenyを追加すると新規インスタンスの作成は失敗しました。

新規インスタンスの作成APIエラーで失敗
Authorization failed or requested resource not found.
既存インスタンスの停止成功

一方で、同じ条件でも既存インスタンスの停止は成功しました。

インスタンスの停止

manageをDenyしているのに、なぜ操作できてしまうのでしょうか。
疑問に思いましたが、これはOCIドキュメントの「メタバーブ反転」で説明されており、Allow文とは包含関係が逆転します。
つまりmanageをDenyしてもinspect/read/useは制御対象にならないため

操作権限動詞Denyの対象
新規インスタンスの作成INSTANCE_CREATEmanage対象
既存インスタンスの停止INSTANCE_UPDATEUSE対象外

となったようです。
これを受けて先ほどのDeny文を to manage から to inspect に変えたところ、インスタンスに対する操作が一切できなくなりました。
このあたりは少し癖があるので、注意が必要です。

ABACでもDenyを使えるか

OCIではタグを使ったABAC(Attribute Based Access Control、属性ベースアクセス制御)がサポートされています。リソース・タグでABACを設定した状態でDeny文が機能するか試してみました。

ガバナンスと管理 > タグ・ネームスペース で制御用のタグを準備します。
今回は test-tag-ns/test-key/deny-test を作成しました。

権限操作用ポリシーを作成します。

Allow group 'test-domain'/'testgroup' to manage all-resources in compartment test-cpt where target.resource.tag.test-tag-ns.test-key='deny-test'
Deny group 'test-domain'/'testgroup' to inspect instances in compartment test-cpt where target.resource.tag.test-tag-ns.test-key='deny-test'

このタグをテスト用インスタンスに付与して操作を試したところ、インスタンスを選択した時点でエラーになりました。inspectをDenyしている効果が出ているようです。      

インスタンスを選択した際のエラー

このように、リソース・タグを使用したABACにもDeny文は利用できました
ただし「拒否ポリシーの既知の問題」に制約事項が記載されていますので、ユーザー、グループ、また動的グループを対象にしたい場合は注意してください。

まとめ

今回はDeny文がどのように動作するかを確認できました。
これによって制御の幅が格段に広がり、管理担当者の苦労が軽減されそうです。
一方、メタバーブ反転など注意点もあるため、ドキュメントを参照しつつ使いこなしていきたいと思います。
この記事がOCIでポリシーを管理する方の参考になれば幸いです。

おすすめの記事

条件に該当するページがございません