配置 Snowflake 以使用联合身份验证

本主题介绍如何使用 SAML2 安全集成来配置 Snowflake 以进行联合身份验证。本主题假定您已 将 IdP 配置为与 Snowflake 共同使用

备注

SAML2 安全集成将替换已弃用的 SAML_IDENTITY_PROVIDER 账户参数。

如果您的现有 SSO 实施正在使用已弃用的此账户参数,则应先 迁移到 SAML 安全集成,然后再继续配置 Snowflake 以进行联合身份验证。

只要存在使用已弃用账户参数的实施,Snowflake 就会继续支持该已弃用的账户参数。

本主题内容:

创建 SAML2 安全集成

Snowflake 使用 SAML2 安全集成与您使用的 IdP 进行集成,用于实施联合身份验证。使用 CREATE SECURITY INTEGRATION 命令开始为 SSO 配置 Snowflake。

重要

在为 SSO 配置 IdP 时,请为 Snowflake 账户提供 URL。此 URL 的 格式 必须与安全集成属性 SAML2_SNOWFLAKE_ISSUER_URLSAML2_SNOWFLAKE_ACS_URL 中的 URLs 匹配。

如果在创建安全集成时未定义这些属性,则会默认使用账户的 旧 URL 属性。

例如,要为使用具备专用连接的账户名称 URL 创建安全集成,请运行以下 SQL 命令:

CREATE SECURITY INTEGRATION my_idp
  TYPE = saml2
  ENABLED = true
  SAML2_ISSUER = 'https://example.com'
  SAML2_SSO_URL = 'http://myssoprovider.com'
  SAML2_PROVIDER = 'ADFS'
  SAML2_X509_CERT = 'MIICr...'
  SAML2_SNOWFLAKE_ISSUER_URL = 'https://<orgname>-<account_name>.privatelink.snowflakecomputing.cn'
  SAML2_SNOWFLAKE_ACS_URL = 'https://<orgname>-<account_name>.privatelink.snowflakecomputing.cn/fed/login';
Copy

请注意,/fed/login 将会追加到 SAML2_SNOWFLAKE_ACS_URL 属性的 URL 中。有关 Snowflake 账户 URL 格式的更多详细信息,请参阅 与 URL 连接

配置 SAML2 安全集成后,您可以使用安全集成执行以下任务:

  • 加密 SAML 断言

  • 发送已签名的 SAML 请求

  • 指定 SAML NameID 格式

  • 导出 SAML2 安全集成元数据

  • Snowflake 的强制重新身份验证过程

备注

如果您的账户是 Business Critical Edition 或更高版本,则可以 搭配使用 SAML2 安全集成和 Client Redirect

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

为用户配置 SSO 登录

创建 SAML2 安全集成后,您可以配置用户是从 IdP 还是从 Snowflake 开始 SSO 登录。

已启用 IdP 的 SSO 不需要在 Snowflake 中进行配置。您只需要告知用户如何访问 Snowflake 即可(例如,使用内部门户)。

SAML2_ENABLE_SP_INITIATED 属性会启用已启用 Snowflake 的 SSO。SAML2_SP_INITIATED_LOGIN_PAGE_LABEL 属性会定义一个字符串,用于标识 IdP。此字符串会显示在 Snowflake 登录页面上,以便用户访问 IdP。

使用 ALTER SECURITY INTEGRATION 命令设置以下属性:

ALTER SECURITY INTEGRATION my_idp SET SAML2_ENABLE_SP_INITIATED = true;
ALTER SECURITY INTEGRATION my_idp SET SAML2_SP_INITIATED_LOGIN_PAGE_LABEL = 'My IdP';
Copy

有关在为用户配置 SSO 登录后,客户端会如何连接到 Snowflake 的详细信息,请参阅 为连接到 Snowflake 的客户端应用程序使用 SSO

加密 SAML 断言

SAML2_SNOWFLAKE_X509_CERT 属性可确保使用 Snowflake 的公共证书对 SAML2 断言进行加密,从而在用户通过联合身份验证访问 Snowflake 时保护流量。

收到来自客户 IdP 的加密断言后,Snowflake 会使用其私钥为加密断言解密。Snowflake 从不导出或提供其私钥。

要加密 SAML 断言,请参阅以下部分。

从 Snowflake 导出公共证书

创建 SAML2 安全集成 后,请按照以下步骤操作:

  1. 在 SAML2 集成上执行以下 SQL 语句。

    DESC SECURITY INTEGRATION my_idp;
    
    Copy
  2. 在第 7 行中找到值 SAML2_SNOWFLAKE_X509_CERT,该值是 PEM 格式的公共证书。

  3. 保存值,确保包含 BEGIN CERTIFICATEEND CERTIFICATE 分隔符。例如,下方的代码块包含 PEM 格式的已截断证书:

    -----BEGIN CERTIFICATE-----
    MIICr...
    -----END CERTIFICATE-----
    
    Copy

创建证书签名请求 (CSR) – 可选

默认情况下,Snowflake 中的 SAML2 安全集成为 SAML IdP 使用自签名证书来加密 SAML 断言。如果您的组织需要使用证书颁发机构颁发的证书 (CA),请完成以下步骤:

  1. 使用系统函数 SYSTEM$GENERATE_SAML_CSR 从 Snowflake 生成证书签名请求 (CSR)。

  2. 为选择的 CA 提供 CSR,以便发布证书。

  3. 使用以下 ALTER 语句将 Base64 编码的证书上传到 SAML 集成中,不带 BEGIN CERTIFICATEEND CERTIFICATE 分隔符。

    ALTER SECURITY INTEGRATION my_idp SET SAML2_SNOWFLAKE_X509_CERT = 'AX2bv...';
    
    Copy
  4. 执行 DESCRIBE INTEGRATION 命令以查看更新后的安全集成:

    DESC SECURITY INTEGRATION my_idp;
    
    Copy

然后,您可以使用函数生成的 CSR 将私钥证书上传到 Snowflake 中。

配置 SAML IdP

  1. 将 PEM 格式的已保存证书作为 SAML 加密证书上传到组织的 IdP。

  2. 配置 IdP,为 Snowflake 服务提供商的 SAML 断言加密 (SP)。

发送已签名的 SAML 请求

您可以从 Snowflake 向 IdP 发送已签名的 SAML 请求,验证 Snowflake 是否为真实的服务提供商。要验证 Snowflake,可以将 IdP 配置为使用存储在 SAML2 安全集成中的证书,以确保 SAML 请求来自 Snowflake,而不是冒充 Snowflake 的第三方。

设置 SAML2_SIGN_REQUEST 属性

如果是首次 创建 SAML2 安全集成,请确保设置了 SAML2_SIGN_REQUEST 属性。

如果在未设置 SAML2_SIGN_REQUEST 属性的情况下创建了 SAML2 安全集成,请执行以下步骤:

  1. 使用能够更新安全集成的 ACCOUNTADMIN 角色的用户身份执行 ALTER SECURITY INTEGRATION 命令:

    ALTER SECURITY INTEGRATION my_idp SET SAML2_SIGN_REQUEST = true;
    
    Copy
  2. 执行 DESCRIBE INTEGRATION 命令以查看更新后的安全集成:

    DESC SECURITY INTEGRATION my_idp;
    
    Copy

配置 IdP 以接受已签名请求

配置 IdP 以接受来自 Snowflake 的已签名请求。在配置过程中,IdP 需要将证书存储在 SAML2_SNOWFLAKE_X509_CERT 属性中。IdP 会使用此证书来验证 SAML 请求是否来自 Snowflake。

备注

Snowflake 不负责配置您的 IdP。有关配置 IdP 的帮助,请咨询您的内部安全管理员。

  1. 执行 DESCRIBE INTEGRATION 命令:

    DESC SECURITY INTEGRATION my_idp;
    
    Copy
  2. SAML2_SNOWFLAKE_X509_CERT 属性的值保存在第 7 行中,以便在 IdP 设置中使用。

指定 SAML NameID 格式

Snowflake 支持允许管理员(即具有 ACCOUNTADMIN 角色的用户)指定将在从 Snowflake 发送到 IdP 的传出 SAML 身份验证请求中请求的 SAML NameID 格式。

指定 SAML NameID 格式允许 Snowflake 在来自 SAML 的 IdP 断言中设置对用户识别属性的预期(即 SAML 主题),从而确保对 Snowflake 的身份验证有效。

SAML NameID 格式可以集成到 SAML2 安全集成中。您可以使用以下值中的一个在安全集成中指定 SAML NameID

  • urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified

  • urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

  • urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName

  • urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName

  • urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos

  • urn:oasis:names:tc:SAML:2.0:nameid-format:persistent

  • urn:oasis:names:tc:SAML:2.0:nameid-format:transient

如果未指定 SAML NameID 格式,Snowflake 将使用以下值:

urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress

设置 SAML2_REQUESTED_NAMEID_FORMAT 属性

如果是首次 创建 SAML2 安全集成,请确保设置了 SAML2_REQUESTED_NAMEID_FORMAT 属性。

如果在未设置 SAML2_REQUESTED_NAMEID_FORMAT 属性的情况下创建了 SAML2 安全集成,请执行以下步骤:

  1. 使用具有 ACCOUNTADMIN 角色的用户来执行 ALTER SECURITY INTEGRATION 命令以指定 SAML NameId 格式:

    ALTER SECURITY INTEGRATION my_idp SET SAML2_REQUESTED_NAMEID_FORMAT = '<string_literal>';
    
    Copy
  2. 执行 DESCRIBE INTEGRATION 命令以查看更新后的安全集成:

    DESC SECURITY INTEGRATION my_idp;
    
    Copy

配置 IdP 以指定 NameID

配置 IdP 以指定 SAML 断言中的 SAML NameID 格式。

备注

Snowflake 不负责配置您的 IdP。有关配置 IdP 的帮助,请咨询您的内部安全管理员。

导出 SAML2 安全集成元数据

Snowflake 为 SAML2 安全集成提供了 SAML 2.0 元数据,以便在 IdP 中更快速地配置 Snowflake 服务提供商。

SAML 2.0 元数据包含在 SAML2_SNOWFLAKE_METADATA 属性中,可以通过在 SAML2 安全集成上执行 DESCRIBE INTEGRATION 命令来获取。例如:

DESC SECURITY INTEGRATION my_idp;
Copy
------------------------------------+---------------+-----------------------------------------------------------------------------+------------------+
              property              | property_type |                               property_value                                | property_default |
------------------------------------+---------------+-----------------------------------------------------------------------------+------------------+
SAML2_X509_CERT                     | String        | MIICr...                                                                    |                  |
SAML2_PROVIDER                      | String        | OKTA                                                                        |                  |
SAML2_ENABLE_SP_INITIATED           | Boolean       | false                                                                       | false            |
SAML2_SP_INITIATED_LOGIN_PAGE_LABEL | String        | my_idp                                                                      |                  |
SAML2_SSO_URL                       | String        | https://okta.com/sso                                                        |                  |
SAML2_ISSUER                        | String        | https://okta.com                                                            |                  |
SAML2_SNOWFLAKE_X509_CERT           | String        | MIICr...                                                                    |                  |
SAML2_REQUESTED_NAMEID_FORMAT       | String        | urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress                      |                  |
SAML2_SNOWFLAKE_ACS_URL             | String        | https://example.snowflakecomputing.cn/fed/login                            |                  |
SAML2_SNOWFLAKE_ISSUER_URL          | String        | https://example.snowflakecomputing.cn                                      |                  |
SAML2_SNOWFLAKE_METADATA            | String        | <md:EntityDescriptor entityID="https://example.snowflakecomputing.cn"> ... |                  |
SAML2_DIGEST_METHODS_USED           | String        | http://www.w3.org/2001/04/xmlenc#sha256                                     |                  |
SAML2_SIGNATURE_METHODS_USED        | String        | http://www.w3.org/2001/04/xmldsig-more#rsa-sha256                           |                  |
------------------------------------+---------------+-----------------------------------------------------------------------------+------------------+

作为代表性示例, SAML2_SNOWFLAKE_METADATA 属性的格式化 SAML 2.0 XML 元数据如下所示。请注意,signingencryptionX509certificate 值已截断。

<md:EntityDescriptor xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" entityID="https://example.snowflakecomputing.cn">
 <md:SPSSODescriptor AuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
  <md:KeyDescriptor use="signing">
    <dsig:KeyInfo>
      <dsig:X509Data>
        <dsig:X509Certificate>MIICr...</dsig:X509Certificate>
      </dsig:X509Data>
    </dsig:KeyInfo>
  </md:KeyDescriptor>
  <md:KeyDescriptor use="encryption">
    <dsig:KeyInfo>
      <dsig:X509Data>
        <dsig:X509Certificate>MIICr...</dsig:X509Certificate>
      </dsig:X509Data>
    </dsig:KeyInfo>
  </md:KeyDescriptor>
  <md:AssertionConsumerService index="0" isDefault="true" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://example.snowflakecomputing.cn/fed/login" />
 </md:SPSSODescriptor>
</md:EntityDescriptor>
Copy

作为参考,下表将 XML 元数据标签映射为 Snowflake SAML2 安全集成属性。

XML 输出

SAML2 安全集成属性

entityID

SAML2_SNOWFLAKE_ISSUER_URL

AuthnRequestsSigned

SAML2_SIGN_REQUEST

签名证书

SAML2_SNOWFLAKE_X509_CERT

加密证书

SAML2_SNOWFLAKE_X509_CERT

断言使用者服务 URL

SAML2_SNOWFLAKE_ACS_URL

Snowflake 的强制重新身份验证

在初始身份验证 SSO 流程或当前 Snowflake 会话过期时,Snowflake 支持通过配置 SAML2 安全集成来要求身份验证用户重新进行身份验证以访问 Snowflake。

在 Snowflake SAML2 安全集成中启用此功能时,Snowflake 会在从 Snowflake 到 IdP 的传出 SAML 请求中将 SAML 规格 ForceAuthn 属性设置为 True。IdP 收到将 ForceAuthn 属性设置为 True 的请求后,IdP 会向 Snowflake 发送请求,这会导致提示用户需要重新输入其身份验证凭据(例如用户名、密码)才能访问 Snowflake。

此功能通过重新身份验证提供更强的安全性。此外,重新身份验证提示允许用户输入一组与启动 SSO 访问 Snowflake 时不同的凭据。

重要

在实施此功能之前,请验证 IdP 是否支持在 SSO 身份验证流程期间切换身份。

如果在 Snowflake 中实施了此功能,并且 IdP 不支持在初始 SSO 身份验证流程期间切换身份,则用户可能无法使用在显示重新身份验证提示时提供的不同凭据访问 Snowflake。

如果是首次 创建 SAML2 安全集成,请确保设置了 SAML2_FORCE_AUTHN 属性。

要更新现有 SAML2 安全集成以支持强制重新身份验证以访问 Snowflake,请按照以下步骤操作:

  1. 执行 ALTER SECURITY INTEGRATION 命令以更新安全集成:

    ALTER SECURITY INTEGRATION my_idp SET SAML2_FORCE_AUTHN = true;
    
    Copy
  2. 执行 DESCRIBE INTEGRATION 命令以查看更新后的安全集成:

    DESC SECURITY INTEGRATION my_idp;
    
    Copy

其中:

SAML2_FORCE_AUTHN = TRUE | FALSE

指示在初始身份验证流程期间是否强制用户再次进行身份验证以访问 Snowflake 的布尔值。设置为 TRUE 时,Snowflake 会在从 Snowflake 向身份提供者发出的请求中将 ForceAuthn SAML 属性设置为 TRUE

  • 即使存在与身份提供商的有效会话,TRUE 值也会强制用户再次进行身份验证以访问 Snowflake。

  • FALSE 值不会强制用户再次进行身份验证以访问 Snowflake。

默认:FALSE

自定义注销端点

Snowflake 支持定义自定义端点 URL,以便在注销 Snowflake 后将用户重定向到该端点。端点是通过 SAML2 安全集成中的 SAML2_POST_LOGOUT_REDIRECT_URL 属性来设置的。

为通过 SAML SSO 访问 Snowflake 的用户启用后,点击 Classic Console 中的 Log Out 按钮会导致 Snowflake 终止 Snowflake会话,并将用户重定向到指定的端点。

重要

此行为 适用于 Snowsight

通过定义注销端点,管理员可以选择控制用户在注销 Snowflake 后重定向到的位置。例如,自定义端点可以触发脚本,从而同步终止 IdP 会话。此实施的优点是 Snowflake 和 IdP 会话都将终止,强制用户根据 IdP 重新进行身份验证以访问 Snowflake。

如果是首次 创建 SAML2 安全集成,请确保设置了 SAML2_POST_LOGOUT_REDIRECT_URL 属性。

如果在未设置 SAML2_POST_LOGOUT_REDIRECT_URL 属性的情况下创建了 SAML2 安全集成,请执行 ALTER SECURITY INTEGRATION 命令以配置自定义注销端点:

ALTER SECURITY INTEGRATION my_idp SET SAML2_POST_LOGOUT_REDIRECT_URL = 'https://logout.example.com';
Copy

管理 SAML2 安全集成

您可以使用 ALTER SECURITY INTEGRATION 命令来管理 SAML2 安全集成。例如:

  • 将 X.509 证书作为字符串更新到现有的 SAML2 安全集成中。

    ALTER SECURITY INTEGRATION my_idp SET SAML2_X509_CERT = 'AX2bv...';
    
    Copy
  • 如果您是配置了 IdP 来验证 SAML 请求签名或加密 SAML 响应的客户,则可以覆盖现有的私钥和自签名证书,并生成新的私钥和自签名证书:

    1. 生成新的私钥:

      小心

      运行以下命令后,SAML 身份验证将停止工作,因为 IdP 仍在使用旧的 SAML2_SNOWFLAKE_X509_CERT 证书。为了更大程度地减少中断,您应该在用户不那么活跃时运行以下命令。

      ALTER SECURITY INTEGRATION my_idp REFRESH SAML2_SNOWFLAKE_PRIVATE_KEY;
      
      Copy
    2. 在安全集成中检索 SAML2_SNOWFLAKE_X509_CERT 属性的值:

      DESCRIBE SECURITY INTEGRATION my_idp;
      SELECT "property_value" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
        WHERE "property" = 'SAML2_SNOWFLAKE_X509_CERT';
      
      Copy
    3. 将检索到的值上传到 IdP 中,将旧证书替换为 IdP 中的新证书。

  • 启用已签名请求。

    ALTER SECURITY INTEGRATION my_idp SET SAML2_SIGN_REQUEST = true;
    
    Copy
  • 指定 NameID 格式。

    ALTER SECURITY INTEGRATION my_idp SET SAML2_REQUESTED_NAMEID_FORMAT = 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified';
    
    Copy
  • 更新现有安全集成以启用强制重新身份验证。

    ALTER SECURITY INTEGRATION my_idp SET SAML2_FORCE_AUTHN = true;
    
    Copy
  • 更新现有安全集成以禁用强制重新身份验证。

    ALTER SECURITY INTEGRATION my_idp UNSET SAML2_FORCE_AUTHN;
    
    Copy
  • 更新自定义注销端点。

    ALTER SECURITY INTEGRATION my_idp SET SAML2_POST_LOGOUT_REDIRECT_URL = 'https://logout.example.com';
    
    Copy

有关更多信息,请参阅 ALTER SECURITY INTEGRATION

复制 SSO 配置

Snowflake 支持从源账户到目标账户的 SAML2 安全集成 的复制,以及故障转移/故障回复。

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

语言: 中文