Dalam Wayang, bagaimana saya mengamankan variabel kata sandi (dalam hal ini kata sandi MySQL)?

13

Saya menggunakan Wayang untuk menyediakan MySQL dengan kelas parameter:

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

Bagaimana saya bisa melindungi $password? Saat ini, saya menghapus izin dunia yang dapat dibaca dari file definisi simpul dan secara eksplisit memberikan puppetizin baca melalui ACL.

Saya berasumsi orang lain telah menemukan situasi yang sama jadi mungkin ada praktik yang lebih baik.

Belmin Fernandez
sumber

Jawaban:

3

Ketika bekerja dengan Wayang dan MySQL, saya cenderung untuk memasukkan kata sandi root di /root/.my.cnf, mengunci file ini, dan kemudian membatasi akses SSH ke server database.

Ya, menyimpan kata sandi root pada server db dalam teks yang jelas bukan solusi yang paling aman. Namun jika Anda menulis kata sandi root mysql dalam file ini, mengamankan akun root mysql untuk memungkinkan login dari localhost hanya akan membuat kata sandi keluar dari boneka, dan juga keluar dari pstabel daftar proses .

Selain itu, jika seseorang memiliki akses root untuk membaca file di /root/.my.cnf, maka mereka mungkin juga memiliki akses untuk menghentikan daemon MySQL lokal dan me-restart daemon tanpa tabel pengguna untuk mendapatkan akses root langsung ke database.

robbyt
sumber
2
Gunakan mysql_config_editor jika pada mysql 5.6 dan yang lebih baru. Maka setidaknya kata sandi tidak akan berada dalam teks biasa.
Kejau Touray
1

Orang lain mungkin dapat menunjukkan beberapa plug-in atau serupa yang mengoreksi saya, tetapi cara umum untuk melakukannya adalah dengan menyimpan kata sandi yang dienkripsi , bukan kata sandi teks biasa.

Namun, saya dapat memberitahu Anda sekarang, MySQL tidak mengizinkan Anda untuk menggunakan kata sandi terenkripsi - jika tidak, itu AKAN menjadi kata sandinya, dan hash akan memungkinkan Anda untuk login.

Ada banyak "peretasan" di sekitar yang memungkinkan Anda untuk menggunakan utilitas pihak ketiga seperti Hiera dan GPG . Jelas, Anda dapat menggulung sendiri - tetapi bahkan milis Wayang sendiri menyarankan metode ini .

Andrew M.
sumber
1

Anda tidak menentukan dari siapa Anda melindungi kata sandi ini. Saya akan menganggap itu sysadmin lain atau mungkin pengembang yang memiliki akses ke master boneka dan / atau kotak klien tetapi tidak perlu mengetahui kata sandi root.

Untuk mengatur kata sandi pada awalnya, Anda dapat menggunakan sintaks ini:

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

Yang akan memungkinkan Anda untuk menyimpan kata sandi terenkripsi dalam konfigurasi boneka Anda bukan yang plaintext.

Untuk menggunakan mysqladmindan mysqlklien pada baris perintah, yang terbaik yang bisa saya pikirkan adalah menambahkan .my.cnffile ke konfigurasi boneka Anda yang akan disebarkan ke direktori home pengguna yang sesuai. File di master boneka dan di klien harus memiliki izin file yang sesuai dan membatasi.

Ada banyak cara di sekitar izin file tersebut ketika Anda menambahkan boneka ke dalam campuran (seperti menulis exec () yang menarik file dari klien) tetapi tampaknya ada perbaikan dibandingkan menyimpan kata sandi dalam file yang dapat dibaca dunia. Ini akan lebih sulit jika Anda menggunakan sistem versi untuk konfigurasi boneka Anda.

Ladadadada
sumber
1
Tetapi jika seseorang mengambil kata sandi terenkripsi, tidak bisakah mereka menggunakan string terenkripsi untuk login?
Andrew M.
@Redmumba Semua pengujian saya tampaknya menunjukkan demikian. Mungkin aku melewatkan sesuatu yang bisa diuraikan oleh Ladadadada.
Belmin Fernandez
3
Tidak. Ketika Anda menggunakan IDENTIFIED BY PASSWORD '*HASH-HERE'bukannya IDENTIFIED BY 'PASSWORD-HERE'memasukkan MySQL hash langsung ke usertabel. Anda kemudian harus menggunakan kata sandi yang menghasilkan hash untuk masuk. Anda dapat melihat seperti apa bentuk perintah hibah dengan hash kata sandi dengan masuk secara normal dan mengetik SHOW GRANTS;. Anda juga dapat memeriksa pengguna lain denganSHOW GRANTS FOR user@host;
Ladadadada
Ah, jadi Anda tidak bisa menggunakan hash itu sendiri untuk masuk, saya mengerti. Namun, jika ia memiliki klien yang perlu terhubung ke database - katakanlah, ujung depannya - ia juga akan memerlukan cara untuk menyimpan kata sandi terenkripsi, yang merupakan bahan pertimbangan.
Andrew M.
0

Tautan ini menyarankan dua metode: menggunakan variabel lingkungan, dan menggunakan subkulit.

Saya pikir Anda juga dapat membuat pembungkus sederhana di sekitar perintah Anda mysqladmindan meneruskan kata sandi Anda yang terenkripsi. Pembungkus ini kemudian akan mendekripsi kata sandi dan meneruskannya ke mysqladmin. Anda perlu melindungi pembungkus Anda karena mengandung bagian dekripsi.

Anda dapat memilih cara yang Anda rasa lebih aman berdasarkan lingkungan Anda dan siapa yang memiliki akses ke sistem Anda.

Khaled
sumber