Arkose Protect

공지:

Arkose Protect은 GitLab.com에서 사용되며 자체 호스트형 GitLab에서는 지원되지 않습니다. 아래는 GitLab.com에서 Arkose Protect를 유지하기 위한 내부 요구 사항을 기술합니다. 이 기능은 이론적으로 자체 호스트형 인스턴스에서 사용할 수 있지만 현재는 권장되지 않습니다.

GitLab은 Arkose Protect를 통해 악의적인 사용자로부터 계정을 생성하는 것을 방지합니다.

작동 원리

만약 Arkose Protect가 사용자를 의심스러워하는 경우, 사용자가 로그인 버튼 아래에 대화식 도전을 제시합니다. 로그인 시도를 계속하려면 도전을 완료해야 합니다. Arkose Protect가 사용자를 신뢰하는 경우, 도전은 투명한 모드에서 실행되어 사용자가 추가 조치를 취하지 않고 보통대로 로그인할 수 있게 됩니다.

%%{init: { "fontFamily": "GitLab Sans" }}%% sequenceDiagram accTitle: Arkose Protect 도전 시퀀스 accDescr: GitLab이 Arkose Labs로 데이터를 보내어 로그인 시도 중에 도전을 제시해야 하는지를 결정하는 방법. participant U as 사용자 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 Portal에서 공개 및 비공개 API 키를 가져옵니다.
  3. ArkoseLabs 로그인 도전을 활성화합니다. 다음 명령을 Rails 콘솔에서 실행하고 자체 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 응답을 보려면 GitLab 운영 로그에서 다음 KQL로 쿼리합니다.

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 도전을 해결하지 못해 로그인에 실패했는지 확인하려면 GitLab 운영 로그에서 다음 KQL로 쿼리합니다.

KQL: json.message:"Challenge was not solved" AND json.username:replace_username_here

허용목록

설정 및 프로덕션 중에 end-to-end QA 테스트 스위트가 통과할 수 있도록하기 위해 허용목록을 추가했습니다. GITLAB_QA_USER_AGENT을 각 QA 사용자에게 제공합니다. 각 QA 사용자는 ALLOWLIST risk category를받습니다.

허용목록의 사용 방법은 Arkose::VerifyResponse 클래스에서 확인할 수 있습니다.

피드백 작업

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

통합 테스트

  • GitLab 16.8에서 도입된 Data Exchange를 사용하여 특정 동작을 요청합니다. arkose_labs_signup_data_exchange라는 이름의 기능 플래그로 도입되었습니다. 기본적으로 비활성화됩니다.

스테이징 및 개발 환경에서만 도전을 억제하거나 나타나게 하려면 이 기능을 사용할 수 있습니다. 이 기능을 사용하여 특정 리스크 밴드를 받고자 하는 경우 사용할 수 있습니다.

도전을 억제하려면 브라우저의 사용자 에이전트 문자열을 변경합니다. 적절한 문자열은 1Password에서 찾을 수 있습니다.

또는 특정 동작을 요청하려면 arkose_labs_signup_data_exchange 기능 플래그를 활성화하고 데이터 교환 페이로드를 수정하여 interactive 필드를 다음 값 중 하나와 함께 포함할 수 있습니다:

  • 'true' - 도전을 나타내도록 합니다.
  • 'false' - 도전을 억제합니다. 도전을 억제하면 ArkoseLabs는 세션이 안전하다고 간주합니다.

예를 들어, 다음 차이점은 페이로드를 업데이트하여 도전을 억제합니다:

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 기능을 소유하고 있습니다. 슬랙에서 ArkoseLabs/GitLab 협업 채널인 #ext-gitlab-arkose에 참여할 수 있습니다.

ArkoseLabs는 다음 리소스를 유지하고 있습니다: