1
resposta

Senha aparece em claro no Log ao realizar login

Estou usando o vRaptor 4.2.2

Tenho um método de validação de usuário e senha:

@Post
public void valida(@NotNull @Valid Login login) {
    // lógica de validação aqui
}

O login.jsp é assim:

<form action="<c:url value='/login/valida'/>" method="post">
    <div class="centraliza">
        <div class="form-group col-sm-4 centraliza">
            <label for="login.usuario">Usuário</label>
            <input type="text" class="form-control" name="login.usuario" id="login.usuario"
                value="${login.usuario}" />
        </div>
        <br/>
        <div class="form-group col-sm-4 centraliza">
            <label for="login.senha">Senha</label>
            <input type="password" class="form-control" name="login.senha" id="login.senha"
                value="${login.senha}" />
        </div>
        <br/>
        <div class="centraliza-texto">
            <input type="submit" value="Entrar" class="btn btn-info btn-lg" />
        </div>
    </div>
</form>

Antes de chegar na primeira linha da lógida de validação do método 'valida', passo pelo trecho de código da classe IogiParametersProvider.java:

private List<Object> instantiateParameters(Parameters parameters, List<Target<Object>> targets, List<Message> errors) {
        LOGGER.debug("getParametersFor() called with parameters {} and targets {}.", parameters, targets);

        List<Object> arguments = new ArrayList<>(targets.size());
        for (Target<Object> target : targets) {
            Object newObject = instantiateOrAddError(parameters, errors, target);
            arguments.add(newObject);
        }
        return arguments;
    }

Essa linha "LOGGER.debug("getParametersFor() called with parameters {} and targets {}.", parameters, targets);" loga meu usuário e senha em claro nos logs. De cara, pensei em aumentar o nível do log4j de DEBUG para INFO, e parou de logar. Porém é uma solução sensível de erro de alguém que troque esse nível.

Vi que, em ParametersInstantiator.java, tem o trecho abaixo:

private Object[] getParametersForCurrentMethod() {
        Object[] args = flash.consumeParameters(methodInfo.getControllerMethod());
        if (args == null) {
            return provider.getParametersFor(methodInfo.getControllerMethod(), errors);
        }
        return args;
    }

Ele entra na condicão "if (args == null)". Não sei por quê args ainda é null nesse ponto (talvez seja o esperado mesmo). É exatamente o que faz cair na linha supracitada: "LOGGER.debug("getParametersFor() called with parameters {} and targets {}.", parameters, targets);"

Alguém poderia me ajudar a não deixar essa senha em claro no log mantendo no nível de log DEBUG?

Obrigado.

1 resposta

Olá Stefano, tudo bem?

Para evitar que a senha seja registrada em claro nos logs, você pode fazer o seguinte:

Alterar o nível de log para INFO ou superior: Como você mencionou, aumentar o nível de log do DEBUG para INFO ou superior é uma solução viável. Dessa forma, as mensagens de depuração, incluindo o registro da senha, não serão gravadas nos logs.

Utilizar uma biblioteca de log que suporte ofuscação de informações sensíveis: Algumas bibliotecas de log, como o Logback, possuem recursos que permitem a ofuscação de informações sensíveis em logs. Você pode configurar regras para ocultar automaticamente a senha antes que ela seja registrada nos logs.

Remover manualmente a senha antes de gravar o log: Outra opção é remover manualmente a senha antes de registrar a mensagem de log. Você pode fazer isso ajustando o código para substituir a senha por um valor em branco ou ofuscado antes de chamar o método de log.

Utilizar um interceptor para manipular os parâmetros: No seu caso específico com o VRaptor, você pode criar um interceptor que manipula os parâmetros antes de serem registrados no log. Você pode criar um interceptor personalizado que intercepte as requisições antes de chegarem ao método valida e faça a remoção da senha antes do log ser registrado.

Lembre-se de considerar as questões de segurança ao lidar com senhas e informações sensíveis. É uma prática recomendada não armazenar ou registrar informações sensíveis, como senhas, em logs ou qualquer outro lugar onde possam ser facilmente acessadas por usuários não autorizados.

Espero ter ajudado e bons estudos :)