Three guards guarding art in a museum

Crie um arquivo de configuração CodeQL central

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

Nos módulos básicos e intermediários deste guia, nos concentramos em começar e configurar a verificação de código. Agora, vamos criar uma configuração centralizada em que você possa personalizar seu gerenciamento de segurança de código em escala, com um arquivo para gerenciar configurações em vários repositórios ou em toda a sua organização. Assim, as equipes não precisam atualizar manualmente os fluxos de trabalho em potencialmente centenas de repositórios sempre que uma política de segurança é alterada.

O principal especialista em segurança de campo do GitHub, Keith Hoodlet, tem alguns insights sobre por que você pode querer fazer isso, especialmente em uma organização maior:

Centralizar sua configuração do CodeQL é uma maneira importante de gerenciar a ferramenta em escala. No meu emprego anterior, nossa equipe de segurança era responsável por mais de 3.000 desenvolvedores. Muitas vezes trabalhamos em estreita colaboração com os desenvolvedores e, para algumas equipes, éramos muito prescritivos. Mas não poderíamos fazer isso para cada repositório. Ao oferecer uma configuração centralizada, todos os repositórios da organização podem adotar instantaneamente nossa configuração recomendada, e ela estará sempre atualizada com nossas orientações atuais.

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

Existem algumas maneiras diferentes de criar e gerenciar configurações em toda a organização, mas recomendamos criar um arquivo de configuração em um repositório privado que os gerenciadores de segurança possam controlar e usá-lo com cada fluxo de trabalho CodeQL que sua organização criar. Dessa forma, você pode seguir uma boa prática de fluxo Git que garante alterações rastreáveis. 


Neste guia, você aprenderá:

  • Por que e como criar um arquivo de configuração CodeQL central

  • Como fornecer acesso ao seu arquivo central

  • Como dizer aos repositórios para usarem o arquivo central


1. Crie um novo repositório para armazenar o arquivo de configuração.

Crie um novo repositório privado na sua organização. É aqui que sua equipe de segurança armazenará a configuração padrão que todos os outros repositórios podem usar. Somente as pessoas que deveriam ter acesso para definir uma política de segurança para toda a organização deveriam ter acesso de gravação, mas todos deveriam ter acesso de leitura. Vamos chamar isso security-team-codeql-config

Recomendamos que você crie um único repositório para gerenciar o CodeQL e use pastas separadas para seus arquivos de configuração e consultas, pacotes e suítes CodeQL.

2. Crie o arquivo de configuração.

No repositório security-team-codeql-config , crie uma pasta chamada codeql

Na nova pasta codeql , crie um arquivo chamado codeql-config.yml.

Vamos adicionar o seguinte ao arquivo:

name: "My CodeQL config"



disable-default-queries: true

Isso define um nome para nosso arquivo de configuração e desativa as consultas CodeQL padrão para que possamos especificar o que executar.

3. Adicione pacotes CodeQL ao arquivo de configuração.

Vamos adicionar o núcleo da equipe de campo do GitHub e os pacotes Java/Kotlin e JavaScript/TypeScript estendidos ao arquivo de configuração adicionando o seguinte:

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

Agora vamos adicionar mais algumas personalizações:

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

Esse código diz ao CodeQL para ignorar vários arquivos e diretórios de arquivos e exclui uma enumeração de fraqueza comum (CWE) bem conhecida para que um aviso não seja exibido sempre que o CodeQL for executado. Ele também ignora os níveis de gravidade “aviso” e “recomendação” para manter nossos registros limitados apenas aos alertas importantes.

O código todo deve ficar assim:

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

É possível usar a configuração acima como modelo para sua própria configuração.

4. Crie um token de repositório externo.

Agora que temos nosso arquivo de configuração centralizado, precisamos apontar nossos outros repositórios para ele. Se o repositório de configuração for privado, o que recomendamos, os outros repositórios da sua organização precisarão de um repositório externo para acessar o arquivo CodeQL personalizado.

Na página GitHub.com da organização proprietária do repositório security-team-codeql-config , selecione a guia Settings.

Clique em Secrets and variables ​​na barra lateral e selecione a opção Actions

Vamos dar ao nosso novo segredo o nome ACCESS_TOKEN e inserir um valor. Você precisará inseri-lo novamente em breve. Lembre-se de seguir os padrões de segredos da sua organização ao trabalhar na produção.

Certifique-se de que Private and internal repositories esteja selecionado e clique em Add secret.

Na página GitHub.com do seu repositório Web Goat, selecione a guia Configurações. Clique em Secrets and variables ​​na barra lateral e selecione a opção Actions.

Adicione um token chamado ACCESS_TOKEN com o mesmo valor inserido acima.

5. Adicione o arquivo de configuração centralizado ao fluxo de trabalho CodeQL do repositório.

Agora, acesse o seu repositório Web Goat e abra o arquivo .github/workflows/codeql.yml . Encontre o seguinte:

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

Cole as seguintes linhas depois para apontar para nosso arquivo de configuração:

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

Certifique-se de alterar o proprietário para o nome da sua própria organização.

Se você adicionou as seguintes linhas como parte do módulo intermediário, comente-as assim por enquanto:

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

A seção agora deve ficar assim:

    # 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 }}

Fazer commit da alteração.

Pronto! Agora, sempre que você alterar o arquivo codeql-config.yml no repositório security-team-codeql-config , as alterações serão refletidas no seu repositório Web Goat.

Você pode verificar se ele está funcionando usando a página de status da ferramenta abordada no módulo intermediário. Você pode encontrá-lo selecionando a guia Security no repositório Web Goat, selecionando Code scanning e depois Tool status.

A seguir: Compreensão da cadeia de suprimentos de software de ponta a ponta

Voltaremos ao CodeQL em breve, mas primeiro vamos dar uma olhada em dois poderosos recursos de segurança da cadeia de suprimentos de software. No próximo guia, veremos como você pode usar a API GitHub Dependency Submission para criar um mapa de todas as dependências, incluindo as dependências de suas dependências, e como gerar uma lista de materiais de software (SBOMs) para que você possa relatar todas as suas dependências.