Arkose Protect
Arkose Protect 在 GitLab.com 上使用,但不支持 GitLab 自托管实例。 以下内容记录了在 GitLab.com 上维护 Arkose Protect 的内部要求。 虽然此功能理论上可以在 GitLab 自托管实例上使用,但目前不建议这样做。
GitLab 集成了 Arkose Protect 以防止恶意用户创建账户。
它是如何工作的?
如果 Arkose Protect 判断用户可疑,它会在“登录”按钮下方显示一个交互式挑战。 需要完成此挑战才能继续登录尝试。如果 Arkose Protect 信任该用户,挑战将以透明模式运行, 这意味着用户无需执行任何额外操作,可以像往常一样登录。
%%{init: { "fontFamily": "GitLab Sans" }}%%
sequenceDiagram
accTitle: Arkose Protect 挑战流程
accDescr: GitLab 如何向 Arkose Labs 发送数据,以决定在登录尝试期间是否显示挑战。
participant U as User
participant G as GitLab
participant A as Arkose Labs
U->>G: User loads signup form
G->>A: Sends device fingerprint and telemetry
A->>U: Returns Session token and decision on if to challenge
opt Requires Challenge
U->>U: User interacts with Challenge iframe
end
U->>G: Submits form with Arkose Labs token
G ->> A: Sends token to be verified
A ->> G: Returns verification response
Note over G: records `UserCustomAttribute::risk_band`
alt session_details.solved == true
G ->> U: Proceed
else session_details.solved == false
G ->> U: Do not proceed
end
我们如何处理恶意的注册尝试?
根据收到的风险评分,用户可能需要执行最多三个阶段的身份验证才能注册账户。
配置
要启用 Arkose Protect:
-
为 ArkoseLabs 申请授权。
-
从 ArkoseLabs Portal 获取公钥和私钥。
-
启用 ArkoseLabs 登录挑战。在 Rails 控制台中运行以下命令,将
<your_public_api_key>和<your_private_api_key>替换为您自己的 API 密钥。ApplicationSetting.current.update(arkose_labs_public_api_key: '<your_public_api_key>') ApplicationSetting.current.update(arkose_labs_private_api_key: '<your_private_api_key>')
要禁用 Arkose Protect:
要禁用 ArkoseLabs 集成,请在 Rails 控制台中运行以下命令。
Feature.disable(:arkose_labs)对 ArkoseLabs 问题的分类和调试
您可以使用以下工具对 ArkoseLabs 提出的问题进行分类和调试:
查看用户会话的 ArkoseLabs Verify API 响应
要查看用户的 ArkoseLabs Verify API 响应,请使用以下 KQL 查询 GitLab 生产日志:
KQL: json.message:"Arkose verify response" AND json.username:replace_username_here如果查询有效,结果将包含用户会话的调试信息:
| 响应 | 描述 |
|---|---|
json.response.session_details.suppressed |
如果未向用户显示挑战,则值为 true。如果用户在白名单中,则始终为 true。 |
json.arkose.risk_band |
可以是 low、medium 或 high。登录时会被忽略。用于调试身份验证问题。 |
json.response.session_details.solved |
指示用户是否解决了挑战。如果用户在白名单中,则始终为 true。 |
json.response.session_details.previously_verified |
指示令牌是否已被重用。默认为 false。如果为 true,则可能表示恶意活动。 |
检查用户是否未通过 ArkoseLabs 挑战
要检查用户是否因未解决 ArkoseLabs 挑战而登录失败,请使用以下 KQL 查询 GitLab 生产日志:
KQL: json.message:"Challenge was not solved" AND json.username:replace_username_here白名单
为确保端到端 QA 测试套件可以在暂存和生产环境中通过,我们将 GITLAB_QA_USER_AGENT 添加到了 白名单 中。每个 QA 用户都会获得一个 ALLOWLIST 风险类别。
您可以在我们的 Arkose::VerifyResponse 类中找到白名单标志的使用情况。
反馈作业
为了帮助 Arkose 改进其保护服务,我们创建了一个每日后台作业,向他们发送我们阻止的用户列表。
此作业由 Arkose::BlockedUsersReportWorker 类执行。
测试您的集成
仅在暂存和开发环境中,您可以抑制挑战或强制其出现。 如果您想接收特定的风险等级,可以使用此功能。
要强制挑战,请更改您的浏览器 用户代理字符串。您可以在 1Password 中找到相应的字符串。
或者,要请求特定行为,请启用 arkose_labs_signup_data_exchange 功能标志,并修改数据交换负载,以包含一个具有以下任意值的 interactive 字段:
'true'- 强制挑战出现。'false'- 抑制挑战。如果您抑制挑战,ArkoseLabs 会认为您的会话是安全的。
例如,以下 diff 更新了以抑制挑战的负载:
diff --git a/ee/lib/arkose/data_exchange_payload.rb b/ee/lib/arkose/data_exchange_payload.rb
index 191ae0b5cf82..b2d888b98c95 100644
--- a/ee/lib/arkose/data_exchange_payload.rb
+++ b/ee/lib/arkose/data_exchange_payload.rb
@@ -35,6 +35,7 @@ def json_data
now = Time.current.to_i
data = {
+ interactive: 'false',
timestamp: now.to_s, # required to be a string
"HEADER_user-agent" => request.user_agent,
"HEADER_origin" => request.origin,
其他资源
反滥用团队负责 ArkoseLabs Protect 功能。您可以加入 Slack 上的 ArkoseLabs 和 GitLab 协作频道:#ext-gitlab-arkose。
ArkoseLabs 还维护以下资源: