사용자 및 IP 요금 제한

Tier: Free, Premium, Ultimate

Offering: Self-managed

요금 제한은 웹 애플리케이션의 보안 및 내구성을 향상시키는 데 사용되는 일반적인 기술입니다. 자세한 내용은 요금 제한을 참조하세요.

기본적으로 다음의 제한 사항은 비활성화되어 있습니다:

note
기본적으로 모든 Git 작업은 처음에 인증되지 않은 상태로 시도됩니다. 이로 인해 HTTP Git 작업이 인증되지 않은 요청에 대해 구성된 요금 제한이 발생할 수 있습니다.
note
API 요청에 대한 요금 제한은 프론트엔드에서 수행된 요청에는 영향을 미치지 않으며, 이러한 요청은 항상 웹 트래픽으로 계산됩니다.

인증되지 않은 API 요청 요금 제한 활성화

인증되지 않은 API 요청 요금 제한을 활성화하려면:

  1. 왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.

  2. 설정 > 네트워크를 선택합니다.

  3. 사용자 및 IP 요금 제한을 확장합니다.

  4. 인증되지 않은 API 요청 요금 제한 활성화를 선택합니다.

    • 선택 사항. IP당 요금 제한 기간당 최대 인증되지 않은 API 요청 값을 업데이트합니다. 기본값은 3600입니다.

    • 선택 사항. 인증되지 않은 요금 제한 기간(초) 값을 업데이트합니다. 기본값은 3600입니다.

인증되지 않은 웹 요청 요금 제한 활성화

인증되지 않은 웹 요청 요금 제한을 활성화하려면:

  1. 왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.

  2. 설정 > 네트워크를 선택합니다.

  3. 사용자 및 IP 요금 제한을 확장합니다.

  4. 인증되지 않은 웹 요청 요금 제한 활성화를 선택합니다.

    • 선택 사항. IP당 요금 제한 기간당 최대 인증되지 않은 웹 요청 값을 업데이트합니다. 기본값은 3600입니다.

    • 선택 사항. 인증되지 않은 요금 제한 기간(초) 값을 업데이트합니다. 기본값은 3600입니다.

인증된 API 요청 요금 제한 활성화

인증된 API 요청 요금 제한을 활성화하려면:

  1. 왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.

  2. 설정 > 네트워크를 선택합니다.

  3. 사용자 및 IP 요금 제한을 확장합니다.

  4. 인증된 API 요청 요금 제한 활성화를 선택합니다.

    • 선택 사항. 사용자당 요금 제한 기간당 최대 인증된 API 요청 값을 업데이트합니다. 기본값은 7200입니다.

    • 선택 사항. 인증된 API 요금 제한 기간(초) 값을 업데이트합니다. 기본값은 3600입니다.

인증된 웹 요청 요금 제한 활성화

인증된 웹 요청 요금 제한을 활성화하려면:

  1. 왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.

  2. 설정 > 네트워크를 선택합니다.

  3. 사용자 및 IP 요금 제한을 확장합니다.

  4. 인증된 웹 요청 요금 제한 활성화를 선택합니다.

    • 선택 사항. 사용자당 요금 제한 기간당 최대 인증된 웹 요청 값을 업데이트합니다. 기본값은 7200입니다.

    • 선택 사항. 인증된 웹 요금 제한 기간(초) 값을 업데이트합니다. 기본값은 3600입니다.

사용자 지정 요금 제한 응답 사용

요금 제한을 초과하는 요청은 429 응답 코드 및 기본적으로 나중에 다시 시도하십시오라는 일반 텍스트 본문을 반환합니다.

사용자 지정 응답을 사용하려면:

  1. 왼쪽 사이드바에서 하단에 있는 관리자를 선택합니다.

  2. 설정 > 네트워크를 선택합니다.

  3. 사용자 및 IP 요금 제한을 확장합니다.

  4. 요금 제한에 도달한 클라이언트에게 전송할 일반 텍스트 응답 텍스트 상자에 일반 텍스트 응답 메시지를 추가합니다.

project/:id/jobs에 대한 최대 인증 요청 수(분당)

타임아웃을 줄이기 위해 project/:id/jobs 엔드포인트는 인증된 사용자당 기본 요청 속도 제한을 600호출로 설정했습니다.

최대 요청 수를 수정하려면:

  1. 왼쪽 사이드바의 하단에서 Admin을 선택합니다.

  2. Settings > Network를 선택합니다.

  3. User and IP rate limits를 확장합니다.

  4. project/:id/jobs에 대한 최대 인증 요청 수(분당) 값을 업데이트합니다.

응답 헤더

클라이언트가 관련 속도 제한을 초과할 경우, 다음 요청이 차단됩니다. 서버는 특정 기간 후에 재시도할 수 있도록 요청자에게 속도 제한 정보를 포함한 응답을 제공할 수 있습니다. 이러한 정보는 응답 헤더에 첨부됩니다.

헤더 예시 설명
RateLimit-Limit 60 클라이언트 매 분에 대한 요청 할당량입니다. Admin 영역에 설정된 속도 제한 기간이 1분과 다를 경우, 이 헤더의 값은 대략 가장 가까운 60분 주기로 조정됩니다.
RateLimit-Name throttle_authenticated_web 요청을 차단하는 스로틀의 이름입니다.
RateLimit-Observed 67 해당 클라이언트가 시간 창 내에 발생시킨 요청 수입니다.
RateLimit-Remaining 0 시간 창 내에서 남은 할당량입니다. RateLimit-Limit - RateLimit-Observed의 결과입니다.
RateLimit-Reset 1609844400 요청 할당량이 재설정되는 유닉스 시간 형식의 시간입니다.
RateLimit-ResetTime Tue, 05 Jan 2021 11:00:00 GMT 요청 할당량이 재설정되는 RFC2616 형식의 날짜 및 시간입니다.
Retry-After 30 할당량이 재설정될 때까지 남은 시간 초 단위입니다. 이는 표준 HTTP 헤더입니다.

HTTP 헤더를 사용하여 속도 제한 우회하기

조직의 필요에 따라 속도 제한을 활성화하고 일부 요청은 속도 제한을 우회하도록 하려는 경우가 있을 수 있습니다.

이것은 속도 제한을 우회해야 하는 요청에 대해 사용자 정의 헤더로 표시하여 수행할 수 있습니다. GitLab 앞에 있는 로드 밸런서나 리버스 프록시 어디에선가 이 작업을 수행해야 합니다. 예를 들어:

  1. 우회 헤더의 이름을 선택합니다. 예: Gitlab-Bypass-Rate-Limiting.

  2. 로드 밸런서가 GitLab의 속도 제한을 우회해야 하는 요청에 대해 Gitlab-Bypass-Rate-Limiting: 1으로 설정하도록 구성합니다.

  3. 로드 밸런서를 구성하여 다음 중 하나를 수행합니다:
    • Gitlab-Bypass-Rate-Limiting을 지웁니다.
    • 속도 제한의 영향을 받아야 할 모든 요청에 대해 Gitlab-Bypass-Rate-Limiting1이 아닌 값으로 설정합니다.
  4. 환경 변수 GITLAB_THROTTLE_BYPASS_HEADER를 설정합니다.
    • 리눅스 패키지 설치의 경우, gitlab_rails['env']'GITLAB_THROTTLE_BYPASS_HEADER' => 'Gitlab-Bypass-Rate-Limiting'을 설정합니다.
    • 자체 컴파일 설치의 경우, /etc/default/gitlabexport GITLAB_THROTTLE_BYPASS_HEADER=Gitlab-Bypass-Rate-Limiting을 설정합니다.

로드 밸런서가 모든 수신 트래픽에서 우회 헤더를 지우거나 덮어쓰는 것이 중요합니다. 그렇지 않으면 사용자가 해당 헤더를 설정하여 GitLab의 속도 제한을 우회하는 것을 신뢰해야 합니다.

우회는 헤더가 1로 설정된 경우에만 작동합니다.

우회 헤더로 인해 속도 제한을 우회한 요청은 production_json.log"throttle_safelist":"throttle_bypass_header"로 표시됩니다.

우회 메커니즘을 비활성화하려면 환경 변수 GITLAB_THROTTLE_BYPASS_HEADER를 설정 해제하거나 비워 두어야 합니다.

특정 사용자가 인증된 요청 속도 제한을 우회하도록 허용

위에서 설명한 우회 헤더와 유사하게, 특정 사용자 집합이 속도 제한기를 우회할 수 있도록 허용하는 것이 가능합니다. 이는 인증된 요청에만 적용됩니다: 인증되지 않은 요청의 경우, 정의상 GitLab은 사용자가 누구인지 알 수 없습니다.

허용 목록은 GITLAB_THROTTLE_USER_ALLOWLIST 환경 변수에 사용자 ID의 쉼표로 구분된 목록으로 구성됩니다. 사용자가 1, 53 및 217이 인증된 요청 속도 제한기를 우회하려면, 허용 목록 구성은 1,53,217이 됩니다.

  • Linux 패키지 설치의 경우, gitlab_rails['env']'GITLAB_THROTTLE_USER_ALLOWLIST' => '1,53,217'를 설정하세요.
  • 자체 컴파일 설치의 경우, /etc/default/gitlabexport GITLAB_THROTTLE_USER_ALLOWLIST=1,53,217를 설정하세요.

사용자 허용 목록으로 인해 속도 제한기를 우회한 요청은 production_json.log에서 "throttle_safelist":"throttle_user_allowlist"로 표시됩니다.

애플리케이션 시작 시, 허용 목록은 auth.log에 기록됩니다.

속도 제한 설정을 적용하기 전에 테스트하기

GITLAB_THROTTLE_DRY_RUN 환경 변수를 쉼표로 구분된 속도 제한 이름 목록으로 설정하여 속도 제한 설정을 테스트할 수 있습니다.

가능한 이름은 다음과 같습니다:

  • throttle_unauthenticated
    • GitLab 14.3에서 더 이상 사용되지 않음. 대신 throttle_unauthenticated_api 또는 throttle_unauthenticated_web를 사용하세요. throttle_unauthenticated는 여전히 지원되며 두 가지 모두를 선택합니다.
  • throttle_unauthenticated_api
  • throttle_unauthenticated_web
  • throttle_authenticated_api
  • throttle_authenticated_web
  • throttle_unauthenticated_protected_paths
  • throttle_authenticated_protected_paths_api
  • throttle_authenticated_protected_paths_web
  • throttle_unauthenticated_packages_api
  • throttle_authenticated_packages_api
  • throttle_authenticated_git_lfs
  • throttle_unauthenticated_files_api
  • throttle_authenticated_files_api
  • throttle_unauthenticated_deprecated_api
  • throttle_authenticated_deprecated_api

예를 들어, 보호되지 않는 경로에 대한 모든 인증된 요청을 시도하려면 GITLAB_THROTTLE_DRY_RUN='throttle_authenticated_web,throttle_authenticated_api'로 설정할 수 있습니다.

모든 속도 제한에 대해 드라이 런 모드를 활성화하려면, 변수를 *로 설정할 수 있습니다.

속도를 드라이 런 모드로 설정하면 제한에 도달할 경우 auth.log에 메시지가 기록되며, 요청이 계속 진행됩니다. 로그 메시지에는 env 필드가 track으로 설정되어 있습니다. matched 필드에는 도달한 속도 제한의 이름이 포함됩니다.

환경 변수를 우선 설정해야 속도 제한을 활성화할 수 있습니다. 관리자 영역의 설정은 즉시 적용되며, 환경 변수를 설정하는 것은 모든 Puma 프로세스를 재시작해야 합니다.

문제 해결

관리자 접근을 차단한 후 속도 제한 비활성화

많은 사용자가 동일한 프록시 또는 네트워크 게이트웨이를 통해 GitLab에 연결하는 경우, 속도 제한이 너무 낮으면 관리자가 차단될 수 있습니다. 이는 GitLab이 속도 제한을 트리거한 요청과 동일한 IP를 사용하고 있는 관리자를 식별할 수 있기 때문입니다.

관리자는 Rails 콘솔을 사용하여 속도 제한을 비활성화할 수 있습니다. 이는 GITLAB_THROTTLE_DRY_RUN 변수에 대해 나열된 것들과 동일합니다. 예를 들어:

Gitlab::CurrentSettings.update!(throttle_authenticated_web_enabled: false)

이 예제에서 throttle_authenticated_web 매개변수는 _enabled 이름 접미사가 있습니다.

제한에 대한 숫자 값을 설정하려면, _enabled 이름 접미사를 _period_in_seconds_requests_per_period 접미사로 교체하세요.