W Puppet, jak mam zabezpieczyć zmienną hasła (w tym przypadku hasło MySQL)?

13

Korzystam z Puppet, aby zapewnić MySQL sparametryzowaną klasę:

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

Jak mogę chronić $password? Obecnie usunąłem domyślne uprawnienia do odczytu świata z pliku definicji węzła i wyraźnie dałem puppetuprawnienia odczytu przez ACL.

Zakładam, że inni zetknęli się z podobną sytuacją, więc być może istnieje lepsza praktyka.

Belmin Fernandez
źródło

Odpowiedzi:

3

Pracując z Puppet i MySQL, zwykle umieszczam hasło roota w /root/.my.cnf, blokuję ten plik, a następnie ograniczam dostęp SSH do serwera bazy danych.

Tak, przechowywanie hasła roota na serwerze db w postaci zwykłego tekstu nie jest najbezpieczniejszym rozwiązaniem. Jeśli jednak zapiszesz hasło root mysql w tym pliku, zabezpieczenie konta root mysql w celu umożliwienia logowania tylko z localhost spowoduje, że hasło nie będzie znajdować się w marionetce, a także poza pstabelą listy procesów .

Dodatkowo, jeśli ktoś ma uprawnienia roota, aby odczytać plik w katalogu /root/.my.cnf, prawdopodobnie ma również dostęp do zatrzymania lokalnego demona MySQL i zrestartowania go bez tabeli użytkowników, aby uzyskać natychmiastowy dostęp roota do bazy danych.

robbyt
źródło
2
Użyj mysql_config_editor, jeśli korzystasz z mysql 5.6 i nowszych. Wtedy przynajmniej hasło nie będzie zwykłym tekstem.
Kejau Touray
1

Ktoś inny prawdopodobnie wskaże jakąś wtyczkę lub podobną, która mnie poprawia, ale ogólnym sposobem na zrobienie tego jest przechowywanie zaszyfrowanego hasła, a nie hasła w postaci zwykłego tekstu.

Jednak mogę wam teraz powiedzieć, że MySQL nie pozwala na użycie zaszyfrowanego hasła - w przeciwnym razie, TO MUSI być hasłem, a skrót pozwala na zalogowanie się mimo to.

Wokół jest wiele „hacków”, które pozwalają korzystać z narzędzi innych firm, takich jak Hiera i GPG . Oczywiście możesz rzucić własne - ale nawet własne listy mailingowe Puppet sugerują tę metodę .

Andrew M.
źródło
1

Nie określiłeś, przed kim chronisz to hasło. Zakładam, że inni sysadmini lub potencjalnie programiści mają dostęp do mastera kukiełkowego i / lub skrzynek klienta, ale nie muszą znać hasła roota.

Aby wstępnie ustawić hasło, możesz użyć tej składni:

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

Co pozwoliłoby Ci przechowywać zaszyfrowane hasło w konfiguracji lalek zamiast hasła w postaci zwykłego tekstu.

Aby użyć mysqladmini mysqlklienta w wierszu poleceń, najlepsze, co mogę wymyślić, to dodać .my.cnfplik do konfiguracji lalek, który zostanie wdrożony w katalogu osobistym odpowiedniego użytkownika. Plik zarówno w master marionetce, jak i na klientach powinien mieć odpowiednie, restrykcyjne uprawnienia do plików.

Istnieje wiele sposobów na obejście tych uprawnień do plików, gdy dodajesz marionetkę do miksu (np. Napisanie exec (), który ściąga plik z klientów), ale wydaje się, że byłoby to lepsze niż przechowywanie hasła w pliku czytelnym dla świata. Byłoby to trudniejsze, jeśli używasz systemu kontroli wersji dla konfiguracji lalek.

Ladadadada
źródło
1
Ale jeśli ktoś odzyska zaszyfrowane hasło, czy nie może po prostu użyć zaszyfrowanego ciągu do zalogowania się?
Andrew M.,
@Redmumba Wszystkie moje testy wydają się to wskazywać. Być może brakuje mi czegoś, co mógłby rozwinąć Ladadadada.
Belmin Fernandez
3
Nie. Gdy używasz IDENTIFIED BY PASSWORD '*HASH-HERE'zamiast IDENTIFIED BY 'PASSWORD-HERE'MySQL, wstawia skrót bezpośrednio do usertabeli. Następnie musisz użyć hasła, które wygenerowało ten skrót, aby się zalogować. Możesz zobaczyć, jak wyglądałoby Twoje polecenie grantu z skrótem hasła, logując się normalnie i wpisując SHOW GRANTS;. Możesz także sprawdzić innych użytkowników za pomocąSHOW GRANTS FOR user@host;
Ladadadada,
Ach, więc nie mogę użyć samego skrótu do logowania, rozumiem. Jeśli jednak ma klienta, który musi połączyć się z bazą danych - powiedzmy, z jego interfejsu - będzie również potrzebował sposobu przechowywania zaszyfrowanego hasła, które jest dobrym pomysłem.
Andrew M.,
0

Ten link sugeruje dwie metody: użycie zmiennych środowiskowych i użycie podpowłoki.

Myślę, że możesz również utworzyć proste opakowanie wokół polecenia mysqladmini przekazać do niego zaszyfrowane hasło. To opakowanie odszyfruje hasło i przekaże je do mysqladmin. Musisz chronić swoje opakowanie, ponieważ zawiera ono część deszyfrującą.

Możesz wybrać sposób, w jaki uważasz, że jest bardziej bezpieczny, w zależności od środowiska i tego, kto ma dostęp do twojego systemu.

Khaled
źródło