MFA(多重身份验证)

多重身份验证 (MFA) 可降低密码身份验证的相关安全风险。密码用户注册 MFA 后,他们在登录 Snowflake 时必须使用第二重身份验证因素。这些用户输入他们的密码,然后使用第二重因素。有关用户如何添加可用作第二重身份验证因素的 MFA 方法的信息,请参阅 配置第二个身份验证因素

MFA 适用于使用密码进行身份验证的 人类用户服务用户 必须使用另一种形式的身份验证。有关这些用户类型的更多信息,请参阅 用户类型

重要

为了改善所有客户的安全状况,Snowflake 正部署变更措施,要求所有密码登录用户都要注册 MFA。有关此次部署的信息,请参阅 为单因素密码登录的弃用做好计划

要求用户注册 MFA

目前,根据启用 2024_08 行为变更捆绑包 时账户是否存在,为您的组织实施 MFA 的策略会有所不同:

  • 如在启用 2024_08 捆绑包之前账户已存在,而且如您要求人类用户使用 MFA,则必须配置您的账户。有关实施 MFA 以要求所有人类用户注册 MFA 的信息,请参阅 使用 MFA 加强用户或账户身份验证

  • 如果账户是在启用 2024_08 捆绑包之后创建,则默认情况下,所有使用密码进行身份验证的人类用户都必须注册 MFA。此 MFA 要求不适用于服务用户。

    如果您要禁用所有人类用户都必须注册 MFA 的要求,请使用 MFA_ENROLLMENT=OPTIONAL 创建自定义身份验证策略,然后在账户上设置身份验证策略。有关创建和设置身份验证策略的详细信息,请参阅 身份验证策略

    请注意,退出强制性 MFA 的功能是临时措施;请参阅 为单因素密码登录的弃用做好计划

限制哪些 MFA 方法可用

当用户注册 MFA 时,他们需要使用一种 MFA 方法作为第二重身份验证因素。Snowflake 允许使用以下 MFA 方法:

  • 使用可通过多种方式存储和访问的密钥进行身份验证。

  • 使用可生成基于时间的一次性密码 (TOTP) 的身份验证器应用程序进行身份验证。

  • 使用 Duo 进行身份验证。

小技巧

在决定允许使用哪些 MFA 方法时,请记住以下几点:

  • 推荐使用密钥,这是因为它们的安全性和可用性。

  • Duo 不像其他 MFA 方法那样可以复制。

作为管理员,您可以使用 身份验证策略 来控制哪些 MFA 方法可以用作第二重身份验证因素。例如,以下身份验证策略允许用户使用密钥或身份验证器应用程序作为第二重身份验证因素,但不允许用户使用 Duo:

CREATE AUTHENTICATION POLICY require_mfa_policy
  MFA_AUTHENTICATION_METHODS = ('PASSWORD')
  MFA_ENROLLMENT = REQUIRED
  MFA_POLICY = (ALLOWED_METHODS = ('PASSKEY', 'TOTP'));
Copy

如果用户之前配置了现已禁止的 MFA 方法,则他们下次登录时,系统会提示他们使用先前存在的方法进行身份验证,然后提示他们配置新的允许方法。

有关 MFA_POLICY 参数的更多信息,请参阅 CREATE AUTHENTICATION POLICY

移除用户的 MFA 方法

您可以移除用户先前添加的 MFA 方法,这样他们就不能再将其用作第二重身份验证因素。

  1. 执行 SHOW MFA METHODS 命令并找到 name 列中的值。例如,如果您要为用户 joe 移除某个 MFA 方法,请执行以下命令并从输出中复制该 MFA 方法的 name

    SHOW MFA METHODS FOR USER joe;
    
    Copy
    +---------------+-----------------+------------------------+-------------------------------+---------------------------------+---------------------+
    |   name        |      type       |    comment             |     last_used                 |        created_on               |  additional_info    |
    +---------------+-----------------+------------------------+-------------------------------+---------------------------------+---------------------+
    | TOTP-48A7     |    TOTP         | Authenticator App 48A7 | 2025-02-26 11:14:38.000 -0800 |  2025-02-26 11:13:19.000 -0800  | null                |
    +---------------+-----------------+------------------------+-------------------------------+---------------------------------+---------------------+
    
  2. 执行 ALTER USER ... REMOVE MFA METHOD 语句以移除 MFA 方法:

    ALTER USER joe REMOVE MFA METHOD TOTP-48A7;
    
    Copy

恢复被锁定的用户

如果密码用户因无法使用第二重身份验证因素而被锁定 Snowflake 账户,管理员可通过以下方式协助他们恢复登录权限:暂时禁用 MFA 或帮助用户 设置新的 MFA 方法

提示用户添加新的 MFA 方法

如果用户无法访问其用作第二重认证因素的 MFA 方法(例如,丢失用于存储密钥的 YubiKey),管理员可协助用户设置新的 MFA 方法,以恢复 Snowflake 登录权限。

当用户无权访问其 MFA 方法而需要设置新方法时,管理员会执行 ALTER USER ... ENROLL MFA 语句。例如,如果用户 joe 需要建立新的 MFA 方法,管理员可以执行以下命令:

ALTER USER joe ENROLL MFA;
Copy
  • 如果用户拥有 经过验证的电子邮件地址,Snowflake 会发送一封电子邮件,提示他们添加 MFA 身份验证方法。

  • 如果用户没有经过验证的电子邮件地址,Snowflake 会返回一个页面的 URL,该页面会提示用户添加 MFA 身份验证方法。管理员可以将此 URL 发送给锁定用户。

暂时禁用 MFA

如果管理员需要暂时为用户禁用 MFA,他们可以执行 ALTER USER ... SET MINS_TO_BYPASS_MFA 语句。例如,要暂时禁用 MFA,以便用户 joe 可以在 30 分钟内使用单因素密码进行身份验证,请执行以下命令:

ALTER USER joe SET MINS_TO_BYPASS_MFA = 30;
Copy

设置管理员紧急访问权限

紧急访问权限是指绕过常规身份验证方法的能力。如果常规身份验证不可用(例如,组织的身份提供商服务中断),管理员需要 Snowflake 紧急访问权限。

在许多情况下,组织会创建专用 Snowflake 用户并将其密码凭据存储在加密密钥库中,以提供紧急访问权限。强制执行 MFA 后,使用此密码的每个管理员都必须有自己的 MFA 方法,可以将其用作第二重身份验证因素。在这些情况下,Snowflake 建议每个管理员设置 TOTP MFA 方法,以便他们可以使用身份验证器应用程序作为第二重因素。在配置 MFA 方法时使用描述性注释可以帮助区分管理员。

使用 MFA 连接到 Snowflake

MFA 登录主要用于通过 Web 界面连接到 Snowflake,但也完全支持 SnowSQL 和 Snowflake JDBC、Node.js 与 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 不支持此功能。

  • 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 令牌缓存,请完成以下步骤:

  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 与 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 与 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
    
    Copy
  • passcode 选项设置为代码的值,以分别指定密码和代码,类似于下面的内容:

    authenticator: 'USERNAME_PASSWORD_MFA',
    password: "abc123", // password and MFA passcode are input separately
    passcode: "987654"
    
    Copy

    要使用这种方法,请确保 passcodeInPassword 选项为 false`(默认值)。如果 :codenowrap:`passcodeInPassword 同时设置为``true`` 和 passcode,则 passcodeInPassword 设置优先,在身份验证时,驱动程序会假定 password 字段同时包含密码和 MFA 代码。

有关更多详细信息,请参阅 使用 MFA 密码

将 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() 方法的描述。

语言: 中文