强制双因素认证

双因素认证 (2FA)是一种要求用户提供两种不同因素来证实他们身份的一种技术:

  • 用户名和密码。
  • 另一种身份验证方法,例如由应用程序生成的代码。

2FA 使未经授权的人更难访问账户,因为他们需要两种因素。

note 如果您正在使用和强制 SSO,则您可能已经在身份提供程序 (IDP) 端强制执行 2FA。在极狐GitLab 上强制执行 2FA 可能是不必要的。

对所有用户强制执行 2FA

极狐GitLab 上的用户无需任何管理员干预即可启用它。如果您想强制每个人都设置 2FA,您可以从两种不同的方式中进行选择:

  • 下次登录时强制执行
  • 建议下次登录时执行,但在执行前允许宽限期。

    配置的宽限期过后,用户可以登录,但不能离开 /-/profile/two_factor_auth 的 2FA 配置区域。

您可以使用 UI 或 API 来为所有用户强制 2FA。

使用 UI

  1. 在左侧导航栏,在底部,选择 管理员
  2. 选择 设置 > 通用
  3. 展开 登录限制
    • 选中 强制执行双因素认证 复选框以启用此功能。
    • 双因素认证宽限期 中,输入小时数。如果希望在下次登录尝试期间强制执行 2FA,请输入 0

使用 API

使用应用程序设置 API 以修改以下设置:

  • require_two_factor_authentication
  • two_factor_grace_period

更多详情,可以查看通过 API 访问的设置列表

为管理员用户强制 2FA

  • 引入于极狐GitLab 16.8。

管理员可以为私有化部署实例上的所有管理员用户强制 2FA:

  1. 在左侧导航栏,在底部,选择 管理员
  2. 在左侧导航栏,选择 设置 > 通用
  3. 展开 登录限制 部分:
    1. 选中 要求管理员启用 2FA 复选框以启用此功能。
    2. 双因素认证宽限期 中,输入小时数。如果希望在下次登录尝试期间强制执行 2FA,请输入 0
  4. 选择 保存更改
note 如果您正在使用外部提供商登录到极狐GitLab,则此设置不会强制执行 2FA。2FA 应在该外部提供商上启用。

为群组中的所有用户强制 2FA

先决条件:

  • 您必须具有群组的维护者或所有者角色。

要想仅为特定群组强制 2FA:

  1. 在左侧导航栏,选择 搜索或前往,找到您的群组。
  2. 选择 设置 > 通用
  3. 展开 权限和群组功能
  4. 选择 此群组中的所有用户都必须设置双因素身份验证
  5. 可选。在 延迟 2FA 强制执行(小时) 中,输入您希望宽限期持续的小时数。如果顶级群组及其子群组和项目中有多个不同的宽限期,则使用最短的宽限期。
  6. 选择 保存更改

强制执行会影响群组中所有直接和继承的成员

访问令牌不需要提供第二个因素进行身份验证,因为它们是基于 API 的。在强制执行 2FA 之前生成的令牌保持有效。

极狐GitLab 入站邮件 功能不遵循 2FA 强制执行。用户可以在不使用 2FA 进行身份验证的情况下使用 incoming email 功能,例如创建问题或对合并请求进行评论。即使强制执行 2FA,也是如此。

子群组中的 2FA

您可以像在定计群组中一样,为单个子群组启用并强制执行 2FA。

您可以防止子群组设置自己的 2FA 要求:

  1. 转到顶级群组的 设置 > 通用
  2. 展开 权限和群组功能 部分。
  3. 清除 允许子群组设置自己的双因素身份验证规则 复选框。

此操作导致所有具有 2FA 要求的子群组停止要求其成员使用 2FA。

项目中的 2FA

如果某个属于启用或强制要求使用双因素认证(2FA)的群组的项目,被共享给了一个未启用或未强制要求使用双因素认证的群组,那么该未使用双因素认证的群组的成员可以在不使用双因素认证的情况下访问该项目。 例如:

  • 群组 A 启用 2FA 并强制执行。群组 B 没有启用 2FA。
  • 如果一个项目 P 属于群组 A,被共享给了群组 B,那么群组 B 的成员可以在不使用双因素认证的情况下访问项目 P

要确保此发生,要为 2FA 群组禁止共享项目

如果您在启用了 2FA 的群组或子组中添加成员,这些成员 需要使用 2FA。

Disable 2FA

您可以为单个用户或所有用户禁用 2FA。

这是一项永久性和不可逆的操作。用户必须重新激活 2FA 才能再次使用它。

caution 为用户禁用 2FA 不会禁用强制执行所有用户的 2FA强制执行所有用户组中的 2FA设置。您还必须禁用任何强制执行的 2FA 设置,以便用户在下次登录极狐GitLab 时不会再次被要求设置 2FA。

对单个用户

管理员

为单个管理员,使用 Rails 控制台来禁用 2FA 是可能的:

admin = User.find_by_username('<USERNAME>')
user_to_disable = User.find_by_username('<USERNAME>')

TwoFactor::DestroyService.new(admin, user: user_to_disable).execute

管理员会被通知 2FA 已经禁用。

非管理员

在极狐GitLab 15.2 及更高版本,您可以使用 Rails 控制台或 API 端点来为非管理员禁用 2FA。

您可以为您自己的账号禁用 2FA。

您可以使用 API 端点来为管理员禁用 2FA。

对所有用户

要为所有用户禁用 2FA,即使强制执行 2FA 已禁用,使用以下 Rake 任务。

  • 对于使用 Linux 软件包安装的实例:

    sudo gitlab-rake gitlab:two_factor:disable_for_all_users
    
  • 对于源码安装的实例:

    sudo -u git -H bundle exec rake gitlab:two_factor:disable_for_all_users RAILS_ENV=production
    

禁用 2FA

caution 为用户禁用 2FA 不会禁用对所有用户强制 2FA对群组中的所有用户强制执行 2FA设置。您还必须禁用任何强制执行的 2FA 设置,这样用户下次登录时就不会被要求再次设置 2FA。
caution 这是一个永久且不可逆转的行为。用户必须重新激活 2FA 才能再次使用它。

为单个用户

要为非管理员用户禁用 2FA,我们建议使用 API 端点而不是 Rails 控制台。 使用 Rails 控制台,可以禁用单个用户的 2FA。 连接到 Rails 控制台并运行:

admin = User.find_by_username('<USERNAME>')
user_to_disable = User.find_by_username('<USERNAME>')

TwoFactor::DestroyService.new(admin, user: user_to_disable).execute

管理员会被通知 2FA 已经被禁用。

非管理员

在极狐GitLab 15.2 及更高版本,您可以使用 Rails 控制台或 API 端点来为非管理员禁用 2FA。

You can disable 2FA for your own account.

您可以为自己的账号禁用 2FA。

您不能使用 API 端点来为管理员禁用 2FA。

为所有用户

在某些特殊情况下,即使禁用了强制 2FA,您也可能希望为所有人禁用 2FA。执行一个 Rake 任务:

# Omnibus installations
sudo gitlab-rake gitlab:two_factor:disable_for_all_users

# Installations from source
sudo -u git -H bundle exec rake gitlab:two_factor:disable_for_all_users RAILS_ENV=production

Git over SSH 操作的 2FA

可以通过 SSH 操作对 Git 实施双重认证。但是,我们建议改用 ED25519_SKECDSA_SK SSH 密钥。

可以使用以下命令完成一次性密码 (OTP) 验证:

ssh git@<hostname> 2fa_verify

验证 OTP 后,Git over SSH 操作可用于 15 分钟(默认)的会话持续时间以及关联的 SSH 密钥。

安全限制

2FA 不会保护带有 compromised 私有 SSH 密钥的用户。

一旦验证了 OTP,任何人都可以在配置的会话持续时间内,使用该私有 SSH 密钥通过 SSH 运行 Git。