In Puppet, come posso proteggere una variabile password (in questo caso una password MySQL)?


13

Sto usando Puppet per fornire a MySQL una classe con parametri:

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'],
        }
}

Come posso proteggere $password? Attualmente, ho rimosso l'autorizzazione leggibile dal mondo predefinito dal file di definizione del nodo e ho dato esplicitamente l' puppetautorizzazione in lettura tramite ACL.

Suppongo che gli altri abbiano incontrato una situazione simile, quindi forse c'è una pratica migliore.

Risposte:


3

Quando lavoro con Puppet e MySQL, tendo a mettere la password di root in /root/.my.cnf, a bloccare questo file e quindi a limitare l'accesso SSH al server del database.

Sì, archiviare la password di root sul server db in chiaro non è la soluzione più sicura. Tuttavia, se si scrive la password di root mysql in questo file, la protezione dell'account root di mysql per consentire gli accessi solo da localhost manterrà la password fuori dal burattino e anche dalla pstabella dell'elenco dei processi .

Inoltre, se qualcuno ha accesso come root per leggere il file su /root/.my.cnf, probabilmente avrà anche accesso per fermare il demone MySQL locale e riavviare il demone senza la tabella degli utenti per ottenere l'accesso root immediato al database.


2
Utilizzare mysql_config_editor se su mysql 5.6 e versioni successive. Quindi almeno la password non sarà in testo semplice.
Kejau Touray,

1

Qualcun altro può probabilmente indicare alcuni plug-in o simili che mi correggono, ma il modo generale per farlo è archiviare la password crittografata , non la password di testo normale.

Tuttavia, posso dirti in questo momento, MySQL non ti consente di utilizzare una password crittografata; in caso contrario, DOVREBBE essere la password e l'hash consentirebbe comunque di accedere.

Ci sono molti "hack" in giro che ti permettono di usare utility di terze parti come Hiera e GPG . Ovviamente, puoi creare il tuo - ma anche le mailing list di Puppet suggeriscono questo metodo .


1

Non hai specificato da chi stai proteggendo questa password. Presumo che siano altri amministratori di sistema o eventualmente sviluppatori che hanno accesso al master delle marionette e / o alle caselle client ma non hanno bisogno di conoscere la password di root.

Per impostare inizialmente la password, è possibile utilizzare questa sintassi:

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

Il che ti permetterebbe di memorizzare una password crittografata nella tua configurazione fantoccio anziché una in testo normale.

Per l'utilizzo mysqladmine il mysqlclient dalla riga di comando, il meglio che mi viene in mente è aggiungere un.my.cnf file alla configurazione del burattino che viene distribuito nella home directory dell'utente appropriato. Il file sia nel masterizzatore delle marionette che nei client deve disporre di autorizzazioni file appropriate e restrittive.

Esistono molti modi per aggirare quei permessi dei file quando aggiungi un pupazzo nel mix (come scrivere un exec () che estrae il file dai client) ma sembrerebbe un miglioramento rispetto alla memorizzazione della password in un file leggibile dal mondo. Ciò sarebbe più difficile se si utilizza un sistema di versioning per la configurazione del burattino.


1
Ma se qualcuno recuperasse la password crittografata, non potrebbe semplicemente usare la stringa crittografata per accedere?
Andrew M.

@Redmumba Tutti i miei test sembrano indicarlo. Forse mi manca qualcosa che Ladadadada potrebbe elaborare.
Belmin Fernandez,

3
No. Quando usi IDENTIFIED BY PASSWORD '*HASH-HERE'invece di IDENTIFIED BY 'PASSWORD-HERE'MySQL inserisce l'hash direttamente nella usertabella. Devi quindi usare la password che ha generato quell'hash per accedere. Puoi vedere come sarebbe il tuo comando grant con l'hash della password accedendo normalmente e digitando SHOW GRANTS;. Puoi anche controllare altri utenti conSHOW GRANTS FOR user@host;
Ladadadada,

Ah, quindi non puoi usare l'hash stesso per accedere, vedo. Tuttavia, se ha un client che deve connettersi al database, ad esempio il suo front-end, avrebbe anche bisogno di un modo per archiviare la password crittografata, che è uno spunto di riflessione.
Andrew M.

0

Questo collegamento suggerisce due metodi: l'uso delle variabili di ambiente e l'uso della subshell.

Penso che puoi anche creare un semplice wrapper attorno al tuo comando mysqladmine passarci la password crittografata. Questo wrapper decodificherà quindi la password e la passerà a mysqladmin. È necessario proteggere il wrapper in quanto contiene la parte di decrittazione.

Puoi scegliere il modo in cui lo ritieni più sicuro in base al tuo ambiente e a chi ha accesso al tuo sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.