Como oculto informações confidenciais como senhas de texto sem formatação dos logs?

10

Não tenho acesso a uma instalação do Postgres, portanto não posso verificar.

Eu sou um cara de segurança e estou vendo senhas de texto sem formatação nos logs:

create user user1 with password 'PLAINTEXT PASSWORD'

Como os DBAs podem alterar ou criar suas senhas sem a senha limpa nos logs?

Eu já vi isso , que afirma que você pode usar um hash md5 da senha, mas o hash também fica claro. Existe uma maneira melhor?

schroeder
fonte
11
Se você confiar em seus DBAs (porque você não pode aplicá-los), diga a eles para usar o \passwordcomando de psql.
Dez

Respostas:

11

Parece que log_statementestá definido como all.

Se você deseja impedir que as senhas apareçam nos logs enquanto log_statementestiver definido como um valor que captura ALTER USER/ ALTER ROLE, você deverá substituí-lo ao alterar senhas. por exemplo

BEGIN;
SET LOCAL log_statement = 'none';
ALTER USER ... SET PASSWORD ...;
COMMIT;

Você deve ser um superusuário para fazer isso. Usuários normais não podem substituir regras de log.

Seria bom se PostgreSQL suportado sinalizar alguns parâmetros para declarações (ou até mesmo funções) como usuários sensíveis à segurança e permissão para solicitar que eles sejam mascarados em toras, pg_stat_statements, pg_stat_activity, etc. Não existe actualmente qualquer recurso - mas hey, patches são bem-vinda. Se você está realmente interessado, publique no pgsql-hackers antes de escrever qualquer código real, para que você possa obter conselhos e comentários. Como alternativa, fale com alguém que contrata o desenvolvimento.

Em geral, o PostgreSQL espera que você trate os logs como confidenciais.

Há outras áreas em que o log é uma séria preocupação de segurança. Por exemplo, algumas das pgcryptofunções usam chaves criptográficas como parâmetros.

Craig Ringer
fonte
3

A resposta atualmente aceita não funcionou para mim no Postgres 9.4, por impedir que a senha de texto sem formatação apareça nos logs.

O que funcionou para mim foi gerar o hash da senha localmente:

$ username='some_user'; dbpass='some_pass'; echo -n "${dbpass}${username}" | md5sum | awk '{print "md5" $1}'
md5dcca63c0632e24746a19448231cac29c

Em seguida, insira isso:

ALTER USER some_user WITH UNENCRYPTED PASSWORD 'md5dcca63c0632e24746a19448231cac29c';

(Nota de segurança: Dependendo de onde você gera o que foi mencionado acima, você pode impedir que seu shell faça logon no histórico, ou em um sistema compartilhado, você pode usar um utilitário * nix que solicitará a senha, em vez de incluí-la no diretório Por acaso eu não estava em um sistema compartilhado, então isso não era uma preocupação para mim.)

robut
fonte
11
Muito bom. Uma coisa que eu acrescentaria com alguma ênfase é que simplesmente não devemos definir senhas em texto não criptografado.
Dez
2
Sim, considerei isso e mencionei na pergunta. Ainda não é suficiente para os meus requisitos.
precisa