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
属性的值。
账户管理员(即被授予 ACCOUNTADMIN 系统角色的用户)也可以使 用:ref:label-authentication_policy_hardening_authentication
强制用户 注册 MFA。
使用 MFA 连接到 Snowflake¶
MFA 登录主要用于通过 Web 界面连接到 Snowflake,但也完全支持 SnowSQL 和 Snowflake JDBC、Node.js 与 ODBC 驱动程序。
使用 MFA 令牌缓存,最大限度地减少身份验证过程中的提示次数 – 可选¶
MFA 令牌缓存有助于减少在连接和验证 Snowflake 时必须确认的提示次数,尤其是在相对较短的时间间隔内进行多次连接尝试时。
缓存的 MFA 令牌的有效期最长为四个小时。
如果满足以下任何条件,缓存的 MFA 令牌将无效:
账户的 ALLOW_CLIENT_MFA_CACHING 参数设置为 FALSE。
身份验证方法发生变化。
身份验证凭证(即用户名和/或密码)更改。
身份验证凭据无效。
缓存的令牌已过期或加密无效。
与缓存令牌相关的账户名称发生变化。
Snowflake 用于缓存 MFA 令牌的整体流程与用于缓存基于浏览器的联合 单点登录 的连接令牌的流程类似。客户端应用程序将 MFA 令牌存储在客户端操作系统的密钥库中。用户可以随时从密钥库中删除缓存的 MFA 令牌。
Snowflake 在 macOS 和 Windows 上使用以下驱动程序、连接器和工具支持 MFA 令牌缓存。Linux 不支持此功能。
Snowflake CLI 3.0 版本(或更高版本)
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,请执行以下操作:
将 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 与 Node.js 配合使用¶
MFA 可用于通过 Snowflake Node.js 驱动程序连接到 Snowflake。默认情况下,用户注册 MFA 时会使用 Duo Push 身份验证机制。
要使用 Duo 生成的代码代替推送机制,登录参数必须包括以下连接选项之一。两个示例都使用密码 abc123
和 MFA 代码 987654
来演示配置。
将
passcodeInPassword
选项设置为true
,并将代码作为密码字符串的一部分,类似于下面的内容:authenticator: 'USERNAME_PASSWORD_MFA', password: "abc123987654", // passcode 987654 is part of the password passcodeInPassword: true // because passcodeInPassword is true
将
passcode
选项设置为代码的值,以分别指定密码和代码,类似于下面的内容:authenticator: 'USERNAME_PASSWORD_MFA', password: "abc123", // password and MFA passcode are input separately passcode: "987654"
要使用这种方法,请确保
passcodeInPassword
选项为false`(默认值)。如果 :codenowrap:`passcodeInPassword
同时设置为``true`` 和passcode
,则passcodeInPassword
设置优先,在身份验证时,驱动程序会假定password
字段同时包含密码和 MFA 代码。
有关更多详细信息,请参阅 使用 MFA 密码。
将 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。提供密码作为连接字符串的一部分。 |