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
有关更多信息,请参阅 Duo 文档 (https://duo.com/docs/duoweb#first-steps)。
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 令牌将无效:
账户的 ALLOW_CLIENT_MFA_CACHING 参数设置为 FALSE。
身份验证方法发生变化。
身份验证凭证(即用户名和/或密码)更改。
身份验证凭据无效。
缓存的令牌已过期或加密无效。
与缓存令牌相关的账户名称发生变化。
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 令牌缓存,请完成以下步骤:
作为账户管理员(即具有 ACCOUNTADMIN 系统角色的用户),使用 ALTER ACCOUNT 命令将账户的 ALLOW_CLIENT_MFA_CACHING 参数设置为
true
。ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;
在客户端连接字符串中,将身份验证器值更新为
authenticator = username_password_mfa
。添加驱动程序或连接器所需的包或库:
如果您使用的是 Snowflake Connector for Python,请运行以下命令来安装可选的 keyring 包:
pip install "snowflake-connector-python[secure-local-storage]"
必须输入方括号(
[
和]
),如命令中所示。方括号指定应该安装的 包的额外部分 (https://www.python.org/dev/peps/pep-0508/#extras)。如图所示,使用引号将包名称括起来,以防止系统将方括号解释为通配符。
如果您需要安装其他附加内容(例如,安装
pandas
,以 使用 Python Connector APIs for Pandas,请使用逗号分隔多个附加内容。pip install "snowflake-connector-python[secure-local-storage,pandas]"
对于 Snowflake JDBC 驱动程序,请参阅 将 JNA 类添加到类路径。
要禁用 MFA 令牌缓存,请取消设置 ALLOW_CLIENT_MFA_CACHING 参数:
ALTER ACCOUNT UNSET ALLOW_CLIENT_MFA_CACHING;
要查找使用 MFA 令牌缓存作为第二因素身份验证进行登录的所有用户,可以账户管理员(具有 ACCOUNTADMIN 角色的用户)身份执行以下 SQL 语句:
SELECT EVENT_TIMESTAMP,
USER_NAME,
IS_SUCCESS
FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE SECOND_AUTHENTICATION_FACTOR = 'MFA_TOKEN';
将 MFA 与 Snowsight 配合使用¶
要使用 MFA 登录 Snowsight,请执行以下操作:
输入您的凭据(用户登录名和密码)。
如果启用了 Duo Push,您可以选择通知方式。如果选择 Send Me a Push,推送通知将发送到您的 Duo Mobile 应用程序。收到通知时选择 Approve,您将登录到 Snowflake。
如上所示,除了使用推送通知之外,您还可以选择以下选项:
选择 Call Me,通过拨打已注册移动设备的电话来接收登录指令。
选择 Enter a Passcode,通过手动输入 Duo Mobile 应用程序提供的密码来登录。
将 MFA 与 Classic Console Web 界面配合使用¶
使用 MFA 登录 Classic Console:
将浏览器指向您 账户 的 URL。例如:
https://myorg-account1.snowflakecomputing.cn
。输入您的凭据(用户登录名和密码)。
如果启用了 Duo Push,推送通知将发送到您的 Duo Mobile 应用程序。收到通知时选择 Approve,您将登录到 Snowflake。
如上图所示,除了使用推送通知之外,您还可以选择以下选项:
选择 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>
ORpasscodeInPassword=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
用户 demo
使用嵌入密码的 Duo 密码连接到 xy12345
账户( US 西部区域)的 JDBC 连接字符串:
jdbc:snowflake://xy12345.snowflakecomputing.cn/?user=demo&passcodeInPassword=on
将 MFA 与 ODBC 配合使用¶
MFA 可用于通过 Snowflake ODBC 驱动程序连接到 Snowflake。默认情况下,当用户注册 MFA 时将使用 Duo Push 身份验证机制;无需更改 ODBC 设置。
要使用 Duo 生成的密码而不是推送机制,必须为驱动程序指定以下参数之一:
passcode=<passcode_string>
ORpasscodeInPassword=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>
ORpasscode_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 Schema 和 Account Usage 中找到:
Information Schema提供过去 7 天内的数据,可使用 LOGIN_HISTORY、LOGIN_HISTORY_BY_USER 表函数进行查询。
Account Usage LOGIN_HISTORY 视图 视图提供过去一年内的数据。
错误代码 |
错误 |
描述 |
---|---|---|
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。提供密码作为连接字符串的一部分。 |