Redshift中执行Revoke命令无法移除用户的Schema访问权限
问题排查与解决方法
针对你遇到的REVOKE命令未生效、用户仍保留Schema权限的问题,核心原因通常是权限来源不止你处理的安全组,以下是具体排查点和解决步骤:
1. 检查用户是否为超级用户
如果KYKE是超级用户,所有REVOKE命令都会无效——超级用户默认拥有所有权限且无法被回收。执行以下SQL确认:
SELECT rolsuper FROM pg_roles WHERE rolname = 'KYKE';
如果返回true,先取消超级用户权限:
ALTER ROLE KYKE NOSUPERUSER;
2. 排查用户是否继承了其他角色的权限
用户可能属于多个安全组/角色,你只移除了BAMKT,但其他角色仍在给KYKE授权。执行以下SQL查询KYKE所属的所有角色:
SELECT r.rolname AS inherited_role FROM pg_auth_members am JOIN pg_roles r ON am.roleid = r.oid WHERE am.member = (SELECT oid FROM pg_roles WHERE rolname = 'KYKE');
如果发现其他无关角色,执行ALTER GROUP [角色名] DROP USER KYKE;移除关联。
3. 彻底回收所有直接与间接权限
你之前的命令只覆盖了表和Schema的USAGE权限,可能遗漏了序列、函数等对象的权限,或者未彻底回收Schema本身的所有权限。执行以下完整回收命令:
-- 回收Schema下所有表的权限 REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA BAMKT FROM KYKE; -- 回收Schema下所有序列的权限 REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA BAMKT FROM KYKE; -- 回收Schema下所有函数的权限 REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA BAMKT FROM KYKE; -- 回收Schema本身的所有权限 REVOKE ALL PRIVILEGES ON SCHEMA BAMKT FROM KYKE;
4. 检查PUBLIC角色的默认权限
所有用户默认属于PUBLIC角色,如果BAMKT Schema给PUBLIC分配了权限,KYKE会通过这个角色继承权限。执行以下SQL检查:
SELECT nspname AS schema_name, privacl FROM pg_namespace WHERE nspname = 'BAMKT' AND nspacl LIKE '%PUBLIC=%';
如果存在PUBLIC的权限,可选择:
- 回收
PUBLIC的权限(影响所有普通用户):REVOKE ALL PRIVILEGES ON SCHEMA BAMKT FROM PUBLIC; - 单独拒绝
KYKE的权限(不影响其他用户):DENY ALL PRIVILEGES ON SCHEMA BAMKT TO KYKE;
5. 验证权限是否清除
执行以下SQL确认KYKE已无BAMKT相关权限:
-- 检查表权限 SELECT schemaname, tablename, privilege_type FROM information_schema.table_privileges WHERE grantee = 'KYKE' AND schemaname = 'BAMKT'; -- 检查Schema权限 SELECT nspname, privacl FROM pg_namespace WHERE nspname = 'BAMKT' AND nspacl LIKE '%KYKE=%';
内容的提问来源于stack exchange,提问作者LKW
相关产品推荐
相关产品推荐

