No Puppet, como eu protegeria uma variável de senha (neste caso, uma senha do MySQL)?

13

Estou usando o Puppet para provisionar o MySQL com uma classe parametrizada:

class mysql::server( $password ) {

        package { 'mysql-server': ensure => installed }
        package { 'mysql': ensure => installed }

        service { 'mysqld':
                enable => true,
                ensure => running,
                require => Package['mysql-server'],
        }

        exec { 'set-mysql-password':
                unless => "mysqladmin -uroot -p$password status",
                path => ['/bin', '/usr/bin'],
                command => "mysqladmin -uroot password $password",
                require => Service['mysqld'],
        }
}

Como posso proteger $password? Atualmente, removi a permissão legível por padrão do mundo do arquivo de definição de nó e dei explicitamente puppetpermissão de leitura via ACL.

Suponho que outras pessoas tenham se deparado com uma situação semelhante, então talvez exista uma prática melhor.

Belmin Fernandez
fonte

Respostas:

3

Ao trabalhar com o Puppet e o MySQL, costumo colocar a senha de root em /root/.my.cnf, bloquear esse arquivo e restringir o acesso SSH ao servidor de banco de dados.

Sim, armazenar a senha root no servidor db em texto não criptografado não é a solução mais segura. No entanto, se você escrever a senha root do mysql nesse arquivo, proteger a conta root do mysql para permitir logins apenas do host local manterá a senha fora do fantoche e também fora da pstabela da lista de processos .

Além disso, se alguém tiver acesso root para ler o arquivo em /root/.my.cnf, provavelmente também terá acesso para parar o daemon MySQL local e reiniciar o daemon sem a tabela users para obter acesso root imediato ao banco de dados.

Robbyt
fonte
2
Use mysql_config_editor se estiver no mysql 5.6 e posterior. Pelo menos a senha não estará em texto sem formatação.
Kejau Touray 26/06/16
1

Outra pessoa provavelmente pode apontar algum plug-in ou similar que me corrija, mas a maneira geral de fazer isso é armazenar a senha criptografada , não a senha de texto sem formatação.

No entanto, posso lhe dizer agora, o MySQL não permite que você use uma senha criptografada - caso contrário, essa seria a senha e o hash permitiria que você se logasse de qualquer maneira.

Existem muitos "hacks" disponíveis que permitem usar utilitários de terceiros, como Hiera e GPG . Obviamente, você pode criar suas próprias - mas mesmo as listas de discussão do Puppet sugerem esse método .

Andrew M.
fonte
1

Você não especificou de quem está protegendo esta senha. Vou assumir que são outros administradores de sistema ou possivelmente desenvolvedores que têm acesso ao mestre de marionetes e / ou às caixas de clientes, mas não precisam saber a senha de root.

Para definir a senha inicialmente, você pode usar esta sintaxe:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;

O que permitiria armazenar uma senha criptografada em sua configuração de fantoche, em vez de uma senha em texto sem formatação.

Para usar mysqladmine o mysqlcliente na linha de comando, o melhor que consigo pensar é adicionar um .my.cnfarquivo à sua configuração de marionetes que é implantada no diretório inicial do usuário apropriado. O arquivo no mestre de marionetes e nos clientes deve ter permissões de arquivo restritivas apropriadas.

Existem várias maneiras de contornar essas permissões de arquivo quando você adiciona fantoches à mistura (como escrever um exec () que extrai o arquivo dos clientes), mas parece haver uma melhoria no armazenamento da senha em um arquivo legível mundialmente. Isso seria mais difícil se você usar um sistema de versão para sua configuração de fantoches.

Ladadadada
fonte
1
Mas se alguém recuperasse a senha criptografada, eles não poderiam simplesmente usar a cadeia criptografada para fazer login?
Andrew M.
@ Redmumba Todos os meus testes parecem indicar isso. Talvez esteja sentindo falta de algo que Ladadadada possa elaborar.
Belmin Fernandez
3
Não. Quando você usa, em IDENTIFIED BY PASSWORD '*HASH-HERE'vez do IDENTIFIED BY 'PASSWORD-HERE'MySQL, insere o hash diretamente na usertabela. Você precisará usar a senha que gerou esse hash para efetuar login. Você pode ver como seria o seu comando de concessão com o hash da senha fazendo login normalmente e digitando SHOW GRANTS;. Você também pode verificar outros usuários comSHOW GRANTS FOR user@host;
Ladadadada
Ah, então você não pode usar o próprio hash para fazer login, entendo. No entanto, se ele tiver um cliente que precise se conectar ao banco de dados - digamos, seu front end - ele também precisará de uma maneira de armazenar a senha criptografada, que é um alimento para reflexão.
Andrew M.
0

Este link sugere dois métodos: usando variáveis ​​de ambiente e subshell.

Eu acho que você também pode criar um invólucro simples em torno do seu comando mysqladmine passar sua senha criptografada para ele. Esse wrapper descriptografará a senha e a passará para mysqladmin. Você precisa proteger seu invólucro, pois ele contém a parte de descriptografia.

Você pode escolher a maneira que achar mais segura, com base no seu ambiente e em quem tem acesso ao seu sistema.

Khaled
fonte