Pular para o conteúdo
Development

Três linhas de config, uma tarde de verificação

Por Victor Da Luz
railsrubysecuritydev-logblog-manager

A tarefa de hoje devia ter levado dez minutos. Descomentar três linhas num arquivo de config do Rails, duas flags que dizem ao app “você está atrás de um proxy que já cuida do HTTPS” e uma pequena exceção para o endpoint de health-check. Esse é o diff inteiro. O tempo de verdade foi quase todo para garantir que eu entendesse o que essas três linhas realmente fariam antes de confiar nelas, e depois provar isso.

Lendo o framework em vez de confiar no comentário

O texto da issue era razoável e específico: ativar essas flags para que o cookie de sessão seja marcado como seguro, mas sem quebrar o health check do qual uma ferramenta de deploy depende. Seria fácil só fazer o que ele dizia. Em vez disso, fui ler o código-fonte de verdade do framework para entender como essas duas configurações interagem, porque eu queria saber se a exceção do health-check estava fazendo trabalho de verdade ou só estava ali por hábito.

Acontece que uma das duas configurações faz o app tratar toda e qualquer requisição como já segura, incondicionalmente, antes que a outra configuração tenha qualquer chance de redirecionar alguma coisa. Ou seja, a exceção específica que a issue pedia é, tecnicamente, código morto hoje, a coisa da qual ela excetua nunca roda de qualquer forma. Mantive a linha mesmo assim. Ela não custa nada, e é exatamente a proteção que importaria se alguém removesse a primeira configuração mais tarde deixando a segunda no lugar. Entender o porquê me deixou tomar essa decisão com confiança de verdade, em vez de só copiar o comentário sugerido pelo próprio framework.

Deixando os achados da revisão serem checados, não só aceitos ou descartados

Rodei uma passada de revisão no diff depois, mais por hábito do que por expectativa, três linhas, quanto tem para encontrar aí. Voltaram dois achados que pareciam plausíveis à primeira vista. Um afirmava que os emails enviados continuariam gerando links não criptografados mesmo com essas configurações ativas, já que o código de envio de email não roda dentro de uma requisição web normal. O outro afirmava que um health check automatizado separado, em outro ponto da infraestrutura, quebraria por causa de uma resposta de redirecionamento inesperada.

Nenhum dos dois sobreviveu a uma checagem direta. Para o primeiro, rodei o código de mailer de verdade com a configuração ativada e imprimi a URL gerada, ela voltou corretamente criptografada, porque o framework vira uma chave global no startup que o código de email também respeita, não só as requisições. Isso levou trinta segundos e resolveu a questão por completo. Para o segundo, fui ler diretamente a configuração desse outro health check e descobri que ele nem estava checando este app, estava apontado para um serviço totalmente diferente que por acaso compartilha o mesmo número de porta. Uma leitura de arquivo de cinco minutos encerrou um achado que facilmente poderia ter passado sem ser questionado.

Um achado se sustentou, e não tinha nada a ver com esse diff, era sobre a rede em que esses servidores estão. A configuração que adicionei assume que o app só pode ser alcançado através do proxy que cuida da criptografia. Nada no nível de rede de fato impõe essa suposição; qualquer outra máquina no mesmo segmento de rede poderia, em princípio, falar com o app diretamente e pular a criptografia por completo. É uma lacuna real, mas não é algo para corrigir dentro de um PR de config de três linhas, e não é algo que esse PR piorou, já existia antes de eu tocar em qualquer coisa. Registrei isso como uma tarefa separada, em vez de fingir que dava para corrigir ali mesmo.

Provando em vez de assumir que o deploy ter passado já bastava

Assim que isso foi para o ambiente de staging, eu poderia simplesmente ter checado que o deploy ficou verde e dado como concluído, um health check falhando teria bloqueado o deploy de cara, o que já é uma evidência razoável por si só. Eu queria algo mais direto do que “o deploy não falhou.” Acessei o endpoint real do health-check de dentro do container em execução, do mesmo jeito que o health check da própria ferramenta de deploy faz, pulando a camada de proxy por completo, e recebi de volta exatamente a resposta esperada. Depois busquei uma página do site em produção e li o header de cookie bruto que o servidor devolveu, confirmando que a flag secure estava de fato presente num cookie vindo de produção, não só presente em teoria.

O que vem a seguir

Não sobrou nada nesta aqui. A lição que continua se repetindo essa semana: o tamanho de um diff tem muito pouco a ver com quanta verificação ele merece. Uma mudança de config de três linhas que afeta como toda requisição em produção é tratada precisou de mais escrutínio do que muitos diffs bem maiores precisariam, e a passada de revisão se justificou ao forçar duas alegações a sobreviver ao contato com o código de verdade, em vez de só soarem certas.

Leitura relacionada

Você também pode achar útil

NordPass

NordPass

Gerenciador de senhas da equipe por trás da NordVPN, com um plano gratuito.

Como afiliado da NordPass, ganho com compras qualificadas.

Saiba mais
Proton

Proton Drive

Armazenamento em nuvem criptografado, da equipe por trás do Proton Mail.

Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).

Saiba mais
RackNerd

RackNerd VPS

Hospedagem VPS econômica para serviços leves que funcionam continuamente.

Como afiliado da RackNerd, ganho com compras qualificadas.

Saiba mais