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

GitLab Ultimate10.3で導入されました

ホワイトペーパー「A Seismic Shift in Application Security(アプリケーション・セキュリティの激震)」をダウンロードして、組織を保護する方法をご覧ください

概要

GitLabCI/CDを使っているのであれば、Static Application Security Testing(SAST)を使って、既知の脆弱性についてソースコードを分析することができます。

以下のいずれかの方法でSASTをご利用いただけます:

GitLab は SAST レポートをチェックし、発見された脆弱性をソースブランチとターゲットブランチの間で比較し、マージリクエストに情報を表示します。

SAST Widget

結果は脆弱性の優先度順にソートされます:

  1. クリティカル
  2. 高い
  3. ミディアム
  4. 低い
  5. 不明
  6. その他すべて
注:パイプラインは、SAST スキャンと DAST スキャンを含む複数のジョブで構成されます。 いずれかのジョブが何らかの理由で完了しなかった場合、セキュリティ・ダッシュボードには SAST スキャナの出力は表示されません。 たとえば、SAST ジョブが完了しても DAST ジョブが失敗した場合、セキュリティ・ダッシュボードには SAST の結果は表示されません。 アナライザは、失敗時に終了コードを出力します。

ユースケース

  • あなたのコードには、クラス内に潜在的に危険な属性や、意図しないコードの実行につながる安全でないコードがあります。
  • あなたのアプリケーションはクロスサイトスクリプティング(XSS) 攻撃の脆弱性があり、セッションデータへの不正アクセスに利用される可能性があります。

要件

SASTジョブを実行するには、デフォルトではGitLab Runnerにdocker またはkubernetes のexecutorが必要です。GitLab.comの共有Runnerを使っている場合は、デフォルトで有効になっています。

GitLab 13.0からは、SASTのDocker-in-Dockerを有効にしている場合のみ、Docker特権モードが必要です。

注意:当社の SAST ジョブは現在、Linux コンテナタイプを想定しています。 Windows コンテナはまだサポートされていません。
注意:独自のRunnerを使用する場合はインストールされているDockerのバージョンが19.03.0。 詳細はトラブルシューティング情報を参照してください。

対応言語とフレームワーク

次の表は、どの言語、パッケージ・マネージャー、フレームワークがサポートされ、どのツールが使用されるかを示しています。

言語(パッケージマネージャ)/フレームワーク スキャンツール GitLabバージョンで導入されました。
.NET Core セキュリティコードスキャン 11.0
.NET フレームワーク セキュリティコードスキャン 13.0
任意 Gitleaksと TruffleHog 11.9
エイペックス(セールスフォース) ピーエムディー 12.1
C/C++ フローファインダー 10.7
Elixir(フェニックス) ソベロ 11.10
行く ゴセック 10.7
Groovy(AntGradleMavenSBT) SpotBugsと find-sec-bugsプラグイン 11.3 (Gradle) & 11.9 (Ant、Maven、SBT)
ヘルムチャート キューベセック 13.1
Java(AntGradleMavenSBT) SpotBugsと find-sec-bugsプラグイン 10.6 (Maven)、10.8 (Gradle)、11.9 (Ant、SBT)
ジャバスクリプト ESLintセキュリティプラグイン 11.8, 13.2でGitLabCoreに移行
Kubernetesマニフェスト キューベセック 12.6
Node.js NodeJsScan 11.1
PHP phpcs-security-audit 10.8
Python(pip) バンディット 10.3
反応 ESLintリアクトプラグイン 12.5
Ruby on Rails 制動手 10.3, 13.1でGitLabCoreに移動しました。
Scala(AntGradleMavenSBT) SpotBugsと find-sec-bugsプラグイン 11.0(SBT) & 11.9 (Ant、Gradle、Maven)
タイプスクリプト tslint-config-security 11.9
注:Javaアナライザは、GradleラッパーGrailsMavenラッパーなどの亜種にも使用できます。

SASTアナライザーをGitLabの全階層で利用可能に

全てのオープンソース(OSS) アナライザーはレビュー中で、GitLab Core tier に移行する可能性があります。 進捗は対応するエピックで追跡できます。

Docker-in-DockerのサポートはGitLab Core層には拡張されませんのでご注意ください。

階層ごとの機能概要

以下の表に示すように、GitLabの階層によって利用できる機能が異なります:

能力 Coreにて アルティメット
SAST スキャナの設定 {チェック・サークル} {チェック・サークル}
SAST設定のカスタマイズ {チェック・サークル} {チェック・サークル}
JSONレポートを見る {チェック・サークル} {チェック・サークル}
マージリクエストでのJSONレポートのプレゼンテーション {点線丸} {チェック・サークル}
脆弱性との相互作用 {点線丸} {チェック・サークル}
セキュリティダッシュボードへのアクセス {点線丸} {チェック・サークル}

貢献するスキャナー

他のセキュリティスキャナをGitLabにインテグレーションする方法については、セキュリティスキャナのインテグレーションドキュメントをご覧ください。

設定

:Auto DevOpsが提供するAuto SASTを使用している場合は、このセクションで示すようにSASTを手動で構成する必要はありません。

GitLab 11.9以降では、SASTを有効にするには、GitLabインストールの一部として提供されるSAST.gitlab-ci.yml テンプレート含める必要があります。11.9より前のバージョンのGitLabでは、そのテンプレートで定義されたジョブをコピーして使用することができます。

.gitlab-ci.yml ファイルに以下を追加してください:

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

付属のテンプレートは、CI/CDパイプラインにSASTジョブを作成し、プロジェクトのソースコードに脆弱性がないかスキャンします。

結果はSAST レポートのアーティファクトとして保存され、後でダウンロードして分析することができます。 実装上の制限により、常に最新の SAST アーティファクトを使用します。

SAST設定のカスタマイズ

SAST 設定は、.gitlab-ci.ymlvariables パラメータを使用することで、環境変数を通じて変更することができます。 以下の例では、SAST テンプレートをインクルードし、同時にSAST_GOSEC_LEVEL 変数を2に設定しています:

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

variables:
  SAST_GOSEC_LEVEL: 2

テンプレートはパイプライン設定の前に評価されるため、変数の最後の記述が優先されます。

SASTジョブの上書き

Deprecation:GitLab 13.0から、onlyexceptの使用はサポートされなくなりました。テンプレートをオーバーライドする場合は、代わりに](../../../ci/yaml/README.md#rules) を使用する必要があります。

ジョブ定義をオーバーライドする (例えば、variablesdependenciesのようなプロパティを変更する) には、オーバーライドする SAST ジョブと同じ名前のジョブを宣言します。 この新しいジョブをテンプレート包含の後に配置し、その下に追加のキーを指定します。 例えば、これはspotbugs アナライザでFAIL_NEVER を有効にします:

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

spotbugs-sast:
  variables:
    FAIL_NEVER: 1

非公開リポジトリの認証情報を渡すための環境変数の使用

解析ツールによっては、プロジェクトの依存関係をダウンロードしなければ解析できないものもあります。 そのような依存関係は非公開の Git リポジトリにあることもあり、ダウンロードするにはユーザー名やパスワードなどの認証情報が必要になります。 解析ツールによっては、そのような認証情報を環境変数で指定することもできます。

変数を使用してユーザー名とパスワードを非公開 Maven リポジトリに渡します。

非公開 Maven リポジトリにログイン認証が必要な場合は、MAVEN_CLI_OPTS 環境変数を使用できます。

非公開Mavenリポジトリの使用方法の詳細はこちらをご覧ください。

Docker-in-Dockerの有効化

必要であれば、Docker-in-Dockerを有効にしてGitLab 13.0以前のSASTの動作を復元することができます:

  1. 特権モードでDocker-inDockerを使用してGitLab Runnerを設定します。
  2. 変数SAST_DISABLE_DINDfalseにセット:

    include:
      - template: SAST.gitlab-ci.yml
    
    variables:
      SAST_DISABLE_DIND: "false"
    

これにより、CI/CDパイプラインに複数の<analyzer-name>-sastジョブではなく、単一のsast ジョブが作成されます。

Kubesecアナライザーの有効化

GitLab Ultimate 12.6で導入されました

Kubesec アナライザーを有効にするには、SCAN_KUBERNETES_MANIFESTS"true" に設定する必要があります。.gitlab-ci.ymlで、定義します:

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

variables:
  SCAN_KUBERNETES_MANIFESTS: "true"

プリコンパイル

プロジェクトがカスタムビルド構成を必要とする場合、SAST実行中のコンパイルを避け、代わりにパイプライン内の早いステージからすべてのジョブのアーティファクトを渡すことが望ましい場合があります。 これは、スキャンジョブの準備にbefore_script 、現在の戦略です。

プロジェクトの依存関係をアーティファクトとして渡すには、依存関係をプロジェクトの作業ディレクトリに含め、artifacts:path 設定を使用して指定する必要があります。 すべての依存関係が存在する場合、COMPILE=false 変数をアナライザに提供することができ、コンパイルはスキップされます:

image: maven:3.6-jdk-8-alpine

stages:
 - build
 - test

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

build:
  stage: build
  script:
    - mvn package -Dmaven.repo.local=./.m2/repository
  artifacts:
    paths:
      - .m2/
      - target/

spotbugs-sast:
  dependencies:
    - build
  variables:
    MAVEN_REPO_PATH: ./.m2/repository
    COMPILE: false
  artifacts:
    reports:
      sast: gl-sast-report.json
注意: アナライザがコンパイルされたアーティファクトを認識できるようにするには、 vendoredディレクトリへのパスを明示的に指定する必要があります。 この設定はアナライザによって異なりますが、 上記のJavaの場合は、MAVEN_REPO_PATH 。 利用可能なオプションの完全なリストは、アナライザの設定を参照してください。

利用可能な変数

SASTは環境変数を使って設定できます。

ログレベル

SECURE_LOG_LEVEL env varを設定することで、ログの冗長性を制御することができます。デフォルトはinfoに設定されていますが、以下のレベルのいずれかに設定することができます:

  • fatal
  • error
  • warn
  • info
  • debug

カスタム認証局

カスタム作成者を信頼するには、ADDITIONAL_CA_CERT_BUNDLE 変数を SAST 環境内で信頼したい CA 証明書のバンドルに設定します。

Dockerイメージ

以下はDockerイメージ関連の変数です。

環境変数 説明
SECURE_ANALYZERS_PREFIX デフォルトのイメージ (プロキシ) を提供する Docker レジストリの名前をオーバーライドします。アナライザのカスタマイズについては、こちらを参照してください。
SAST_ANALYZER_IMAGE_TAG 廃止:デフォルトのイメージのDockerタグをオーバーライドします。アナライザーのカスタマイズについてはこちらをご覧ください。
SAST_DEFAULT_ANALYZERS デフォルトの画像の名前を上書きします。アナライザのカスタマイズについてはこちらをご覧ください。
SAST_DISABLE_DIND Docker-in-Dockerを無効にし、アナライザを個別に実行します。この変数はデフォルトでtrue

脆弱性フィルター

解析ツールによっては、指定した閾値以下の脆弱性をフィルタリングできるものもあります。

環境変数 デフォルト値 説明
SAST_EXCLUDED_PATHS spec, test, tests, tmp パスに基づいて脆弱性を出力から除外します。 これは、パターンのカンマ区切りのリストです。 パターンには、グロブ、またはファイルやフォルダのパス (例えば、doc,spec ) を使用できます。親ディレクトリもパターンにマッチします。
SAST_BANDIT_EXCLUDED_PATHS   スキャンから除外するパスをカンマで区切ったリスト。 Python のfnmatch 構文を使用; 例えば:'*/tests/*'
SAST_BRAKEMAN_LEVEL 1 指定された信頼度の下で、ブレーキマンの脆弱性を無視します。 整数、1=低い 3=高い。
SAST_FLAWFINDER_LEVEL 1 整数、0=リスクなし、5=高リスク。
SAST_GITLEAKS_ENTROPY_LEVEL 8.0 秘密検出のための最小エントロピー。 フロート、0.0 = 低、8.0 = 高。
SAST_GOSEC_LEVEL 0 指定された信頼度の下で、ゴセックの脆弱性を無視します。 整数、0=未定義、1=低、2=中、3=高。
SAST_GITLEAKS_COMMIT_FROM   Gitleaksのスキャンが開始されるコミット。
SAST_GITLEAKS_COMMIT_TO   Gitleaksのスキャンが終了するコミット。
SAST_GITLEAKS_HISTORIC_SCAN false Gitleaksの履歴スキャンを有効にするフラグ。

Docker-in-Dockerオーケストレータ

以下の変数はDocker-in-Dockerオーケストレータを設定するため、Docker-in-Dockerモードが有効な場合にのみ使用されます。

環境変数 デフォルト値 説明
SAST_ANALYZER_IMAGES   カンマで区切られたカスタム画像のリスト。 デフォルトの画像はそのまま有効です。アナライザのカスタマイズについてはこちらをご覧ください。
SAST_PULL_ANALYZER_IMAGES 1 Dockerレジストリからイメージを取り出します(無効にするには0に設定します)。アナライザのカスタマイズについてはこちらをご覧ください。
SAST_DOCKER_CLIENT_NEGOTIATION_TIMEOUT 2m Dockerクライアントネゴシエーションの制限時間。 タイムアウトはGoのParseDurationを使って解析されます。 有効な時間単位はns,us (またはµs)、ms,s,m,hです。 例えば、300ms,1.5h または2h45m
SAST_PULL_ANALYZER_IMAGE_TIMEOUT 5m アナライザーの画像を引き出す際の制限時間。 タイムアウトはGoのParseDurationを使って解析されます。 有効な時間単位はns,us (またはµs)、ms,s,m,hです。 例えば、300ms,1.5h または2h45m
SAST_RUN_ANALYZER_TIMEOUT 20m アナライザ実行時の制限時間。 タイムアウトはGoのParseDurationを使用して解析されます。 有効な時間単位は、ns,us (またはµs)、ms,s,m,hです。 たとえば、300ms,1.5h または2h45mです。

アナライザーの設定

環境変数でカスタマイズできる分析器もあります。

環境変数 アナライザー 説明
SCAN_KUBERNETES_MANIFESTS キューベセック Kubernetes マニフェストをスキャンするには、"true" に設定します。
KUBESEC_HELM_CHARTS_PATH キューベセック kubesec がスキャンする Kubernetes マニフェストを生成するためにhelm が使用する Helm チャートへのオプションパス。依存関係が定義されている場合は、before_scripthelm dependency build を実行して必要な依存関係をフェッチする必要があります。
KUBESEC_HELM_OPTIONS キューベセック helm 実行ファイルの追加引数。
COMPILE スポットバグ プロジェクトのコンパイルと依存関係の取得を無効にするには、"false" に設定します。
ANT_HOME スポットバグ ANT_HOME 環境変数。
ANT_PATH スポットバグ ant 実行ファイルへのパス。
GRADLE_PATH スポットバグ gradle 実行ファイルへのパス。
JAVA_OPTS スポットバグ java 実行ファイルの追加引数。
JAVA_PATH スポットバグ java 実行ファイルへのパス。
SAST_JAVA_VERSION スポットバグ どのJavaバージョンを使用するか。サポートされているバージョンは811です。 デフォルトは8です。
MAVEN_CLI_OPTS スポットバグ mvn またはmvnw 実行ファイルの追加引数。
MAVEN_PATH スポットバグ mvn 実行ファイルへのパス。
MAVEN_REPO_PATH スポットバグ Maven ローカルリポジトリへのパス (maven.repo.local プロパティのショートカット)。
SBT_PATH スポットバグ sbt 実行ファイルへのパス。
FAIL_NEVER スポットバグ コンパイルの失敗を無視するには1 を設定します。
SAST_GOSEC_CONFIG ゴセック Gosecの設定へのパス(オプション)。
PHPCS_SECURITY_AUDIT_PHP_EXTENSIONS phpcs-security-audit カンマ区切りの PHP 拡張モジュールの一覧。

カスタム環境変数

GitLab Ultimate 12.5で導入されました

前述の SAST 構成変数に加えて、SAST vendored テンプレートが使用されている場合、すべてのカスタム環境変数が基礎となる SAST アナライザー・イメージに伝搬されます。

注意:以下の接頭辞で始まる名前の変数は、SAST Dockerコンテナおよび/またはアナライザー・コンテナに伝搬されませんDOCKER_,CI,GITLAB_,FF_,HOME,PWD,OLDPWD,PATH,SHLVL,HOSTNAME.

JSON形式のレポーター

SAST ツールは JSON レポートファイルを生成します。 詳細は、このレポートのスキーマを参照してください。

SASTレポートの例です:

{
  "version": "2.0",
  "vulnerabilities": [
    {
      "id": "9e96e0ab-23da-4d7d-a09e-0acbaa5e83ca",
      "category": "sast",
      "name": "Predictable pseudorandom number generator",
      "message": "Predictable pseudorandom number generator",
      "description": "The use of java.util.Random is predictable",
      "severity": "Medium",
      "confidence": "Medium",
      "scanner": {
        "id": "find_sec_bugs",
        "name": "Find Security Bugs"
      },
      "location": {
        "file": "groovy/src/main/groovy/com/gitlab/security_products/tests/App.groovy",
        "start_line": 47,
        "end_line": 47,
        "class": "com.gitlab.security_products.tests.App",
        "method": "generateSecretToken2",
        "dependency": {
          "package": {}
        }
      },
      "identifiers": [
        {
          "type": "find_sec_bugs_type",
          "name": "Find Security Bugs-PREDICTABLE_RANDOM",
          "value": "PREDICTABLE_RANDOM",
          "url": "https://find-sec-bugs.github.io/bugs.htm#PREDICTABLE_RANDOM"
        },
        {
          "type": "cwe",
          "name": "CWE-330",
          "value": "330",
          "url": "https://cwe.mitre.org/data/definitions/330.html"
        }
      ]
    },
    {
      "id": "e6dbf91f-4c07-46f7-a365-0169489c27d1",
      "category": "sast",
      "message": "Probable insecure usage of temp file/directory.",
      "severity": "Medium",
      "confidence": "Medium",
      "scanner": {
        "id": "bandit",
        "name": "Bandit"
      },
      "location": {
        "file": "python/hardcoded/hardcoded-tmp.py",
        "start_line": 10,
        "end_line": 10,
        "dependency": {
          "package": {}
        }
      },
      "identifiers": [
        {
          "type": "bandit_test_id",
          "name": "Bandit Test ID B108",
          "value": "B108",
          "url": "https://docs.openstack.org/bandit/latest/plugins/b108_hardcoded_tmp_directory.html"
        }
      ]
    },
  ],
  "remediations": []
}

シークレット検出

シークレット・ディテクションについて詳しくはこちらをご覧ください。

セキュリティダッシュボード

セキュリティダッシュボードは、グループ、プロジェクト、パイプラインに存在するすべてのセキュリティ脆弱性の概要を把握するのに適した場所です。セキュリティダッシュボードについてもっと読む。

脆弱性との対話

脆弱性が見つかったら、その脆弱性と対話することができます。 脆弱性と対話する方法については、こちらをお読みください。

脆弱性データベース

脆弱性データベースに含まれる脆弱性は、GitLab脆弱性アドバイザリーデータベースで検索・閲覧することができます。

脆弱性データベースの更新

脆弱性データベースの更新の詳細については、メンテナンステーブルを確認してください。

オフライン環境での SAST の実行

インターネットを通じた外部リソースへのアクセスが制限されている、制限されている、または断続的な環境にある自己管理GitLabインスタンスでは、SASTジョブを正常に実行するためにいくつかの調整が必要です。 詳細については、オフライン環境を参照してください。

オフラインSASTの要件

オフライン環境でSASTを使用するには、以下が必要です:

**pull policy 注意:**GitLab Runnerのデフォルトのalways、つまりRunnerはローカルに利用可能なDockerイメージがある場合でも、GitLabコンテナレジストリからDockerイメージをプルしようとします。ローカルに利用可能なDockerイメージのみを使用したい場合は、オフライン環境でGitLab Runnerのpull_policyif-not-presentに設定することができます。 しかし、CI/CDパイプラインで更新されたスキャナを使用することができるため、オフライン環境でない場合はプルポリシーの設定を](https://docs.gitlab.com/runner/executors/docker.html#using-the-always-pull-policy) に維持することをお勧めします。

GitLab SASTアナライザーイメージをDockerレジストリで利用可能にします。

サポートされているすべての言語とフレームワークでSASTを使用するには、registry.gitlab.com 、以下のデフォルトSASTアナライザイメージをローカルのDockerコンテナレジストリにインポートします:

registry.gitlab.com/gitlab-org/security-products/analyzers/bandit:2
registry.gitlab.com/gitlab-org/security-products/analyzers/brakeman:2
registry.gitlab.com/gitlab-org/security-products/analyzers/eslint:2
registry.gitlab.com/gitlab-org/security-products/analyzers/flawfinder:2
registry.gitlab.com/gitlab-org/security-products/analyzers/gosec:2
registry.gitlab.com/gitlab-org/security-products/analyzers/kubesec:2
registry.gitlab.com/gitlab-org/security-products/analyzers/nodejs-scan:2
registry.gitlab.com/gitlab-org/security-products/analyzers/phpcs-security-audit:2
registry.gitlab.com/gitlab-org/security-products/analyzers/pmd-apex:2
registry.gitlab.com/gitlab-org/security-products/analyzers/secrets:2
registry.gitlab.com/gitlab-org/security-products/analyzers/security-code-scan:2
registry.gitlab.com/gitlab-org/security-products/analyzers/sobelow:2
registry.gitlab.com/gitlab-org/security-products/analyzers/spotbugs:2
registry.gitlab.com/gitlab-org/security-products/analyzers/tslint:2

DockerイメージをローカルのオフラインDockerレジストリにインポートするプロセスは、ネットワークセキュリティポリシーに依存します。 外部リソースをインポートしたり、一時的にアクセスしたりすることができる承認済みのプロセスについては、IT担当者にご相談ください。 これらのスキャナは定期的に新しい定義に更新されるため、定期的な更新を自分で行うことができるかどうかを検討してください。

Dockerイメージをファイルとして保存・転送する方法の詳細については、Dockerのドキュメントdocker save,docker load,docker export,docker importを参照してください。

ローカルSASTアナライザを使用するためのSAST CIジョブ変数の設定

.gitlab-ci.yml ファイルに以下の設定を追加します。SECURE_ANALYZERS_PREFIX を、ローカルの Docker コンテナレジストリを参照するように置き換える必要があります:

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

variables:
SECURE_ANALYZERS_PREFIX: "localhost:5000/analyzers"

SAST ジョブは、SAST アナライザのローカルコピーを使用して、インターネットにアクセスすることなく、コードをスキャンし、セキュ リティレポートを生成します。

トラブルシューティング

Error response from daemon: error processing tar file: docker-tar: relocation error

このエラーは、SASTジョブを実行するDockerのバージョンが19.03.0.である場合に発生します。 Docker19.03.1 以上に更新することを検討してください。古いバージョンは影響を受けません。この問題の.