ユーザーとIPレート制限
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
レート制限は、Webアプリケーションのセキュリティと耐久性を向上させるためによく使用される手法です。詳細については、レート制限を参照してください。
以下の制限はデフォルトで無効になっています:
デフォルトでは、すべてのGit操作は最初に認証なしで試行されます。このため、HTTP Git操作は、認証されていないリクエストに対して構成されたレート制限をトリガーする可能性があります。
APIリクエストのレート制限は、フロントエンドからのリクエストには影響しません。これらは常にWebトラフィックとしてカウントされるためです。
認証されていないAPIリクエストレート制限を有効にする
認証されていないAPIリクエストレート制限を有効にするには、次の手順に従います:
左側のサイドバーの下部で、管理者を選択します。
設定 > ネットワークを選択します。
ユーザーとIPレートの制限とIPレート制限を展開します。
認証されていないAPIリクエストレート制限を有効にするを選択します。
- オプション。IPあたりのレート制限期間あたりの最大未認証APIリクエスト数の値を更新します。
3600がデフォルトです。 - オプション。Unauthenticated rate limit period in seconds(認証されていないレート制限期間 (秒))の値を更新します。
3600がデフォルトです。
- オプション。IPあたりのレート制限期間あたりの最大未認証APIリクエスト数の値を更新します。
未認証のウェブリクエストレート制限を有効にする
認証されていないリクエストレート制限を有効にするには、次の手順に従います:
左側のサイドバーの下部で、管理者を選択します。
設定 > ネットワークを選択します。
ユーザーとIPレートの制限とIPレート制限を展開します。
未認証のウェブリクエストレート制限を選択します。
- オプション。IPあたりのレート制限期間あたりの最大未認証webリクエスト数の値を更新します。
3600がデフォルトです。 - オプション。Unauthenticated rate limit period in seconds(認証されていないレート制限期間 (秒))の値を更新します。
3600がデフォルトです。
- オプション。IPあたりのレート制限期間あたりの最大未認証webリクエスト数の値を更新します。
認証されたAPIリクエストレート制限を有効にする
認証されたAPIリクエストレート制限を有効にするには、次の手順に従います:
左側のサイドバーの下部で、管理者を選択します。
設定 > ネットワークを選択します。
ユーザーとIPレートの制限とIPレート制限を展開します。
認証されたAPIリクエストのレート制限を有効にするを選択します。
- オプション。ユーザーあたりのレート制限期間あたりの最大認証API要求数の値を更新します。
7200がデフォルトです。 - オプション。**認証されたAPIレート制限期間(秒単位)**の値を更新します。
3600がデフォルトです。
- オプション。ユーザーあたりのレート制限期間あたりの最大認証API要求数の値を更新します。
認証されたWebリクエストレート制限を有効にする
認証されたリクエストレート制限を有効にするには、次の手順に従います:
左側のサイドバーの下部で、管理者を選択します。
設定 > ネットワークを選択します。
ユーザーとIPレートの制限とIPレート制限を展開します。
認証されたAPIリクエストレート制限を有効にするを選択します。
- オプション。ユーザーあたりのレート制限期間あたりの最大認証されたウェブリクエスト数の値を更新します。
7200がデフォルトです。 - オプション。**認証されたWebレート制限期間(秒単位)**の値を更新します。
3600がデフォルトです。
- オプション。ユーザーあたりのレート制限期間あたりの最大認証されたウェブリクエスト数の値を更新します。
カスタムレート制限レスポンスを使用する
レート制限を超過するリクエストは、429レスポンスコードとプレーンテキストの本文を返します。これはデフォルトではRetry laterです。
カスタムレスポンスを使用するには、次の手順に従います:
- 左側のサイドバーの下部で、管理者を選択します。
- 設定 > ネットワークを選択します。
- ユーザーとIPレートの制限とIPレート制限を展開します。
- **レート制限に達したクライアントに送信するプレーンテキストの応答。**テキストボックスに、プレーンテキストの応答メッセージを追加します。
1分あたりのproject/:id/jobsへの最大認証済みリクエスト
タイムアウトを減らすために、project/:id/jobsエンドポイントには、認証済みユーザーあたり600呼び出しのデフォルトのレート制限があります。
リクエストの最大数を変更するには、次の手順に従います:
- 左側のサイドバーの下部で、管理者を選択します。
- 設定 > ネットワークを選択します。
- ユーザーとIPレートの制限とIPレート制限を展開します。
project/:id/jobsへの1分あたりの最大認証リクエスト数の値を更新します。
レスポンスヘッダー
クライアントが関連付けられているレート制限を超えると、次のリクエストはブロックされます。サーバーは、リクエスタが特定の期間後に再試行できるように、レート制限情報で応答する場合があります。これらの情報は、レスポンスヘッダーに添付されます。
| ヘッダー | 例 | 説明 |
|---|---|---|
RateLimit-Limit | 60 | 毎分クライアントのリクエストクォータ。管理者エリアで設定されたレート制限期間が1分と異なる場合、このヘッダーの値は、最も近い60分の期間におおよそ調整されます。 |
RateLimit-Name | throttle_authenticated_web | リクエストをブロックするトリガーの名前。 |
RateLimit-Observed | 67 | 時間枠内のクライアントに関連付けられたリクエストの数。 |
RateLimit-Remaining | 0 | 時間枠内の残りのクォータ。RateLimit-Limitの結果からRateLimit-Observedを引いた値です。 |
RateLimit-Reset | 1609844400 | Unix時間形式で、リクエストクォータがリセットされる時間。 |
RateLimit-ResetTime | Tue, 05 Jan 2021 11:00:00 GMT | RFC2616形式で、リクエストクォータがリセットされる日時。 |
Retry-After | 30 | クォータがリセットされるまでの残り時間(秒)。これは、標準HTTPヘッダーです。 |
HTTPヘッダーを使用してレート制限を回避する
組織のニーズによっては、レート制限を有効にしても、一部のリクエストがレート制限を回避するようにすることがあります。
カスタムヘッダーを使用して、レート制限を回避するリクエストをマークすることで、これを行うことができます。これは、GitLabの前のロードバランサーまたはリバースプロキシ内のどこかで行う必要があります。例:
- 回避ヘッダーの名前を選択します。たとえば
Gitlab-Bypass-Rate-Limitingなどです。 - GitLabレート制限を回避する必要があるリクエストで
Gitlab-Bypass-Rate-Limiting: 1を設定するようにロードバランサーを設定します。 - ロードバランサーを次のいずれかに設定します:
Gitlab-Bypass-Rate-Limitingを消去します。- レート制限の影響を受けるすべてのリクエストで、
Gitlab-Bypass-Rate-Limitingを1以外の値に設定します。
GITLAB_THROTTLE_BYPASS_HEADERという環境変数を設定します。- Linuxパッケージを使用しているセルフコンパイルインストールの場合は、
'GITLAB_THROTTLE_BYPASS_HEADER' => 'Gitlab-Bypass-Rate-Limiting'をgitlab_rails['env']に設定します。 - セルフコンパイルインストールの場合は、
export GITLAB_THROTTLE_BYPASS_HEADER=Gitlab-Bypass-Rate-Limitingを/etc/default/gitlabに設定します。
- Linuxパッケージを使用しているセルフコンパイルインストールの場合は、
ロードバランサーが、すべての受信トラフィックの回避ヘッダーを消去または上書きすることが重要です。そうしないと、ユーザーがそのヘッダーを設定せず、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_THROTTLE_USER_ALLOWLIST' => '1,53,217'をgitlab_rails['env']に設定します。 - セルフコンパイルインストールの場合は、
export GITLAB_THROTTLE_USER_ALLOWLIST=1,53,217を/etc/default/gitlabに設定します。
ユーザー許可リストが原因でレート制限を回避したリクエストは、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は引き続きサポートされており、両方を選択します。
- GitLab 14.3で非推奨になりました。代わりに
throttle_unauthenticated_apithrottle_unauthenticated_webthrottle_authenticated_apithrottle_authenticated_webthrottle_unauthenticated_protected_pathsthrottle_authenticated_protected_paths_apithrottle_authenticated_protected_paths_webthrottle_unauthenticated_packages_apithrottle_authenticated_packages_apithrottle_authenticated_git_lfsthrottle_unauthenticated_files_apithrottle_authenticated_files_apithrottle_unauthenticated_deprecated_apithrottle_authenticated_deprecated_api
たとえば、保護されていないパスへのすべての認証済みリクエストに対してスロットルを試すには、GITLAB_THROTTLE_DRY_RUN='throttle_authenticated_web,throttle_authenticated_api'を設定して実行できます。
すべてのスロットルのドライランモードを有効にするには、変数を*に設定します。
スロットルをドライランモードに設定すると、制限に達した場合に、auth.logにメッセージがログメッセージ記録され、リクエストは続行されます。ログメッセージには、envフィールドにtrackが設定されたenvが含まれています。matchedフィールドには、ヒットしたスロットルの名前が含まれています。
設定でレート制限を有効にする前に、環境変数を設定することが重要です。管理者エリアの設定はすぐに有効になりますが、環境変数を設定するには、すべてのPumaプロセスを再起動する必要があります。
トラブルシューティング
管理者が誤ってブロックされた後、スロットルを無効にする
多数のユーザーが同じプロキシまたはネットワークゲートウェイを介してGitLabに接続する場合、レート制限が低すぎると、スロットルをトリガーしたリクエストと同じIPを使用しているとGitLabが認識するため、その制限によって管理者もブロックされる可能性があります。
管理者は、Railsコンソールを使用して、GITLAB_THROTTLE_DRY_RUN変数にリストされているものと同じ制限を無効にすることができます。例:
Gitlab::CurrentSettings.update!(throttle_authenticated_web_enabled: false)この例では、throttle_authenticated_webパラメータには_enabledという名前のサフィックスが付いています。
制限の数値を設定するには、_enabledという名前のサフィックスを_period_in_secondsおよび_requests_per_periodというサフィックスに置き換えます。