Snowflake:允许用户更改他们的 RSA_PUBLIC_KEY 属性

Snowflake: Allow users to alter their RSA_PUBLIC_KEY property

我的 Snowflake 用户具有 SYSADMIN 角色;但是,我希望能够自己更改我的 RSA_PUBLIC_KEY 和 RSA_PUBLIC_KEY_2 属性。是否可以创建角色和权限的组合以允许用户仅修改其 RSA_PUBLIC_KEY 和 RSA_PUBLIC_KEY_2 属性?

这些不是用户可以自行更改的属性之一: https://docs.snowflake.net/manuals/sql-reference/sql/alter-user.html

更具体地说,需要安全管理员(或帐户管理员)角色:https://docs.snowflake.net/manuals/user-guide/security-access-control-overview.html

也在这里讨论: https://snowflakecommunity.force.com/s/question/0D50Z00009Q8cYtSAJ/createalter-user

* 更新 *

作为解决方法,创建一个由 SECURITYADMIN 角色拥有的存储过程,在定义中使用 EXECUTE AS OWNER 选项,并向您的用户授予访问权限:

use role securityadmin;

create or replace procedure p_set_rsa_key_for_user_x(RSA_KEY string) 
returns text
language javascript
execute as owner
as
  $$
  const stmt = snowflake.createStatement({ 
    sqlText: "alter user user_x set RSA_PUBLIC_KEY = ?",
    binds: [RSA_KEY] 
  })
  const rs = stmt.execute()
  return 'SUCCESS'
  $$
;

grant usage on procedure p_set_rsa_key_for_user_x(string) to role analyst;

use role analyst;

call p_set_rsa_key_for_user_x('MIIBIjANBgkqh...');

其中 'user_x' 是相关用户名,'analyst' 是他们被授予的角色。

希望对您有所帮助...

这在技术上不是必需的,但添加检查以查看执行存储过程的用户是否是为其提供此 SP 的人可能是一个想法。将 "select current_user()" 添加到代码中并针对用户名进行测试以提高安全性……

如果您想要一个只允许轮换用户拥有的密钥的通用程序,这里有一个示例。

use role securityadmin;
CREATE OR REPLACE PROCEDURE SET_RSA_PUBLIC_KEY(RSA_PUBLIC_KEY VARCHAR)
    RETURNS VARCHAR NOT NULL
    LANGUAGE SQL
    EXECUTE AS OWNER
    AS
    $$
    DECLARE
      user VARCHAR DEFAULT (SELECT CURRENT_USER());
    BEGIN
      alter user IDENTIFIER(:user) set RSA_PUBLIC_KEY = :RSA_PUBLIC_KEY;
      return 'Success';
    END;
    $$;
grant usage on procedure SET_RSA_PUBLIC_KEY(string) to role public;
call SET_RSA_PUBLIC_KEY('MIIBIjANBgkqh...');