Aikido

Prevenir Secrets codificados em Python

Segurança

Evite Secrets codificados em Python: Detetar vulnerabilidades de segurança antes da produção

Todo desenvolvedor Python já passou por isso - você está pressionando para cumprir um prazo, e você codifica uma chave de API "apenas temporariamente". Então, essa correção temporária chega à produção, é confirmada no histórico do Git e, de repente, suas credenciais são expostas para sempre.

De acordo com o relatório 2024 State of Secrets Sprawl da GitGuardian, foram detectados mais de 12,8 milhões de secrets em repositórios públicos do GitHub, sendo as chaves de API e as credenciais de bases de dados as mais frequentemente expostas. O custo médio de uma violação de dados envolvendo credenciais expostas é de US$ 4,45 milhões, de acordo com o relatório 2024 Cost of a Data Breach Report da IBM.

Esta regra de revisão de código de IA detecta automaticamente secrets codificados no seu código Python durante os pedidos de pull, evitando incidentes de segurança dispendiosos antes que eles aconteçam.

O que esta regra detecta

Esta regra procura os tipos mais comuns de secrets hardcoded que causam incidentes de segurança no mundo real:

  • Chaves de API: OpenAI, Stripe, AWS, Google Cloud, serviços de terceiros
  • Credenciais da base de dados: Cadeias de ligação com palavras-passe incorporadas
  • Tokens de autenticação: secrets JWT, chaves de sessão, tokens OAuth
  • Chaves de encriptação: Chaves simétricas, sais, certificados
  • Credenciais de serviço: Tokens de registo do Docker, secrets CI/CD

A regra utiliza a correspondência inteligente de padrões para apanhar os dois casos óbvios

(API_KEY = "sk-12345") e subtis (credenciais em linha em cadeias de ligação).

Exemplos do mundo real

Código que causa incidentes de segurança

1#This leaked OpenAI key cost a startup $2,000 in unauthorized usage
2
3OPENAI_API_KEY = "sk-proj-Ab3dEf7GhI9jKlMnOpQrStUvWxYz123456789"
4# Database breach from exposed connection string
5DATABASE_URL = "postgresql://admin:prod_password_2024@db-cluster.company.com:5432/users"
6# JWT secret in code = anyone can forge authentication tokens
7JWT_SECRET_KEY = "super-secret-key-that-never-changes"
8# This pattern shows up in 40% of credential leaks
9
10class APIClient:
11    def __init__(self):
12    self.session = requests.Session()
13    self.session.headers.update({
14    	"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
15    })

Código que passa na revisão de segurança

1import os
2
3# Environment variables keep secrets out of code
4OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
5if not OPENAI_API_KEY:
6    raise ValueError("OPENAI_API_KEY environment variable required")
7
8# Clean separation of config and code
9DATABASE_URL = os.getenv("DATABASE_URL")
10
11# Secrets loaded at runtime, not build time
12JWT_SECRET_KEY = os.getenv("JWT_SECRET_KEY")
13
14class APIClient:
15    def __init__(self):
16        token = os.getenv("API_TOKEN")
17        if not token:
18            raise ValueError("API_TOKEN environment variable required")
19        
20        self.session = requests.Session()
21        self.session.headers.update({"Authorization": f"Bearer {token}"})
22
23# Pro tip: Validate all required secrets at startup
24def validate_required_secrets():
25    required = ["OPENAI_API_KEY", "DATABASE_URL", "JWT_SECRET_KEY"]
26    missing = [key for key in required if not os.getenv(key)]
27    
28    if missing:
29        raise EnvironmentError(f"Missing required environment variables: {missing}")
30
31validate_required_secrets()  # Fail fast if misconfigured

Dicas de implementação que funcionam de facto

1. O .env Padrão de ficheiro (desenvolvimento)
# pip install python-dotenv
from dotenv  import load_dotenv
 import os

# Carregar secrets do ficheiro .env (nunca submeter este ficheiro!)
load_dotenv()

# Agora os seus secrets funcionam localmente sem hardcoding
DATABASE_URL = os.getenv("DATABASE_URL") # do ficheiro .env
API_KEY = os.getenv("API_KEY") # do ficheiro .env*

Arquivo .env** (adicionar ao `.gitignore`):

DATABASE_URL=postgresql://localhost:5432/myapp_dev
API_KEY=sua_chave_de_api_de_desenvolvimento
STRIPE_KEY=sk_test_sua_chave_de_teste
2. Gestão do segredo de produção
1# Para produção: Use o gerenciador de segredos do seu provedor de nuvem
 2import boto3
3import json
4
5def get_secret(secret_name):
 6 client = boto3.client('secretsmanager', region_name='us-west-2')
7 response = client.get_secret_value(SecretId=secret_name)
8    return json.loads(response['SecretString'])
9
10 # Carregar secrets em tempo de execução
secrets = get_secret('secrets')
12DATABASE_URL= secrets['database_url']
13API_KEY= secrets['api_key']
3. Secrets do Docker (se você usa Docker)
def load_docker_secret(secret_name):
    """Load secret from Docker swarm secret or fall back to env var"""
    try:
        with open(f'/run/secrets/{secret_name}', 'r') as f:
            return f.read().strip()
    except FileNotFoundError:
        return os.getenv(secret_name.upper())

DATABASE_PASSWORD = load_docker_secret('db_password')
4. Padrão de classe de configuração
1class Config:
2    """Centralized configuration with validation"""
3    def __init__(self):
4        # Fail fast on missing secrets
5        self.database_url = self._require_env('DATABASE_URL')
6        self.api_key = self._require_env('API_KEY')
7        self.debug = os.getenv('DEBUG', 'False').lower() == 'true'
8    
9    def _require_env(self, key):
10        value = os.getenv(key)
11        if not value:
12            raise ValueError(f'Required environment variable {key} is not set')
13        return value
14
15config = Config()  # Will raise error if secrets are missing

Porque é que esta regra lhe poupa tempo e dinheiro

Evita erros dispendiosos: Uma única chave de API vazada pode resultar em milhares de dólares em uso não autorizado. De acordo com o Relatório de Investigações de Violação de Dados de 2024 da Verizon, 74% das violações de dados envolvem o elemento humano, incluindo credenciais expostas acidentalmente.

Economiza tempo de revisão de código: Em vez de verificar manualmente cada PR em busca de secrets codificados, a IA faz isso de forma automática e consistente. As equipas de segurança gastam uma média de 23% do seu tempo em revisões manuais de código, de acordo com o Relatório DevSecOps 2024 do GitLab.

Reduz os incidentes de segurança: O relatório 2024 State of the Octoverse do GitHub mostra que 95% dos vazamentos de credenciais acontecem por meio de commits de código-fonte. A deteção automatizada evita a maioria desses incidentes.

Melhora a produtividade da equipa: Os programadores obtêm feedback imediato em vez de ficarem a saber dos problemas de segurança dias mais tarde, durante as revisões de segurança.

Conformidade facilitada: reforça automaticamente as melhores práticas de segurança exigidas pelo SOC 2, ISO 27001 e outras estruturas de conformidade.

Experimente esta regra em ação com a Aikido Security

Pronto para deixar de se preocupar com a possibilidade de cometer secrets acidentalmente? A revisão de código de IA da Aikido Security detecta estes problemas no momento em que abre um pedido de pull.

O que obtém:

  • Feedback instantâneo sobre cada RP
  • Zero falsos positivos para trabalho de desenvolvimento real
  • Integração perfeita com o seu fluxo de trabalho atual
  • Regras personalizadas para os seus padrões secretos específicos
  • Aplicação das melhores práticas de segurança em toda a equipa

A melhor parte? Demora 2 minutos a configurar e começa a proteger o seu código imediatamente. Sem configurações complexas, sem necessidade de conhecimentos de segurança.

FAQs

Tem perguntas?

Isto irá atrasar o nosso processo de desenvolvimento?

Não - na verdade, acelera o desenvolvimento ao detetar problemas numa fase inicial. Corrigir um segredo codificado num PR demora 30 segundos. Corrigi-lo depois de um incidente de segurança demora dias.

E quanto aos ficheiros de teste com credenciais falsas?

A IA distingue entre secrets reais e dados de teste. Também pode adicionar comentários # aikido:ignore para credenciais de teste legítimas.

Posso personalizar isto para os formatos secretos específicos da nossa empresa?

Sim! Pode criar padrões personalizados para as APIs internas da sua organização, formatos de bases de dados ou serviços proprietários.

Como é que isto funciona com o nosso atual pipeline de CI/CD?

Integra-se perfeitamente no seu fluxo de trabalho existente. O processo de instalação detecta automaticamente a sua plataforma de repositório e configura a integração por si.

E se já estivermos a utilizar variáveis de ambiente em todo o lado?

Ótimo! Esta regra garante que a sua equipa mantém essas boas práticas e detecta quaisquer regressões acidentais.

Obter segurança gratuitamente

Proteja seu código, nuvem e tempo de execução em um sistema central.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados do scan em 32secs.