요율 제한

Tier: Free, Premium, Ultimate Offering: Self-managed, GitLab Dedicated
note
GitLab.com의 경우 GitLab.com 특정 요율 제한을 참조하십시오.

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

예를 들어, 간단한 스크립트로 초당 수천 개의 웹 요청을 만들 수 있습니다. 이러한 요청은 다음과 같을 수 있습니다:

  • 악의적인 것.
  • 무관심한 것.
  • 단지 버그일 수도 있습니다.

귀하의 애플리케이션과 인프라는 이러한 부하를 감당할 수 없을 수도 있습니다. 자세한 내용은 서비스 거부 공격을 참조하십시오. 대부분의 경우, 단일 IP 주소에서의 요청 속도를 제한함으로써 대부분의 케이스를 완화할 수 있습니다.

대다수의 무차별 대입 공격도 마찬가지로 속도 제한에 의해 완화될 수 있습니다.

참고: API 요청의 요율 제한은 프론트엔드에서 발생하는 요청에는 영향을 주지 않습니다. 왜냐하면 이러한 요청은 항상 웹 트래픽으로 계산되기 때문입니다.

구성 가능한 제한

당신은 인스턴스의 Admin 영역에서 다음 요율 제한을 설정할 수 있습니다:

당신은 또한 Rails 콘솔을 사용하여 이러한 요율 제한을 설정할 수 있습니다:

Git 및 컨테이너 레지스트리의 인증 실패 금지

만일 단일 IP 주소로부터 3분 동안 30건의 인증 실패 요청을 받았을 경우, GitLab은 1시간 동안 HTTP 상태 코드 403을 반환합니다. 이는 다음과 같은 경우에만 적용됩니다:

  • Git 요청.
  • 컨테이너 레지스트리 (/jwt/auth) 요청.

이 제한은 다음과 같습니다:

  • 성공적으로 인증된 요청에 의해 재설정됩니다. 예를 들어, 29번의 인증 실패 요청 후 1회 성공 요청, 그리고 나머지 29번의 인증 실패 요청이 발생하더라도 금지 조건이 발동되지 않습니다.
  • gitlab-ci-token에 의해 인증된 JWT 요청에는 적용되지 않습니다.
  • 기본적으로 비활성화되어 있습니다.

응답 헤더는 제공되지 않습니다.

요율 제한을 피하기 위해 당신은 다음을 할 수 있습니다:

  • 자동화된 파이프라인 실행을 시간을 두어 분산시킵니다.
  • 실패한 인증 시도에 대해 지수 백오프와 재시도를 구성합니다.
  • 토큰 만료를 관리하기 위한 문서화된 과정과 모범 사례를 사용합니다.

구성 정보에 대한 자세한 내용은 Omnibus GitLab 구성 옵션을 참조하십시오.

구성할 수 없는 제한

  • :user_id/status, :id/following, :id/followers, :user_id/keys, id/keys/:key_id, :id/gpg_keys, :id/gpg_keys/:key_id 엔드포인트에 대한 요율 제한은 GitLab 17.1에서 플래그 rate_limiting_user_endpoints와 함께 도입되었습니다. 기본적으로 비활성화되어 있습니다.
이 기능의 여러 엔드포인트의 가용성은 피처 플래그에 의해 제어됩니다. 자세한 내용은 히스토리를 참조하십시오. 이러한 엔드포인트들은 테스트용으로 제공되지만, 프로덕션 환경에서 사용할 준비가 되어 있지는 않습니다.

저장소 아카이브

저장소 아카이브 다운로드에 대한 요율 제한이 존재합니다. 이 제한은 프로젝트 및 UI 또는 API를 통해 다운로드를 시작하는 사용자에게 적용됩니다.

요율 제한은 사용자당 분당 5회 요청입니다.

웹훅 테스트

웹훅 테스트에 대한 요율 제한이 있으며, 웹훅 기능의 남용을 방지합니다.

요율 제한은 사용자당 분당 5회 요청입니다.

사용자 등록

/users/sign_up 엔드포인트에 대해 IP 주소당 요율 제한이 있습니다. 이는 엔드포인트 남용 시도를 완화하기 위한 것입니다. 예를 들어, 사용자명 또는 사용 중인 이메일 주소를 대량으로 탐지하기 위한 시도를 완화하기 위한 것입니다.

요율 제한은 IP 주소당 분당 20회 호출입니다.

사용자 상태

:user_id/status 엔드포인트에 대해 IP 주소당 요율 제한이 있습니다. 이는 엔드포인트 남용 시도를 완화하기 위한 것입니다.

요율 제한은 IP 주소당 분당 240회 호출입니다.

사용자 팔로우

:id/following 엔드포인트에 대해 IP 주소당 요율 제한이 있습니다. 이는 엔드포인트 남용 시도를 완화하기 위한 것입니다.

요율 제한은 IP 주소당 분당 100회 호출입니다.

사용자 팔로워

:id/followers 엔드포인트에 대해 IP 주소당 요율 제한이 있습니다. 이는 엔드포인트 남용 시도를 완화하기 위한 것입니다.

요율 제한은 IP 주소당 분당 100회 호출입니다.

사용자 키

:user_id/keys 엔드포인트에서 IP 주소당 요청 제한이 있습니다. 이는 엔드포인트 남용 시도를 완화하기 위한 것입니다.

요청 제한은 IP 주소당 분당 120회입니다.

사용자별 키

id/keys/:key_id 엔드포인트에서 IP 주소당 요청 제한이 있습니다. 이는 엔드포인트 남용 시도를 완화하기 위한 것입니다.

요청 제한은 IP 주소당 분당 120회입니다.

사용자 GPG 키

:id/gpg_keys 엔드포인트에서 IP 주소당 요청 제한이 있습니다. 이는 엔드포인트 남용 시도를 완화하기 위한 것입니다.

요청 제한은 IP 주소당 분당 120회입니다.

사용자별 GPG 키

:id/gpg_keys/:key_id 엔드포인트에서 IP 주소당 요청 제한이 있습니다. 이는 엔드포인트 남용 시도를 완화하기 위한 것입니다.

요청 제한은 IP 주소당 분당 120회입니다.

사용자 이름 업데이트

사용자 이름을 변경할 수 있는 빈도에 대한 요청 제한이 있습니다. 이것은 기능 남용을 완화하기 위한 것입니다. 예를 들어, 사용 중인 사용자 이름을 대규모로 확인하는 경우 등.

요청 제한은 인증된 사용자당 분당 10회입니다.

사용자 이름 존재 여부

/users/:username/exists 내부 엔드포인트에 대해 요청 제한이 있습니다. 회원가입 시 선택한 사용자 이름이 이미 사용 중인지 확인하는 데 사용됩니다. 사용 중인 사용자 이름을 대규모로 확인하는 남용을 완화하기 위한 것입니다.

요청 제한은 IP 주소당 분당 20회입니다.

프로젝트 작업 API 엔드포인트

  • GitLab 15.7에서 도입되었습니다. 기본적으로 비활성화된 ci_enforce_rate_limits_jobs_api 플래그와 함께.
  • GitLab 16.0에서 일반적으로 사용 가능하게 되었습니다. ci_enforce_rate_limits_jobs_api 기능 플래그가 제거되었습니다.

project/:id/jobs 엔드포인트에 대해 요청 제한이 있으며, 작업을 검색할 때 타임아웃을 줄이기 위해 시행됩니다.

요청 제한은 인증된 사용자당 기본적으로 분당 600회입니다. 요청 제한을 구성할 수 있습니다.

AI 액션

  • GitLab 16.0에서 도입되었습니다.

GraphQL aiAction 뮤테이션에 대해 요청 제한이 있으며, 이 엔드포인트를 남용으로부터 방지하기 위해 시행됩니다.

요청 제한은 인증된 사용자당 8시간당 160회입니다.

API를 사용하여 회원 삭제

  • GitLab 16.0에서 도입되었습니다.

API 엔드포인트 /groups/:id/members 또는 /project/:id/members를 사용하여 프로젝트 또는 그룹 멤버를 제거하는 데에도 요청 제한이 있습니다.

요청 제한은 분당 60회의 삭제입니다.

알림 이메일

  • GitLab 17.1에서 도입되었습니다. 기본적으로 비활성화된 rate_limit_notification_emails 플래그와 함께.
  • GitLab 17.2에서 일반적으로 사용 가능하게 되었습니다. rate_limit_notification_emails 기능 플래그가 제거되었습니다.

프로젝트 또는 그룹에 대한 관련 알림 이메일에 대해 요청 제한이 있습니다.

요청 제한은 프로젝트 또는 그룹 당 사용자당 24시간당 1,000회의 알림입니다.

문제 해결

Rack Attack로 로드 밸런서 거부 목록을 설정하고 있음

Rack Attack은 모든 트래픽이 로드 밸런서에서 오는 것처럼 보일 경우 로드 밸런서를 차단할 수 있습니다. 이 경우 다음을 수행해야 합니다:

  1. nginx[real_ip_trusted_addresses]를 구성합니다. 이렇게 하면 사용자의 IP가 로드 밸런서 IP로 나열되지 않습니다.
  2. 로드 밸런서의 IP 주소를 허용 목록에 추가합니다.
  3. GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    

Redis를 사용하여 Rack Attack에서 차단된 IP 제거

차단된 IP를 제거하려면 다음을 수행합니다:

  1. 프로덕션 로그에서 차단된 IP를 찾습니다:

    grep "Rack_Attack" /var/log/gitlab/gitlab-rails/auth.log
    
  2. 거절 목록이 Redis에 저장되므로 redis-cli를 엽니다:

    /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket
    
  3. 실제 IP로 대체하여 다음 구문을 사용하여 차단을 제거할 수 있습니다:

    del cache:gitlab:rack::attack:allow2ban:ban:<ip>
    
  4. IP에 해당하는 키가 더 이상 표시되지 않는지 확인합니다:

    keys *rack::attack*
    

    기본적으로 keys 명령어는 비활성화되어 있습니다.

  5. 필요에 따라 부인 목록에 IP를 추가하여 다시 차단되지 않도록 합니다.