Pular para o conteúdo

Security Features

O sistema de módulos do Go incorpora diversas camadas de segurança para proteger contra supply chain ataques, código malicioso e comprometimento de dependências.

Garante integridade global dos módulos.

Como funciona:

  • Versões públicas consultadas pelo serviço ficam registradas em sum.golang.org.
  • Detecta alterações maliciosas em módulos.
  • Previne ataques direcionados.

Ver capítulo completo: Checksum Database

Controla quais sistemas de controle de versão o Go pode usar.

Por quê?: Restringe os clientes VCS executados durante downloads diretos. O padrão permite Git e Mercurial para módulos públicos; os demais clientes suportados ficam limitados a módulos privados.

Janela do terminal
# Padrão seguro
GOVCS="public:git|hg,private:all"
# Apenas Git (mais restritivo)
GOVCS="*:git"
# Desabilitar proteção (NÃO RECOMENDADO)
GOVCS="*:all"
Janela do terminal
# Sintaxe
GOVCS="padrão:lista,padrão:lista,..."
# Exemplos
GOVCS="github.com:git,example.com:svn,private:all"
GOVCS="*.internal.corp:git,public:git|hg"
VCS Comando Permitido pelo GOVCS padrão
git git Público e privado
hg hg Público e privado
svn svn Privado
fossil fossil Privado

No Go 1.27, o suporte ao download direto via Bazaar (bzr) foi removido. Módulos que dependem desse acesso precisam de outro VCS ou de um proxy que os disponibilize.

O GOAUTH configura a autenticação das requisições HTTPS usadas para descobrir módulos (go-import) e acessar proxies de módulos. O padrão é netrc.

Janela do terminal
# Usar credenciais de NETRC ou ~/.netrc (padrão)
export GOAUTH=netrc
# Consultar o credential helper do Git em um diretório absoluto
export GOAUTH="git /home/gopher/projeto"
# Executar um helper próprio
export GOAUTH="/usr/local/bin/auth-helper"
# Combinar métodos, separados por ponto e vírgula
export GOAUTH="netrc; git /home/gopher/projeto"
# Desabilitar autenticação HTTP do comando go
export GOAUTH=off

No modo git, o Go executa git credential fill no diretório indicado. Esse diretório precisa existir e o credential helper precisa estar configurado.

Um helper próprio recebe e produz dados no formato descrito em go help goauth. Sua saída informa URLs e cabeçalhos HTTP, separados por linhas em branco. O valor de GOAUTH é uma lista de comandos; os hosts e as credenciais são definidos pelo método escolhido.

Para usar um arquivo .netrc, preencha os dados do servidor:

machine gitlab.empresa.com
login oauth2
password SEU_TOKEN

Depois, limite a leitura do arquivo e configure o acesso:

Janela do terminal
chmod 600 ~/.netrc
export GOPRIVATE="gitlab.empresa.com/*"
export GOAUTH=netrc
go get gitlab.empresa.com/time/biblioteca@latest

Define módulos privados que não devem usar proxy ou checksum database.

Janela do terminal
# Sintaxe
GOPRIVATE="padrão,padrão,..."
# Exemplos
GOPRIVATE="github.com/empresa/*"
GOPRIVATE="*.internal.corp,github.com/usuario"
GOPRIVATE="gitlab.empresa.com/*,bitbucket.org/time/*"

Fornece o valor padrão para GONOPROXY e GONOSUMDB. Se essas variáveis forem definidas explicitamente, seus padrões prevalecem para proxy e checksum database, respectivamente.

Quando usar:

  • ✅ Repositórios privados da empresa
  • ✅ Código proprietário
  • ✅ Módulos internos
Janela do terminal
# Listar todas as dependências
go list -m all
# Ver dependências transitivas
go mod graph | grep -v "$(go list -m)"
# Verificar atualizações
go list -u -m all
Janela do terminal
# govulncheck - scanner oficial de vulnerabilidades
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...
# nancy - scanner de vulnerabilidades
go list -json -m all | nancy sleuth
# Dependabot (GitHub)
# Habilitar no repositório
Janela do terminal
# Usar versões exatas em produção
require (
github.com/gin-gonic/gin v1.10.0 // Não v1.10
gorm.io/gorm v1.25.7 // Não v1.25 ou latest
)
# Evitar pseudo-versions em produção
# ❌ v0.0.0-20240101120000-abcdef123456
# ✅ v1.2.3
Janela do terminal
# Configure GOPRIVATE
export GOPRIVATE="github.com/empresa/*"
# Use GOAUTH para autenticação
export GOAUTH=netrc # Credenciais já configuradas em ~/.netrc
# Nunca commite tokens
# Adicione ao .gitignore:
.env
.netrc
Janela do terminal
# Sempre commite go.sum
git add go.sum
git commit -m "Update dependencies"
# Verifique integridade regularmente
go mod verify
# Em CI/CD
- run: go mod download
- run: go mod verify
- run: go build ./...

Proteções:

  • ✅ Checksum database detecta alterações
  • ✅ go.sum garante consistência
  • ✅ retract marca versões comprometidas

Exemplo:

Janela do terminal
# Versão comprometida detectada
$ go get github.com/modulo-comprometido@v1.5.0
go: warning: github.com/modulo-comprometido@v1.5.0: retracted by module author
Security vulnerability - use v1.5.1+

Proteções:

  • ✅ GOPRIVATE previne vazamento de nomes
  • ✅ Proxies privados tem precedência

Configuração:

Janela do terminal
# Proxy privado PRIMEIRO
export GOPROXY="https://proxy.empresa.com,proxy.golang.org,direct"
export GOPRIVATE="github.com/empresa/*"
# Para buscar os privados no proxy corporativo, sem consultar o proxy público:
export GONOPROXY=none
export GOPROXY="https://proxy.empresa.com"

Sem GONOPROXY=none, o padrão de GOPRIVATE faz o Go buscar esses módulos diretamente no VCS. Se o proxy corporativo atende módulos privados, sua configuração precisa impedir que os caminhos sejam encaminhados a um serviço público.

Proteções:

  • Os checksums não detectam, por si só, que um caminho digitado errado aponta para outro módulo

Mitigação:

  • ✅ Revisar go.mod em PRs
  • ✅ Usar ferramentas de linting
  • Conferir o caminho e a origem do módulo antes de adicioná-lo

Proteções:

  • ✅ GOVCS limita VCS permitidos

Exemplo seguro:

Janela do terminal
# Apenas Git e Mercurial
export GOVCS="*:git|hg"
name: Security
on: [push, pull_request]
jobs:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.27.1'
# Verificar checksums
- name: Verify modules
run: go mod verify
# Scanner de vulnerabilidades
- name: Run govulncheck
run: |
go install golang.org/x/vuln/cmd/govulncheck@latest
govulncheck ./...
# Verificar go.sum commitado
- name: Check go.sum
run: |
go mod tidy
git diff --exit-code go.sum
# Scan de segurança
- name: Run Gosec
uses: securego/gosec@master
with:
args: ./...

Use um secret com acesso de leitura aos repositórios necessários para preparar as credenciais. O token do workflow pode não ter acesso a outros repositórios privados. Veja o tutorial de módulos privados no GitHub Actions.

# Nunca em código
env:
GOPRIVATE: "github.com/empresa/*"
# O arquivo de credenciais deve ser preparado pelo workflow
GOAUTH: netrc
  • Configure GOPRIVATE para módulos privados
  • Configure GOAUTH para autenticação
  • Configure GOVCS para limitar VCS
  • Habilite checksum database (padrão)
  • Use proxy privado se necessário
  • Sempre rode go mod verify
  • Revise go.mod changes em PRs
  • Não use @latest em produção
  • Verifique licenças de dependências
  • Audite dependências periodicamente
  • Execute govulncheck
  • Verifique todas as dependências atualizadas
  • Commit go.sum atualizado
  • Documente dependências críticas
  • Teste com todas as dependências limpas
Janela do terminal
# Instalar
go install golang.org/x/vuln/cmd/govulncheck@latest
# Escanear projeto
govulncheck ./...
# JSON output
govulncheck -json ./...
Janela do terminal
# Via Docker
go list -json -m all | docker run -i sonatypecommunity/nancy:latest sleuth
# Output formatado
go list -json -m all | nancy sleuth --output=json
Janela do terminal
# Instalar
go install github.com/securego/gosec/v2/cmd/gosec@latest
# Escanear
gosec ./...
# Com severity mínima
gosec -severity=medium ./...

Segurança em Go Modules é multi-camadas:

  • 🔒 Checksum Database - Integridade global
  • 🔐 GOVCS - Controle de VCS
  • 🔑 GOAUTH - Autenticação moderna
  • 🛡️ GOPRIVATE - Proteção de privados
  • ✅ go mod verify - Verificação local