GitLab Security Essentials - ハンズオンラボ: SAST とシークレット検出

このハンズオンガイドは、プロジェクトで SAST とシークレット検出を有効化・使用するプロセスを案内します。

推定所要時間: 15 分

タスク A. プロジェクトの作成

このコースセクションでは、セキュリティスキャナーをテストするために、あらかじめコードが用意されたテンプレートを使用します。

  1. 新しいプロジェクト ボタンを選択します。

  2. テンプレートから作成 タイルを選択します。

  3. インスタンス タブを選択します。

  4. Security Essentials Labs テンプレートの横にある テンプレートを使用 を選択します。

  5. プロジェクト名 フィールドに Security Labs と入力します。

    プロジェクトスラグは自動的に入力されます。必要に応じて短い文字列に変更することもできますが、このラボではデフォルトのままにしてください。

  6. プロジェクト URL フィールドで、URL の後半部分のドロップダウンをクリックして、グループ名training-users/* で始まる)を指しているか確認します。ユーザー名 ではなくグループ内にプロジェクトを作成してください。

  7. 公開レベルプライベート に設定されていることを確認します。

    親グループがプライベートに設定されているため、その配下のすべての子グループとプロジェクトもプライベートになります。プロジェクトの公開レベルについてはドキュメントでさらに詳しく学べます。

  8. プロジェクトを作成 をクリックします。

タスク B. SAST の有効化と設定

静的アプリケーションセキュリティテスト(SAST)は、ソースコードの脆弱性を検査するプロセスです。SAST スキャンを使用することで、コードリポジトリの既知の脆弱性を自動的にスキャンできます。また、マージリクエストのマージ前に脆弱性を確認するためにも使用できます。このプロセスにより、コードに脆弱性が混入しないようにできます。

  1. (+) > このディレクトリ > 新しいファイル をクリックして、main ブランチに新しいファイルを作成します。

  2. ファイル名 フィールドに .gitlab-ci.yml と入力します。自動的にテンプレートが表示されますが、このタスクでは空白のままにしておいて構いません。

  3. 単一の test ステージを定義します:

    stages:
      - test
    

    YAML ファイルはスペース 2 つでインデントする必要があります。Web IDE ではタブ 4 スペースに設定されている場合があります。サンプルをコピー&ペーストしない場合は、バックスペースで 2 スペースに調整してください。

  4. .gitlab-ci.yml のステージ定義の後に以下のテキストを貼り付けて SAST を有効化します:

    include:
      - component: ilt.gitlabtraining.cloud/components/sast/sast@~latest
    

    GitLab UI から SAST を設定することも可能です。その場合は Secure > セキュリティ設定 に移動し、SAST を設定 ボタンをクリックします。このラボでは CI ファイルを編集して設定することで、仕組みをより深く理解できるようにしています。

  5. .gitlab-ci.yml ファイルの末尾に inputs セクションを追加し、excluded_paths: venv/ を設定します。

    include:
      - component: ilt.gitlabtraining.cloud/components/sast/sast@~latest
        inputs:
          excluded_paths: venv/
    

    .gitlab-ci.yml ファイルの inputs セクションに設定を追加することで SAST をカスタマイズできます。たとえば、excluded_paths 変数を使用すると、SAST スキャンからプロジェクトのパスを除外できます。不要なファイルのスキャンを防ぐために設定できます。

    例として、Python プロジェクトには venv ディレクトリが含まれていることが多く、プロジェクトが使用するパッケージが格納されています。このディレクトリには自分たちのソースコードが含まれていないため、SAST スキャンから除外するべきです。

    SAST 変数の完全なリストはドキュメントで確認できます。

  6. 完成すると、.gitlab-ci.yml ファイルは以下のようになります:

    stages:
      - test
    
    include:
      - component: ilt.gitlabtraining.cloud/components/sast/sast@~latest
        inputs:
          excluded_paths: venv/
    
  7. 変更をコミット ボタンをクリックし、適切なコミットメッセージを追加します(例: Add SAST template to .gitlab-ci.yml)。

  8. 新しいブランチにコミット オプションを選択し、ブランチ名を add-security に変更します。この変更に対して新しいマージリクエストを作成する にチェックが入っていることを確認し、変更をコミット ボタンをクリックします。

  9. 新しいマージリクエスト ウィンドウで、マージリクエストの名前を入力します。マージリクエストを作成 を選択します。

タスク C. マージリクエストの脆弱性レポート

セキュリティスキャンの主な目的の一つは、安全でないコードがリポジトリに取り込まれるのを防ぐことです。マージリクエストの脆弱性レポートを使用して、1 つのマージリクエストで検出されたすべての脆弱性を確認できます。このレポートには、現在のマージリクエストで新たに導入された脆弱性のみが表示されます。リポジトリにすでに存在する脆弱性はここには表示されませんが、プロジェクトレベルの脆弱性レポートには表示されます。

  1. パイプラインが完了した後、マージリクエストの画面を更新します。

  2. セキュリティスキャンにより 15 件の新たな潜在的脆弱性が検出されました というメッセージが表示されます。

  3. パイプラインのすべての検出結果を表示 を選択します。

  4. MR に表示されている脆弱性を確認します。ここでは他のセキュリティ機能を示すために、これらの脆弱性をそのままマージします。ただし、実際のケースではここで問題を解決することを目指してください。

  5. マージリクエストに戻ります。

  6. ソースブランチを削除 にチェックを入れたまま、マージ をクリックします。

タスク D. Advanced SAST の有効化

より徹底的なスキャンと脆弱性検出を提供するために、プロジェクトで Advanced SAST を有効化します。これを行うには、SAST スキャンコンポーネントに別の入力を追加する必要があります。

  1. 左サイドバーで コード > リポジトリ に移動します。

  2. .gitlab-ci.yml ファイルを選択します。

  3. 編集 > 単一ファイルを編集 を選択します。

  4. excluded_paths の入力の下に、run_advanced_sast という名前で値 true の別の入力を追加します。完成すると、ファイルは以下のようになります:

    stages:
      - test
    
    include:
      - component: ilt.gitlabtraining.cloud/components/sast/sast@~latest
        inputs:
          excluded_paths: venv/
          run_advanced_sast: true
    
  5. 変更をコミット をクリックします。

  6. 適切なコミットメッセージを追加します(例: Add Advanced SAST functionality)。新しいブランチにコミット オプションが選択されていることを確認します。ブランチ名を sast-update に設定し、この変更に対して新しいマージリクエストを作成する にチェックが入っていることを確認します。変更をコミット ボタンをクリックします。

  7. その後の MR ページで、適切なタイトル(例: Enabled Advanced SAST in our pipeline)を入力し、マージリクエストを作成 をクリックします。

  8. 左サイドバーで ビルド > パイプライン を選択します。

  9. 現在実行中のパイプラインを選択します。gitlab-advanced-sast というジョブがあることを確認します。

  10. パイプラインが正常に完了したら、MR に戻り、マージ ボタンをクリックします。

GitLab Advanced SAST スキャナーは SAST スキャナーからより多くの情報を提供します。ラボの後半で脆弱性レポートを確認する際に、その結果がどのように表示されるかを見ていきます。

タスク E. シークレット検出の有効化と設定

前のセクションでは、ソースコードの脆弱性を検出するために SAST を適用しました。コードの脆弱性をスキャンするだけでなく、GitLab はキーや API トークンなどのシークレットについてもコードをスキャンできます。シークレット検出をコードに追加することで、リポジトリに機密データが漏洩するのを防ぐことができます。

シークレット検出ジョブはデフォルトで test ステージに属します。.gitlab-ci.yml にすでにそのステージが定義されているため、再度定義する必要はありません。

  1. 左サイドバーで コード > リポジトリ に移動します。

  2. ビルド > パイプラインエディター を選択します。

  3. .gitlab-ci.yml の既存の include: セクションの末尾(SAST のコンポーネントの下)に以下のコンポーネントを追加して、シークレット検出を有効化します。インデントは前のテンプレートと同じレベルにしてください。

    include:
      - component: ilt.gitlabtraining.cloud/components/sast/sast@~latest
        inputs:
          excluded_paths: venv/
          run_advanced_sast: true
      - component: ilt.gitlabtraining.cloud/components/secret-detection/secret-detection@~latest
    

    GitLab UI からシークレット検出を設定することも可能です。その場合は Secure > セキュリティ設定 に移動し、シークレット検出を設定 ボタンをクリックします。このラボでは .gitlab-ci.yml ファイルを編集して設定することで、仕組みをより深く理解できるようにしています。

  4. コンポーネントのインポートの下に以下のジョブ定義を貼り付けて、シークレット検出ジョブが test ディレクトリを無視するように設定します。

    secret_detection:
      variables:
        SECRET_DETECTION_EXCLUDED_PATHS: tests/
    

    デフォルト以外の動作を使用するようにシークレット検出を設定するには、secret_detection ジョブ定義をオーバーライドし、その中に変数を追加します。

    シークレット検出変数の完全なリストはドキュメントで確認できます。

  5. .gitlab-ci.yml ファイルは以下のようになります:

    stages:
      - test
    
    include:
      - component: ilt.gitlabtraining.cloud/components/sast/sast@~latest
        inputs:
          excluded_paths: venv/
          run_advanced_sast: true
      - component: ilt.gitlabtraining.cloud/components/secret-detection/secret-detection@~latest
    
    secret_detection:
      variables:
        SECRET_DETECTION_EXCLUDED_PATHS: tests/
    
  6. ブランチを main に設定し、変更をコミット を選択します。

    注: リポジトリへのすべての変更は MR を通じて行い、MR はマージ前に他のチームメンバーによって承認されることがベストプラクティスとされています。ただし、このプロジェクトのメンバーはラボを実施している人一人だけなので、そのようなレビューは不可能です。そのため、小規模なチームやデモ環境では main ブランチに直接コミットすることが一般的に許容されています。実際の業務環境では、マージリクエストを使用してください。

  7. ビルド > パイプライン に移動し、ジョブを確認して、すべてのパイプラインが完了するまで待ちます。

タスク F. プロジェクトレベルの脆弱性レポートの表示

main ブランチにコードをマージするたびに、セキュリティパイプラインが実行され、デフォルトブランチの最新コミットのすべての脆弱性を表示するプロジェクトレベルの脆弱性レポートが生成されます。これは、他のブランチの脆弱性と比較する際のベースラインとなる脆弱性セットと考えてください。

  1. Secure > 脆弱性レポート に移動します。

  2. 開発の脆弱性 テーブルの レポートタイプ 列を確認すると、有効にした各ツールの様々な脆弱性検出結果が表示されています。

  3. Advanced SAST スキャナーが検出した脆弱性のみを表示します。脆弱性を検索またはフィルター… バーの スキャナー ドロップダウンを選択し、GitLab Advanced SAST を選択してフィルタリングします。

  4. SQL コマンドで使用される特殊要素の不適切な無効化(「SQL インジェクション」) の脆弱性の 1 つを選択します。ここには 詳細コードフロー の 2 つのタブがあります。詳細 タブには脆弱性に関する一般的な詳細が表示されます。コードフロー タブは Advanced SAST スキャナーが提供する特別な機能です。コードの中でその脆弱性がどのように発生するかが表示されます。

  5. これらのさまざまな結果を確認します。次のラボでは、これらの脆弱性のトリアージと解決方法について説明します。

ラボガイド完了

このラボ演習が完了しました。このコースの他のラボガイドを参照できます。

ご提案・改善点

ラボに変更を加えたい場合は、マージリクエストで変更内容を送信してください。