Wie würde ich in Puppet eine Passwortvariable (in diesem Fall ein MySQL-Passwort) sichern?

13

Ich verwende Puppet, um MySQL mit einer parametrisierten Klasse auszustatten:

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

Wie kann ich schützen $password? Derzeit habe ich die standardmäßige weltweite puppetLeseberechtigung aus der Knotendefinitionsdatei entfernt und die Leseberechtigung explizit über ACL erteilt.

Ich gehe davon aus, dass andere auf eine ähnliche Situation gestoßen sind, also gibt es vielleicht eine bessere Praxis.

Belmin Fernandez
quelle

Antworten:

3

Wenn ich mit Puppet und MySQL arbeite, neige ich dazu, das root-Passwort in /root/.my.cnf einzufügen, diese Datei zu sperren und dann den SSH-Zugriff auf den Datenbankserver einzuschränken.

Ja, das Root-Passwort im Klartext auf dem Datenbankserver zu speichern, ist nicht die sicherste Lösung. Wenn Sie jedoch das mysql-root-Passwort in diese Datei schreiben, wird durch das Sichern des mysql-root-Kontos, um nur Anmeldungen von localhost zuzulassen, das Passwort von puppet und auch von der Prozesslistentabelle psferngehalten.

Wenn jemand Root-Zugriff zum Lesen der Datei unter /root/.my.cnf hat, kann er möglicherweise auch den lokalen MySQL-Dämon stoppen und den Dämon ohne die Benutzertabelle neu starten, um sofort Root-Zugriff auf die Datenbank zu erhalten.

Robbyt
quelle
2
Verwenden Sie mysql_config_editor, wenn Sie mit mysql 5.6 oder höher arbeiten. Dann ist zumindest das Passwort nicht im Klartext.
Kejau Touray
1

Jemand anders kann wahrscheinlich auf ein Plug-In oder ähnliches hinweisen, das mich korrigiert. Die allgemeine Vorgehensweise besteht jedoch darin, das verschlüsselte Kennwort und nicht das Nur-Text-Kennwort zu speichern .

Allerdings kann ich Ihnen jetzt sagen, dass MySQL die Verwendung eines verschlüsselten Passworts nicht zulässt - andernfalls wäre das das Passwort und der Hash würde es Ihnen ermöglichen, sich trotzdem anzumelden.

Es gibt viele "Hacks", mit denen Sie Dienstprogramme von Drittanbietern wie Hiera und GPG verwenden können . Natürlich können Sie auch Ihre eigenen Mailinglisten erstellen - aber selbst Puppets eigene Mailinglisten schlagen diese Methode vor .

Andrew M.
quelle
1

Sie haben nicht angegeben, vor wem Sie dieses Passwort schützen. Ich gehe davon aus, dass es andere Sysadmins oder möglicherweise Entwickler sind, die Zugriff auf den Puppet-Master und / oder die Client-Boxen haben, aber das Root-Passwort nicht kennen müssen.

Zum Festlegen des Kennworts können Sie zunächst die folgende Syntax verwenden:

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

Damit können Sie ein verschlüsseltes Passwort in Ihrer Puppet-Konfiguration anstelle eines Klartext-Passworts speichern.

Für die Verwendung mysqladminund den mysqlClient in der Befehlszeile ist das Beste, was ich mir vorstellen kann, eine .my.cnfDatei zu Ihrer Puppet-Konfiguration hinzuzufügen , die im Home-Verzeichnis eines entsprechenden Benutzers bereitgestellt wird. Die Datei sowohl im Puppenmaster als auch auf den Clients sollte über entsprechende, einschränkende Dateiberechtigungen verfügen.

Es gibt viele Möglichkeiten, diese Dateiberechtigungen zu umgehen, wenn Sie der Mischung eine Marionette hinzufügen (z. B. das Schreiben einer exec (), die die Datei von den Clients abruft). Dies scheint jedoch eine Verbesserung gegenüber dem Speichern des Kennworts in einer weltweit lesbaren Datei zu sein. Dies wäre schwieriger, wenn Sie ein Versionierungssystem für Ihre Puppet-Konfiguration verwenden.

Ladadadada
quelle
1
Aber wenn jemand das verschlüsselte Kennwort abgerufen hat, kann er sich dann nicht einfach mit der verschlüsselten Zeichenfolge anmelden?
Andrew M.
@ Redmumba Alle meine Tests scheinen dies anzuzeigen. Vielleicht fehlt mir etwas, worauf Ladadadada näher eingehen könnte.
Belmin Fernandez
3
Nein. Wenn Sie IDENTIFIED BY PASSWORD '*HASH-HERE'anstelle von IDENTIFIED BY 'PASSWORD-HERE'MySQL verwenden, wird der Hash direkt in die userTabelle eingefügt. Sie müssen dann das Kennwort verwenden, das diesen Hash generiert hat, um sich anzumelden. Sie können sehen, wie Ihr Grant-Befehl mit dem Kennwort-Hash aussehen würde, indem Sie sich normal anmelden und Folgendes eingeben SHOW GRANTS;. Sie können auch andere Benutzer mitSHOW GRANTS FOR user@host;
Ladadadada
Ah, Sie können sich also nicht mit dem Hash selbst anmelden, wie ich sehe. Wenn er jedoch einen Client hat, der eine Verbindung zur Datenbank herstellen muss - beispielsweise sein Front-End -, benötigt er auch eine Möglichkeit zum Speichern des verschlüsselten Kennworts, das Anlass zum Nachdenken ist.
Andrew M.
0

Dieser Link schlägt zwei Methoden vor: Verwendung von Umgebungsvariablen und Verwendung von Subshell.

Ich denke, Sie können auch einen einfachen Wrapper um Ihren Befehl erstellen mysqladminund Ihr verschlüsseltes Kennwort übergeben. Dieser Wrapper entschlüsselt dann das Passwort und übergibt es an mysqladmin. Sie müssen Ihren Wrapper schützen, da er den Entschlüsselungsteil enthält.

Sie können je nach Ihrer Umgebung und dem Zugriff auf Ihr System festlegen, wie Sie sich sicherer fühlen.

Khaled
quelle