チュートリアル: パイプラインのシークレット検出でプロジェクトを保護する
アプリケーションが外部リソースを使用する場合、通常、トークンやキーなどのシークレットでアプリケーションを認証する必要があります。シークレットがリモートリポジトリにプッシュされると、そのリポジトリへのアクセス権を持つすべての人が、あなたまたはあなたのアプリケーションになりすますことができます。
パイプラインシークレット検出は、CI/CDジョブを使用して、GitLabプロジェクトのシークレットをチェックします。このチュートリアルでは、プロジェクトを作成し、パイプラインシークレット検出を設定し、その結果を分析する方法を学習します:
はじめる前
このチュートリアルを開始する前に、以下を確認してください:
- GitLab.comアカウント。パイプラインシークレット検出のすべての機能を活用するには、Ultimateプランのアカウントを使用してください。
- CI/CDに関するある程度の知識。
プロジェクトを作成する
まず、プロジェクトを作成し、シークレット検出を有効にします:
- 左側のサイドバーの上部で、新規作成( )> 新規プロジェクト/リポジトリを選択します。
- 空のプロジェクトの作成を選択します。
- プロジェクトの詳細を入力します:
- 名前とプロジェクトslugを入力します。
- **プロジェクトのデプロイ先(オプション)**ドロップダウンリストから、デプロイ計画がありませんを選択します。
- リポジトリを初期化しREADMEファイルを生成するチェックボックスを選択します。これにより、後でプロジェクトにコンテンツを追加する場所が提供されます。
- シークレット検出を有効にするチェックボックスを選択します。
- プロジェクトを作成を選択します。
新しいプロジェクトが作成され、Readmeと.gitlab-ci.ymlファイルで初期化されます。CI/CD設定には、Security/Secret-Detection.gitlab-ci.ymlテンプレートが含まれており、プロジェクトでパイプラインシークレット検出を有効にします。
ジョブの出力を確認
パイプラインシークレット検出は、secret_detectionCI/CDジョブで実行されます。スキャンの結果は、CI/CDジョブログに書き込まれます。各スキャンでは、ジョブアーティファクトとして包括的なレポートも生成されます。
最新のスキャンの結果を確認するには、次の手順に従います:
- 左側のサイドバーで、ビルド > ジョブを選択します。
- 最新の
secret_detectionジョブを選択します。新しいパイプラインを実行していない場合は、ジョブは1つだけです。 - ジョブログで、次の出力を確認します:
- アナライザーのバージョンやルールセットなど、スキャンに関する情報。プロジェクトでは、シークレット検出を自動的に有効にしたため、デフォルトのルールセットが使用されます。
- シークレットが検出されたかどうか。
no leaks foundと表示されるはずです。
- 完全なレポートをダウンロードするには、ジョブのアーティファクトでダウンロードを選択します。
マージリクエストパイプラインを有効にする
これまでのところ、パイプラインシークレット検出を使用して、デフォルトブランチのコミットをスキャンしました。ただし、デフォルトブランチにマージする前に、マージリクエスト内のコミットを分析するには、マージリクエストパイプラインを有効にする必要があります。
これを行うには、次の手順を実行します:
.gitlab-ci.ymlファイルに次の行を追加します:variables: AST_ENABLE_MR_PIPELINES: "true"変更を保存し、プロジェクトの
mainブランチにコミットします。
偽のシークレットを追加
次に、マージリクエストで偽のシークレットを「リーク」して、ジョブの出力を複雑にしてみましょう:
新しいブランチをチェックアウトします:
git checkout -b pipeline-sd-tutorialプロジェクトのReadmeを編集し、次の行を追加します。パーソナルアクセストークンの正確な形式に合わせるには、
-の前後のスペースを必ず削除してください:# To make the example work, remove # the spaces before and after the dash: glpat - 12345678901234567890変更をコミットしてプッシュし、マージするためにマージリクエストを開いてデフォルトブランチにマージします。
マージリクエストパイプラインが自動的に実行されます。
パイプラインが完了するのを待ってから、ジョブログを確認します。
WRN leaks found: 1と表示されるはずです。ジョブアーティファクトをダウンロードし、次の情報が含まれていることを確認します:
シークレットの種類。この例では、タイプは
"GitLab personal access token"です。シークレットの使用目的の説明と、リークを修正するために実行できる手順。
脆弱性の重大度。パーソナルアクセストークンはGitLab.comでユーザーになりすますために使用できるため、このリークは
Criticalです。シークレットのrawテキスト。
シークレットの場所に関する情報:
"file": "README.md", "line_start": 97, "line_end": 97,この例では、シークレットはファイル
README.mdの97行目にあります。
マージリクエストのセキュリティウィジェットを使用します
- プラン: Ultimate
デフォルト以外のブランチで検出されたシークレットは、「検出結果」と呼ばれます。検出結果がデフォルトブランチにマージされると、「脆弱性」になります。
マージリクエストウィジェットには、マージリクエストがマージされた場合に脆弱性になる可能性のある検出結果のリストが表示されます。
ウィジェットを表示するには:
- 前の手順で作成したマージリクエストを選択します。
- マージリクエストウィジェットを見つけます。これは、セキュリティスキャンから始まります。
- ウィジェットで、詳細を表示( )を選択します。
- 表示された情報を確認します。Secret detection detected 1 new potential vulnerability(シークレット検出で1つの新しい潜在的な脆弱性が検出されました)が表示されます。
マージリクエスト内のすべての検出結果の詳細なビューについては、すべてのパイプラインの検証結果を表示するを選択します。
シークレットをトリアージする
- プラン: Ultimate
GitLab Ultimateプランでは、ジョブの出力は次にも書き込まれます:
- パイプラインのセキュリティタブ。
- 検出結果が脆弱性になった場合は、脆弱性レポート。
UIを使用してシークレットをトリアージする方法を示すために、脆弱性を作成し、脆弱性レポートでそのステータスを変更してみましょう:
最後の手順で作成したマージリクエストをマージし、パイプラインが完了するのを待ちます。
偽のシークレットが
mainに追加され、これにより検出結果が脆弱性になります。左側のサイドバーで、セキュリティ>脆弱性レポートを選択します。
脆弱性の説明を選択して表示します:
- シークレットの種類の詳細。
- 修正ガイダンス。
- 脆弱性がいつ、どこで検出されたかに関する情報。
脆弱性を編集>ステータスの変更を選択します。
- ステータスドロップダウンリストから、[無視する…]を選択します。[テストで使用]。
- プロジェクトに偽のシークレットを追加した理由を説明するコメントを追加します。
- ステータスの変更を選択します。
脆弱性は、脆弱性レポートのフロントページに表示されなくなります。
リークを修正する
シークレットをリモートリポジトリに追加すると、そのシークレットは安全ではなくなり、できるだけ早く失効する必要があります。シークレットを失効して置き換える必要があります。これらがデフォルトブランチにマージされていない場合でも同様です。
リークを修正するために実行する正確な手順は、組織のセキュリティポリシーによって異なりますが、少なくとも次のことを行う必要があります:
- シークレットを失効します。シークレットが失効されると、有効ではなくなり、正当なアクティビティーを偽装するために使用できなくなります。
- リポジトリからシークレットを削除します。
特定の修正ガイダンスは、secret-detectionジョブのジョブログに書き込まれ、脆弱性レポートの詳細ページで確認できます。