为 External OAuth 配置自定义授权服务器

本主题介绍如何在 Snowflake 中创建 External OAuth 安全集成,以便客户端可以通过自定义授权服务器进行身份验证来访问 Snowflake 数据。

如果您的授权服务器是 支持的身份提供商 (IdP) 而不是自定义授权服务器,请参阅有关配置特定 IdP 的主题。

本主题内容:

External OAuth 令牌有效负载要求

自定义身份验证服务器发送到 Snowflake 的访问令牌必须包含以下有效负载信息。有关声明列的更多信息,请参阅 JWT 声明 (https://tools.ietf.org/html/rfc7519#section-4)。

声明

描述

scp

范围。访问令牌中的范围列表。

scope

范围。

访问令牌中以逗号分隔的范围字符串。

Snowflake 支持在为自定义授权服务器 创建修改 External OAuth 安全集成时,通过设置 EXTERNAL_OAUTH_SCOPE_DELIMITER 属性为分隔符指定任何单个字符,如空格(即“' '”)。

请联系 Snowflake 支持部门 (https://community.snowflake.com/s/article/How-To-Submit-a-Support-Case-in-Snowflake-Lodge),在您的 Snowflake 账户中启用此属性。

aud

受众。将访问令牌的接收者标识为字符串 URI。

exp

过期时间。标识访问令牌的到期时间,在此时间后就 不能 再接受和处理访问令牌了。

iss

发放者。将发放访问令牌的主体标识为字符串 URI。

iat

发放时间。必填。标识 JWT 发放的时间。

备注

Snowflake 支持 nbf (不早于)声明,该声明标识在指定的时间点之前 不能 接受和处理访问令牌。

如果自定义授权服务器支持 nbf (不早于)声明,则可以选择包括访问令牌中的 nbf 声明。

要验证令牌是否包含所需的信息,可以在此 JSON Web 令牌 (https://jwt.ms) 网站测试令牌。

作为代表性示例,PAYLOAD: DATA 界面显示令牌有效负载,如下所示。

{
  "aud": "<audience_url>",
  "iat": 1576705500,
  "exp": 1576709100,
  "iss": "<issuer_url>",
  "scp": [
    "session:role:analyst"
  ]
}
Copy

配置过程

以下步骤假设您的自定义授权服务器和环境可以配置为获取创建 Snowflake 安全集成所需的值。

重要

本主题中的步骤就是关于如何配置自定义授权服务器的 代表性示例

您可以将环境配置为任何所需状态,并使用任何所需的 OAuth 流程,前提是您可以获得 External OAuth 安全集成 所需的信息。

请注意,以下步骤可作为获取在 Snowflake 中创建 External OAuth 安全集成所需信息的指南。

在配置自定义授权服务器之前,请咨询您的内部安全策略,以确保您的组织满足所有法规和合规性要求。

获取关键环境值以使用 External OAuth

在配置 IdP 和授权服务器时,必须收集以下值以定义 External OAuth 安全集成:

发放者 URL:

包括此 URL 与 external_oauth_issuer 参数。

RSA 公钥:

包括此值与 external_oauth_rsa_public_key 参数。

受众 URLs:

如果需要多个受众 URL,请在 external_oauth_audience_list 参数中用逗号分隔每个 URL。

范围属性:

您可以将此值设置为 scp 或者 scope。默认情况下,该值为 scp

您可以将 external_oauth_scope_mapping_attribute 参数的值设置为该值。

如果不使用默认值 scp,则将 external_oauth_scope_mapping_attribute 参数的值设置为 scope

有关更多信息,请参阅 External OAuth 令牌有效负载要求

用户属性:

此属性是指用于标识您的 IdP 中的用户的属性。将此属性值包括在 external_oauth_user_mapping_claim 参数中。

Snowflake 用户属性:

Snowflake 中用于标识用户的属性。将此值包括在 external_oauth_snowflake_user_mapping_attribute 参数中。

在 Snowflake 中创建 External OAuth 安全集成

此步骤在 Snowflake 中创建 External OAuth 安全集成。External OAuth 安全集成确保 Snowflake 可以与自定义授权服务器安全通信并验证来自自定义授权服务器的访问令牌,并根据与访问令牌关联的用户角色为用户提供对 Snowflake 数据的访问权限。有关更多信息,请参阅 CREATE SECURITY INTEGRATION

重要

仅账户管理员或具有全局 CREATE INTEGRATION 权限的角色可以执行此 SQL 命令。

External OAuth 安全集成参数值区分大小写,您输入到 External OAuth 安全集成中的值必须与您的环境中的值相一致。如果值的大小写不一致,则不会验证访问令牌,从而导致身份验证尝试失败。

在 Snowflake 中创建 External OAuth 安全集成

create security integration external_oauth_custom
    type = external_oauth
    enabled = true
    external_oauth_type = custom
    external_oauth_issuer = '<authorization_server_url>'
    external_oauth_rsa_public_key = '<public_key_value>'
    external_oauth_audience_list = ('<audience_url_1>', '<audience_url_2>')
    external_oauth_token_user_mapping_claim = 'upn'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';
Copy

修改 External OAuth 安全集成

您可以通过对安全集成执行 ALTER 语句来更新 External OAuth 安全集成。

有关更多信息,请参阅 ALTER SECURITY INTEGRATION (External OAuth)

将 ANY 角色与 External OAuth 结合使用

在 Snowflake 中创建安全集成的配置步骤中,OAuth 访问令牌包括范围定义。因此,在运行时,使用 External OAuth 安全集成既不允许 OAuth 客户端,也不允许用户在 OAuth 访问令牌中使用未定义角色。

在验证访问令牌并创建会话之后,ANY 角色可以允许 OAuth 客户端和用户决定其角色。如有必要,客户端或用户可以切换到与 OAuth 访问令牌中定义的角色不同的角色。

要配置 ANY 角色,将范围定义为 SESSION:ROLE-ANY 并使用 external_oauth_any_role_mode 参数配置安全集成。此参数可以有三个可能的字符串值:

  • DISABLE 不允许 OAuth 客户端或用户切换角色(即 use role <role>;)。默认。

  • ENABLE 允许 OAuth 客户端或用户切换角色。

  • ENABLE_FOR_PRIVILEGE 允许 OAuth 客户端或用户仅为具有 USE_ANY_ROLE 权限的客户端或用户切换角色。可以将此权限授予用户可以使用的一个或多个角色,也可以撤消。例如:

    grant USE_ANY_ROLE on integration external_oauth_1 to role1;
    
    Copy
    revoke USE_ANY_ROLE on integration external_oauth_1 from role1;
    
    Copy

定义安全集成如下:

create security integration external_oauth_1
    type = external_oauth
    enabled = true
    external_oauth_any_role_mode = 'ENABLE'
    ...
Copy

将次要角色与 External OAuth 结合使用

主要角色所需的范围在外部令牌中传递:用户的默认角色 (session:role-any) 或授予用户的特定角色 (session:role:<role_name>)。

默认情况下,Snowflake 不会 激活会话中用户(即 DEFAULT_SECONDARY_ROLES)的默认 次要角色

要激活会话中用户的默认次要角色,并允许在使用 External OAuth 时执行 USE SECONDARY ROLES 命令,请完成以下步骤:

  1. 配置连接的安全集成。在创建安全集成(使用 CREATE SECURITY INTEGRATION)或更高版本(使用 ALTER SECURITY INTEGRATION)时,将 EXTERNAL_OAUTH_ANY_ROLE_MODE 参数值设置为 ENABLE 或 ENABLE_FOR_PRIVILEGE。

  2. 配置授权服务器以在令牌的范围属性中传递 session:role-any 的静态值。有关范围参数的更多信息,请参阅 External OAuth 概览

将 Client Redirect与 External OAuth 结合使用

Snowflake 支持将 Client Redirect 与 External OAuth 结合使用,包括将 Client Redirect 和 External OAuth 与支持的 Snowflake 客户端结合使用。

有关更多信息,请参阅 重定向客户端连接

将网络策略与 External OAuth 结合使用

目前,网络策略无法添加到您的 External OAuth 安全集成。但是,您仍然可以实施广泛应用于整个 Snowflake 账户的网络策略。

如果您的用例需要特定于 OAuth 安全集成的网络策略,请使用 Snowflake OAuth。这种方法允许 Snowflake OAuth 网络策略与可能适用于 Snowflake 账户的其他网络策略不同。

有关更多信息,请参阅 网络策略

将副本与 External OAuth 结合使用

Snowflake 支持 External OAuth 安全集成从源账户到目标账户的复制和故障切换/故障回复。

有关详细信息,请参阅 跨多个账户复制安全集成和网络策略

测试过程

要测试自定义授权服务器的配置,请执行以下操作:

  1. 验证测试用户是否存在于您的 IdP 并有一个密码。

  2. 验证 Snowflake 中存在测试用户,且其 login_name 属性值设置为 <external_oauth_token_user_mapping_claim>

  3. 注册 OAuth 2.0 客户端

  4. 允许 OAuth 2.0 客户端向自定义令牌端点发出 POST 请求,如下所示:

    • 授予类型设置为资源所有者

    • HTTP 基本授权标头包含 clientID 和密钥

    • FORM 数据包含用户名和密码

    • 包括范围

示例命令请求 ANALYST 自定义角色,并假定 session:role:analyst 已在自定义授权服务器中定义。

以下是使用 cURL 获取访问令牌的示例。

curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
  --user <OAUTH_CLIENT_ID>:<OAUTH_CLIENT_SECRET> \
  --data-urlencode "username=<IdP_USER_USERNAME>" \
  --data-urlencode "password=<IdP_USER_PASSWORD>" \
  --data-urlencode "grant_type=password" \
  --data-urlencode "scope=session:role:analyst" \
  <IdP_TOKEN_ENDPOINT>
Copy

通过 External OAuth 连接到 Snowflake

配置安全集成并获取访问令牌后,您可以使用以下方法之一连接到 Snowflake:

请注意以下事项:

  • 必须将 authenticator 参数设置为 oauth,将 token 参数设置为 external_oauth_access_token

  • token 值作为 URL 查询参数传递时,必须对 token 值进行 URL 编码。

  • token 值传递给属性对象(例如 JDBC 驱动程序)时,无需进行任何修改。

例如,如果使用 Python Connector,请设置连接字符串,如下所示。

ctx = snowflake.connector.connect(
   user="<username>",
   host="<hostname>",
   account="<account_identifier>",
   authenticator="oauth",
   token="<external_oauth_access_token>",
   warehouse="test_warehouse",
   database="test_db",
   schema="test_schema"
)
Copy

您现在可以使用 External OAuth 安全连接到 Snowflake。

语言: 中文