Código-fonte seguro

1. Visão geral

Técnicas seguras de código-fonte são um conjunto de práticas que podem ser usadas para melhorar a segurança do código-fonte. Essas técnicas podem ajudar a identificar e corrigir vulnerabilidades no código-fonte, evitar o acesso não autorizado ao código-fonte e proteger o código-fonte contra modificações.

Algumas técnicas comuns de código-fonte seguro incluem:

  • Lint:é o processo de verificação de erros e problemas estilísticos no código-fonte. Isso é feito com uma ferramenta lint, que é um programa que analisa o código-fonte e identifica possíveis problemas. As ferramentas Lint podem ser usadas para verificar uma variedade de erros, incluindo erros de sintaxe, semânticos, de estilo e vulnerabilidades de segurança.
  • Teste estático de segurança de aplicativos (SAST, na sigla em inglês): o SAST é um tipo de teste de segurança que analisa o código-fonte, o código binário ou o código de bytes para identificar vulnerabilidades de segurança. As ferramentas SAST podem ser usadas para encontrar vulnerabilidades em várias linguagens de programação, incluindo Go, Java, Python, C++ e C#.
  • Verificação de licença:a verificação de licença é o processo de identificação das licenças de componentes de software de terceiros usados em um aplicativo de software. Isso é importante porque ajuda a garantir que o aplicativo cumpra os termos das licenças, o que pode evitar problemas jurídicos.

Essas técnicas podem ser usadas para melhorar a segurança do código-fonte em todos os estágios do ciclo de vida de desenvolvimento de software. A inspeção de lint pode ser usada para identificar erros no início do processo de desenvolvimento, o SAST pode ser usado para encontrar vulnerabilidades antes que o código seja compilado ou implantado, e a verificação de licença pode ser usada para garantir que o aplicativo esteja em conformidade com os termos das licenças.

Essas técnicas podem melhorar a segurança do código-fonte e reduzir o risco de violações de segurança.

O que você vai aprender

Neste laboratório, você conhecerá as ferramentas e técnicas para proteger o código-fonte do software.

  • Inspecionar
  • Teste de segurança para aplicativos estáticos
  • Verificação de licença

Todos os comandos e ferramentas usados neste laboratório serão executados no Cloud Shell.

2. Configuração e requisitos

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google Você pode atualizar a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como PROJECT_ID. Se você não gostar do ID gerado, poderá gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto.
  • Para sua informação, há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar faturamento além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Iniciar o editor do Cloud Shell

Este laboratório foi elaborado e testado para uso com o Editor do Google Cloud Shell. Para acessar o editor,

  1. Acesse seu projeto do Google em https://console.cloud.google.com.
  2. No canto superior direito, clique no ícone do editor do Cloud Shell

8560cc8d45e8c112.png

  1. Um novo painel será aberto na parte inferior da janela.
  2. Clique no botão "Abrir editor"

9e504cb98a6a8005.png

  1. O editor será aberto com um explorador à direita e o editor na área central.
  2. Um painel do terminal também deve estar disponível na parte inferior da tela
  3. Se o terminal NÃO estiver aberto, use a combinação de teclas "ctrl+" para abrir uma nova janela de terminal

Configuração do ambiente

Defina o GOPATH como um único diretório para simplificar os comandos usados neste laboratório.

export GOPATH=$HOME/gopath

Crie um diretório para armazenar nosso trabalho

mkdir -p workspace
cd workspace

clonar o repositório de código-fonte

git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)

3. Inspecionar

A inspeção é usada para verificar erros comuns de estilo ou defeitos relacionados à sintaxe. A inspeção ajuda a segurança ao fornecer um padrão de sintaxe comum entre várias equipes, o que leva a revisões de código mais rápidas, compartilhamento de conhecimento e clareza de código.

Além disso, o Lint identifica erros comuns de sintaxe que podem levar a vulnerabilidades comuns, como uso inadequado ou menos eficiente de bibliotecas ou APIs principais.

Instalar a ferramenta de vinculação staticcheck

 go get honnef.co/go/tools/cmd/staticcheck@latest

Executar o Go Linter (staticcheck) no diretório raiz do projeto

 staticcheck

Analisar a saída

main.go:42:29: unnecessary use of fmt.Sprintf (S1039)

Você recebe o erro porque http.ListenAndServe() aceita uma string, e o código atual usa Sprintf sem transmitir variáveis para a string

Revise o status de saída do comando.

echo $?

Nesse caso, como o comando resultou em um erro, o status de saída será 1 ou maior. Esse é um método que pode ser usado em um pipeline de CI/CD para determinar o sucesso/falha da ferramenta.

Edite o arquivo main.go e corrija o código:

  • Comente a linha abaixo de LINTING - Step 1 dentro do método main(), adicionando barras à esquerda(//).
  • Remova a marca de comentário das duas linhas logo abaixo de LINTING - Step 2 dentro do método main(), removendo as barras à esquerda.

Execute novamente o staticcheck no diretório raiz do projeto

staticcheck

O comando não deve retornar nenhum resultado (ou seja, uma linha vazia).

Inspecione o status de saída do comando.

  echo $?

Nesse caso, como o comando não resultou em um erro, o status de saída será zero.

4. Teste de segurança para aplicativos estáticos

Teste de segurança AST/estático: fornece análise de código estático procurando pontos fracos e exposições comuns ( CWEs)

Instalar a ferramenta AST (gosec)

    export GOSEC_VERSION="2.15.0"
    curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | \
          sh -s -- -b $(go env GOPATH)/bin v${GOSEC_VERSION}

Executar gosec com o arquivo de política no código-fonte

gosec -conf policies/gosec-policy.json -fmt=json ./...

A saída precisa ser semelhante a esta

{
    "Golang errors": {},
    "Issues": [
        {
            "severity": "HIGH",
            "confidence": "LOW",
            "cwe": {
                "ID": "798",
                "URL": "https://cwe.mitre.org/data/definitions/798.html"
            },
            "rule_id": "G101",
            "details": "Potential hardcoded credentials",
            "file": "/home/random-user-here/shift-left-security-workshop/labs/source-code-lab/main.go",
            "code": "31: \t// STEP 2: Change this and the reference below to something different (ie, not \"pawsword\" or \"password\")\n32: \tvar pawsword = \"im-a-cute-puppy\"\n33: \tfmt.Println(\"Something a puppy would use: \", username, pawsword)\n",
            "line": "32",
            "column": "6"
        }
    ],
    "Stats": {
        "files": 1,
        "lines": 89,
        "nosec": 0,
        "found": 1
    }
}

A ferramenta identificou um possível problema: Potential hardcoded credentials

5. Verificação de licença

As licenças são importantes para a segurança porque podem exigir legalmente que você exponha um código-fonte que talvez você não queira expor. O conceito é chamado copyleft" licenças que exigem a exposição do código-fonte se você usar dependências com essas licenças.

Instalar golicense

mkdir -p /tmp/golicense
wget -O /tmp/golicense/golicense.tar.gz https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_linux_x86_64.tar.gz
pushd /tmp/golicense
tar -xzf golicense.tar.gz
chmod +x golicense
mv golicense $(go env GOPATH)/bin/golicense
popd

Criar o arquivo binário

go build

Faça a verificação de licença com o arquivo de política atual que não permite "BSD-3-Cláusula" licenças

golicense policies/license-policy.hcl hello-world

OBSERVAÇÃO: isso falhará com uma saída semelhante:

 🚫 rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
 🚫 rsc.io/quote      BSD 3-Clause "New" or "Revised" License
 🚫 golang.org/x/text BSD 3-Clause "New" or "Revised" License

Modifique o arquivo de política policies/license-policy.hcl para mover a "Cláusula BSD-3" da lista deny para a lista allow.

Fazer a verificação de licença de novo

golicense policies/license-policy.hcl hello-world

OBSERVAÇÃO: isso deve funcionar com uma saída semelhante:

    ✅ rsc.io/quote      BSD 3-Clause "New" or "Revised" License
    ✅ rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
    ✅ golang.org/x/text BSD 3-Clause "New" or "Revised" License

6. Parabéns

Parabéns, você concluiu o codelab.

O que você aprendeu

  • Ferramentas e técnicas para proteger o código-fonte

Última atualização: 23/03/2023