GitLab でも好きな静的解析ツール (Code Quality & SAST) を使う

2022/12/21に公開

この記事は GitLab Advent Calendar 2022 の 21 日目の記事です。

GitLab でも好きな静的解析ツール (Code Quality & SAST) を使う

GitLab SAST や GitLab Code Quality って手軽に使えていいですよね。でも欠点も多くて...

  • 好きな静的解析ツールに切り替えにくい - SAST Analyzer として用意されていない静的解析ツールは SAST Analyzer を自作しなければなりません。また、静的解析ツールの最新版が使いたくても、SAST Analyzer が古いものを使っていることもあります。
  • カスタマイズが難しい - GitLab SAST のカスタマイズ方法を覚えなければなりません。そのうえ、結局のところ、SAST Analyzer が利用している静的解析ツールの設定方法も知らなければなりません。
  • 開発環境で動作させずらい - ソースコードの問題はソースコードを書いている最中に指摘されるのが理想です。検査を後回しにすればするほど同じ指摘が大量に発生します。それだけ修正にかかる時間が長くなります。SAST や Code Quality は保険として使うにとどめるのがおすすめです。

やはり使い慣れている静的解析ツールがそのまま使えるのが理想です。最近の SARIF 形式のレポート出力に対応しているツールなら、前回紹介した SARIF Converter で GitLab SAST 形式や GitLab Code Quality 形式に変換できます。

SAST としての利用

Security Code Scan (.NET)

Security Code Scan は .NET 用の脆弱性の静的解析ツールです。.NET で静的セキュリティコード検査 (Security Code Scan 編)で紹介しましたが、コンパイルをしたバイトコードを解析し、コードの呼び出しも追跡するというなかなかすごいやつです。

まずは .NET ソリューションに Security Code Scan の .NET Tools 版をインストールします。

$ dotnet new tool-manifest
$ dotnet tool install security-scan

プロジェクトの.gitlab-ci.ymlに次の記述を追加します。

default:
  image: mcr.microsoft.com/dotnet/sdk:6.0

sast:
  before_script:
    - dotnet tool restore
    - dotnet restore
    - wget -q -O sarif-converter https://gitlab.com/ignis-build/sarif-converter/-/releases/permalink/latest/downloads/bin/sarif-converter-linux
    - chmod +x sarif-converter
  script:
    - dotnet build
    # Security Code Scan による静的解析
    - dotnet security-scan YourProject.sln --export=security-scan.sarif
  after_script:
    # レポートを SAST 形式に変換
    - ./sarif-converter --type sast --src-root . security-scan.sarif gl-sast-report.json
  artifacts:
    reports:
      sast: gl-sast-report.json

Security Code Scan の出力する SARIF はソースコードの場所を絶対パスとなっています。しかし、SAST はプロジェクトルートからの相対パスを要求します。相対パスに変換するために、プロジェクトルートのパスを --src-root . と指定しています。

マージリクエストに脆弱性のあるコードをプッシュすると、こんな感じでお知らせしてくれます。

そのほかの言語

.NET 以外でも、SARIF レポートさえ出力してくれれば問題ありません。

例えば、ESLint には脆弱性検査の eslint-plugin-security と SARIF レポートを出力する SARIF formatter for ESLint を組み合わせます。(ESLint も Security Code Scan 同様に絶対パスで出力します。--src-root . を忘れないようにしてください)

おそらく他の静的解析ツールでも同様だと思います。もし、うまく動作しない静的解析ツールがありましたら、Issue にてお知らせいただければと思います。

Code Quality

静的解析ツールは SAST だけでなく、未使用の変数などのコードの問題を指摘するツールも多いです。GitLab では Code Quality がこれにあたります。これらの静的解析ツールも、SARIF 形式のレポートを出力できれば、SARIF Converter で GitLab Code Quality 形式に変換し、マージリクエストでコードの問題を確認できます。

ReShaper Command Line Tools の InspectCode (.NET)

.NET でお気に入りの静的解析ツールは JetBrains 社製の Visual Studio 拡張の ReSharper の静的解析です。ありがたいことに、静的解析ツール部分だけコマンドラインで公開されています。

どんな感じかは ReSharper Command Line Tools による静的コード解析を見ていただければと思います。

.gitlab-ci.yml ファイルに次のように追加すると、ReSharper Command Line Tools の InspectCode の結果をマージリクエストで確認できるようになります。

default:
  image: mcr.microsoft.com/dotnet/sdk:6.0

codequality:
  before_script:
    - dotnet tool restore
    - dotnet restore
    - wget -q -O sarif-converter https://gitlab.com/ignis-build/sarif-converter/-/releases/permalink/latest/downloads/bin/sarif-converter-linux
    - chmod +x sarif-converter
  script:
    - dotnet build
    # ReSharper CommandLine Tools で静的解析
    - dotnet jb inspectcode --output=inspect-code.sarif --format=sarif sarif-converter-example-dotnet.sln
  after_script:
    # レポートを Code Quality 形式に変換
    - ./sarif-converter --type codequality inspect-code.sarif gl-code-quality-report.json
  artifacts:
    reports:
      codequality: gl-code-quality-report.json

マージリクエストに問題のあるコードをプッシュすると、こんな感じでお知らせしてくれます。

まとめ

GitLab Code Quality や GitLab SAST は使い始めるのは簡単ですが、有効活用するのは簡単ではありません。使い慣れた好きな静的解析ツールを使った方がいいケースも多いでしょう。

  • 静的解析ツールは開発環境に組み込んでください - ソースコードの問題はソースコードを書いている最中に指摘されるのが最も効率が良いです。
  • 保険として Code Quality や SAST を利用してください - 開発環境での静的解析は漏れが出ることもあります。Code Quality や SAST は保険として大いに役に立ちます。
  • Ultimate プラン以外では SAST の結果を Code Quality 形式に変換します - マージリクエストなどで脆弱性やコードの問題を確認できます。

SARIF Converter を使えば、使い慣れた好きな静的解析ツールを GitLab Code Quality や GitLab SAST に利用できます。

おまけですけど、HTML レポートを出力する機能も付いています。こちらも活用していただけると嬉しいです。

Discussion