Arkose Protect

DISCLAIMER: Arkose Protect는 GitLab.com에서 사용되며 Self-Managed GitLab 인스턴스에서는 지원되지 않습니다. 아래는 GitLab.com에서 Arkose Protect를 유지하는 내부 요구 사항을 문서화한 것입니다. 이 기능은 이론상으로는 Self-Managed 인스턴스에서 사용할 수 있지만 현재 추천하지는 않습니다.

GitLab은 Arkose Protect를 통해 악의적인 사용자가 계정을 생성하는 것을 막습니다.

작동 방식

Arkose Protect는 사용자가 의심스러운 경우, 로그인 버튼 아래에 대화형 도전을 제시합니다. 도전은 로그인 시 진행되어야 하며, 사용자가 신뢰받는 경우에는 도전이 투명한 모드로 실행되어 별도의 조치 없이 보통대로 로그인할 수 있습니다.

sequenceDiagram participant U as User participant G as GitLab participant A as Arkose Labs U->>G: 사용자가 가입 양식을 로드합니다. G->>A: 기기 지문 및 텔레메트리 전송 A->>U: 세션 토큰과 도전 여부에 대한 결정 반환 opt 도전이 필요한 경우 U->>U: 사용자가 도전 iframe과 상호작용함 end U->>G: Arkose Labs 토큰을 사용하여 양식 제출 G ->> A: 검증을 위해 토큰 전송 A ->> G: 검증 응답 반환 Note over G: `UserCustomAttribute::risk_band` 기록 alt session_details.solved == true G ->> U: 계속 진행 else session_details.solved == false G ->> U: 진행하지 않음 end

악의적인 가입 시도 처리 방법

받은 위험 점수에 따라 사용자는 신원 확인을 최대 세 단계까지 수행해야 할 수 있습니다.

구성

Arkose Protect를 활성화하려면:

  1. ArkoseLabs를 라이선스 구매합니다.
  2. ArkoseLabs 포털에서 공개 및 비공개 API 키를 가져옵니다.
  3. ArkoseLabs 로그인 도전을 활성화합니다. 다음 명령을 Rails 콘솔에서 실행하고 <your_public_api_key><your_private_api_key>를 고유한 API 키로 대체합니다.

    Feature.enable(:arkose_labs_signup_challenge)
    ApplicationSetting.current.update(arkose_labs_public_api_key: '<your_public_api_key>')
    ApplicationSetting.current.update(arkose_labs_private_api_key: '<your_private_api_key>')
    

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 낮음, 중간, 또는 높음일 수 있습니다. 로그인에서는 무시됩니다. 신원 확인 문제를 디버깅하는 데 사용합니다.
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 클래스에서 허용 목록의 사용 방법을 찾을 수 있습니다. (https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/arkose/verify_response.rb#L38)

피드백 작업

Arkose의 보호 서비스를 개선하기 위해, 우리는 우리에 의해 차단된 사용자 목록을 Arkose에게 보내는 매일 백그라운드 작업을 생성했습니다. 이 작업은 Arkose::BlockedUsersReportWorker 클래스에 의해 수행됩니다.

통합 테스트

  • GitLab 16.8에서 도입된 데이터 교환(Data Exchange)을 사용하여 특정 동작을 요청합니다. 이를 위해 arkose_labs_signup_data_exchange라는 플래그가 있으며, 기본적으로 비활성화되어 있습니다.

스테이징 및 개발 환경에서만 도전을 억제하거나 강제로 표시할 수 있습니다. 특정 위험 등급을 받고 싶다면 이 기능을 사용할 수 있습니다.

도전을 강제로 표시하려면 브라우저 사용자 에이전트 문자열을 변경하십시오. 적절한 문자열은 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는 다음 리소스를 유지하고 있습니다: