Okta SCIM 与 Snowflake 集成¶
本指南提供了在 Okta 中为 Snowflake 配置预置所需的步骤,包括以下部分:
功能¶
Snowflake 应用程序支持用户和角色管理。
这使 Okta 能够:
管理 Snowflake 中的用户生命周期(即创建、更新和删除)。
管理 Snowflake 中的角色生命周期(即创建、更新和删除)。
管理 Snowflake 中用户到角色的分配。
支持以下预置功能:
- 推送新用户:
通过 OKTA 创建的新用户也将在 Snowflake 中创建。
- 推送配置文件更新:
通过 OKTA 对用户配置文件进行的更新将被推送到 Snowflake。
- 推送用户停用信息:
通过 OKTA 停用用户或禁用其对 Snowflake 的访问后,该用户在 Snowflake 中也将被停用。
备注
对于 Snowflake,停用用户意味着将用户的
DISABLED
属性设置为TRUE
。- 重新激活用户:
可以重新激活 Snowflake 用户账户。
- 同步密码:
如果需要,可以将用户密码从 Okta 推送到 Snowflake。
小技巧
默认设置是为用户创建一个随机密码,并为用户提供属性设置
has_Password=true
。如果没有密码,用户必须通过 Okta SSO 访问 Snowflake。要防止为用户生成密码,请在预置用户之前关闭此设置,如下所示:点击 Edit。
在 Sync Password 下方,取消选中以下设置: Generate a new random password whenever the user's Okta password changes。
保存更改。
在 Okta 中启用此设置将为用户创建能够访问 Snowflake 的密码。这可能会导致用户在没有 SSO 的情况下访问 Snowflake。
要 禁用 密码同步,请在 Okta 中取消设置此选项, 并 更新 Snowflake Okta SCIM 安全集成 以将
SYNC_PASSWORD
属性设置为False
。- 推送组:
“推送组”功能可在 Snowflake 中创建角色并便于角色管理。使用 Okta 推送组在 Snowflake 中创建的角色在 Okta 和 Snowflake 中具有相同的名称。请务必先在 Okta 中创建角色,然后使用推送组更新 Snowflake,以确保 Okta 和 Snowflake 可以同步。Okta 和 Snowflake 中的 OKTA_PROVISIONER 自定义角色无法管理 Snowflake 中手动创建的角色。推送组 不会 在 Snowflake 中创建用户。
小技巧
如果 Okta 中的 Snowflake 应用程序被分配给 Okta 中的用户,则 Okta 可以在 Snowflake 中创建用户。
有关更多信息,请参阅 将应用程序分配给用户 (https://help.okta.com/en/prod/Content/Topics/Provisioning/lcm/lcm-assign-app-user.htm)。
支持以下用户属性:
属性类型 |
SCIM 用户属性 |
Snowflake 用户属性 |
备注 |
---|---|---|---|
基础属性 |
userName |
name 和 login_name |
|
givenName |
first_name |
||
familyName |
last_name |
||
自定义属性 |
defaultRole |
default_role |
|
defaultWarehouse |
default_warehouse |
||
defaultSecondaryRoles |
default_secondary_roles |
只能将值指定为 |
已知问题¶
Okta 不支持包含下划线的 URLs。如果 Snowflake 账户的名称包含下划线,则需要使用特殊的账户 URL,将下划线替换为连字符。例如,如果您使用的是 URL 格式的账户名称,则特殊 URL 可以是
https://myorg-account-name.snowflakecomputing.cn
。不能通过所有权转移将现有 Snowflake 角色纳入 Okta 的管理。只有新的角色可以通过 Okta 创建。
可以通过所有权转移将现有 Snowflake 用户纳入 Okta 的管理。有关更多信息,请参阅 故障排除 (本主题内容)。
限制¶
Snowflake 支持每个账户每个 SCIM 端点(例如
/Users
端点、/Groups
端点)最多 500 个并发请求。您的账户超过此阈值后,Snowflake 将返回429
HTTP 状态代码(即请求过多)。请注意,此请求限制通常仅在初始预置期间发生,此时出现相对大量的请求(即超过 10,000 个)来预置用户或组。
不支持¶
Okta 的“ 增强组推送 (https://help.okta.com/en/prod/Content/Topics/users-groups-profiles/usgp-enable-group-push.htm) ”和“立即推送”功能。
备注
defaultRole
、defaultSecondaryRoles
和defaultWarehouse
属性为可选属性,因此未进行映射。要在 Okta 中映射这些属性,请使用配置文件、表达式或为所有用户设置默认值。有关更多信息,请参阅 管理配置文件(在 Okta 中) (https://help.okta.com/en/prod/Content/Topics/users-groups-profiles/usgp-user-profiles-main.htm)。如果您使用与 Snowflake 服务的专用连接来访问 Snowflake,请确保未在集成设置中输入这些 URLs。请输入公共端点(即没有
.privatelink
),并确保网络策略允许从 此处 (https://help.okta.com/en-us/Content/Topics/Security/ip-address-allow-listing.htm) 列出的 Okta IP 地址进行访问,否则您无法使用此集成。Okta 目前不支持导入 Active Directory 嵌套组 (https://help.okta.com/en/prod/Content/Topics/Directory/ad-agent-import-groups.htm)。因此,如果 Okta 集成在 AD 中使用嵌套组,则您无法使用 Snowflake Okta SCIM 集成在 Snowflake 中预置或管理嵌套组。请联系 Okta 和 Microsoft 请求对嵌套组的支持。
先决条件¶
在预置用户或组之前,请确保 Snowflake 中的 网络策略 允许从 此处 (https://help.okta.com/en-us/Content/Topics/Security/ip-address-allow-listing.htm) 记录的 Okta IP 地址进行访问。有关更多信息,请参阅 管理 SCIM 网络策略。
在为 Snowflake 配置预置之前,请确保已在 Okta 中为 Snowflake 应用程序配置了 General Settings 和任何 Sign-On Options。
完成上述步骤后,在 Okta 中点击 Next 可返回 Provisioning 选项卡。
配置步骤¶
配置过程需要完成 Snowflake 和 Okta 中的相应步骤。
Snowflake 配置¶
Snowflake 配置过程创建了一个 SCIM 安全集成,以允许在 Okta 中创建的用户和角色由 Snowflake 中的 OKTA_PROVISIONER SCIM 角色拥有,同时创建了一个访问令牌以在 SCIM API 请求中使用。访问令牌的有效期为六个月。过期后,使用如下所示的 SYSTEM$GENERATE_SCIM_ACCESS_TOKEN 手动创建新的访问令牌。
备注
要使 SCIM 集成的现有访问令牌无效,请执行 DROP INTEGRATION 语句。
要继续将 SCIM 与 Snowflake 一起使用,请使用 CREATE SECURITY INTEGRATION 语句重新创建 SCIM 集成,并使用 SYSTEM$GENERATE_SCIM_ACCESS_TOKEN 生成新的访问令牌。
在首选的 Snowflake 客户端中执行以下 SQL 语句。下文对每个 SQL 语句进行了解释。
use role accountadmin;
create role if not exists okta_provisioner;
grant create user on account to role okta_provisioner;
grant create role on account to role okta_provisioner;
grant role okta_provisioner to role accountadmin;
create or replace security integration okta_provisioning
type = scim
scim_client = 'okta'
run_as_role = 'OKTA_PROVISIONER';
select system$generate_scim_access_token('OKTA_PROVISIONING');
重要
示例 SQL 语句使用 ACCOUNTADMIN 系统角色,OKTA_PROVISIONER 自定义角色被授予 ACCOUNTADMIN 角色。
可以不使用 ACCOUNTADMIN 角色而使用权限较低的角色。使用权限较低的角色有助于解决与权限最低的访问相关的合规性问题,但是,使用较低权限的角色可能会在 SCIM 配置和管理过程中导致意外错误。
这些错误可能是由于权限较低的角色没有足够的权限通过 SCIM 管理所有角色,这是由于角色的创建方式和由此产生的角色层次结构造成的。因此,为了避免配置和管理过程中出现错误,请选择以下选项之一:
使用示例 SQL 语句中所示的 ACCOUNTADMIN 角色。
使用具有全局 MANAGE GRANTS 权限的角色。
如果前两个选项都不合适,请使用自定义角色,该角色对将使用 SCIM 管理的所有角色拥有 OWNERSHIP 权限。
使用 ACCOUNTADMIN 角色。
use role accountadmin;
创建自定义角色 OKTA_PROVISIONER。Okta 在 Snowflake 中创建的所有用户和角色都将归范围缩小的 OKTA_PROVISIONER 角色所有。
create role if not exists okta_provisioner; grant create user on account to role okta_provisioner; grant create role on account to role okta_provisioner;
让 ACCOUNTADMIN 角色使用 OKTA_PROVISIONER 自定义角色创建安全集成。有关更多信息,请参阅 CREATE SECURITY INTEGRATION。
grant role okta_provisioner to role accountadmin; create or replace security integration okta_provisioning type = scim scim_client = 'okta' run_as_role = 'OKTA_PROVISIONER';
创建授权令牌并将其复制到剪贴板并安全存储以供以后使用。将此令牌用于每个 SCIM REST API 请求并将其放在请求标头中。访问令牌将在六个月后过期,并且可以使用此语句生成新的访问令牌。
select system$generate_scim_access_token('OKTA_PROVISIONING');
重要
Okta 在 Snowflake 中创建的所有用户和角色都将归范围缩小的
okta_provisioner
角色所有。如果您想通过 Okta 管理现有的 Snowflake 用户,请完成以下步骤:
将现有用户的所有权转移到 okta_provider 角色。
use role accountadmin; grant ownership on user <user_name> to role okta_provisioner;
确保为现有用户设置了
login_name
属性(如果这些现有 Snowflake 用户使用 Okta SSO,则应该已经设置了该属性)。请注意,纳入 Okta 管理的现有用户的名称将更新,以与 Okta 的用户名相匹配。将变更内容通知您的用户,因为他们可能会使用此名称从其他集成(即 Tableau)连接到 Snowflake。
Okta 配置¶
本部分讨论如何在 Okta 中创建和配置 Snowflake 应用程序。
备注
在 Okta 中创建 Snowflake 应用程序时,应用程序的 SubDomain 字段必须包含 Snowflake 账户的 账户标识符。如果 Snowflake 账户名称包含下划线,并且您使用的是标识符格式的账户名称,则必须将下划线转换为连字符,因为 Okta 不支持 URLs 中存在下划线(例如 myorg-account-name
)。
请勿 在 SubDomain 字段中包含 privatelink
分段,因为专用连接 不受支持,输入此分段会导致 SCIM 连接失败。
要在 Okta 中配置 Snowflake 应用程序,请完成以下步骤。
在 Settings 中,从左侧菜单中选择 Integration,然后选中 Enable API Integration 框。
对于 API Token,输入上方从剪贴板生成的值。点击 Test API Credentials 按钮,如果成功,则保存配置。
从左侧菜单中选择 To App。
选择要启用的 Provisioning Features。
验证属性映射。
defaultRole
、defaultSecondaryRoles
和defaultWarehouse
属性为可选属性,因此未进行映射。如果有需要,您可以使用 Okta 配置文件或表达式对其进行映射,或者为所有用户设置相同的值。
您现在可以将用户分配给 Snowflake 应用程序(如果需要)并完成应用程序设置。
备注
Okta 支持名为 snowflakeUserName
的属性,该属性可映射到 Snowflake 用户的 name
字段。
如果希望 Snowflake 用户的 name
和 login_name
字段具有不同的值,请执行以下步骤。
联系 Snowflake 支持部门为您的账户启用单独映射。
在 Okta 中,访问 Snowflake 应用程序并导航到 Provisioning > Attribute Mappings > Edit Mappings。
搜索属性
snowflakeUserName
。如果未找到该属性,则 Snowflake 应用程序是在该属性可用之前就已创建。使用如下所示的映射重新创建 Snowflake 应用程序,或按如下所示手动添加属性:
点击 Add Attribute。
为表中列出的各个字段设置以下值。
字段
值
数据类型
字符串
显示名称
Snowflake 用户名
变量名称
snowflakeUserName
外部名称
snowflakeUserName
外部命名空间
urn:ietf:params:scim:schemas:extension:enterprise:2.0:User
描述
映射到 Snowflake 中用户的
name
字段。范围
用户个人
点击 Save。
启用 Snowflake 启动的 SSO¶
SCIM 预置过程不会自动启用单点登录 (SSO)。
要在 SCIM 预置过程完成后使用 SSO,请启用 Snowflake 启动的 SSO。
管理 SCIM 网络策略¶
将网络策略应用到 SCIM 安全集成允许 SCIM 网络策略与应用于整个 Snowflake 账户的网络策略不同。允许 SCIM 提供程序预置用户和组,而无需向控制普通用户访问的网络策略添加 IP 地址。
应用于 SCIM 集成的网络策略会替换应用于整个 Snowflake 账户的网络策略,但会被分配给用户的网络策略替换。
创建 SCIM 安全集成后,使用以下命令创建 SCIM 网络策略:
alter security integration okta_provisioning set network_policy = <scim_network_policy>;
要取消设置 SCIM 网络策略,请使用以下命令:
alter security integration okta_provisioning unset network_policy;
其中:
okta_provisioning
指定 Okta SCIM 安全集成的名称。
scim_network_policy
在 Snowflake 中指定 Okta SCIM 网络策略。
有关更多信息,请参阅 使用网络策略控制网络流量 和 ALTER SECURITY INTEGRATION。
将次要角色与 SCIM 结合使用¶
Snowflake 支持使用 SCIM 将 用户 属性 DEFAULT_SECONDARY_ROLES
设置为 'ALL'
,以允许用户在 Snowflake 会话中使用 次要角色。
有关代表性示例,请参阅 更新用户。
复制 Okta SCIM 安全集成¶
Snowflake 支持通过 SCIM 安全集成执行从源账户到目标账户的复制和故障转移/故障回复。
有关详细信息,请参阅 跨多个账户复制安全集成和网络策略。
故障排除¶
转移所有权。 如果用户更新失败,请在 Snowflake 中检查用户的所有权。如果它不属于
okta_provisioner
角色(或在 Snowflake 中创建安全集成时在run_as_role
参数中设置的角色),则更新将失败。通过在 Snowflake 中运行以下 SQL 语句来转移所有权,然后重试。grant ownership on user <username> to role OKTA_PROVISIONER;
确保为现有用户设置了
login_name
属性(如果这些现有 Snowflake 用户使用 Okta SSO,则应该已经设置了该属性)。若要验证 Okta 正在向 Snowflake 发送更新,请检查 Okta 中有关 Snowflake 应用程序的日志事件和 Snowflake 中的 SCIM 审计日志,以确保 Snowflake 正在从 Okta 接收更新。使用以下命令查询 Snowflake SCIM 审核日志。
use role accountadmin; use database demo_db; use schema information_schema; select * from table(rest_event_history('scim')); select * from table(rest_event_history( 'scim', dateadd('minutes',-5,current_timestamp()), current_timestamp(), 200)) order by event_timestamp;
在预置过程中可能会发生身份验证错误。错误消息可能如下所示:
Error authenticating: Forbidden. Errors reported by remote server: Invalid JSON: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at [Source: java.io.StringReader@4c76ba04; line: 1, column: 2]
如果出现此错误消息或其他身份验证错误消息,请尝试以下故障排除过程:
在 Okta 中,移除当前的 Snowflake 应用程序并创建一个新的 Snowflake 应用程序。
在 Snowflake 中,创建新的 SCIM 安全集成并生成新的访问令牌。
点击 Copy 复制新令牌。
在 Okta 中,粘贴并验证新的访问令牌,如“如何将 Okta 配置为 SCIM 身份提供商”中所述。
使用 Okta 中的新 Snowflake 应用程序将 Okta 的用户和角色预置到 Snowflake。
后续主题: