在阿里云RDS中的PostgreSQL数据库中,超级用户是没有给到最终用户的,而是给了一个比较大权限的用户,这个用户可以创建数据库,可以创建用户,在通常情况下都是够用的。最近业务方给我提了一个需求,需要建一个只读用户,这个只读用户不能有DDL的权限。目前发现在阿里云RDS提供的PostgreSQL数据库中,无法满足此需要,原因是,任何用户都能创建表,无法禁止用户创建表的权限,更深层次的原因为:
1. 原因是模板数据库template1中的有一个名称为“public”的schema,这个“public”的schema的属主是超级用户,而这个超级用户阿里云没有给到最终用户。而用户自己创建出来的数据库都是从template1拷贝的,所以用户创建出来的数据库中也有一个名称为“public”的schema,而这个“public”的schema的属主仍然是原先的超级用户,而任何人都有在这个“public”的schema中创建表的权限,而因为我们这些RDS使用用户没有超级用户的权限,所以无法用“revoke create on schema public from public”的方法取消任何用户在此schema建表的权限。而又因为这个“public”的schema的属主是超级用户,我们也无法删除掉这个schema。
目前我们自己是无法解决此问题,只能由阿里云来解决,解决的建议方法如下:
1. 建议阿里云默认创建出来的实例把在schema “public”中创建表的权限回收。
2. 再创建一个的模板数据,如名称为template2,)然把这个模板数据库中的public schema删除掉。
create database template2;
UPDATE pg_database SET datistemplate='true' WHERE datname='template2';
drop schema public;
这样用户可以从template2复制出一个数据库:
create database userdb01 template template2;
这样建出来的数据库userdb01中是没有“public”这个schema的,用户如果想使用“public”这个schema,可以自己建,因为是用户自己建的“public”的这个schema,这个“public”的属主是用户自己,而不是阿里云的超级用户,这样用户想让谁能在这个“public”的schema中创建表或其它权限,他都可以直接赋权了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您提出的需求和建议非常合理,但需要注意的是,直接修改阿里云RDS PostgreSQL服务的默认设置或模板数据库通常是不可行的,因为这些改动涉及到所有用户的通用配置和安全性。不过,针对您的需求,有几种变通的方法可以在现有的权限体系下实现只读用户的创建:
readonly_schema
。public
Schema移动到新的readonly_schema
中。readonly_schema
中的SELECT
权限,而不给予CREATE
权限。虽然不能直接禁止在public
Schema中创建表,但可以通过以下方式间接实现限制:
撤销公共权限:尝试撤销public
角色在public
Schema上的CREATE
权限,尽管这可能因超级用户权限问题而受限,但在某些特定版本或配置下可能可行。
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
创建角色与权限管理:为每个用户或一组用户创建特定的角色,并仅向这些角色授予所需的最小权限集,避免直接给用户赋予过多权限。
如果上述方法均无法满足您的需求,最直接的方式是通过阿里云官方渠道(如工单系统)提交技术支持请求,详细说明您的场景和需求。虽然直接修改模板数据库如您所建议的操作可能不在客户可控范围内,但可以询问是否有其他高级配置选项、定制服务或是未来产品更新计划能够解决这一问题。
希望这些建议能对您有所帮助!