MFA(多重身份验证)

Snowflake 支持多重身份身份验证(即 MFA),为连接到 Snowflake 的用户提供更高的登录安全性。MFA 支持作为 Snowflake 的一项集成功能提供,由 Duo Security (http://www.duosecurity.com) 服务提供技术支持,并且完全由 Snowflake 管理。

除了安装 Duo Mobile 应用程序(支持多种智能手机平台 [iOS、Android、Windows 等])外,用户无需单独注册 Duo 或执行任何其他任务。有关支持的平台/设备以及 Duo 多重素身份验证工作原理的更多信息,请参阅 Duo 用户指南 (http://guide.duosecurity.com/)。

MFA 以每个用户为单位启用,但目前用户不会自动注册 MFA。要使用 MFA,用户必须自行注册。

注意

Snowflake 强烈 建议至少要求具有 ACCOUNTADMIN 角色的所有用户使用 MFA。

本主题内容:

先决条件

Duo 应用程序服务通过 TCP 端口 443 进行通信。

为确保行为一致,请更新防火墙设置,将 Duo 应用程序服务纳入 TCP 端口 443

*.duosecurity.com:443
Copy

有关更多信息,请参阅 Duo 文档 (https://duo.com/docs/duoweb#first-steps)。

MFA 登录流程

下图说明了注册 MFA 的用户的整体登录流程,无论使用何种接口进行连接:

MFA 登录流程

为 Snowflake 用户注册 MFA

任何 Snowflake 用户都可以通过 Web 界面自行注册 MFA。有关更多信息,请参阅 使用 Snowsight 管理您的用户简介

切换用于 MFA 的手机

即时还原是 Duo 的一项功能,允许用户在切换到新手机之前备份 Duo 应用程序。只要 Snowflake 用户先备份旧手机,就可以使用即时还原功能在新手机上启用身份验证,而不会中断 Snowflake 的 MFA。

如果用户没有备份旧手机或丢失了旧手机,Snowflake 账户管理员必须为使用旧手机的每个用户名 禁用 MFA,然后才能在新手机上重新启用 MFA。

为账户和用户管理 MFA

在账户层面, MFA 无需管理。它会自动为账户启用,并供所有用户自助注册。但是,账户管理员(即被授予 ACCOUNTADMIN 系统角色的用户)可能会发现需要暂时或永久禁用某个用户的 MFA,例如,如果用户丢失了手机或更改了电话号码,就无法使用 MFA 登录。

账户管理员可以使用 ALTER USER 命令的以下属性来执行这些任务:

  • MINS_TO_BYPASS_MFA

    指定暂时禁用 MFA,用户在此之后才能登录的分钟数。此时间过后, MFA 会强制执行,如果没有 Duo Mobile 应用程序生成的临时令牌,用户将无法登录。

  • DISABLE_MFA

    为用户禁用 MFA,有效取消用户注册。可能需要刷新浏览器来验证用户是否不再注册 MFA。要再次使用 MFA,用户必须重新注册。

    备注

    DISABLE_MFA 不是任何 Snowflake 表或视图中的列。账户管理员执行 ALTER USER 命令将 DISABLE_MFA 设置为 TRUE 后, EXT_AUTHN_DUO 属性的值将自动设置为 FALSE

    要验证特定用户的 MFA 是否已禁用,请执行 DESCRIBE USER 语句并检查 EXT_AUTHN_DUO 属性的值。

使用 MFA 连接到 Snowflake

MFA 登录主要用于通过 Web 界面连接到 Snowflake,但也完全支持 SnowSQL 和 Snowflake JDBC 与 ODBC 驱动程序。

使用 MFA 令牌缓存,最大限度地减少身份验证过程中的提示次数 – 可选

MFA 令牌缓存有助于减少在连接和验证 Snowflake 时必须确认的提示次数,尤其是在相对较短的时间间隔内进行多次连接尝试时。

缓存的 MFA 令牌的有效期最长为四个小时。

如果满足以下任何条件,缓存的 MFA 令牌将无效:

  1. 账户的 ALLOW_CLIENT_MFA_CACHING 参数设置为 FALSE。

  2. 身份验证方法发生变化。

  3. 身份验证凭证(即用户名和/或密码)更改。

  4. 身份验证凭据无效。

  5. 缓存的令牌已过期或加密无效。

  6. 与缓存令牌相关的账户名称发生变化。

Snowflake 用于缓存 MFA 令牌的整体流程与用于缓存基于浏览器的联合 单点登录 的连接令牌的流程类似。客户端应用程序将 MFA 令牌存储在客户端操作系统的密钥库中。用户可以随时从密钥库中删除缓存的 MFA 令牌。

Snowflake 在 macOS 和 Windows 上使用以下驱动程序和连接器支持 MFA 令牌缓存。Linux 不支持此功能。

  • ODBC 驱动程序 2.23.0 版本(或更高版本)

  • JDBC 驱动程序 3.12.16 版本(或更高版本)

  • Python Connector for Snowflake 2.3.7 版本(或更高版本)。

Snowflake 建议在启用 MFA 令牌缓存之前咨询内部安全和合规管理人员。

小技巧

MFA 令牌缓存可与联合 单点登录 中的连接缓存相结合。

要结合这两项功能,请确保 ALLOW_ID_TOKEN 参数与 ALLOW_CLIENT_MFA_CACHING 参数一起设置为 true

要启用 MFA 令牌缓存,请完成以下步骤:

  1. 作为账户管理员(即具有 ACCOUNTADMIN 系统角色的用户),使用 ALTER ACCOUNT 命令将账户的 ALLOW_CLIENT_MFA_CACHING 参数设置为 true

    ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
    
    Copy
  2. 在客户端连接字符串中,将身份验证器值更新为 authenticator = username_password_mfa

  3. 添加驱动程序或连接器所需的包或库:

    • 如果您使用的是 Snowflake Connector for Python,请运行以下命令来安装可选的 keyring 包:

      pip install "snowflake-connector-python[secure-local-storage]"
      
      Copy

      必须输入方括号([]),如命令中所示。方括号指定应该安装的 包的额外部分 (https://www.python.org/dev/peps/pep-0508/#extras)。

      如图所示,使用引号将包名称括起来,以防止系统将方括号解释为通配符。

      如果您需要安装其他附加内容(例如,安装 pandas,以 使用 Python Connector APIs for Pandas,请使用逗号分隔多个附加内容。

      pip install "snowflake-connector-python[secure-local-storage,pandas]"
      
      Copy
    • 对于 Snowflake JDBC 驱动程序,请参阅 将 JNA 类添加到类路径

要禁用 MFA 令牌缓存,请取消设置 ALLOW_CLIENT_MFA_CACHING 参数:

ALTER ACCOUNT UNSET ALLOW_CLIENT_MFA_CACHING;
Copy

要查找使用 MFA 令牌缓存作为第二因素身份验证进行登录的所有用户,可以账户管理员(具有 ACCOUNTADMIN 角色的用户)身份执行以下 SQL 语句:

SELECT EVENT_TIMESTAMP,
       USER_NAME,
       IS_SUCCESS
  FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
  WHERE SECOND_AUTHENTICATION_FACTOR = 'MFA_TOKEN';
Copy

将 MFA 与 Snowsight 配合使用

要使用 MFA 登录 Snowsight,请执行以下操作:

  1. 登录 Snowsight

  2. 输入您的凭据(用户登录名和密码)。

  3. 如果启用了 Duo Push,您可以选择通知方式。如果选择 Send Me a Push,推送通知将发送到您的 Duo Mobile 应用程序。收到通知时选择 Approve,您将登录到 Snowflake。

    带有 Send Me a Push、Call Me 和 Enter a Passcode 选项的 MFA 选择对话框。

    如上所示,除了使用推送通知之外,您还可以选择以下选项:

    • 选择 Call Me,通过拨打已注册移动设备的电话来接收登录指令。

    • 选择 Enter a Passcode,通过手动输入 Duo Mobile 应用程序提供的密码来登录。

将 MFA 与 Classic Console Web 界面配合使用

使用 MFA 登录 Classic Console:

  1. 将浏览器指向您 账户 的 URL。例如:https://myorg-account1.snowflakecomputing.cn

  2. 输入您的凭据(用户登录名和密码)。

  3. 如果启用了 Duo Push,推送通知将发送到您的 Duo Mobile 应用程序。收到通知时选择 Approve,您将登录到 Snowflake。

    带有 Send Me a Push、Call Me 和 Enter a Passcode 选项的 MFA 选择对话框。

    如上图所示,除了使用推送通知之外,您还可以选择以下选项:

    • 选择 Call Me,通过拨打已注册移动设备的电话来接收登录指令。

    • 选择 Enter a Passcode,通过手动输入 Duo Mobile 应用程序提供的密码来登录。

将 MFA 与 SnowSQL 配合使用

MFA 可用于通过 SnowSQL 连接到 Snowflake。默认情况下,用户注册 MFA 时会使用 Duo Push 身份验证机制。

要使用 Duo 生成的密码而不是推送机制,登录参数必须包含以下连接选项之一:

--mfa-passcode <string> OR --mfa-passcode-in-password

有关更多详细信息,请参阅 SnowSQL(CLI 客户端)

将 MFA 与 JDBC 配合使用

MFA 可用于通过 Snowflake JDBC 驱动程序连接到 Snowflake。默认情况下,当用户注册 MFA 时将使用 Duo Push 身份验证机制;无需更改 JDBC 连接字符串。

要使用 Duo 生成的密码而不是推送机制,必须在 JDBC 连接字符串中包含以下参数之一:

passcode=<passcode_string> OR passcodeInPassword=on

其中:

  • passcode_string 是 Duo 为正在连接的用户生成的密码。它可以是 Duo Mobile 应用程序生成的密码,也可以是 SMS 密码。

  • 如果 passcodeInPassword=on,那么密码和密码将以 <password_string><passcode_string> 的形式连接起来。

有关更多详细信息,请参阅 JDBC 驱动程序

使用 Duo 的 JDBC 连接字符串示例

用户 demo 使用 Duo 密码连接到 xy12345 账户( US 西部区域)的 JDBC 连接字符串:

jdbc:snowflake://xy12345.snowflakecomputing.cn/?user=demo&passcode=123456
Copy

用户 demo 使用嵌入密码的 Duo 密码连接到 xy12345 账户( US 西部区域)的 JDBC 连接字符串:

jdbc:snowflake://xy12345.snowflakecomputing.cn/?user=demo&passcodeInPassword=on
Copy

将 MFA 与 ODBC 配合使用

MFA 可用于通过 Snowflake ODBC 驱动程序连接到 Snowflake。默认情况下,当用户注册 MFA 时将使用 Duo Push 身份验证机制;无需更改 ODBC 设置。

要使用 Duo 生成的密码而不是推送机制,必须为驱动程序指定以下参数之一:

passcode=<passcode_string> OR passcodeInPassword=on

其中:

  • passcode_string 是 Duo 为正在连接的用户生成的密码。它可以是 Duo Mobile 应用程序生成的密码,也可以是 SMS 密码。

  • 如果 passcodeInPassword=on,那么密码和密码将以 <password_string><passcode_string> 的形式连接起来。

有关更多详细信息,请参阅 ODBC 驱动程序

将 MFA 与 Python 配合使用

MFA 可用于通过 Snowflake Python Connector 连接到 Snowflake。默认情况下,当用户注册 MFA 时将使用 Duo Push 身份验证机制;无需更改 Python API 调用。

要使用 Duo 生成的密码而不是推送机制,必须在 connect() 方法中为驱动程序指定以下参数之一:

passcode=<passcode_string> OR passcode_in_password=True

其中:

  • passcode_string 是 Duo 为正在连接的用户生成的密码。它可以是 Duo Mobile 应用程序生成的密码,也可以是 SMS 密码。

  • 如果 passcode_in_password=True,那么密码和密码将以 <password_string><passcode_string> 的形式连接起来。

更多详情,请参阅 Python Connector API 文档中 函数 部分对 connect() 方法的描述。

MFA 错误代码

以下是在身份验证流程中可能返回的与 MFA 相关的错误代码。

每次登录尝试失败时都会显示错误。历史数据也可在 Snowflake Information SchemaAccount Usage 中找到:

错误代码

错误

描述

390120

EXT_AUTHN_DENIED

Duo Security 身份验证被拒绝。

390121

EXT_AUTHN_PENDING

Duo Security 身份验证正在等待中。

390122

EXT_AUTHN_NOT_ENROLLED

用户未注册 Duo Security。请联系本地系统管理员。

390123

EXT_AUTHN_LOCKED

用户已被 Duo Security 锁定。请联系本地系统管理员。

390124

EXT_AUTHN_REQUESTED

需要 Duo Security 身份验证。

390125

EXT_AUTHN_SMS_SENT

Duo Security 临时密码通过 SMS 发送。请使用密码进行身份验证。

390126

EXT_AUTHN_TIMEOUT

通过 Duo Mobile 等待登录请求批准的时间已过。如果您的移动设备没有数据服务,请生成 Duo 密码并将其输入连接字符串。

390127

EXT_AUTHN_INVALID

指定的密码不正确。

390128

EXT_AUTHN_SUCCEEDED

Duo Security 身份验证成功。

390129

EXT_AUTHN_EXCEPTION

由于与外部服务提供商的通信问题,请求无法完成。请稍后再试。

390132

EXT_AUTHN_DUO_PUSH_DISABLED

您的 MFA 未启用 Duo Push。提供密码作为连接字符串的一部分。

语言: 中文