- 概要
- ユースケース
- 要件
- 対応言語とフレームワーク
- 貢献するスキャナー
- 設定
- JSON形式のレポーター
- シークレット検出
- セキュリティダッシュボード
- 脆弱性との対話
- 脆弱性データベース
- オフライン環境での SAST の実行
- トラブルシューティング
静的アプリケーションセキュリティテスト(SAST)
GitLab Ultimate10.3で導入されました。
概要
GitLabCI/CDを使っているのであれば、Static Application Security Testing(SAST)を使って、既知の脆弱性についてソースコードを分析することができます。
以下のいずれかの方法でSASTをご利用いただけます:
- 既存の
.gitlab-ci.yml
ファイルにSAST テンプレートを含めます。 - Auto DevOpsが提供するAuto SASTを暗黙的に使用します。
GitLab は SAST レポートをチェックし、発見された脆弱性をソースブランチとターゲットブランチの間で比較し、マージリクエストに情報を表示します。
結果は脆弱性の優先度順にソートされます:
- クリティカル
- 高い
- ミディアム
- 低い
- 不明
- その他すべて
ユースケース
- あなたのコードには、クラス内に潜在的に危険な属性や、意図しないコードの実行につながる安全でないコードがあります。
- あなたのアプリケーションはクロスサイトスクリプティング(XSS) 攻撃の脆弱性があり、セッションデータへの不正アクセスに利用される可能性があります。
要件
SASTジョブを実行するには、デフォルトではGitLab Runnerにdocker
またはkubernetes
のexecutorが必要です。GitLab.comの共有Runnerを使っている場合は、デフォルトで有効になっています。
GitLab 13.0からは、SASTのDocker-in-Dockerを有効にしている場合のみ、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(Ant、Gradle、Maven、SBT) | SpotBugsと find-sec-bugsプラグイン | 11.3 (Gradle) & 11.9 (Ant、Maven、SBT) |
ヘルムチャート | キューベセック | 13.1 |
Java(Ant、Gradle、Maven、SBT) | 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(Ant、Gradle、Maven、SBT) | SpotBugsと find-sec-bugsプラグイン | 11.0(SBT) & 11.9 (Ant、Gradle、Maven) |
タイプスクリプト | tslint-config-security
| 11.9 |
SASTアナライザーをGitLabの全階層で利用可能に
全てのオープンソース(OSS) アナライザーはレビュー中で、GitLab Core tier に移行する可能性があります。 進捗は対応するエピックで追跡できます。
Docker-in-DockerのサポートはGitLab Core層には拡張されませんのでご注意ください。
階層ごとの機能概要
以下の表に示すように、GitLabの階層によって利用できる機能が異なります:
能力 | Coreにて | アルティメット |
---|---|---|
SAST スキャナの設定 | {チェック・サークル} | {チェック・サークル} |
SAST設定のカスタマイズ | {チェック・サークル} | {チェック・サークル} |
JSONレポートを見る | {チェック・サークル} | {チェック・サークル} |
マージリクエストでのJSONレポートのプレゼンテーション | {点線丸} | {チェック・サークル} |
脆弱性との相互作用 | {点線丸} | {チェック・サークル} |
セキュリティダッシュボードへのアクセス | {点線丸} | {チェック・サークル} |
貢献するスキャナー
他のセキュリティスキャナをGitLabにインテグレーションする方法については、セキュリティスキャナのインテグレーションドキュメントをご覧ください。
設定
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.yml
のvariables
パラメータを使用することで、環境変数を通じて変更することができます。 以下の例では、SAST テンプレートをインクルードし、同時にSAST_GOSEC_LEVEL
変数を2
に設定しています:
include:
- template: SAST.gitlab-ci.yml
variables:
SAST_GOSEC_LEVEL: 2
テンプレートはパイプライン設定の前に評価されるため、変数の最後の記述が優先されます。
SASTジョブの上書き
only
とexcept
の使用はサポートされなくなりました。テンプレートをオーバーライドする場合は、代わりに](../../../ci/yaml/README.md#rules) を使用する必要があります。ジョブ定義をオーバーライドする (例えば、variables
やdependencies
のようなプロパティを変更する) には、オーバーライドする 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の動作を復元することができます:
- 特権モードでDocker-inDockerを使用してGitLab Runnerを設定します。
-
変数
SAST_DISABLE_DIND
をfalse
にセット: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
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_script でhelm 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バージョンを使用するか。サポートされているバージョンは8 と11 です。 デフォルトは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 アナライザー・イメージに伝搬されます。
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を使用するには、以下が必要です:
- Docker-In-Dockerを無効にする(デフォルト)。
- GitLab Runnerで
docker
またはkubernetes
executor。 - Dockerコンテナレジストリに、SASTアナライザイメージのローカルで利用可能なコピーがあります。
pull policy
注意:**GitLab Runnerのデフォルトのalways
、つまりRunnerはローカルに利用可能なDockerイメージがある場合でも、GitLabコンテナレジストリからDockerイメージをプルしようとします。ローカルに利用可能なDockerイメージのみを使用したい場合は、オフライン環境でGitLab Runnerのpull_policy
をif-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
以上に更新することを検討してください。古いバージョンは影響を受けません。この問題の.