将Rego权限策略转换为AWS Cedar策略的技术咨询
问题分析与修正方案
原Rego逻辑是:资源归指定团队所有,团队为不同权限配置了允许的用户列表,仅当请求用户在对应权限的允许列表中,且资源归该团队所有时,才允许访问。下面是转换为Cedar时的问题修正方案:
原尝试的核心问题
- 成员存储格式错误:团队实体的
permissions中,members存储的是字符串用户名(如"alice"),但Cedar中需要通过实体引用匹配主体,字符串无法与PhotoApp::User类型的主体实体匹配。 - 动作引用方式错误:策略中直接用
action实体作为字典键,Cedar中需通过action.id获取动作的标识字符串(如"write")来匹配权限字典的键。 - 缺少动作实体定义:请求中使用的
PhotoApp::Action write未在实体列表中定义,导致策略无法识别动作。
修正后的Cedar实体
[ { "uid": {"type": "PhotoApp::User", "id": "alice"}, "attrs": {}, "parents": [] }, { "uid": {"type": "PhotoApp::User", "id": "bob"}, "attrs": {}, "parents": [] }, { "uid": {"type": "PhotoApp::Owner", "id": "a-team"}, "attrs": { "permissions": { "read": { "members": [ {"type": "PhotoApp::User", "id": "alice"}, {"type": "PhotoApp::User", "id": "bob"} ] }, "write": { "members": [ {"type": "PhotoApp::User", "id": "alice"} ] } } }, "parents": [] }, { "uid": {"type": "PhotoApp::Resource", "id": "db1"}, "attrs": { "owner": {"type": "PhotoApp::Owner", "id": "a-team"} }, "parents": [] }, { "uid": {"type": "PhotoApp::Action", "id": "read"}, "attrs": {}, "parents": [] }, { "uid": {"type": "PhotoApp::Action", "id": "write"}, "attrs": {}, "parents": [] } ]
修正后的Cedar策略
permit ( principal, action, resource ) when { # 确保资源有所有者,且所有者的权限字典中包含当前动作对应的条目 exists resource.owner, exists resource.owner.permissions[action.id], # 检查主体是否在该权限的允许成员列表中 principal in resource.owner.permissions[action.id].members };
验证逻辑
- 允许场景:主体
PhotoApp::User alice,动作PhotoApp::Action write,资源PhotoApp::Resource db1→ 策略返回允许(alice在a-team的write权限成员列表中) - 拒绝场景1:主体
PhotoApp::User bob,动作PhotoApp::Action write,资源PhotoApp::Resource db1→ 策略返回拒绝(bob不在write权限列表中) - 允许场景2:主体
PhotoApp::User bob,动作PhotoApp::Action read,资源PhotoApp::Resource db1→ 策略返回允许(bob在read权限列表中)
内容的提问来源于stack exchange,提问作者shays10
相关产品推荐
相关产品推荐

