料金制限
レート制限は、ウェブアプリケーションのセキュリティと耐久性を向上させるために使われる一般的なテクニックです。
例えば、単純なスクリプトは、1 秒間に何千ものウェブリクエストを行うことができます。リクエストは
- 悪意のある
- 無気力。
- ただの虫。
アプリケーションやインフラが負荷に対処できない可能性があります。詳細はDenial-of-Service attack を参照してください。ほとんどの場合、1つのIPアドレスからのリクエストのレートを制限することで軽減できます。
ほとんどのブルートフォース攻撃も同様にレート制限によって軽減されます。
設定可能な制限
インスタンスの管理エリアで、これらのレート制限を設定できます:
- インポート/エクスポートのレート制限
- イシューのレート制限
- ノートのレート制限
- 保護されたパス
- 生エンドポイントのレート制限
- ユーザーおよびIPレート制限
- パッケージ・レジストリ・レート制限
- Git LFSレート制限
- Git SSH オペレーションのレート制限
- ファイル API のレート制限
- 非推奨 API のレート制限
- GitLab Pages のレート制限
- パイプラインのレート制限
- インシデント管理のレート制限
- プロジェクトリストAPIへの認証なしアクセス制限
これらのレートリミットはRailsコンソールで設定できます:
Gitおよびコンテナレジストリの認証禁止に失敗しました。
GitLab は、単一の IP アドレスから 3 分間に 30 回の認証失敗リクエストを受信した場合、HTTP ステータスコード403
を 1 時間返します。これは複合型にのみ適用されます:
- Git リクエストにのみ適用されます。
- コンテナレジストリ (
/jwt/auth
) のリクエスト。
この制限は
- 認証に成功したリクエストによってリセットされます。例えば、29回認証に失敗し、その後1回認証に成功し、さらに29回認証に失敗しても、BANのトリガーにはなりません。
-
gitlab-ci-token
によって認証された JWT リクエストには適用されません。 - デフォルトでは無効になっています。
レスポンス・ヘッダは提供されません。
設定についてはOmnibus GitLab 設定オプションを参照してください。
設定不可能な制限
リポジトリ・アーカイブ
GitLab 12.9で導入されました。
リポジトリアーカイブをダウンロードする際のレート制限が利用可能になりました。この制限は、プロジェクトと、UI または API を通じてダウンロードを開始したユーザーに適用されます。
レートリミットはユーザーあたり毎分5リクエストです。
Webhookテスト
GitLab 13.4 で導入されました。
Webhookのテストにはレート制限があり、Webhook機能の悪用を防ぎます。
レートリミットはユーザーあたり毎分5リクエストです。
ユーザー登録
GitLab 14.7 で導入されました。
/users/sign_up
エンドポイントにはIPアドレスごとのレート制限があります。これはエンドポイントを悪用しようとする試みを軽減するためです。例えば、使用中のユーザ名やメールアドレスを大量に発見するためです。
レート制限は、IPアドレスあたり1分あたり20コールです。
ユーザー名の更新
GitLab 14.7 で導入されました。
ユーザー名の変更頻度に制限を設けました。これは、この機能の悪用を防ぐためです。例えば、どのユーザー名が使われているかを大量に発見するためです。
レートリミットは、認証ユーザーあたり1分あたり10コールです。
ユーザー名が存在する場合
GitLab 14.7 で導入されました。
サインアップ時に、選択したユーザー名が既に使われていないかチェックするために使われる内部エンドポイント/users/:username/exists
にはレート制限があります。これは、使用中のユーザ名が大量に発見されるような悪用のリスクを軽減するためです。
レート制限は、IPアドレスあたり1分あたり20コールです。
プロジェクトジョブAPIエンドポイント
ジョブを取得する際のタイムアウトを減らすために、エンドポイントproject/:id/jobs
にはレート制限があります。
レート制限は、認証ユーザー1人当たり1分あたり600コールです。
AIアクション
GitLab 16.0 で導入されました。
GraphQLaiAction
の変異にはレート制限があり、このエンドポイントの悪用を防ぐために強制されます。
レート制限は、認証ユーザーあたり8時間あたり160コールです。
APIを使用したメンバーの削除
GitLab 16.0 で導入されました。
API エンドポイント /groups/:id/members
または/project/:id/members
を使ってプロジェクトやグループのメンバーを削除するには、レート制限があります。
制限速度は1分あたり60件です。
トラブルシューティング
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
-
denylistはRedisに保存されているため、
redis-cli
を開く必要があります:/opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket
-
以下の構文を使ってブロックを削除できます。
<ip>
を denylist に登録されている実際の IP に置き換えてください:del cache:gitlab:rack::attack:allow2ban:ban:<ip>
-
そのIPのキーが表示されなくなったことを確認します:
keys *rack::attack*
デフォルトでは、
keys
コマンドは無効になっています。