CSRF の保護
TeamCity のクロスサイトリクエストフォージェリ(CSRF)保護は、バージョン 2017.1(問題(英語))以降に実装されています。この保護は、HTTP リクエストに関するいくつかの要件を意味します。
バージョン 2020.1 以降、TeamCity は保護手段として CSRF トークンのみを使用します。TeamCity の以前のバージョンでは、Origin/Referer
ヘッダーも使用されていました。
セキュリティトークンを取得するには、GET https://your-server/authenticationTest.html?csrf
リクエストを送信します。
トークンを渡すには、X-TC-CSRF-Token
HTTP リクエストヘッダーまたは tc-csrf-token
HTTP パラメーターを使用します。
HTTP リクエストの CSRF チェック
TeamCity の観点から HTTP リクエストの安全性を検討するときは、次のチェックが順番に行われます。
HTTP リクエストが(
GET
などの)変更されていないリクエストである場合、安全と見なされます。HTTP リクエストのパラメーターまたは HTTP ヘッダにセキュアな CSRF トークンがあり、このトークンがユーザセッションに格納されているものと一致する場合、安全であると見なされます。
ブラウザー以外の HTTP クライアントへの影響
ブラウザー以外の API アクセスの場合は、リクエストのトークンベースの認証を使用し、HTTP クライアントで Cookie サポートを無効にすることをお勧めします。
Cookie を使用する必要がある場合、API は最初に CSRF トークンを取得し、それを Cookie 対応のリクエストで提供する必要があります。
CORS クライアントへの影響
CORS リクエストを使用するには、ここで説明するように CORS サポートを設定します。この構成は、GET
要求には十分です。
CORS を介して POST/PUT/DELETE
リクエストを送信する必要がある場合は、authenticationTest.html?csrf
呼び出しを使用して CSRF トークンを取得し、このトークンに変更する HTTP リクエストを提供する必要があります。
トラブルシューティング
TeamCity での CSRF 保護に関する問題に直面した場合(たとえば、サーバーから「 CSRF チェックに失敗したために 403 ステータスコードで応答しています」という応答が表示される場合)、次の手順を試すことができます。
2020.1 より前の TeamCity バージョンでの動作と同様に、
teamcity.csrf.paranoid=false
内部プロパティを設定して、CORS 操作のOrigin/Referer
ヘッダーの検証を強制します(詳細については、アップグレードノートを参照してください)。teamcity.csrf.origin.check.enabled=logOnly
内部プロパティを設定して、CSRF 保護を一時的に無効にします。失敗した CSRF 試行に関する情報は、
TeamCity/logs/teamcity-auth.log
ファイルに記録されます。リクエストのより詳細な診断を行うには、debug-auth ロギングプリセットを有効にします。
リストされている手順のいずれも問題の解決に役立たない場合は、サポート(英語)に連絡し、teamcity-auth.log
ログに有効な teamcity-auth ロギングプリセットを提供してください。