動的アプリケーションセキュリティテスト(DAST)

新しい環境にウェブアプリケーションをデプロイする場合、アプリケーションは新しいタイプの攻撃にさらされるかもしれません。例えば、アプリケーションサーバの誤った設定や、セキュリティ管理に関する誤った仮定は、ソースコードからは見え ないかもしれません。

動的アプリケーションセキュリティテスト(Dynamic Application Security Testing)(DAST) は、デプロイされた環境において、このような脆弱性についてアプリケーションを検査します。

概要については、動的アプリケーションセキュリティテスト(Dynamic Application Security Testing)(DAST) を参照してください。

note
上位6件の攻撃のうち4件がアプリケーションベースのものであったこと、および組織を保護する方法については、ホワイトペーパー「A Seismic Shift in Application Security」をダウンロードしてください。

GitLab DAST

GitLabは以下のDASTアナライザを提供しており、あなたがテストしているアプリケーションの種類によって一つ以上が役に立つかもしれません。

ウェブサイトをスキャンするには、以下のうちの一つを使います:

  • 単純なHTMLを提供する従来のアプリケーションをスキャンする場合は、DASTプロキシベースアナライザを使用します。プロキシベースのアナライザは、自動またはオンデマンドで実行できます。
  • DAST ブラウザベースアナライザ:JavaScript を多用するアプリケーションをスキャンします。これには、単一ページのWebアプリケーションが含まれます。

APIのスキャンには

  • DAST API アナライザでウェブ API をスキャンします。GraphQL、REST、SOAP などの Web API テクノロジーに対応しています。

アナライザは、アプリケーションのセキュリティで説明したアーキテクチャパターンに従います。各アナライザはCIテンプレートを使用してパイプラインで設定でき、Dockerコンテナでスキャンを実行します。スキャンはDASTレポートのアーティファクトを出力し、GitLabはこのアーティファクトを使用して、ソースブランチとターゲットブランチでのスキャン結果の差異に基づいて発見された脆弱性を判断します。

利用を開始

前提条件

  • GitLab Runnerが利用可能で、Linux/amd64上でdocker Executor
  • ターゲットアプリケーションのデプロイ。詳細については、デプロイオプションをお読みください。
  • dast ステージをCI/CDパイプライン定義に追加します。これは、例えばデプロイステップの後に追加します:

     stages:
       - build
       - test
       - deploy
       - dast
    

推奨

  • パイプラインが各実行で同じウェブサーバにデプロイされるように設定されている場合は注意してください。サーバーの更新中にDASTスキャンを実行すると、不正確で非決定的な結果につながります。
  • 常にプルポリシーを使用して最新バージョンのアナライザを実行するように Runner を設定してください。
  • デフォルトでは、DASTはパイプライン内の以前のジョブによって定義されたすべてのアーティファクトをダウンロードします。DASTジョブがenvironment_url.txt 、テスト対象のURLや以前のジョブで作成されたその他のファイルの定義に依存していない場合は、アーティファクトをダウンロードしないことをお勧めします。アーティファクトのダウンロードを回避するには、アナライザ CI/CD ジョブを拡張して依存関係を指定しないようにします。たとえば、DAST プロキシベースのアナライザーの場合、.gitlab-ci.yml ファイルに以下を追加します:

     dast:
       dependencies: []
    

アナライザー設定

アナライザ固有の設定方法については、DAST プロキシベースアナライザDAST ブラウザベースアナライザ、またはDAST API アナライザを参照してください。

スキャン結果の表示

GitLab 13.1で導入されました。

検出された脆弱性はマージリクエストパイプラインセキュリティタブ脆弱性レポートに表示されます。

  1. 検出されたすべての脆弱性を表示するには、次のいずれかを実行します:
    • プロジェクトで、「セキュリティとコンプライアンス」、「脆弱性レポート」の順に選択します。
    • パイプラインから、[セキュリティ] タブを選択します。
    • マージリクエストからセキュリティスキャンウィジェットに移動し、[フルレポート]タブを選択します。
  2. DAST 脆弱性の説明を選択します。以下のフィールドは、根本的な原因の調査および修正を支援するために DAST アナライザが出力するフィールドの例です。アナライザによって出力されるフィールドは異なります。

    項目説明
    説明脆弱性の説明
    証拠脆弱性を検証するために発見されたデータの証拠。リクエストやレスポンスのスニペットであることが多く、脆弱性の検証に役立ちます。
    識別子脆弱性の識別子。
    リンク集検出された脆弱性の詳細へのリンクです。
    方法脆弱性の検出に使用される HTTP メソッド。
    プロジェクト脆弱性が検出された名前空間とプロジェクト。
    リクエストヘッダーリクエストのヘッダー。
    レスポンスヘッダアプリケーションから受け取ったレスポンスのヘッダー。
    応答ステータスアプリケーションから受信した応答ステータス。
    スキャナの種類脆弱性レポートの種類。
    深刻度脆弱性の深刻度。
    解答脆弱性に対する推奨される解決策の詳細。
    URL脆弱性が検出されたURL。
note
パイプラインは、SAST スキャンと DAST スキャンを含む複数のジョブで構成することができます。何らかの理由でジョブの終了に失敗した場合、セキュリティダッシュボードには DAST スキャナの出力は表示されません。例えば、DAST ジョブは終了したが SAST ジョブは失敗した場合、セキュリティダッシュボードには DAST の結果は表示されません。失敗した場合、アナライザは終了コードを出力します。

スキャンされた URL の一覧

DASTがスキャンを完了すると、マージリクエストページにスキャンされたURLの数が表示されます。スキャンされたURLのリストを含むウェブコンソール出力を表示するには、[詳細を表示]を選択します。

DAST Widget

アプリケーションデプロイオプション

DASTでは、デプロイされたアプリケーションがスキャン可能である必要があります。

ターゲットアプリケーションの複雑さに応じて、DASTテンプレートのデプロイと設定方法にはいくつかの選択肢があります。DASTデモンストレーションプロジェクトでは、アプリケーションの例と設定を提供しています。

レビューアプリ

レビューアプリは、DASTターゲットアプリケーションをデプロイする最も複雑な方法です。このプロセスを支援するために、Google Kubernetes Engine(GKE) を使用してレビューアプリのデプロイを作成しました。このサンプルはReview Apps - GKEプロジェクトにあり、DAST 用の Review Apps の設定方法についてREADME.mdに詳細な説明があります。

Dockerサービス

アプリケーションでDockerコンテナを使用する場合、DASTでデプロイおよびスキャンするための別のオプションがあります。Dockerビルドジョブが完了し、イメージがコンテナレジストリに追加されると、そのイメージをサービスとして使用することができます。

.gitlab-ci.ymlでサービス定義を使用することで、DASTアナライザでサービスをスキャンすることができます。

ジョブにservices セクションを追加する場合、alias を使用して、サービスへのアクセスに使用できるホスト名を定義します。以下の例では、dast ジョブ定義のalias: yourapp 部分は、デプロイされたアプリケーションへの URL がホスト名としてyourapp を使用することを意味します (https://yourapp/)。

stages:
  - build
  - dast

include:
  - template: DAST.gitlab-ci.yml

# Deploys the container to the GitLab container registry
deploy:
  services:
  - name: docker:dind
    alias: dind
  image: docker:20.10.16
  stage: build
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker pull $CI_REGISTRY_IMAGE:latest || true
    - docker build --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest

dast:
  services: # use services to link your app container to the dast job
    - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
      alias: yourapp

variables:
  DAST_WEBSITE: https://yourapp
  DAST_FULL_SCAN_ENABLED: "true" # do a full scan
  DAST_BROWSER_SCAN: "true" # use the browser-based GitLab DAST crawler

ほとんどのアプリケーションはデータベースやキャッシュサービスのような複数のサービスに依存します。デフォルトでは、サービスフィールドで定義されたサービスは互いに通信できません。サービス間の通信を許可するには、FF_NETWORK_PER_BUILD 機能フラグを有効にします。

variables:
  FF_NETWORK_PER_BUILD: "true" # enable network per build so all services can communicate on the same network

services: # use services to link the container to the dast job
  - name: mongo:latest
    alias: mongo
  - name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
    alias: yourapp