Security Features
Introdução
Seção intitulada “Introdução”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.
Camadas de segurança
Seção intitulada “Camadas de segurança”1. Checksum Database (Go 1.13+)
Seção intitulada “1. Checksum Database (Go 1.13+)”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
2. GOVCS (Go 1.16+)
Seção intitulada “2. GOVCS (Go 1.16+)”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.
Configuração GOVCS
Seção intitulada “Configuração GOVCS”# Padrão seguroGOVCS="public:git|hg,private:all"
# Apenas Git (mais restritivo)GOVCS="*:git"
# Desabilitar proteção (NÃO RECOMENDADO)GOVCS="*:all"Regras de padrão
Seção intitulada “Regras de padrão”# SintaxeGOVCS="padrão:lista,padrão:lista,..."
# ExemplosGOVCS="github.com:git,example.com:svn,private:all"GOVCS="*.internal.corp:git,public:git|hg"VCS suportados
Seção intitulada “VCS suportados”| 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.
3. GOAUTH (Go 1.24+)
Seção intitulada “3. GOAUTH (Go 1.24+)”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.
Configuração
Seção intitulada “Configuração”# Usar credenciais de NETRC ou ~/.netrc (padrão)export GOAUTH=netrc
# Consultar o credential helper do Git em um diretório absolutoexport GOAUTH="git /home/gopher/projeto"
# Executar um helper próprioexport GOAUTH="/usr/local/bin/auth-helper"
# Combinar métodos, separados por ponto e vírgulaexport GOAUTH="netrc; git /home/gopher/projeto"
# Desabilitar autenticação HTTP do comando goexport GOAUTH=offNo 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.
Exemplo prático
Seção intitulada “Exemplo prático”Para usar um arquivo .netrc, preencha os dados do servidor:
machine gitlab.empresa.comlogin oauth2password SEU_TOKENDepois, limite a leitura do arquivo e configure o acesso:
chmod 600 ~/.netrcexport GOPRIVATE="gitlab.empresa.com/*"export GOAUTH=netrcgo get gitlab.empresa.com/time/biblioteca@latest4. GOPRIVATE (Go 1.13+)
Seção intitulada “4. GOPRIVATE (Go 1.13+)”Define módulos privados que não devem usar proxy ou checksum database.
# SintaxeGOPRIVATE="padrão,padrão,..."
# ExemplosGOPRIVATE="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
Melhores Práticas de Segurança
Seção intitulada “Melhores Práticas de Segurança”✅ Verificação de Dependências
Seção intitulada “✅ Verificação de Dependências”1. Auditar Dependências
Seção intitulada “1. Auditar Dependências”# Listar todas as dependênciasgo list -m all
# Ver dependências transitivasgo mod graph | grep -v "$(go list -m)"
# Verificar atualizaçõesgo list -u -m all2. Usar Ferramentas de Segurança
Seção intitulada “2. Usar Ferramentas de Segurança”# govulncheck - scanner oficial de vulnerabilidadesgo install golang.org/x/vuln/cmd/govulncheck@latestgovulncheck ./...
# nancy - scanner de vulnerabilidadesgo list -json -m all | nancy sleuth
# Dependabot (GitHub)# Habilitar no repositório✅ Versionamento Seguro
Seção intitulada “✅ Versionamento Seguro”# Usar versões exatas em produçãorequire ( 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✅ Módulos Privados Seguros
Seção intitulada “✅ Módulos Privados Seguros”# Configure GOPRIVATEexport GOPRIVATE="github.com/empresa/*"
# Use GOAUTH para autenticaçãoexport GOAUTH=netrc # Credenciais já configuradas em ~/.netrc
# Nunca commite tokens# Adicione ao .gitignore:.env.netrc✅ Verificar Checksums
Seção intitulada “✅ Verificar Checksums”# Sempre commite go.sumgit add go.sumgit commit -m "Update dependencies"
# Verifique integridade regularmentego mod verify
# Em CI/CD- run: go mod download- run: go mod verify- run: go build ./...Proteção Contra Ataques
Seção intitulada “Proteção Contra Ataques”1. Supply Chain Attacks
Seção intitulada “1. Supply Chain Attacks”Proteções:
- ✅ Checksum database detecta alterações
- ✅
go.sumgarante consistência - ✅
retractmarca versões comprometidas
Exemplo:
# Versão comprometida detectada$ go get github.com/modulo-comprometido@v1.5.0go: warning: github.com/modulo-comprometido@v1.5.0: retracted by module author Security vulnerability - use v1.5.1+2. Dependency Confusion
Seção intitulada “2. Dependency Confusion”Proteções:
- ✅
GOPRIVATEprevine vazamento de nomes - ✅ Proxies privados tem precedência
Configuração:
# Proxy privado PRIMEIROexport 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=noneexport 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.
3. Typosquatting
Seção intitulada “3. Typosquatting”Proteções:
- Os checksums não detectam, por si só, que um caminho digitado errado aponta para outro módulo
Mitigação:
- ✅ Revisar
go.modem PRs - ✅ Usar ferramentas de linting
- Conferir o caminho e a origem do módulo antes de adicioná-lo
4. Code Injection via VCS
Seção intitulada “4. Code Injection via VCS”Proteções:
- ✅
GOVCSlimita VCS permitidos
Exemplo seguro:
# Apenas Git e Mercurialexport GOVCS="*:git|hg"CI/CD Seguro
Seção intitulada “CI/CD Seguro”GitHub Actions
Seção intitulada “GitHub Actions”name: Securityon: [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: ./...Variáveis de Ambiente Seguras
Seção intitulada “Variáveis de Ambiente Seguras”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ódigoenv: GOPRIVATE: "github.com/empresa/*" # O arquivo de credenciais deve ser preparado pelo workflow GOAUTH: netrcChecklist de Segurança
Seção intitulada “Checklist de Segurança”Setup Inicial
Seção intitulada “Setup Inicial”- Configure
GOPRIVATEpara módulos privados - Configure
GOAUTHpara autenticação - Configure
GOVCSpara limitar VCS - Habilite checksum database (padrão)
- Use proxy privado se necessário
Durante Desenvolvimento
Seção intitulada “Durante Desenvolvimento”- Sempre rode
go mod verify - Revise
go.modchanges em PRs - Não use
@latestem produção - Verifique licenças de dependências
- Audite dependências periodicamente
Antes de Release
Seção intitulada “Antes de Release”- Execute
govulncheck - Verifique todas as dependências atualizadas
- Commit
go.sumatualizado - Documente dependências críticas
- Teste com todas as dependências limpas
Ferramentas de Segurança
Seção intitulada “Ferramentas de Segurança”govulncheck (Oficial)
Seção intitulada “govulncheck (Oficial)”# Instalargo install golang.org/x/vuln/cmd/govulncheck@latest
# Escanear projetogovulncheck ./...
# JSON outputgovulncheck -json ./...nancy (Sonatype)
Seção intitulada “nancy (Sonatype)”# Via Dockergo list -json -m all | docker run -i sonatypecommunity/nancy:latest sleuth
# Output formatadogo list -json -m all | nancy sleuth --output=jsongosec (Security Scanner)
Seção intitulada “gosec (Security Scanner)”# Instalargo install github.com/securego/gosec/v2/cmd/gosec@latest
# Escaneargosec ./...
# Com severity mínimagosec -severity=medium ./...Recursos Adicionais
Seção intitulada “Recursos Adicionais”- Go Security Policy
- Go Vulnerability Database
- GOVCS Documentation
- Module Authentication (GOAUTH)
- Checksum Database
Conclusão
Seção intitulada “Conclusão”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