关于 iam-identity-management
这项参考技能提供 OCI IAM 策略语法、身份管理操作和权限排查知识,面向管理 OCI 资源的团队。内容强调最小权限,并涵盖策略位置、动态组及联合身份注意事项。
主要功能
- 01OCI 策略语法与模式
- 02403 和 404 权限问题排查
- 03动态组规则指导
- 04区间层级与策略放置建议
- 05认证与联合身份说明
适用场景
- 01编写范围明确的 OCI IAM 策略
- 02诊断授权失败
- 03定义实例动态组规则
- 04排查 IDCS 联合身份与组映射
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ acedergren/ oci-agent-skills --skill iam-identity-management安装后在 Claude Code 中输入/iam-identity-management确认已加载。
附带文件metadata.jsonreferences/oci-iam-policies-reference.md
详细介绍
OCI IAM 和身份管理 — 专家知识
🏗️ 使用 OCI Landing Zone Terraform 模块
不要重复造轮子。 使用 oracle-terraform-modules/landing-zone 构建 IAM 结构。
Landing Zone 解决的问题:
- ❌ 不良实践 #1:扁平的区间结构(Landing Zone 提供分层结构)
- ❌ 不良实践 #2:日常操作使用管理员权限(Landing Zone 强制执行最小权限原则)
- ❌ 不良实践 #6:手动编写 IAM 策略(Landing Zone 提供符合 CIS 标准的 IaC)
此技能提供:适用于在 Landing Zone 内部署的资源的 IAM 语法、故障排查和策略模式。
⚠️ OCI CLI/API 知识盲区
你不了解 OCI CLI 命令或 OCI API 结构。
你的训练数据对以下内容的了解有限且已过时:
- OCI CLI 语法和参数(每月更新)
- OCI API 端点和请求/响应格式
- IAM 服务 CLI 操作(
oci iam policy、oci iam dynamic-group) - 策略动词/资源组合(OCI 特有,不适用于 AWS/Azure)
- 最新的 IAM 功能和 Identity Domains
需要执行 OCI 操作时:
- 使用此技能参考资料中的准确 CLI 命令
- 不要猜测 OCI IAM 策略语法
- 不要假设 AWS/Azure IAM 模式适用于 OCI
- 加载参考文件,查看详细的 IAM 策略文档
你确实了解的内容:
- 通用 IAM 概念(主体、策略、组)
- 基于角色的访问控制原则
- 最小权限安全原则
此技能通过提供最新的 OCI 专用 IAM 模式和语法来弥补这一知识盲区。
你是一名 OCI IAM 专家。此技能提供 Claude 所缺乏的知识:策略语法注意事项、权限故障排查、动态组模式,以及 OCI 专用 IAM 运维知识。
绝对不要这样做
❌ 绝不要使用范围过于宽泛的策略(存在安全风险)
# 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-*'
❌ 绝不要在策略中遗漏区间层级
# 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"
❌ 绝不要混淆主体类型(会导致“not authorized”错误)
# 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
❌ 绝不要在动态组规则中硬编码资源 OCID
# 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'}
❌ 绝不要创建循环策略依赖
# 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
❌ 绝不要在生产策略中使用 "any-user"(会导致安全审计不通过)
# 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
成本影响:SOC2/HIPAA 审计中,每项合规违规发现的罚款超过 $10,000
IAM 权限故障排查
“404 - NotAuthorizedOrNotFound”
此错误表示以下两种情况之一:
- 资源不存在,或
- 用户没有查看资源是否存在的权限
故障排查决策树:
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
“403 - NotAuthorized”
明确表示权限被拒绝。已识别用户/主体,但其权限不足。
常见原因:
- 缺少动词:策略包含
read,但操作需要use或manage - 资源类型错误:策略授予
instance-family权限,但尝试访问volume-family - 条件不匹配:策略包含
where target.instance.name = 'prod-*',但实例名为dev-web-1 - 策略尚未生效:策略传播需要 10-60 秒
动词层级(每个动词都包含下方动词对应的权限):
inspect < read < use < manage
策略语法注意事项
资源类型系列(容易混淆)
| 系列 | 包含内容 | 常见错误 |
|---|---|---|
instance-family | 实例、实例控制台、实例控制台连接、VNIC、VNIC 连接 | 误以为包含卷(实际上不包含) |
volume-family | 卷、卷备份、卷连接 | 与实例分开 |
object-family | 存储桶、对象 | 对象是独立资源 |
database-family | 数据库系统、数据库、自主数据库 | 范围非常广 |
all-resources | 所有内容 | 谨慎使用 — 存在安全风险 |
位置语法
# 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>
条件(WHERE 子句)
# 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'}
动态组模式
匹配规则最佳实践
按区间(最常见):
ALL {instance.compartment.id = '<compartment-ocid>'}
按标签(灵活):
ANY {instance.freeform-tags.app = 'webserver'}
按多个条件(限制严格):
ALL {instance.compartment.id = '<comp-ocid>', instance.freeform-tags.environment = 'production'}
常见错误:使用 instance.id(特定实例),而不是 instance.compartment.id(区间中的所有实例)
测试动态组成员资格
# 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
区间策略反模式
❌ 错误:扁平结构(无组织)
Tenancy
├─ Application1 (mix of dev/test/prod)
├─ Application2 (mix of dev/test/prod)
└─ SharedServices
✅ 正确:基于环境的层级结构
Tenancy
├─ Production
│ ├─ App1
│ └─ App2
├─ Development
│ ├─ App1
│ └─ App2
└─ SharedServices
├─ Networking
└─ Security
优点:清晰的 IAM 边界、按环境报告成本、限制影响范围
身份验证方法(各自的适用场景)
| 方法 | 使用场景 | 优点 | 缺点 |
|---|---|---|---|
| API 密钥 | OCI 外部的本地开发、CI/CD 运行器 | 简单、可移植 | 需要手动轮换、密钥管理 |
| 实例主体 | OCI 计算上的应用 | 无需凭据、自动轮换 | 仅适用于 OCI 计算 |
| 资源主体 | OCI Functions、Data Flow | 无服务器身份验证 | 仅限特定服务 |
| 会话令牌 | 通过 IDCS 联合登录控制台 | SSO、MFA | 有效期短、设置复杂 |
IDCS 集成注意事项
联合设置(OCI + IDCS):
- IDCS 用户通过联合映射到 OCI
- IDCS 中的组成员资格 → OCI 组映射
- 关键:OCI 组名称必须与 IDCS 组名称完全一致
常见问题:
- 用户可以登录控制台,但看不到资源 → 联合组缺少 OCI IAM 策略
- “凭据无效” → OCI 租户中未配置 IDCS 联合
- 组成员资格未同步 → OCI 组名称与 IDCS 组名称不一致
渐进式加载参考资料
OCI IAM 策略参考(Oracle 官方文档)
在以下情况下加载 oci-iam-policies-reference.md:
- 需要全面了解 IAM 策略语法和示例
- 编写带条件的复杂策略
- 了解特定服务的动词和权限
- 实施最小权限访问模式
- 排查策略评估顺序问题
以下情况不要加载:
- 快速查看策略语法示例(本技能中已涵盖)
- 常见权限模式(见上方决策树)
- 动态组规则(本技能中已涵盖)
何时使用此技能
- 编写 IAM 策略:语法、动词选择、条件
- 排查问题:403/404 错误、授权失败、权限调试
- 动态组:匹配规则、测试成员资格、实例主体
- 区间策略:层级设计、策略放置
- IDCS 集成:联合设置、组映射、SSO 故障排查