You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Snowflake新建角色默认拥有所有已有数据库的访问权限?

异常原因说明

你写的这几段创建角色、用户的SQL本身没有逻辑问题,刚创建的空TEST_ROLE默认不会自带任何业务对象的访问权限,出现没额外授权就能访问所有库、Schema、表、视图的情况,本质是Snowflake的默认权限规则被之前的配置带偏了,最常见的原因按出现概率排:

  • 90%以上的这类问题都是踩了PUBLIC角色的默认继承坑:Snowflake每个账号都内置了一个叫PUBLIC的特殊角色,所有新建的自定义角色、所有用户,默认自动继承PUBLIC的全部权限,根本不需要你手动执行GRANT语句关联。基本都是之前的管理员图省事,给PUBLIC授了过大范围的权限:
    • 直接跑过GRANT ALL PRIVILEGES ON ACCOUNT TO ROLE PUBLIC;这种全账号放权的语句
    • 给PUBLIC授了账号下所有数据库的USAGE权限、所有Schema的USAGE权限、所有表和视图的SELECT权限
    • 给PUBLIC开放了所有数据共享导入库、SNOWFLAKE系统库的全量访问权限
      这种情况下你建的空TEST_ROLE天生带PUBLIC的所有权限,当然能随便看所有对象。
  • 角色层级配错了:如果你之前改过SECURITYADMIN创建角色的默认规则,把新建的自定义角色默认设成SYSADMIN甚至ACCOUNTADMIN的子角色,子角色会自动继承上级角色的所有权限,哪怕你没给TEST_ROLE单独开权限,也能拿到高权限角色的全量访问权。
  • 全局授权规则误开:如果之前给PUBLIC或者SECURITYADMIN授过MANAGE GRANTS这类全局管控权限,或者配了覆盖全账号的未来授权(Future Grants)规则给所有角色放通访问,也会导致新建角色自动拿到全量对象的访问权限。
  • 验证方法很简单:用TEST_USER登录后先跑SELECT CURRENT_ROLE();确认当前激活的角色确实是TEST_ROLE,没切到其他高权限角色,再分别跑SHOW GRANTS TO ROLE TEST_ROLE;和SHOW GRANTS TO ROLE PUBLIC;拉取两个角色的所有权限列表,一眼就能找到是哪条授权导致的越权。

内容的提问来源于stack exchange,提问作者MM Kharal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:00:59