Static Analysis セットアップ

Join the Preview!

Code Analysis is in Preview.

Code Analysis は サイトでは利用できません。

概要

Datadog Static Analysis をセットアップするには、Software Delivery > Code Analysis に移動します。

Static Analysis のスキャンの実行先を選択

Datadog ホスト型スキャンでの実行

Datadog ホスト型の Static Analysis スキャンはプレビュー段階です。アクセスのリクエストはカスタマー サクセス マネージャーに連絡してください。

Datadog のインフラストラクチャ上で直接 Datadog Static Analysis のスキャンを実行できます。開始するには、Code Analysis ページ に移動します。

CI パイプラインでスキャン

Datadog Static Analysis は datadog-ci CLI を使用して CI パイプラインで実行されます。Datadog API キー と アプリケーション キー (code_analysis_read スコープが必要) を設定し、各 CI プロバイダで Static Analysis を実行します。

CI プロバイダに応じた手順を参照してください:


ソース コード管理プロバイダの選択

Datadog Static Analysis はすべてのソース コード管理プロバイダをサポートし、GitHub にはネイティブ サポートがあります。

GitHub 連携を設定

ソース コード管理プロバイダが GitHub の場合、GitHub integration タイル から GitHub App を構成し、source code integration をセットアップして、インライン コード スニペットを表示し、pull request comments を有効にする必要があります。

GitHub App をインストールする際、特定の機能を有効にするために次の権限が必要です:

  • Content: Read: Datadog に表示される コード スニペットを確認できるようにします
  • Pull Request: Read & Write: pull request comments を使用して違反に対するフィードバックをあなたの Pull Requests に直接追加できるようにし、さらに 脆弱性を修正 するための Pull Requests を作成できるようにします

その他のソース コード管理プロバイダ

別のソース コード管理プロバイダを使用している場合は、datadog-ci CLI ツールを使用して CI パイプラインで Static Analysis を実行し、Datadog に結果をアップロード してください。 結果が Code Analysis ページに表示され始める前に、デフォルト ブランチでリポジトリの解析を 必ず 実行する必要があります。

構成をカスタマイズ

既定では、Datadog Static Analysis は使用しているプログラミング言語向けの Datadog の ルール セット でリポジトリをスキャンします。適用する ルール セットと適用範囲をカスタマイズするには、リポジトリの ルート ディレクトリstatic-analysis.datadog.yml ファイルを追加します。

static-analysis.datadog.yml ファイルには、次の グローバル オプションを含めることができます:

名前説明必須デフォルト
rulesetsルール セット名と構成の一覧。 利用可能な ルール セットをすべて表示true
ignore無視するパス プレフィックスおよび glob パターンの一覧。 一致したファイルは解析されません。false
only解析対象とするパス プレフィックスおよび glob パターンの一覧。 一致したファイルのみ解析されます。false
ignore-gitignore特定のファイルの解析をスキップするために .gitignore ファイルに記載されたパスを使用しないようにします。falsefalse
max-file-size-kb指定サイズ (kB 単位) より大きいファイルを無視します。false200

static-analysis.datadog.yml ファイルには、次の ruleset オプションを含めることができます:

名前説明必須
rulesこの ruleset に属するルールの構成の一覧。false
ignoreこの ルール セットに対して無視するパス プレフィックスおよび glob パターン。 該当するファイルは解析されません。false
onlyこの ルール セットに対して解析するパス プレフィックスおよび glob パターン。 該当するファイルのみ解析されます。false

static-analysis.datadog.yml ファイルには、次の rule オプションを含めることができます:

名前説明必須
ignoreこのルールに対して無視するパス プレフィックスおよび glob パターン。 該当するファイルは解析されません。false
onlyこのルールに対して解析するパス プレフィックスおよび glob パターン。 該当するファイルのみ解析されます。false
argumentsカスタマイズ可能な引数をサポートするルール向けの値のマップ。false

arguments フィールドのマップは、引数の名前をキーとし、その値は文字列またはマップです:

  • リポジトリ全体に対して値を設定するには、文字列として指定します。
  • リポジトリ内のサブツリーごとに異なる値を設定するには、サブツリー プレフィックスから、そのサブツリー内でその引数が持つ値へのマップとして指定します。

static-analysis.datadog.yml ファイルの完全な構造は次のとおりです:

rulesets:
  - ruleset-name
  - ruleset-name:
    # 次のパス / ファイルにのみこの ルール セットを適用します
    only:
      - "path/example"
      - "**/*.file"
    # 次のパス / ファイルではこの ルール セットを適用しません
    ignore:
      - "path/example"
      - "**/*.file"
  - ruleset-name:
    rules:
      rule-name:
        # 次のパス / ファイルにのみこのルールを適用します
        only:
          - "path/example"
          - "**/*.file"
        # 次のパス / ファイルではこのルールを適用しません
        ignore:
          - "path/example"
          - "**/*.file"
        arguments:
          # ルールの引数を value に設定します
          argument-name: value
      rule-name:
        arguments:
          # 異なるサブ ツリーで異なる引数値を設定します
          argument-name:
            # 既定では value_1 を設定します (リポジトリの root パス)
            /: value_1
            # 特定のパスでは value_2 を設定します
            path/example: value_2
# 次のパス / ファイル内にあるもののみを解析します (いずれの ルール セットでも)
only:
  - "path/example"
  - "**/*.file"
# 次のパス / ファイル内にあるものは解析しません (いずれの ルール セットでも)
ignore:
  - "path/example"
  - "**/*.file"

例の構成ファイル:

rulesets:
  - python-best-practices
  - python-security
  - python-code-style:
    rules:
      max-function-lines:
        # 次のファイルには ルール max-function-lines を適用しません
        ignore:
          - "src/main/util/process.py"
          - "src/main/util/datetime.py"
        arguments:
          # ルール max-function-lines のしきい値を 150 行に設定します
          max-lines: 150
      max-class-lines:
        arguments:
          # ルール max-class-lines のしきい値をサブ ツリーごとに変えます
          max-lines:
            # 既定ではしきい値を 200 行に設定します (リポジトリの root パス)
            /: 200
            # src/main/backend ではしきい値を 100 行に設定します
            src/main/backend: 100
  - python-inclusive
  - python-django:
    # 次のパスにのみ python-django ルール セットを適用します
    only:
      - "src/main/backend"
      - "src/main/django"
    # 次のパターンに一致するファイルでは python-django ルール セットを適用しません
    ignore:
      - "src/main/backend/util/*.py"
# ソース ファイルのみを解析します
only:
  - "src/main"
  - "src/tests"
  - "**/*.py"
# サード パーティ または生成されたファイルは解析しません
ignore:
  - "lib/third_party"
  - "**/*.generated.py"
  - "**/*.pb.py"

違反の無視

リポジトリ単位で無視

static-analysis.datadog.yml ファイルに ignore ルールを追加します。以下の例では、すべてのディレクトリに対して javascript-express/reduce-server-fingerprinting ルールを無視します。

rulesets:
  - javascript-express:
    rules:
      reduce-server-fingerprinting:
        ignore: "**"

ファイルまたはディレクトリで無視

static-analysis.datadog.yml ファイルに ignore ルールを追加します。以下の例では、このファイルに対して javascript-express/reduce-server-fingerprinting ルールを無視します。パスでの無視方法の詳細は、構成のカスタマイズ セクション を参照してください。

rulesets:
  - javascript-express:
    rules:
      reduce-server-fingerprinting:
        ignore: "ad-server/src/app.js"

特定のインスタンスを無視

違反の特定のインスタンスを無視するには、無視したいコード行の上に no-dd-sa というコメントを記述します。これにより、その行から違反が生成されることはなくなります。たとえば、次の Python コード スニペットでは、foo = 1 の行は Static Analysis スキャンで無視されます。

#no-dd-sa
foo = 1
bar = 2

すべてのルールを無視するのではなく、特定のルールだけを無視するために no-dd-sa を使用することもできます。その場合は、次のテンプレートで <rule-name> を無視したいルール名に置き換えて指定します:

no-dd-sa:<rule-name>

たとえば、次の JavaScript コード スニペットでは、my_foo = 1 の行は javascript-code-style/assignment-name ルールを除くすべてのルールで解析されます。このルールは、開発者に キャメル ケーススネーク ケース の代わりに使用するよう指示します。

// no-dd-sa:javascript-code-style/assignment-name
my_foo = 1
myBar = 2

サード パーティの Static Analysis 結果を Datadog にアップロード

SARIF インポートは Snyk、CodeQL、Semgrep、Checkov、Gitleaks、Sysdig でテスト済みです。他の SARIF 準拠ツールで問題が発生した場合は Datadog サポート までお問い合わせください。

相互運用可能な静的分析結果交換形式 (SARIF) であることを条件に、サードパーティーの静的分析ツールから Datadog へ結果を送信することができます。Node.js バージョン 14 以降が必要です。

SARIF レポートをアップロードするには

  1. DD_API_KEY 変数と DD_APP_KEY 変数が定義されていることを確認します。

  2. Optionally, set a DD_SITE variable (this default to datadoghq.com).

  3. datadog-ci ユーティリティをインストールします。

    npm install -g @datadog/datadog-ci
    
  4. サードパーティの静的分析ツールをコード上で実行し、結果を SARIF 形式で出力します。

  5. 結果を Datadog にアップロードします。

    datadog-ci sarif upload $OUTPUT_LOCATION
    

Diff-aware スキャン

Diff-aware スキャンでは、Datadog の static analyzer がフィーチャー ブランチのコミットで変更されたファイルのみをスキャンします。これにより、毎回のスキャンでリポジトリ内のすべてのファイルを解析しないため、スキャン時間が大幅に短縮されます。CI パイプラインで Diff-aware スキャンを有効にするには、次の手順に従ってください:

  1. CI パイプラインで DD_APP_KEYDD_SITEDD_API_KEY 変数が設定されていることを確認します。
  2. static analyzer を起動する前に datadog-ci git-metadata upload の呼び出しを追加します。このコマンドは、Datadog バック エンドで Git メタ データを利用できるようにします。解析対象ファイル数を算出するには、Git メタ データが必要です。
  3. datadog-static-analyzer がフラグ --diff-aware 付きで呼び出されることを確認します。

コマンド シーケンスの例 (これらのコマンドは Git リポジトリ内で実行する必要があります):

datadog-ci git-metadata upload

datadog-static-analyzer -i /path/to/directory -g -o sarif.json -f sarif –-diff-aware <...other-options...>

注: Diff-aware スキャンを完了できない場合は、ディレクトリ全体がスキャンされます。

その他の参考資料