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...');
我的 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...');