Tag: Python

  • Como usar o AWS Secrets Manager para armazenar segredos de uma Lambda

    Como usar o AWS Secrets Manager para armazenar segredos de uma Lambda

    Chave de API no código ou em variável de ambiente em texto claro é um dos achados mais comuns em auditorias de segurança. Neste post de apoio ao vídeo, mostro como usar o AWS Secrets Manager para guardar credenciais e lê-las a partir de uma AWS Lambda, usando uma IAM Role com permissão mínima.

    O exemplo é um projeto real e open source: uma Lambda que consulta diariamente as CVEs publicadas na NVD, filtra as críticas e envia alertas para o Telegram.

    O projeto: CVE Lambda Notifier

    A função roda todos os dias e:

    1. Consulta a API da NVD (National Vulnerability Database) pelas CVEs publicadas nas últimas 24 horas.
    2. Filtra por palavras-chave de tecnologias que você usa (ex.: apache, nginx, docker, zabbix) e por criticidade, com CVSS maior ou igual a 7.
    3. Envia cada CVE relevante para um canal do Telegram, com o score e o link da NVD.

    Para isso, a Lambda precisa de três informações sensíveis: a API key da NVD, o token do bot do Telegram e o ID do chat. É aqui que entra o Secrets Manager.

    Arquitetura do CVE Lambda Notifier: EventBridge Scheduler, AWS Lambda, Secrets Manager, API da NVD e Telegram

    Recursos AWS utilizados

    RecursoPapel no projeto
    AWS Lambda (Python 3.11)Executa a consulta, o filtro e o envio
    AWS Secrets ManagerGuarda NVD_API_KEY, TELEGRAM_BOT_TOKEN e TELEGRAM_CHAT_ID
    IAM RoleDá à Lambda permissão de ler apenas aquele segredo
    Amazon EventBridge SchedulerDispara a função todos os dias às 8h (horário de Brasília)
    Amazon CloudWatch LogsRegistra CVEs recebidas, filtradas, enviadas e erros

    Por que não usar só variáveis de ambiente

    Variáveis de ambiente da Lambda são práticas, mas o valor fica visível para qualquer pessoa com acesso de leitura à função, e costuma acabar copiado em templates, pipelines e prints. O Secrets Manager resolve isso:

    • Criptografia com AWS KMS.
    • Acesso controlado por IAM, por segredo.
    • Auditoria no CloudTrail de quem leu o segredo e quando.
    • Rotação, automática ou manual, sem precisar republicar o código.

    No projeto, a variável de ambiente guarda só o nome do segredo (SECRET_NAME), nunca o valor.

    Passo a passo resumido

    1. Criar o segredo

    No console do Secrets Manager, crie um segredo do tipo outro tipo de segredo com três pares chave/valor:

    ChaveConteúdo
    NVD_API_KEYChave de API da NVD
    TELEGRAM_BOT_TOKENToken do bot criado no BotFather
    TELEGRAM_CHAT_IDID do canal ou usuário que recebe os alertas

    2. Dar permissão à Lambda

    Na IAM Role da função, adicione uma política que permite apenas secretsmanager:GetSecretValue e apenas no ARN do seu segredo:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["secretsmanager:GetSecretValue"],
          "Resource": "arn:aws:secretsmanager:REGIAO:CONTA:secret:NOME-DO-SEGREDO-xxxxxx"
        }
      ]
    }

    Evite "Resource": "*". Se a função for comprometida, ela só consegue ler o segredo de que realmente precisa.

    3. Ler o segredo no código

    Com o boto3, já disponível no runtime Python da Lambda, a leitura é curta:

    import boto3, json, os
    
    def carregar_segredo(nome_segredo):
        client = boto3.client("secretsmanager")
        response = client.get_secret_value(SecretId=nome_segredo)
        return json.loads(response["SecretString"])
    
    segredos = carregar_segredo(os.getenv("SECRET_NAME"))
    token = segredos["TELEGRAM_BOT_TOKEN"]

    Ao carregar o segredo fora do handler, ele é lido uma vez por ambiente de execução e reaproveitado nas invocações seguintes. Isso economiza chamadas à API do Secrets Manager.

    4. Deploy e agendamento

    • Empacote as dependências e o código em um .zip (o repositório tem um build.sh que faz isso) e publique na Lambda com o handler lambda_handler.lambda_handler.
    • No EventBridge Scheduler, crie uma schedule com o fuso America/Sao_Paulo e a expressão cron(0 8 * * ? *), tendo a função como destino.
    • Configure retentativas e, se quiser rastreabilidade de falhas, uma DLQ no SQS.

    Boas práticas

    • Um segredo por aplicação e ambiente (dev, homologação, produção), com políticas IAM separadas.
    • Habilite a rotação sempre que o provedor da credencial permitir.
    • Nunca registre o valor do segredo em log. Cuidado com print de dicionários inteiros.
    • Custo: o Secrets Manager cobra por segredo armazenado por mês e por volume de chamadas à API. Para parâmetros não sensíveis, o Parameter Store do Systems Manager pode ser mais barato.

    Material de apoio

    O mesmo princípio de “segredo fora do código” foi aplicado na arquitetura do Score Trust: Score Trust: arquitetura serverless na AWS.

Visão geral de privacidade

Este site usa cookies para que possamos oferecer a melhor experiência de usuário possível. As informações dos cookies são armazenadas em seu navegador e executam funções como reconhecê-lo quando você retorna ao nosso site e ajudar nossa equipe a entender quais seções do site você considera mais interessantes e úteis.