GitLab Duo Agent Platform - ハンズオンラボ: DAP でコードを作成してセキュリティを確保する

このハンズオンガイドでは、Duo Agent Platform を使用してコードを作成し、セキュリティを確保する方法を説明します。

完了目安時間: 35 分

学習目標

このラボを修了すると、次のことができるようになります。

  • AI 脆弱性管理を使用して、平易な言語で発見内容を説明する。
  • DAP を使用して SAST 脆弱性の修正マージリクエストを生成する。
  • Fix Pipeline フローを使用して修正ブランチの失敗したパイプラインを診断して修復する。
  • セキュリティ修正マージリクエストに対してコードレビューフローをトリガーして AI フィードバックをレビューする。
  • 修正 MR をマージして脆弱性が解決されたことを確認する。

概要

セキュリティの脆弱性は避けられません。早期に発見されるほど、修正がより安く、より速くなります。このラボでは、4 つの DAP 機能が 1 つの実際の問題に対して連携します。

Swag Shop プロジェクトの app.py に SQL インジェクションの脆弱性があり、脆弱性レポートで未解決のままになっています。修正を生成しますが、マージリクエストがオープンの間に依存関係も更新する必要があります。パッケージ名のタイポがパイプラインを壊します。Fix Pipeline フローを使用して診断して解決し、その後セキュリティ修正に対して AI コードレビューを取得してマージします。

タスク A: 脆弱性を特定する

出発点は Swag Shop の脆弱性レポートです。プロジェクトのセキュリティスキャナーはすでに実行されて、いくつかの発見にフラグを立てています。このタスクでのあなたの仕事は、修正するものを見つけることです。

  1. 左サイドバーで Secure > Vulnerability report を選択します。

  2. 検索フィールドをクリックして Report Type を選択し、SAST を選択します。

    注: DAP の脆弱性修正は SAST の発見のみで機能します。

  3. app.py の 214 行目にある Improper neutralization of special elements used in an SQL Command (‘SQL Injection’) という脆弱性を特定します。

  4. 脆弱性をクリックして詳細ビューを開き、メモをレビューします。

タスク A の期待される出力

  • SQL インジェクションの脆弱性が Vulnerability Report に表示されており、SAST でフィルタリングされ、影響を受けるファイルと行番号が詳細ビューに表示されている。

タスク B: 脆弱性を理解して修正する

1 つのオープンな脆弱性があります。このタスクでは、GitLab Duo に平易な言語で説明するよう依頼し、それを修正するマージリクエストを生成します。タスク B の終わりには、独自のブランチに 1 つのオープンなマージリクエスト(修正マージリクエスト)があります。

タスク B.1: 脆弱性を説明する

変更を加える前に、GitLab Duo に発見内容を解釈させてください。これにより、コードに触れる前に脆弱性が何であるか、なぜ重要なのかを理解していることを確認します。

  1. 脆弱性の詳細ビューで、右上隅の AI vulnerability management を選択します。

  2. Explain with AI を選択します。

    Agentic Chat セッションが開いて、影響を受けるコードパターンと推奨される修正アプローチを含めて、脆弱性を平易な言語で説明します。

  3. 続行する前に説明をレビューしてください。

表示内容について: app.py の 214 行目の SQL インジェクションは、ユーザー入力が SQL クエリ文字列に直接埋め込まれているために発生します。攻撃者はその入力を操作してクエリのロジックを変更できます。修正はパラメーター化クエリを使用することで、クエリ構造をデータから分離します。

タスク B.2: 修正マージリクエストを生成する

脆弱性を理解したので、DAP を使用して修正を生成します。

  1. AI vulnerability management を再度選択して、Resolve with AI を選択します。

  2. セッションが完了するまで待ちます。完了すると、マージリクエストが自動的に開きます。

タスク B.3: 修正マージリクエストをレビューする

ブランチで他に何かを行う前に、生成された修正が実際に脆弱性を正しく対処しているかを確認します。これは実際のワークフローで常に実行するステップです。

  1. オープンなマージリクエストから Changes タブを選択します。

  2. 脆弱な文字列連結クエリがパラメーター化クエリに置き換えられていることを確認します。修正はこの脆弱なパターンを:

    vulnerable_query = f"SELECT * FROM demo_products WHERE name LIKE '%{search_term}%' OR description LIKE '%{search_term}%'"
    
    cursor.execute(vulnerable_query)
    

    これに置き換える必要があります。

    secure_query = "SELECT * FROM demo_products WHERE name LIKE ? OR description LIKE ?"
    
    search_param = f"%{search_term}%"
    
    cursor.execute(secure_query, (search_param, search_param))
    
  3. Pipelines タブを選択します。パイプラインのステータスがスキップされたとして表示される場合があります。これは予期されたことです。Resolve with AI によって作成されたコミットにはデフォルトで [ci skip] が含まれています。このブランチへの次のコミット(タスク C で行います)の後に実際のパイプラインが実行されます。

タスク B の期待される出力

  • Agentic Chat セッションが SQL インジェクションの脆弱性を平易な言語で説明している。
  • 1 つのマージリクエスト(修正マージリクエスト)が Code > Merge Requests に表示されており、脆弱性に対処する app.py の変更が含まれている。

タスク C: パイプラインを修正する

修正マージリクエストがオープンの状態で、プロジェクトの依存関係を更新する必要があります。requirements.txt にパッケージを追加しますが、パッケージ名にタイポをします。パイプラインが実行されて失敗します。脆弱性の修正をマージする前に、これを解決する必要があります。

タスク C.1: 依存関係エラーを導入する

  1. 修正マージリクエストのヘッダーに表示されているソースブランチ名をメモします。remediate/improper-neutral... のような形式になります。次のステップで必要になります。

  2. 左サイドバーで Code > Repository に移動します。

  3. ブランチドロップダウンをクリックして、ブランチを main から修正ブランチに変更します。ファイルリストに修正ブランチの内容が表示されます。

  4. ファイルリストから requirements.txt を開きます。

  5. Edit > Open in Web IDE をクリックします。

  6. ファイルの任意の場所に次の行を追加します: nonexistent-package==1.0.0

  7. 左ツールバーで Source Control アイコンを選択して保留中の変更を確認します。

  8. Commit message フィールドに updated requirements と入力します。

  9. 修正ブランチに変更をコミットします。

新しいマージリクエストを作成する必要はありません。修正ブランチへのコミットは自動的に既存の修正マージリクエストを更新し、新しいパイプライン実行をトリガーします。

タスク C.2: 失敗を読む

修正をトリガーする前に、エラーを読んで Fix Pipeline フローが何を解決しようとしているかを理解します。

  1. 修正マージリクエストから Pipelines タブを選択します。パイプラインが完了して失敗ステータスを示すまで待ちます。

  2. 失敗したパイプラインをクリックして詳細ビューを開きます。

  3. 失敗したジョブを見つけてクリックしてログを開きます。次のような出力が表示されることを確認します。

    ERROR: Could not find a version that satisfies the requirement nonexistent-package==1.0.0
    
    ERROR: No matching distribution found for nonexistent-package==1.0.0
    

    注: これを手動で修正する必要はありません。ログを読むことで何が失敗したかを確認し、次に Fix Pipeline フローが何を行うかを理解するのに役立ちます。

タスク C.3: Fix Pipeline フローをトリガーする

  1. Build > Pipelines に移動して、updated requirements パイプラインのパイプライン ID(例: #12345)を選択します。

  2. ページの上部で Fix pipeline with Duo をクリックします。

    注: セッションは自動的に開きます。開かない場合は、Automate > Sessions に移動して Fix Pipeline フローのセッションを見つけてください。

  3. Activity タブをクリックして、フローが実行しているステップを観察します: ログ分析、根本原因の特定、ファイルの変更。

  4. 先に進む前に Details タブでセッションのステータスが Finished に変わるまで待ちます。

フローが行っていること: Fix Pipeline フローは失敗したジョブのログを読み取り、根本原因(存在しないパッケージ)を特定し、責任のあるファイル(requirements.txt)を見つけ、問題のエントリーを削除した新しいマージリクエストを開きます。フローはブランチに直接コミットするのではなく、マージリクエストを作成することに注目してください。これは意図的なものです: DAP はチームの他の開発者と同じレビュープロセスに従います。

タスク C.4: 修正マージリクエストをレビューしてマージする

Fix Pipeline フローは修正ブランチを対象とした新しいマージリクエスト(修正 MR)を作成しました。このタスクの残りは修正 MR で作業します。

  1. セッション出力のリンクをたどって修正マージリクエストに移動します。リンクが表示されない場合は、Code > Merge Requests に移動して Fix Pipeline フローが作成したマージリクエストを探してください。

  2. Changes タブで、requirements.txt から nonexistent-package==1.0.0 が削除されており、他の変更が行われていないことを確認します。

  3. Pipelines タブを選択して、パイプラインが正常に完了するまで待ちます。

  4. マージリクエストに戻って Overview タブを選択します。

  5. Mark as ready を選択してマージリクエストをドラフトから変換し、Merge を選択します。これにより修正が修正ブランチにマージされ、メインブランチではありません。

  6. 修正を確認するには、Code > Repository に移動して requirements.txt を開きます。nonexistent-package==1.0.0 が削除されていることを確認します。

タスク C の期待される出力

  • Fix Pipeline フローセッションが Automate > SessionsFinished ステータスで表示されている。
  • フローが requirements.txt から nonexistent-package==1.0.0 を削除したマージリクエストを開いた。
  • 修正マージリクエストが修正ブランチにマージされた。
  • 修正マージリクエストのパイプラインが現在通過している。

タスク D: コードレビューフローをトリガーする

この時点で 1 つのオープンなマージリクエスト(修正マージリクエスト)があり、パイプラインが通過しています。マージ前に、コードレビューフローを実行して修正に対する AI フィードバックを取得します。

  1. Code > Merge Requests に移動して、修正マージリクエストを開きます。

  2. Overview ページで、右サイドバーの Reviewers セクションを見つけます。

  3. Edit をクリックして GitLabDuo を検索します。選択して GitLab Duo をレビュアーとして割り当てます。

    代替トリガー: マージリクエストの任意のコメントボックスに /assign_reviewer @GitLabDuo と入力することもできます。

  4. マージリクエストの Overview タブで、アクティビティフィードまでスクロールして、リアルタイムで実行されているコードレビューフローを観察します。

  5. GitLab Duo がレビューを完了するまで待ち、マージリクエストに投稿されたコメントを読みます。

タスク D の期待される出力

  • GitLab Duo が修正 MR のレビュアーとして割り当てられている。
  • GitLab Duo によって 1 つ以上のレビューコメントが投稿されている。

タスク E: 修正をマージして解決を確認する

この時点で 1 つのオープンなマージリクエスト(修正マージリクエスト)があり、パイプラインが通過してコードレビューが完了しています。これが最終ステップです: 修正をマージして脆弱性がなくなったことを確認します。

タスク E.1: 修正マージリクエストをマージする

  1. Code > Merge Requests に移動して、修正マージリクエストを開きます。

  2. Overview タブを選択します。

  3. AI Generated Fix フィールドをレビューします。これは脆弱性に対処するために行われた具体的なコード変更をサマリーし、修正内容と理由を確認します。

  4. 下にスクロールして Merge を選択します。

  5. パイプライン番号を選択して、マージパイプラインがいつ完了するかを確認します。

タスク E.2: 脆弱性が解決されたことを確認する

  1. 左サイドバーで Secure > Vulnerability report を選択します。

  2. 検索フィールドで Report Type を選択して SAST を選択します。

  3. Improper neutralization of special elements used in an SQL Command (‘SQL Injection’) の 214 行目の脆弱性がリストに表示されなくなっていることを確認します。

タスク E の期待される出力

  • 修正マージリクエストがメインブランチにマージされた後、パイプラインが通過する。
  • SQL インジェクションの脆弱性が SAST でフィルタリングされた Vulnerability Report に表示されなくなる。

ラボガイド完了

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

ご意見・ご提案

ラボへの変更を希望する場合は、マージリクエスト経由で変更を送信してください。