为 External OAuth 配置 PingFederate¶
本主题介绍如何将 Snowflake 配置为 OAuth 资源,以及如何将 Ping Identity PingFederate 配置为外部 OAuth 授权服务器,以实现对 Snowflake 数据的安全编程访问。
本主题内容:
配置过程¶
以下两个步骤假设您的环境中没有配置任何与 PingFederate OAuth 授权服务器、 OAuth 客户端、作用域和必要的元数据相关的内容。这些步骤也是有关如何配置 PingFederate 的代表性示例。
第一步中的信息将用于在 Snowflake 中创建安全集成。
如果您已配置 PingFederate 授权服务器和客户端,则无需完成以下所有步骤。相反,请浏览第一步,并验证您可以获得所需的信息、创建作用域、将作用域分配给一个或多个策略以及访问元数据。
如果没有配置 PingFederate OAuth 授权服务器和客户端,请完成这两个步骤。
重要
本主题中的步骤是有关如何为 External OAuth 配置 PingFederate 的 代表性示例。
您可以将 PingFederate 配置为任何所需的状态,并使用任何所需的 OAuth 流程,前提是您可以获得 安全集成 所需的信息(本主题内容)。
请注意,以下步骤可作为获取在 Snowflake 中创建安全集成所需信息的指南。
请务必咨询有关配置授权服务器的内部安全策略,以确保您的组织满足所有必要的法规和合规性要求。
第 1 步源自 OAuth 2.0 上的 PingIdentity 文档。有关 PingIdentity 如何定义其术语、用户界面以及与授权服务器相关的选项的更多信息,请参阅以下 PingIdentity 指南:
OAuth 2.0 开发者指南 (https://www.pingidentity.com/content/developer/en/resources/oauth-2-0-developers-guide.html)
配置 PingFederate¶
导航至 PingFederate 服务器下载页面,并根据 操作系统 (https://www.pingidentity.com/en/resources/downloads/pingfederate.html) 下载或升级 PingFederate 实例。
使用适用于操作系统的 PingFederate 安装指南。安装后,访问 PingFederate。
通过导航至 OAuth Server 面板中的 Exclusive Scopes 界面创建 OAuth 作用域。
要将 Snowflake 角色添加为作用域,请将该角色添加到 Scope Value。Snowflake 角色必须具有
session:role:
前缀(例如,对于 Snowflake Analyst 角色,输入session:role:analyst
)。在 Scope Description 框中输入作用域的描述并点击 Add。
导航至 OAuth Server 选项卡并创建一个新客户端。验证以下值:
字段
值
NAME
PingFederate OAuth 授权服务器的友好名称
DESCRIPTION
PingFederate OAuth 授权服务器的友好描述
CLIENT AUTHENTICATION
CLIENT SECRET
EXCLUSIVE SCOPES
选择作用域(即 Snowflake 角色)
ALLOWED GRANT TYPES
选择 Refresh Token 和 Resource Owner Password Credentials
DEFAULT ACCESS TOKEN MANAGER
JSON 网络令牌
导航至 Security 选项卡并导出凭据。从凭据中提取公钥以在以下步骤中使用。
导航至 OAuth Server 选项卡下的 Instance Configuration 选项卡和 Access Token Management | Create Access Token Management Instance,然后:
将 ISSUER CLAIM VALUE 更新为引用此 OAuth 授权服务器的唯一标识符。
将 AUDIENCE CLAIM VALUE 更新为 Snowflake 账户 URL(例如
https://<account_identifier>.snowflakecomputing.cn
)。有关可能的 URL 格式的列表,请参阅 与 URL 连接。
从 开发者工具 (https://www.pingidentity.com/en/resources/downloads/pingfederate.html) 部分下载 PingFederate OAuth Playground 插件。该客户端执行 API 请求。
安装 OAuth Playground (https://www.pingidentity.com/content/dam/developer/downloads/Software/OAuth%20Grant%20Types%20using%20the%20OAuth%20PlayGround.pdf)。
在 Snowflake 中创建安全集成¶
此步骤在 Snowflake 中创建了一个安全集成,以确保 Snowflake 可以安全地与 PingIdentity 通信,验证来自 PingIdentity 的令牌,并根据与 OAuth 令牌相关联的用户角色为用户提供适当的 Snowflake 数据访问。
在 Snowflake Web 界面或 SnowSQL 中执行以下语句。
请注意, external_oauth_issuer
的值必须是在步骤 1.8 中设置的唯一标识符。例如,如果唯一标识符值为 27f10cde-a964-4499-a88c-0c598883e5ad
,将 <unique_id>
替换为 '27f10cde-a964-4499-a88c-0c598883e5ad'
。唯一标识符必须使用单引号(即垂直引号)。
选择最能满足您的用例和配置需求的安全集成。有关更多信息,请参阅 CREATE SECURITY INTEGRATION。
重要
只有账户管理员(即具有 ACCOUNTADMIN 角色的用户)或具有全局 CREATE INTEGRATION 权限的角色才能执行此 SQL 命令。
安全集成参数值区分大小写,您输入到安全集成中的值必须与您的环境中的值相匹配。如果大小写不匹配,则可能无法验证访问令牌,从而导致身份验证尝试失败。
为 PingFederate 创建安全集成
create or replace security integration external_oauth_pf_1 type = external_oauth enabled = true external_oauth_type = ping_federate external_oauth_rsa_public_key = '<BASE64_PUBLIC_KEY>' external_oauth_issuer = '<unique_id>' external_oauth_token_user_mapping_claim = 'username' external_oauth_snowflake_user_mapping_attribute = 'login_name';此安全集成使用
external_oauth_rsa_public_key
参数。Snowflake 使用公钥值来验证 JWT 访问令牌上的签名。
与受众创建安全集成
安全集成的
external_oauth_audience_list
参数必须与您在配置 PingFederate 时指定的 Audience Claim Value 匹配。create security integration external_oauth_pf_2 type = external_oauth enabled=true external_oauth_type = ping_federate external_oauth_issuer = '<ISSUER>' external_oauth_rsa_public_key = '<BASE64_PUBLIC_KEY>' external_oauth_audience_list = ('<snowflake_account_url>') external_oauth_token_user_mapping_claim = 'username' external_oauth_snowflake_user_mapping_attribute = 'login_name';此安全集成使用
external_oauth_rsa_public_key
参数。Snowflake 使用公钥值来验证 JWT 访问令牌上的签名。
修改 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;
revoke USE_ANY_ROLE on integration external_oauth_1 from role1;
定义安全集成如下:
create security integration external_oauth_1
type = external_oauth
enabled = true
external_oauth_any_role_mode = 'ENABLE'
...
将次要角色与 External OAuth 结合使用¶
主要角色所需的范围在外部令牌中传递:用户的默认角色 (session:role-any
) 或授予用户的特定角色 (session:role:<role_name>
)。
默认情况下,Snowflake 不会 激活会话中用户(即 DEFAULT_SECONDARY_ROLES)的默认 次要角色。
要激活会话中用户的默认次要角色,并允许在使用 External OAuth 时执行 USE SECONDARY ROLES 命令,请完成以下步骤:
配置连接的安全集成。在创建安全集成(使用 CREATE SECURITY INTEGRATION)或更高版本(使用 ALTER SECURITY INTEGRATION)时,将 EXTERNAL_OAUTH_ANY_ROLE_MODE 参数值设置为 ENABLE 或 ENABLE_FOR_PRIVILEGE。
配置授权服务器以在令牌的范围属性中传递
session:role-any
的静态值。有关范围参数的更多信息,请参阅 External OAuth 概览。
将网络策略与 External OAuth 结合使用¶
目前,网络策略无法添加到您的 External OAuth 安全集成。但是,您仍然可以实施广泛应用于整个 Snowflake 账户的网络策略。
如果您的用例需要特定于 OAuth 安全集成的网络策略,请使用 Snowflake OAuth。这种方法允许 Snowflake OAuth 网络策略与可能适用于 Snowflake 账户的其他网络策略不同。
有关更多信息,请参阅 网络策略。
将副本与 External OAuth 结合使用¶
Snowflake 支持 External OAuth 安全集成从源账户到目标账户的复制和故障切换/故障回复。
有关详细信息,请参阅 跨多个账户复制安全集成和网络策略。
测试过程¶
在使用 PingFederate 作为授权服务器测试 OAuth 的情况下,您必须:
验证测试用户是否存在于 PingIdentity 并有一个密码。
验证 Snowflake 中是否存在测试用户,且其
login_name
属性值设置为<PING_USER_USERNAME>
向该用户授予分析师角色。
注册 OAuth 客户端。
允许 OAuth 客户端向 PingFederate 令牌端点发出 POST 请求,如下所示:
授予类型设置为资源所有者。
HTTP 基本授权标头包含 clientID 和密钥。
FORM 数据包含用户的用户名和密码。
包括任何必要的作用域。
示例命令请求 Analyst,并假定在 PingFederate > OAuth Server > Exclusive Scopes 中定义 session:role:analyst
。
使用以下命令从 Ping 获取访问令牌。
curl -k 'https://10.211.55.4:9031/as/token.oauth2' \
--data-urlencode 'client_id=<CLIENT_ID>&grant_type=password&username=<USERNAME>&password=<PASSWORD>&client_secret=<CLIENT_SECRET>&scope=session:role:analyst'
通过 External OAuth 连接到 Snowflake¶
配置安全集成并获取访问令牌后,您可以使用以下方法之一连接到 Snowflake:
Go 驱动程序 (https://godoc.org/github.com/snowflakedb/gosnowflake#hdr-Connection_Parameters)
.NET 驱动程序 (https://github.com/snowflakedb/snowflake-connector-net/blob/master/README.md#create-a-connection)
请注意以下事项:
必须将
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"
)
您现在可以使用 External OAuth 安全连接到 Snowflake。