シークレット スキャン

エンジニアリング システムで資格情報が露呈している場合、攻撃者はそれを簡単に悪用できます。 この脅威を防ぐために、GitHub Advanced Security for Azure DevOps のスキャンは、ソース コード内の資格情報やその他の機密コンテンツをスキャンします。 また、プッシュ保護により、まず第一に資格情報が漏洩するのを防ぐことができます。

リポジトリのシークレット スキャンにより、ソース コードに既に存在している可能性があるシークレットが履歴全体でスキャンされ、プッシュ保護により、ソース コードで新しいシークレットが露呈するのを防ぐことができます。

GitHub Advanced Security for Azure DevOps は、Azure Repos と連携して動作します。 GitHub リポジトリで GitHub Advanced Security を使用する場合は、「GitHub Advanced Security」を参照してください。

シークレット スキャン アラートについて

Advanced Security を有効にすると、リポジトリがスキャンされ、さまざまなサービス プロバイダーによって発行されたシークレットが検出され、シークレット スキャン アラートが生成されます。

リソースへのアクセスにペアの資格情報が必要な場合、ペアの両方の部分が同じファイルで検出された場合にのみ、シークレット スキャンによってアラートが作成されます。 ペアリングにより、最も重大なリークが、部分リークに関する情報の背後に隠されないようにすることができます。 ペア マッチングは、誤検知の削減にも役立ちます。これは、プロバイダーのリソースにアクセスするために、ペアの両方の要素を一緒に使用する必要があるためです。

Azure DevOps の [リポジトリ]>[Advanced Security] (高度なセキュリティ) にある [Advanced Security] (高度なセキュリティ) タブは、セキュリティ アラートを表示するためのハブです。 [シークレット] タブを選択すると、シークレット スキャン アラートが表示されます。 状態とシークレットの種類でフィルター処理できます。 アラートに移動すると、修復ガイダンスなどの詳細を確認できます。 Advanced Security を有効にした後、選択したリポジトリすべてのスキャンが開始されます。これには、過去のコミットも含まれます。 時間が経過すると、スキャンが進行し、アラートが表示され始めます。

ブランチの名前が変更されても結果に影響はありません。新しい名前が表示されるまでに最大 24 時間かかる場合があります。

アクティブなシークレット スキャン アラートを示すスクリーンショット

露呈したシークレットを修復するには、露呈した資格情報を無効にし、代わりに新しい資格情報を作成します。 新しく作成したシークレットは、コードに直接プッシュ バックしない方法で安全に保存する必要があります。 たとえば、シークレットは Azure Key Vault に保存できます。 ほとんどのリソースには、プライマリ資格情報とセカンダリ資格情報の両方があります。 特に明記されていない限り、プライマリ資格情報をロールオーバーする方法とセカンダリ資格情報をロールオーバーする方法は同じです。

シークレット スキャン アラートの管理

リポジトリのアラートの表示

リポジトリの共同作成者アクセス許可を持つすべてのユーザーは、[リポジトリ] の [Advanced Security] (高度なセキュリティ) タブで、リポジトリのすべてのアラートの概要を表示できます。 [シークレット] タブを選択すると、すべてのシークレット スキャン アラートが表示されます。

リポジトリに対して Advanced Security を最近有効にした場合、Advanced Security がまだリポジトリをスキャンしていることを示すカードが表示されることがあります。

シークレットのスキャンを示すスクリーンショット

スキャンが完了すると、結果が表示されます。 リポジトリのすべてのブランチと履歴で検出された一意の資格情報ごとに 1 つのアラートが生成されます。 ブランチ フィルターは 1 つのアラートにロールアップされるため、存在しません。

プロバイダー以外のシークレットは、[シークレット スキャン] タブの信頼度ドロップダウンから [その他] を選択して表示できます。

GitHub Advanced Security シークレット スキャン信頼度フィルターのスクリーンショット。

[アラートの詳細]

アラートに移動すると、詳細なアラート ビューが表示され、検出結果に関する詳細が表示され、アラートを解決するための具体的な修復ガイダンスが提供されます。

シークレット スキャン アラートの詳細を示すスクリーンショット

セクション 説明
場所 [場所] セクションには、シークレット スキャンによって漏洩した資格情報が検出されたパスの詳細が示されます。 複数の場所、または履歴の複数のコミットに、漏洩した資格情報が含まれる可能性があります。 これらの場所とコミットはすべて [場所] に表示され、さらに資格情報が特定されたコード スニペットおよびコミットへの直接リンクも表示されます。
推奨 推奨セクションには、特定された資格情報の修復ガイダンスまたはサード パーティ ドキュメントの修復ガイダンスへのリンクが含まれます。
アラートの終了 シークレット スキャン アラートに対する自動修正動作はありません。 すべてのシークレット スキャン アラートは、アラートの詳細ページで、修正済みとして手動で証明する必要があります。 [Close] (クローズ) ボタンを選択して、シークレットが取り消されることを証明します。
重要度 すべてのシークレット スキャン アラートは [重大] として設定されます。 資格情報が露呈している場合、悪意のあるアクターがそれを悪用する可能性があります。
Finding details (検出の詳細) アラート詳細ページのサイドバーの [Finding details] (検出の詳細) には、資格情報の種類と、その資格情報を検出するために使用されたルールがリストされます。

非プロバイダー シークレットでは、信頼度: その他タグもアラートの詳細ビューで重大度バッジ別に表示されます。

アラートの一般的な詳細をスキャンする GitHub Advanced Security シークレットのスクリーンショット。

シークレット スキャン アラートの修正

各シークレットには、固有の修復手順があります。これにより、シークレットを取り消し、代わりに新しいシークレットを再生成する方法がガイドされます。 アラートの詳細では、各アラートの特定の手順またはドキュメントが共有されます。

シークレット スキャン アラートは、クローズするまでオープンのままです。 シークレット スキャン アラートが修正されていることを証明するには、次のようにします。

  1. クローズするアラートに移動し、アラートを選択します。
  2. [アラートをクローズする] ドロップダウンを選択します。
  3. [修正済み] を選択します (まだ選択していない場合)。
  4. [Close] (クローズ) を選択してアラートを送信し、クローズします。

シークレット スキャン アラートをクローズする方法を示すスクリーンショット

シークレット スキャン アラートの無視

Advanced Security でアラートを無視するには、適切なアクセス許可が必要です。 既定では、プロジェクト管理者のみが Advanced Security のアラートを無視できます。 Advanced Security のアクセス許可について詳しくは、Advanced Security のアクセス許可の管理に関するページを参照してください。

アラートを無視するには、次のようにします。

  1. クローズするアラートに移動し、アラートを選択します。
  2. [アラートを閉じる] ドロップダウンを選択します。
  3. クローズする理由として [リスクの許容] または [誤検知] を選択します (まだ選択していない場合)。
  4. [コメント] テキスト ボックスに、任意でコメントを追加します。
  5. [Close] (クローズ) を選択してアラートを送信し、クローズします。
  6. アラートの状態が [オープン] から [Closed] (クローズ) に変わり、無視の理由が表示されます。

シークレット スキャン アラートの無視の詳細を示すスクリーンショット

以前に無視されたアラートを手動で再オープンできます。

侵害されたシークレットを保護する

シークレットがリポジトリにコミットされると、そのシークレットは危険な状態になります。 Microsoft は、危険な状態のシークレットに対して次のアクションを推奨しています。

  • Azure DevOps の個人用アクセス トークンが危険な状態の場合、その危険な状態のトークンを削除し、新しいトークンを作成し、以前のトークンを使用していたサービスを更新します。
  • その他のすべてのシークレットについては、Azure Repos にコミットされたシークレットが有効であることを最初に確認します。 有効な場合は、新しいシークレットを作成し、古いシークレットを使用するサービスをすべて更新して、古いシークレットを削除します。
  • 危険な状態のトークンによって企業のリソースに対して実行されたアクションを特定します。

シークレットを更新するときは、新しいシークレットを安全に保存し、常にアクセスできるようにし、プレーンテキストとして保存しないようにしてください。 1 つの可能性は、Azure KeyVault またはその他のシークレット管理ソリューションを使用して行うことができます。

シークレットのプッシュ保護

プッシュ保護は、受信プッシュに機密性の高いシークレットがないかをチェックし、プッシュが実行されないようにします。 エラー メッセージには、特定されたすべてのシークレットが表示され、必要に応じてそれらのシークレットを削除すること、またはシークレットのプッシュを続行することができます。

プッシュ保護アラートについて

プッシュ保護アラートは、プッシュ保護によって報告されるユーザー アラートです。 プッシュ保護としてのシークレット スキャンは、現在、リポジトリをスキャンして一部のサービス プロバイダーによって発行されたシークレットを検出します。

リソースへのアクセスにペアの資格情報が必要な場合、ペアの両方の部分が同じファイルで検出された場合にのみ、シークレット スキャンによってアラートが作成されます。 ペアリングにより、最も重大なリークが、部分リークに関する情報の背後に隠されないようにすることができます。 ペア マッチングは、ペアの両方の要素をプロバイダーのリソースにアクセスするために一緒に使用する必要があるため、誤検知を減らすのにも役立ちます。

プッシュ保護では、以前のバージョンの特定のトークンがブロックされない場合があります。これは、以前のバージョンのトークンでは、最新バージョンのトークンよりも、誤検知が数多く生成される場合があるためです。 プッシュ保護では、レガシ トークンもブロックされない場合があります。 Azure Storage キーなどのトークンの場合、Advanced Security では、レガシ パターンに一致するトークンはサポートされず、最近作成されたトークンのみがサポートされます。

コマンド ラインからのプッシュ保護

プッシュ保護は、Azure DevOps Git にネイティブで組み込まれています。 コミットに特定されたシークレットが含まれている場合、プッシュが拒否されたことを示すエラーが表示されます。

git プッシュがブロックされたことを示す VS Code のスクリーンショット

Web インターフェイスからのプッシュ保護

プッシュ保護は、Web インターフェイスからも機能します。 シークレットがコミットで特定されると、次のエラー ブロックが表示され、変更をプッシュできなくなります。

git プッシュがブロックされたことを示す AzDO Web UI のスクリーンショット

プッシュがブロックされた場合の操作

プッシュ保護は、プレーン テキスト ファイルで検出されたシークレットをブロックします。プレーン テキスト ファイルは、通常、ソース コード ファイルや JSON 構成ファイルなどのテキスト ファイルですが、これらに限定されません。 これらのシークレットはプレーンテキストで保存されます。 悪意のあるアクターがファイルにアクセスし、そのファイルがパブリック リポジトリに公開されると、誰でもそのシークレットを使用できるようになります。

フラグが設定されたファイルからシークレットを削除し、その後、コミット履歴からシークレットを削除することをお勧めします。 フラグが設定されたシークレットがプレースホルダーまたはシークレットの例である場合、そのフェイク シークレットを更新して、フェイク シークレットの前に Placeholder という文字列を付加することをお勧めします。

直前のコミットでシークレットが追加された場合は、コミットを修正して新しいコミットを作成します。

  1. コードからシークレットを削除します。
  2. git commit --amend を使用して変更をコミットします
  3. 変更を再びプッシュします。

シークレットがさらに履歴に追加されている場合、対話型のリベースを使用してコミットを編集します。

  1. git log を使用して、シークレットを最初にコミットしたコミットを特定します。
  2. 対話型のリベースを実行します: git rebase -i [commit ID before credential introduction]~1
  3. エディターに表示されるテキストの最初の行の pickedit に変更して、編集するコミットを特定します。
  4. コードからシークレットを削除します。
  5. git commit --amend を使用して、変更をコミットします。
  6. git rebase --continueを実行して、リベースを完了します。

ブロックされたシークレットをプッシュする

フラグが設定されたシークレットをバイパスすることは、会社のセキュリティを危険にさらす可能性があるため、推奨されません。 特定されたシークレットが誤検知ではないことを確認した場合、変更を再度プッシュする前に、ブランチ履歴全体からシークレットを削除する必要があります。

ブロックされたシークレットが誤検知であるか、プッシュしても安全であると考えられる場合は、プッシュ保護をバイパスできます。 コミット メッセージに skip-secret-scanning:true という文字列を含めます。 プッシュ保護をバイパスした場合でも、シークレットがプッシュされると、アラート UX でシークレット スキャン アラートが生成されます。