インフラストラクチャ・アズ・コード(IaC)スキャン

GitLab 14.5 で導入されました

Infrastructure as Code (IaC) ScanningはIaCの設定ファイルに既知の脆弱性がないかスキャンします。

IaC ScanningはTerraform、Ansible、AWS CloudFormation、Kubernetesの設定ファイルをサポートしています。

要件

IaC Scanningは、デフォルトで利用可能なtest ステージで実行されます。.gitlab-ci.yml ファイルでステージを再定義すると、test ステージが必要になります。

安定したパフォーマンスを確保するため、最低4GBのRAMを推奨します。

IaC Scanningジョブを実行するには、デフォルトではGitLab Runnerにdocker またはkubernetes のエクゼキュータが必要です。GitLab.comの共有Runnerを使っている場合は、デフォルトで有効になっています。

caution
GitLab IaC ScanningアナライザーはWindowsやamd64以外のCPUアーキテクチャでの実行をサポートしていません。
caution
独自のRunnerを使用する場合は、インストールされているDockerのバージョンが19.03.0ないことを確認してください。詳細はトラブルシューティング情報をご覧ください。

サポートされている言語とフレームワーク

GitLab IaCスキャニングは様々なIaC設定ファイルをサポートしています。GitLabのIaCセキュリティスキャナーは、言語が混在するプロジェクトでも機能する自動言語検出機能も備えています。プロジェクトのソースコードからサポートされている設定ファイルが検出された場合、適切なIaCアナライザーを自動的に実行します。

設定ファイルの種類スキャンツールGitLabバージョンで導入されました。
AnsibleKICS14.5
AWS CloudFormationKICS14.5
Azure Resource Manager1 KICS14.5
ドッカーファイルKICS14.5
Google デプロイマネージャKICS14.5
KubernetesKICS14.5
OpenAPIKICS14.5
Terraform2 KICS14.5
  1. IaC ScanningはJSON形式のAzureリソースマネージャーテンプレートを分析できます。テンプレートをBicep言語で記述する場合、GitLab IaC Scanningがテンプレートを分析する前に、bicep CLIを使ってBicepファイルをJSONに変換する必要があります。
  2. カスタムレジストリ内のTerraformモジュールは脆弱性スキャンされません。提案されている機能についてはこのイシューに従ってください。

サポートされるディストリビューション

GitLabスキャナーは、サイズとメンテナーのため、ベースとなるalpineイメージが提供されます。

FIPS対応イメージ

GitLab 14.10で導入されました

GitLab はFIPS 対応の Red Hat UBIバージョンのイメージも提供しています。そのため、標準イメージをFIPS対応イメージに置き換えることができます。イメージを設定するには、SAST_IMAGE_SUFFIX を設定-fips するか、標準タグに -fips拡張子を-fips 加えて変更 -fipsします。

variables:
  SAST_IMAGE_SUFFIX: '-fips'

include:
  - template: Jobs/SAST-IaC.gitlab-ci.yml

すべての GitLab ティアで IaC アナライザーを利用可能にする方法

全てのオープンソース(OSS) アナライザーは GitLab Free ティアで利用可能です。将来のプロプライエタリなアナライザはより高い階層に制限されるかもしれません。

階層ごとの機能概要

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

機能無料およびプレミアムアルティメット
IaCスキャナの設定{チェックサークル}{チェックサークル}
JSONレポートのダウンロード{チェックサークル}{チェックサークル}
マージリクエストウィジェットで新しい発見を見る{点線円}{チェックサークル}
脆弱性の管理{点線円}{チェックサークル}
セキュリティダッシュボードへのアクセス{点線円}{チェックサークル}

スキャナに貢献する

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

設定

プロジェクトにIaCスキャンを設定するには、次のようにします:

IaCスキャンの手動設定

IaC Scanningを有効にするには、GitLabインストールの一部として提供されたSAST-IaC.gitlab-ci.yml テンプレートインクルードする必要があります。以下にインクルードする方法の例を示します:

include:
  - template: Jobs/SAST-IaC.gitlab-ci.yml

このテンプレートは、CI/CDパイプラインにIaCスキャンのジョブを作成し、プロジェクトの設定ファイルに脆弱性がないかスキャンします。

結果はSASTレポートアーティファクトとして保存され、ダウンロードして分析することができます。

自動マージリクエストによる IaC スキャニングの有効化

note
既知のイシューのため、マージリクエストによる設定ボタンは一時的に無効になりました。詳細については、マージリクエスト 83757を参照してください。

プロジェクトで IaC スキャンを有効にするには、マージリクエストを作成します:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. セキュア > セキュリティ設定を選択します。
  3. Infrastructure as Code (IaC) Scanning] の行で、[Configure with a merge request] を選択します。
  4. マージリクエストをレビューしてマージし、IaCスキャンを有効にします。

パイプラインに IaC スキャンジョブが含まれるようになりました。

ルールセットのカスタマイズ

GitLab 14.8で導入されたオーバーライドルールをサポートしました。

GitLabで提供されるデフォルトのIaCスキャンルールをカスタマイズすることができます。

以下のカスタマイズオプションは別々に、または一緒に使用することができます:

定義済みのアナライザ・ルールの無効化

アクティブにしたくない特定のIaCスキャンルールがある場合、それを無効にすることができます。

アナライザ ルールを無効にするには

  1. プロジェクトのルートに.gitlab ディレクトリを作成します(まだ存在しない場合)。
  2. .gitlab ディレクトリがまだ存在しない場合は、sast-ruleset.toml という名前のカスタム・ルールセット・ファイルを作成します。
  3. ruleset セクションのコンテキストで、disabled フラグをtrue に設定してください。
  4. 1つ以上のruleset サブセクションで、無効にするルールを列挙してください。すべてのruleset.identifier セクションは持っています:
    • ルールのtype フィールド。IaC スキャニングの場合、識別子タイプはkics_id です。
    • ルール識別子のvalue フィールド。KICS ルール識別子は英数字文字列です。ルール識別子を検索するには、次の手順に従います:

sast-ruleset.toml ファイルをデフォルトのブランチにマージすると、無効化されたルールに対する既存の調査結果が自動的に解決されます。

次の例のsast-ruleset.toml ファイルでは、識別子のtype およびvalue に一致することで、無効なルールがkics アナライザに割り当てられています:

[kics]
  [[kics.ruleset]]
    disable = true
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "8212e2d7-e683-49bc-bf78-d6799075c5a7"

  [[kics.ruleset]]
    disable = true
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "b03a748a-542d-44f4-bb86-9199ab4fd2d5"

定義済みのアナライザ・ルールの上書き

カスタマイズしたい特定のIaC Scanningルールがある場合、それをオーバーライドすることができます。例えば、ルールの重大度を下げたり、発見した問題の修正方法について独自のドキュメントにリンクしたりすることができます。

ルールを上書きするには

  1. プロジェクトのルートに.gitlab ディレクトリを作成します(まだ存在しない場合)。
  2. .gitlab ディレクトリがまだ存在しない場合は、sast-ruleset.toml という名前のカスタム・ルールセット・ファイルを作成します。
  3. 1つ以上のruleset.identifier サブセクションに、オーバーライドするルールを列挙して ruleset.identifierください。ruleset.identifier すべての ruleset.identifierセクションには
    • ルールのtype フィールド。IaC スキャニングの場合、識別子タイプはkics_id です。
    • ルール識別子のvalue フィールド。KICS ルール識別子は英数字文字列です。ルール識別子を検索するには、次の手順に従います:
  4. ruleset セクションのruleset.override コンテキストに、オーバーライドするキーを指定します。任意のキーの組み合わせをオーバーライドできます。有効なキーは以下のとおりです:
    • 説明
    • メッセージ
    • 名前
    • 重大度 (有効なオプション: 重大、高、中、低、不明、情報)

次の例sast-ruleset.toml ファイルでは、ルールは識別子のtypevalue によってマッチされ、その後オーバーライドされます:

[kics]
  [[kics.ruleset]]
    [kics.ruleset.identifier]
      type = "kics_id"
      value = "8212e2d7-e683-49bc-bf78-d6799075c5a7"
    [kics.ruleset.override]
      description = "OVERRIDDEN description"
      message = "OVERRIDDEN message"
      name = "OVERRIDDEN name"
      severity = "Info"

特定のアナライザーバージョンへのピン留め

GitLab が管理する CI/CD テンプレートはメジャーバージョンを指定し、そのメジャーバージョン内の最新のアナライザーリリースを自動的にプルします。

場合によっては、特定のバージョンを使う必要があるかもしれません。例えば、後のリリースのリグレッションを避ける必要があるかもしれません。

自動更新の動作をオーバーライドするには、SAST-IaC.gitlab-ci.yml テンプレート をインクルードした後、CI/CD 設定ファイルにSAST_ANALYZER_IMAGE_TAG CI/CD 変数を設定してください。

この変数は特定のジョブでのみ設定してください。この変数をトップレベルで設定すると、設定したバージョンが他の SAST アナライザで使用されます。

タグを設定できます:

  • 3 のようなメジャーバージョンです。パイプラインは、このメジャーバージョン内でリリースされたマイナーバージョンやパッチアップデートを使用します。
  • 3.7 のようなマイナーバージョン。パイプラインは、マイナーバージョン内でリリースされたパッチアップデートを使用します。
  • 3.7.0 のようなパッチバージョン。パイプラインはアップデートを受け取りません。

この例では、KICS アナライザーの特定のマイナーバージョンを使用しています:

include:
  - template: Security/SAST-IaC.gitlab-ci.yml

kics-iac-sast:
  variables:
    SAST_ANALYZER_IMAGE_TAG: "3.1"

脆弱性の自動解決

GitLab IaC Scanningは、まだ関連性のある脆弱性に集中できるように、以下の場合に脆弱性を自動的に解決します:

脆弱性管理システムは、自動的に解決された脆弱性にコメントを残すため、脆弱性の履歴を残すことができます。

後でルールを再度有効にすると、トリアージのために発見が再開されます。

レポートのJSON形式

IaCツールは、既存のSASTレポート・フォーマットでJSONレポート・ファイルを生成します。詳細については、このレポートのスキーマを参照してください。

JSON レポートファイルは CI パイプラインページ、または artifacts: pathsgl-sast-report.json に設定することでマージリクエストのパイプラインタブからダウンロードできます。詳細については、アーティファクトのダウンロードを参照してください。

トラブルシューティング

デバッグレベルのロギング

デバッグ・レベルのロギングは、トラブルシューティングの際に役立ちます。詳細については、デバッグレベルロギングを参照してください。

IaCスキャンの所見は、予期せずNo longer detected

以前に検出された検出結果が予期せずNo longer detectedと表示される場合、スキャナの更新が原因である可能性があります。更新により、効果がない、または誤検出と判断されたルールが無効になり、検出結果がNo longer detected と表示されることがあります:

exec /bin/sh: exec format error ジョブログのメッセージ

GitLab IaC Scanningアナライザーは、amd64 CPUアーキテクチャ上での実行のみをサポートしています。このメッセージは、ジョブがarm のような異なるアーキテクチャで実行されていることを示しています。