Boas práticas de segurança para ambientes de desenvolvimento local

1. Isolamento de ambiente e dependências

O isolamento é a primeira linha de defesa contra contaminação cruzada entre projetos e o sistema operacional host. Containers Docker ou Podman oferecem ambientes efêmeros que eliminam resíduos após o uso. Para gerenciar versões de linguagens, ferramentas como asdf, nvm e pyenv evitam conflitos globais:

# Exemplo: Instalação isolada de Node.js com nvm
nvm install 18.17.0
nvm use 18.17.0
node --version
# v18.17.0

# Exemplo: Ambiente virtual Python com venv
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Ambientes virtuais garantem que bibliotecas específicas do projeto não interfiram em outros projetos ou no sistema base. Combine com Docker para serviços de infraestrutura (bancos de dados, filas):

# docker-compose.yml para serviços isolados
version: '3.8'
services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

2. Gestão segura de credenciais e segredos

Nunca armazene credenciais em código-fonte. Utilize vaults locais como Hashicorp Vault (modo dev), Bitwarden CLI ou 1Password CLI para gerenciar segredos. Ferramentas de injeção como direnv e sops automatizam o carregamento seguro:

# .envrc com direnv (carrega automaticamente ao entrar no diretório)
export DB_PASSWORD="supersecreto"
export API_KEY="sk-abc123"

# Criptografar .env com sops
sops --encrypt .env > .env.encrypted
sops --decrypt .env.encrypted > .env

Boas práticas para arquivos .env:
- Adicione .env ao .gitignore imediatamente
- Restrinja permissões: chmod 600 .env
- Rotacione chaves periodicamente (a cada 90 dias)
- Use .env.example como template com valores fictícios

# .gitignore
.env
.env.*
!env.example

3. Configuração segura de ferramentas de desenvolvimento

Git: assinatura de commits e hooks

Assine commits com GPG ou SSH para garantir autoria e integridade:

# Configurar assinatura GPG
git config --global user.signingkey ABCDEF1234567890
git config --global commit.gpgSign true

# Ou com SSH (Git 2.34+)
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git commit -S -m "feat: implementa autenticação"

Configure hooks com pre-commit e gitleaks para evitar vazamento de segredos:

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.5.0
    hooks:
      - id: detect-private-key
      - id: check-added-large-files
  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.18.2
    hooks:
      - id: gitleaks

Editores e IDEs

Desabilite execução automática de código em editores (VS Code, Neovim). Instale apenas extensões de fontes confiáveis e verifique permissões:

# VS Code: settings.json para segurança
{
  "security.workspace.trust.enabled": true,
  "files.autoSave": "off",
  "extensions.ignoreRecommendations": true
}

Gerenciamento de pacotes

Sempre utilize lockfiles e verifique checksums:

# npm
npm install --package-lock-only
npm audit

# pip
pip freeze > requirements.txt
pip install --require-hashes -r requirements.txt

# Verificar checksum manualmente
sha256sum package.tar.gz
# Comparar com hash oficial

4. Proteção de redes e serviços locais

Configure firewall local para restringir acesso a serviços de desenvolvimento:

# ufw (Ubuntu)
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow from 127.0.0.1 to any port 3000 proto tcp  # React dev server
sudo ufw allow from 127.0.0.1 to any port 5432 proto tcp  # PostgreSQL
sudo ufw enable

Use TLS local com mkcert para simular HTTPS:

# Instalar mkcert
brew install mkcert  # macOS
sudo apt install mkcert  # Linux

# Criar CA local e certificados
mkcert -install
mkcert localhost 127.0.0.1 ::1

# Usar no servidor de desenvolvimento
# Exemplo com Vite: vite.config.js
server: {
  https: {
    key: fs.readFileSync('localhost-key.pem'),
    cert: fs.readFileSync('localhost.pem'),
  }
}

Nunca exponha portas de debug (9229 do Node.js, 5005 do Java) para rede externa. Vincule serviços apenas a 127.0.0.1:

# Node.js debug apenas local
node --inspect=127.0.0.1:9229 app.js

# Django development server
python manage.py runserver 127.0.0.1:8000

5. Práticas de segurança no ciclo de desenvolvimento

Integre análise estática antes do commit. Linters como ESLint, Bandit e RuboCop detectam vulnerabilidades comuns:

# ESLint com regras de segurança
npx eslint --rule 'no-eval: error' --rule 'no-implied-eval: error' src/

# Bandit para Python
bandit -r src/ -f json -o bandit-report.json

Escaneie dependências com ferramentas especializadas:

# Trivy (escaneia container e sistema de arquivos)
trivy fs --severity HIGH,CRITICAL .
trivy image node:18-alpine

# Snyk CLI
snyk test --all-projects
snyk monitor

# OWASP Dependency-Check
dependency-check --scan . --format HTML

Em pull requests, exija revisão de segurança antes do merge. Configure GitHub/GitLab para bloquear merges sem aprovação de segurança:

# .github/CODEOWNERS
# Arquivos sensíveis requerem aprovação do time de segurança
*.env* @security-team
Dockerfile @security-team

6. Backup e recuperação segura de dados locais

Criptografe volumes de dados sensíveis com dm-crypt/LUKS ou VeraCrypt:

# Criar volume criptografado com LUKS
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup open /dev/sdb1 secure-volume
sudo mkfs.ext4 /dev/mapper/secure-volume
sudo mount /dev/mapper/secure-volume /mnt/secure

Automatize backups criptografados com restic ou Borg:

# Restic com criptografia
export RESTIC_REPOSITORY="/backup/restic-repo"
export RESTIC_PASSWORD="senha-forte"
restic init
restic backup ~/projects --exclude='node_modules' --exclude='.venv'
restic snapshots

# Borg
borg init --encryption=repokey /backup/borg-repo
borg create /backup/borg-repo::projeto-$(date +%Y%m%d) ~/projects

Plano de resposta para vazamento de credenciais locais:
1. Identificar credencial comprometida (ex: chave de API no Git)
2. Revogar imediatamente no serviço correspondente (AWS, GitHub, etc.)
3. Rotacionar chave: gerar nova e atualizar .env
4. Executar gitleaks detect --verbose para verificar histórico
5. Remover commit comprometido com git filter-branch ou BFG Repo-Cleaner

# Remover segredo do histórico Git
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch .env" \
  --prune-empty --tag-name-filter cat -- --all
git push origin --force --all

Referências