Estou configurando um servidor MySQL e quero que o Ansible defina a mysql-root
senha durante a instalação.
Com a ajuda da internet, eu vim com esta solução:
- name: Set MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
apt: pkg=mysql-server state=latest
mysql_root_pwd
é uma variável carregada do Ansible Vault. Isso funciona bem, mas agora no servidor existem muitas linhas no log:
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None
Como posso impedir que o Ansible grave senhas em texto não criptografado nos arquivos de log?
O comportamento observado parece ser um bug no módulo debconf. Eu enviei um relatório de erro .
O usuário bcoca no github apontou que é possível usar a
no_log: true
diretiva em tarefas, que definem senhas, para impedir o registro. Esta é uma solução alternativa, que funciona para mim até que o bug seja corrigido.fonte
ERROR: no_log is not a legal parameter in an Ansible task or handler
sudo apt-add-repository ppa:ansible/ansible
,sudo apt-get update
,sudo apt-get install ansible
Eu resolvi atualizando a versão Ansible para 1.6.1
fonte
De acordo com os documentos Ansible :
Parece que a configuração
log_path
no nó de controle resultará em não ter logs nos nós de destino.fonte
vtype='password'
. Isso deve ser suficientemente explícito IMHO? Presumo que a mensagem de log também seja criada pelo módulo debconf.Existe uma maneira melhor do que apenas no_log: True
Como você pode ver, você precisa adicionar:
E, em seguida, faça a saída do resultado do comando com regex_replace, em que:
Com essa abordagem, você não apenas ocultará as senhas e logins, mas também obterá o resultado da sua operação
fonte
Este é um complemento para a resposta de TheDESTROS a partir deste tópico:
wrapper-script.sh.j2
Você precisa de um pouco menos de código e pode descobrir os comandos em seus logs. Existe apenas uma caverna, se houver um segredo nos comandos stdout. Se você deseja evitar o modelo externo, o
copy
módulo com o parâmetrocontent
pode ajudar a escrever um pequeno script de wrapper rapidamente.fonte
A
no_log: true
abordagem deve ser usada como último recurso se outras tentativas falharem, pois tornará a execução da tarefa totalmente opaca e você não terá idéia de quando falhar.As práticas de segurança recomendam fornecer credenciais do stdin ou, quando não for possível, usar arquivos de credenciais (ou mesmo executáveis).
Aqui está um exemplo de como executar um login podman seguro, evitando expor a senha:
Com isso, o segredo não será exposto,
result
mas você ainda poderá ver a saída do comando.A maioria das ferramentas que precisam de login implementam uma das abordagens mais seguras mencionadas. O uso de credenciais na CLI no código é como ter
123456
como sua senha do banco.fonte