요금 제한
GitLab.com 전용 요금 제한을 참조하세요.
요금 제한은 웹 애플리케이션의 보안과 내구성을 개선하는 데 사용되는 일반적인 기술입니다.
예를 들어, 간단한 스크립트는 초당 수천 개의 웹 요청을 할 수 있습니다. 요청은 다음과 같을 수 있습니다:
- 악의적인 기도.
- 무관심한 기도.
- 단순한 버그.
귀하의 애플리케이션과 인프라는 이 부하를 감당할 수 없을 수도 있습니다. 자세한 내용은
서비스 거부 공격을 참조하세요.
대부분의 경우 단일 IP 주소에서의 요청 속도를 제한함으로써 완화할 수 있습니다.
대부분의 무차별 대입 공격도 비슷하게 요금 제한으로 완화됩니다.
이 요청은 항상 웹 트래픽으로 집계됩니다.
구성 가능한 제한
이러한 요금 제한은 인스턴스의 관리자 영역에서 설정할 수 있습니다:
- 가져오기/내보내기 요금 제한
- 문제 요금 제한
- 노트 요금 제한
- 보호된 경로
- 원시 끝점 요금 제한
- 사용자 및 IP 요금 제한
- 패키지 레지스트리 요금 제한
- Git LFS 요금 제한
- Git SSH 작업에 대한 요금 제한
- 파일 API 요금 제한
- 사용 중단된 API 요금 제한
- GitLab Pages 요금 제한
- 파이프라인 요금 제한
- 사고 관리 요금 제한
- 프로젝트 API 요금 제한
- 그룹 API 요금 제한
- 조직 API 요금 제한
Rails 콘솔을 사용하여 이러한 요금 제한을 설정할 수 있습니다:
Git 및 컨테이너 레지스트리에 대한 인증 실패 차단
GitLab은 단일 IP 주소에서 3분 동안 30개의 인증 실패 요청을 수신하면 1시간 동안 HTTP 상태 코드 403
을 반환합니다. 이는 다음의 결합된 요청에만 적용됩니다:
- Git 요청.
- 컨테이너 레지스트리 (
/jwt/auth
) 요청.
이 제한은:
- 성공적으로 인증된 요청으로 인해 재설정됩니다. 예를 들어, 29개의 인증 실패 요청 다음에 1개의 성공적인 요청이 이어지고 다시 29개의 인증 실패 요청이 이어지면 차단되지 않습니다.
-
gitlab-ci-token
으로 인증된 JWT 요청에는 적용되지 않습니다. - 기본적으로 비활성화되어 있습니다.
응답 헤더는 제공되지 않습니다.
요금 제한을 피하려면 다음을 수행할 수 있습니다:
- 자동화된 파이프라인 실행을 분산시키세요.
- 실패한 인증 시도에 대해 지수 백오프 및 재시도를 구성하세요.
- 문서화된 프로세스와 모범 사례를 사용하여 토큰 만료를 관리하세요.
구성 정보는
Omnibus GitLab 구성 옵션을 참조하세요.
비구성 한계
이 기능에서 여러 엔드포인트의 가용성은 기능 플래그에 의해 제어됩니다.
자세한 내용은 내역을 참조하세요.
이 엔드포인트는 테스트용으로 사용할 수 있지만 프로덕션 사용에 적합하지 않습니다.
레포지토리 아카이브
레포지토리 아카이브 다운로드에 대한 속도 제한이
사용 가능합니다. 제한은 프로젝트와 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이 모든 트래픽이 로드 밸런서에서 오는 것으로 보일 경우 로드 밸런서를 차단할 수 있습니다. 이 경우, 다음을 수행해야 합니다:
-
nginx[real_ip_trusted_addresses]
구성하기.이는 사용자의 IP가 로드 밸런서 IP로 나열되지 않도록 합니다.
-
로드 밸런서의 IP 주소를 허용 목록에 추가합니다.
-
GitLab을 재구성합니다:
sudo gitlab-ctl reconfigure
Redis를 사용하여 Rack Attack에서 차단된 IP 제거하기
차단된 IP를 제거하려면:
-
프로덕션 로그에서 차단된 IP를 찾습니다:
grep "Rack_Attack" /var/log/gitlab/gitlab-rails/auth.log
-
차단 목록은 Redis에 저장되어 있으므로
redis-cli
를 엽니다:/opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket
-
다음 구문을 사용하여 차단을 제거할 수 있으며,
<ip>
를 실제 차단된 IP로 대체합니다:del cache:gitlab:rack::attack:allow2ban:ban:<ip>
-
IP가 더 이상 표시되지 않는지 확인합니다:
keys *rack::attack*
기본적으로
keys
명령은 비활성화되어 있습니다. -
선택적으로, 다시 차단되지 않도록 허용 목록에 IP를 추가합니다.