Use when writing IAM policies, troubleshooting permission denied errors, setting up dynamic groups, or implementing IDCS integration...
Don't reinvent the wheel. Use oracle-terraform-modules/landing-zone for IAM structure.
Landing Zone solves:
This skill provides: IAM syntax, troubleshooting, and policy patterns for resources deployed WITHIN a Landing Zone.
You don't know OCI CLI commands or OCI API structure.
Your training data has limited and outdated knowledge of:
oci iam policy, oci iam dynamic-group)When OCI operations are needed:
What you DO know:
This skill bridges the gap by providing current OCI-specific IAM patterns and syntax.
You are an OCI IAM expert. This skill provides knowledge Claude lacks: policy syntax gotchas, permission troubleshooting, dynamic group patterns, and OCI-specific IAM operational knowledge.
โ NEVER use overly broad policies (security risk)
# WRONG - grants admin access to everyone
Allow any-user to manage all-resources in tenancy
# WRONG - too broad for production
Allow group Developers to manage all-resources in compartment Production
# RIGHT - least privilege, specific resources
Allow group AppDevelopers to manage instance-family in compartment AppDev where target.instance.name =~ 'dev-*'
โ NEVER forget compartment hierarchy in policies
# WRONG - policy in child compartment can't access parent resources
Policy location: Compartment A/B/C
"Allow group X to read buckets in compartment A" # Fails! Policy must be in A or above
# RIGHT - policy must be at or above target location
Policy location: Compartment A (or root)
"Allow group X to read buckets in compartment A"
โ NEVER mix up principal types (causes "not authorized" errors)
# WRONG - instance is NOT a user
Allow user <instance-ocid> to read buckets in compartment X
# RIGHT - use dynamic group for instances
Allow dynamic-group app-instances to read buckets in compartment X
โ NEVER hardcode resource OCIDs in dynamic group rules
# WRONG - not scalable, breaks when instance replaced
ALL {instance.id = 'ocid1.instance.oc1.phx.xxxxx'}
# RIGHT - use compartment or tag matching
ALL {instance.compartment.id = '<compartment-ocid>'}
ANY {instance.freeform-tags.environment = 'production'}
โ NEVER create circular policy dependencies
# WRONG - Group A needs policy to manage Group B, but Group B policy grants access to Group A
# Creates deadlock where neither can be created first
# RIGHT - use separate administrative groups with clear hierarchy
โ NEVER use "any-user" in production policies (security audit failure)
# WRONG - grants access to ALL users including future unknown users
Allow any-user to read buckets in tenancy
# RIGHT - explicit group membership
Allow group DataReaders to read buckets in compartment SharedData
Cost impact: $10,000+ per compliance violation finding in SOC2/HIPAA audits
This error means EITHER:
Troubleshooting decision tree:
404 NotAuthorizedOrNotFound?
โ
โโ Does resource definitely exist?
โ โโ YES โ Permission issue
โ โ โโ Check: Does user have 'inspect' or 'read' permission?
โ โ โโ Check: Is policy in correct compartment (at or above target)?
โ โโ NO โ Resource doesn't exist
โ โโ Verify OCID, compartment, region
โ
โโ Using dynamic group/instance principal?
โ โโ Check: Is instance in dynamic group?
โ โโ `oci compute instance get --instance-id <ocid>` (shows compartment, tags)
โ โโ Verify matching-rule matches instance properties
โ
โโ Cross-compartment access?
โโ Policy must be in compartment that CONTAINS both source and target
OR in root compartment
Clear permission denied. User/principal identified but lacks permission.
Common causes:
read but action needs use or manageinstance-family but trying to access volume-familywhere target.instance.name = 'prod-*' but instance is dev-web-1Verb hierarchy (each includes permissions below):
inspect < read < use < manage
| Family | Includes | Common Mistake |
|---|---|---|
instance-family |
instances, instance-consoles, instance-console-connections, vnics, vnic-attachments | Thinking it includes volumes (it doesn't) |
volume-family |
volumes, volume-backups, volume-attachments | Separate from instances |
object-family |
buckets, objects | Objects are separate resources |
database-family |
db-systems, databases, autonomous-databases | Very broad |
all-resources |
Everything | Use sparingly - security risk |
# Compartment (specific)
in compartment <compartment-name or ocid>
# Compartment + descendants
in compartment <compartment-name> where target.compartment.id = <ocid>
# Tenancy (root)
in tenancy
# Specific resource (rare, for delegation)
in resource <resource-ocid>
# Tag-based conditions
where target.resource.tag.environment = 'production'
where target.resource.freeform-tags.CostCenter = 'Engineering'
# Resource name patterns
where target.instance.name =~ 'web-*' # Regex match
# Request properties
where request.operation = 'LaunchInstance'
where request.region = 'us-phoenix-1'
# Multiple conditions
where all {target.resource.tag.env = 'prod', target.compartment.name = 'AppProd'}
where any {target.instance.shape = 'VM.Standard.E4.Flex', target.instance.shape = 'VM.Standard.A1.Flex'}
By Compartment (most common):
ALL {instance.compartment.id = '<compartment-ocid>'}
By Tag (flexible):
ANY {instance.freeform-tags.app = 'webserver'}
By Multiple Criteria (restrictive):
ALL {instance.compartment.id = '<comp-ocid>', instance.freeform-tags.environment = 'production'}
Common Mistake: Using instance.id (specific instance) instead of instance.compartment.id (all instances in compartment)
# 1. Get instance details to see compartment/tags
oci compute instance get --instance-id <instance-ocid>
# 2. Check dynamic group matching rule
oci iam dynamic-group get --dynamic-group-id <group-ocid>
# 3. Verify rule matches instance properties
# Example: If rule is "instance.compartment.id = X"
# Check instance's compartment_id matches X
# 4. Test with actual API call from instance
# SSH to instance and run:
oci os ns get # Should work if instance principal configured correctly
โ WRONG: Flat structure (no organization)
Tenancy
โโ Application1 (mix of dev/test/prod)
โโ Application2 (mix of dev/test/prod)
โโ SharedServices
โ RIGHT: Environment-based hierarchy
Tenancy
โโ Production
โ โโ App1
โ โโ App2
โโ Development
โ โโ App1
โ โโ App2
โโ SharedServices
โโ Networking
โโ Security
Benefits: Clear IAM boundaries, cost reporting by environment, blast radius containment
| Method | Use Case | Pros | Cons |
|---|---|---|---|
| API Key | Local dev, CI/CD runners outside OCI | Simple, portable | Manual rotation, key management |
| Instance Principal | Apps on OCI compute | No credentials, auto-rotation | Only works on OCI compute |
| Resource Principal | OCI Functions, Data Flow | Serverless auth | Limited to specific services |
| Session Token | Console federation via IDCS | SSO, MFA | Short-lived, complex setup |
Federation Setup (OCI + IDCS):
Common Issues:
WHEN TO LOAD oci-iam-policies-reference.md:
Do NOT load for: