1. Visão geral
As técnicas de código-fonte seguro são um conjunto de práticas que podem ser usadas para melhorar a segurança do código-fonte. Essas técnicas ajudam a identificar e corrigir vulnerabilidades no código-fonte, impedir o acesso não autorizado a ele e protegê-lo contra modificações.
Algumas técnicas comuns de código-fonte seguro incluem:
- Linting:é o processo de verificar o código-fonte em busca de erros e problemas de estilo. Isso é feito usando uma ferramenta de lint, que é um programa que analisa o código-fonte e identifica possíveis problemas. As ferramentas de lint podem ser usadas para verificar vários erros, incluindo erros de sintaxe, semânticos, de estilo e vulnerabilidades de segurança.
- Teste estático de segurança de aplicativos (SAST): o SAST é um tipo de teste de segurança que analisa o código-fonte, o código binário ou o bytecode 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ças:é 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 obedeça aos termos das licenças, o que pode evitar problemas legais.
Essas técnicas podem ser usadas para melhorar a segurança do código-fonte em todas as fases do ciclo de vida de desenvolvimento de software. O linting pode ser usado 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ças pode ser usada para garantir que o aplicativo esteja em conformidade com os termos das licenças.
O uso dessas técnicas pode ajudar a melhorar a segurança do código-fonte e reduzir o risco de violações de segurança.
O que você vai aprender
Este laboratório vai se concentrar nas ferramentas e técnicas para proteger o código-fonte do software.
- Inspecionar
- Teste estático de segurança para aplicativos
- Verificação de licenças
Todas as ferramentas e comandos usados neste laboratório serão executados no Cloud Shell.
2. Configuração e requisitos
Configuração de ambiente personalizada
- 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.



- 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 É possível atualizar o local 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. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- 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 desligar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou 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 projetado e testado para uso com o editor do Google Cloud Shell. Para acessar o editor,
- Acesse seu projeto do Google em https://console.cloud.google.com.
- No canto superior direito, clique no ícone do editor do Cloud Shell.

- Um novo painel será aberto na parte de baixo da janela
- Clique no botão "Abrir editor".

- O editor será aberto com um explorador à direita e o editor na área central.
- Um painel de terminal também vai estar disponível na parte de baixo da tela.
- Se o terminal NÃO estiver aberto, use a combinação de teclas "ctrl+`" para abrir uma nova janela do 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
Criar 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
O linting é usado para verificar erros ou defeitos comuns relacionados à sintaxe e ao estilo. O linting ajuda na segurança ao fornecer um padrão de sintaxe comum em várias equipes, o que leva a revisões de código mais rápidas, compartilhamento de conhecimento e clareza do código.
Além disso, o Linting 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
Execute o Go Linter (staticcheck) no diretório raiz do projeto.
staticcheck
Verificar a saída
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
O erro ocorre porque http.ListenAndServe() aceita uma string, e o código atual usa Sprintf sem transmitir variáveis para a string.
Analise 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 1no métodomain()adicionando barras iniciais(//). - Remova os comentários das duas linhas diretamente abaixo de
LINTING - Step 2no métodomain(), removendo as barras iniciais.
Execute staticcheck novamente no diretório raiz do projeto.
staticcheck
O comando não vai 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 estático de segurança para aplicativos
Teste de segurança estático/AST: fornece análise de código estático em busca de vulnerabilidades e exposições comuns ( CWEs).
Instale 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}
Execute gosec com o arquivo de política no código-fonte
gosec -conf policies/gosec-policy.json -fmt=json ./...
A saída 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ças
As licenças são importantes para a segurança porque podem exigir legalmente que você exponha um código-fonte que talvez não queira expor. O conceito é chamado de licenças de copyleft, que exigem que você exponha o código-fonte se 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
Execute a verificação de licença com o arquivo de política atual que não permite licenças "BSD-3-Clause".
golicense policies/license-policy.hcl hello-world
OBSERVAÇÃO: isso vai 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 "BSD-3-Clause" da lista deny para a lista allow.
Executar a verificação de licença novamente
golicense policies/license-policy.hcl hello-world
OBSERVAÇÃO: isso vai ser concluído 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/23