Three guards guarding art in a museum

一元的な CodeQL 構成ファイルを作成する

Nicholas Liffen
Nicholas Liffen // Director, GitHub Advanced Security // GitHub

このガイドの基本モジュールと中級モジュールでは、使用を開始することとコード スキャンの構成に焦点を当てました。ここで、大規模なコード セキュリティ管理をカスタマイズできる一元的構成を作成しましょう。ファイルは 1 つで、複数のレポジトリや組織全体の設定を管理できます。こうすると、セキュリティ ポリシーが変わるたびに数百個になる可能性のあるリポジトリのワークフローをチームが手動で更新する必要がなくなります。

GitHub のプリンシパル フィールド セキュリティ スペシャリストである Keith Hoodlet は、特に大規模な組織でこれを行う理由について、次のように説明しています。

ツールを大規模に管理する上では、CodeQL 構成の一元化が重要です。私の前の職場では、セキュリティ チームが 3,000 人以上の開発者を担当していました。開発者とは緊密に連携し、特定のチームに対しては非常に指導的でした。しかし、全てのリポジトリに対してそのように対応することはできませんでした。一元化された構成を提供すれば、組織全体の全てのリポジトリが推奨される構成を即座に採用できます。また、最新のガイダンスによって常に最新の状態に保たれます。

Keith Hoodlet
Keith Hoodlet // Principal Field Security Specialist, CodeQL // GitHub

組織全体の構成を作成および管理するにはいくつかの方法がありますが、セキュリティ マネージャーが管理できるプライベート リポジトリに構成ファイルを作成し、組織で作成する全ての CodeQL ワークフローでこれを使用することをお勧めします。そうすることで、追跡可能な変更を保証する適切な Git フロー プラクティスに従うことができます。 


このガイドの学習内容

  • 一元的な CodeQL 構成ファイルを作成する理由と方法

  • 一元的なファイルにアクセスする方法

  • 一元的なファイルを使用するようにリポジトリを指定する方法


1. 構成ファイルを保存する新しいリポジトリを作成する。

組織内に新しいプライベート リポジトリを作成します。ここには、セキュリティ チームが他の全てのリポジトリで使用できるデフォルト設定を保存します。組織全体のセキュリティ ポリシーを設定できるユーザーにのみ書き込みアクセス権限がありますが、読み取りアクセス権限は全員にあります。これを次のように呼びます: security-team-codeql-config

CodeQL を管理する単一のリポジトリを作成し、構成ファイルと CodeQL クエリ、パック、スイートには別のフォルダーを使用することをお勧めします。

2. 構成ファイルを作成する。

security-team-codeql-config リポジトリに次の名前のフォルダーを作成します: codeql

この新しい codeql フォルダーに、次の名前のファイルを作成します: codeql-config.yml.

このファイルに以下を追加しましょう。

name: "My CodeQL config"



disable-default-queries: true

これにより、構成ファイルの名前が設定され、デフォルトの CodeQL クエリが無効になるため、何を実行するかを自分で指定できるようになります。

3. CodeQL パックを構成ファイルに追加する。

以下を追加して、GitHub のフィールド チーム コアと拡張 Java/Kotlin および JavaScript/TypeScript パックを構成ファイルに追加しましょう。

packs:
    # > Java/Kotlin queries
    - advanced-security/codeql-java
    - advanced-security/codeql-java-extensions
    # security-extended
    - codeql/java-queries:codeql-suites/java-security-extended.qls



    # JavaScript/TypeScript queries
    - advanced-security/codeql-javascript
    - advanced-security/codeql-javascript-extensions
    # security-extended
    - codeql/javascript-queries:codeql-suites/javascript-security-extended.qls

次に、さらにカスタマイズを追加してみましょう。

paths-ignore:
    # JavaScript
    - 'node_modules'
    - '**/*.test.js'
    # JavaScript Frameworks/Libraries
    - '**/bootstrap.js'
    - '**/boostrap.min.js'
    - '**/jquery-*.js'



query-filters:
- exclude:
    tags:
        -/cwe/-029/
    problems.severity:
    	- warning
    	- recommendation

このコードは、CodeQL にいくつかのファイルとファイル ディレクトリを無視するように指示し、よく知られている CWE (Common Weakness Enumeration) を除外するため、CodeQL が実行されるたびに警告が表示されなくなります。また、重大度レベルの「警告」と「推奨」を無視して、ログを重要なアラートのみに限定しています。

全体は次のようになります。

name: "My CodeQL config"
disable-default-queries: true



packs:
    # > Java/Kotlin queries
    - advanced-security/codeql-java
    - advanced-security/codeql-java-extensions
    # security-extended
    - codeql/java-queries:codeql-suites/java-security-extended.qls



    # JavaScript/TypeScript queries
    - advanced-security/codeql-javascript
    - advanced-security/codeql-javascript-extensions
    # security-extended
    - codeql/javascript-queries:codeql-suites/javascript-security-extended.qls



paths-ignore:
    # JavaScript
    - 'node_modules'
    - '**/*.test.js'
    # JavaScript Frameworks/Libraries
    - '**/bootstrap.js'
    - '**/boostrap.min.js'
    - '**/jquery-*.js'



query-filters:
- exclude:
    tags:
        -/cwe/-029/
    problems.severity:
    	- warning
    	- recommendation

上記の構成は、自分の構成のテンプレートとして使用できます。

4. 外部リポジトリ トークンを作成する。

一元的な構成ファイルが完成したので、他のリポジトリにこのファイルを指定する必要があります。構成リポジトリを非公開にすることをお勧めしますが、その場合、組織内の他のリポジトリがカスタム CodeQL ファイルにアクセスするには外部リポジトリが必要になります。

security-team-codeql-config リポジトリを所有する組織の GitHub.com ページで、[設定] タブを選択します。

サイドバーから [シークレットと変数] をクリックし、[GitHub Actions] オプションを選択します。 

新しいシークレットに ACCESS_TOKEN という名前を付け、値を入力しましょう。すぐにもう一度入力する必要があります。本番環境で作業する場合は、必ず組織のシークレット基準に従うようにしてください。

[プライベートおよび内部リポジトリ] が選択されていることを確認し、[シークレットを追加] をクリックします。

Web Goat リポジトリの GitHub.com ページで、[設定] タブを選択します。サイドバーの [シークレットと変数] をクリックし、[GitHub Actions] オプションを選択します。

ACCESS_TOKEN というトークンを、上で入力したのと同じ値で追加します。

5. 一元的な構成ファイルをリポジトリの CodeQL ワークフローに追加する。

次に、Web Goat リポジトリに移動し、.github/workflows/codeql.yml ファイルに導入したシークレットに対して新しいアラートは表示されません。以下を見つけます。

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v2
      with:
        languages: ${{ matrix.language }}

この後に次の行を貼り付けて、構成ファイルを指定します。

        config-file: 
 owner/security-team-codeql-config/codeql/codeql-config.yml
 external-repository-token: ${{ secrets.ACCESS_TOKEN }}

必ずオーナーを自分の組織名に変更してください。

中級モジュールの一部として次の行を追加した場合は、ここでは次のようにコメントアウトします。

        # paths-ignore:
        #    - '**/*.test.js'
        # config: |
        #  queries:
        #    - uses: security-and-quality

セクションは次のようになります。

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v2
      with:
        languages: ${{ matrix.language }}
        config-file: organization/security-team-codeql-config/codeql/codeql-config.yml        external-repository-token: ${{ secrets.ACCESS_TOKEN }}

変更をコミットします。

これで完了です。これで、codeql-config.yml リポジトリ内の ファイルを変更すると、security-team-codeql-config その変更が Web Goat リポジトリに反映されるようになります。

動作しているかどうかは、中級モジュールで取り上げたツールのステータス ページを使用して確認できます。Web Goat リポジトリの [セキュリティ] タブを選択し、[コード スキャン][ツール ステータス] の順に選択すると、このページが表示されます。

次の項目: エンドツーエンドのソフトウェア サプライ チェーンを理解する

すぐに CodeQL に戻りますが、まず 2 つの強力なサプライ チェーン セキュリティ機能を見てみましょう。次のガイドでは、GitHub Dependency Submission API を使用して、全ての依存関係 (依存関係の依存関係を含む) のマップを作成する方法と、全ての依存関係を報告できるようにソフトウェア部品表 (SBOM) を生成する方法について説明します。