Apache Ranger如何阻止所有用户?是否支持UI用*或API实现?
Apache Ranger 阻止所有用户相关问题解答
问题1:Apache Ranger API 是否支持实现阻止所有用户?
完全支持,且有两种更高效的实现方式,无需强制遍历所有用户:
- 直接在策略的
denyUsers字段中设置["*"],Ranger会将*解析为匹配所有用户,只要这个拒绝策略的优先级足够高(高于所有允许类策略),就能实现阻止所有用户的效果。 - 若你有特殊需求(比如要排除个别用户,仅阻止其余所有用户),可以采用你提到的思路:先调用用户列表API获取所有用户,再将处理后的用户列表传入策略创建API。
直接用*的API请求示例
curl -u <Username>:<Password> -X POST http://<ranger-host>:<port>/service/public/v2/api/policy \ -H "Content-Type: application/json" \ -d '{ "service": "<你的服务名,例如hadoop_hdfs>", "name": "Deny_All_Users", "description": "拒绝所有用户访问目标资源", "resources": { "<资源类型,例如path>": { "values": ["/"], "isRecursive": true } }, "denyUsers": ["*"], "priority": 10, // 设置为比其他允许策略更高的数值,数值越大优先级越高 "isEnabled": true }'
基于用户列表的API实现步骤
- 获取所有用户列表并转为数组格式:
users=$(curl -u <Username>:<Password> -X GET http://<ranger-host>:<port>/service/xusers/users | jq '[.vXUsers[].name]')
- 将用户列表传入策略创建API:
curl -u <Username>:<Password> -X POST http://<ranger-host>:<port>/service/public/v2/api/policy \ -H "Content-Type: application/json" \ -d '{ "service": "<你的服务名>", "name": "Deny_All_Existing_Users", "description": "拒绝当前所有已存在用户访问", "resources": { "<资源类型>": { "values": ["/"], "isRecursive": true } }, "denyUsers": '$users', "priority": 10, "isEnabled": true }'
问题2:UI的「选择用户」标签页能否直接用*实现?
可以实现,但需注意两个关键细节:
- 在「选择用户」弹窗中,手动输入
*后按回车确认,将其添加到拒绝用户列表中(部分Ranger版本需手动触发确认操作)。 - 必须确保该拒绝策略的优先级高于所有允许类策略:在策略编辑页的「优先级」字段设置较高数值,Ranger会优先执行高优先级策略,只有高优先级策略无匹配时才会评估低优先级策略。
若此前存在允许所有用户的策略,需将其优先级调至低于该拒绝策略,或直接禁用/删除,否则拒绝策略无法生效。
关于你提出的备选思路的补充
你的思路是可行的,但属于冗余实现——Ranger原生支持用*匹配所有用户,直接使用*不仅更高效,还能自动覆盖后续新增的用户(而拉取现有用户列表的方式仅能阻止策略创建时已存在的用户,新增用户不会被自动包含)。若需排除个别用户,推荐采用「拒绝所有用户(*)+ 允许特定用户」的组合策略,比遍历用户列表更灵活。
内容的提问来源于stack exchange,提问作者SHOAIB AHMED
相关产品推荐
相关产品推荐

