Apa alternatif yang aman untuk menggunakan kata sandi MySQL di baris perintah?

35

Kami memiliki skrip baris perintah PHP untuk versi database. Kami menjalankan skrip ini setiap kali pengembang menambahkan tambalan basis data baru.

Script menjalankan tambalan dengan baris perintah MySQL:

system('mysql --user=xxx --password=xxx < patch.sql');

Namun, MySQL 5.6 sekarang mengeluarkan peringatan berikut:

Peringatan: Menggunakan kata sandi pada antarmuka baris perintah dapat menjadi tidak aman

Yang jelas benar, tetapi mungkin atau mungkin tidak menjadi masalah bagi pengguna.

  • Apa alternatif yang aman ?
  • Atau, apakah mungkin untuk menonaktifkan peringatan ini?

Harap dicatat bahwa saya tidak mau harus bergantung pada file kata sandi eksternal.

Benjamin
sumber
2
Memiliki kredensial Anda dalam sebuah file bukan masalah besar. Jika seseorang memiliki hak akses root di server Anda, mereka dapat sepenuhnya mem-bypass sistem otentikasi, hanya dengan me-restart server mysql dengan opsi tertentu.
Zoredache
Ini bukan masalah yang sama seperti dalam duplikat suggedted . MySQL tidak meminta kata sandi, saya menyediakannya dan berfungsi dengan baik. Saya mencari alternatif untuk memberikan kata sandi, tidak termasuk file kata sandi.
Benjamin

Jawaban:

17

Dalam versi GA baru-baru ini dari MySQL, yaitu, versi 5.6 , Anda dapat melakukan ini melalui perintah mysql_config_editor, seperti dijelaskan dalam http://dev.mysql.com/doc/refman/5.6/id/mysql-config-editor.html

Pada dasarnya apa yang dilakukannya adalah: mengenkripsi pengguna / memberikan kredensial Anda dengan alias host, dan kemudian Anda menggunakan alias host, memasukkan informasi ini ke file konfigurasi di direktori home Anda, dan kemudian, ketika Anda membutuhkannya, daripada melakukan sesuatu seperti :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

Anda malah menulis:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

dengan demikian menghindari untuk memasukkan kata sandi Anda ke dalam beberapa skrip di cleartext.

Agar ini berfungsi, Anda harus terlebih dahulu (hanya sekali) mendefinisikan myhostaliassebagai:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

Anda dapat menggunakan jalur masuk berbeda untuk akun dan / atau host yang berbeda sesuai keinginan. Ide bagus jika Anda bertanya kepada saya.

Sebagai catatan, saya percaya, fungsi ini TIDAK ada dalam versi apa pun di bawah 5.6.

Tuncay Göncüoğlu
sumber
Catatan: Saya menyadari bahwa mysql_config_editor benar-benar membuat file kata sandi eksternal, namun, ini tidak dilakukan oleh Anda, ini bagaimana sistemnya bekerja, jadi tidak ada manual en / de / crypting yang harus dilakukan oleh Anda.
Tuncay Göncüoğlu
Terima kasih, saya menggunakan MySQL 5.6 jadi ini bukan masalah. Yang mengatakan, pendekatan Anda masih bermasalah (setidaknya dengan cara kami saat ini bekerja), karena saya ingin mengambil kata sandi dari file konfigurasi PHP secara real time, dan meneruskannya secara dinamis ke baris perintah. Dengan apa yang Anda sarankan, saya masih harus menggunakan kata sandi pada baris perintah saat menelepon mysql_config_editor, jadi sayangnya itu tidak membawa nilai lebih. Saya juga mencoba untuk menghindari pengembang melakukan secara manual, sehingga harus memelihara baik file konfigurasi PHP dan konfigurasi mysql.
Benjamin
Solusi terbaik saya mungkin mengabaikan peringatan untuk saat ini. Saya benar-benar bertanya-tanya apakah ada masalah keamanan sama sekali: karena itu dipanggil dari PHP, saya kira baris perintah tidak disimpan dalam bash history atau di mana pun pada mesin?
Benjamin
tidak sepengetahuan saya, tidak, sejarah bash tidak menyimpannya. Namun, kata sandi yang berada dalam teks biasa dalam file konfigurasi php membawa risiko yang sama persis, hanya dalam bentuk lain. mungkin Anda akan lebih suka menyimpan kata sandi menggunakan mysql_config_editor dan menyimpan jalur masuk di file konfigurasi php Anda? Dengan begitu Anda tidak akan membuka kata sandi Anda di mana pun. (tetapi masih harus mempertahankan kata sandi eksternal).
Tuncay Göncüoğlu
9

Gunakan opsi --defaults-fileatau --defaults-extra-file. Anda dapat menentukan ID pengguna dan kata sandi di dalamnya. Ini memiliki format yang sama dengan /etc/my.cnf.

Membaca lebih lanjut, Anda mengatakan bahwa Anda tidak ingin harus bergantung pada file kata sandi eksternal, tetapi itu adalah satu-satunya cara yang benar-benar aman. Apa pun yang lain akan meninggalkan jejak di tabel proses atau sesuatu. Anda bahkan dapat meletakkan file kata sandi di kontrol versi jika Anda benar-benar menginginkannya. Jadikan 600 (atau 400) dan hanya dapat dibaca oleh mysql atau pengguna yang menjalankannya.

lsd
sumber
1
Saya tidak menentang file kata sandi untuk alasan keamanan, hanya saja kredensial MySQL adalah bagian dari konfigurasi global dalam aplikasi PHP (digunakan untuk koneksi PDO juga), dan hal itu berarti membuat file kata sandi (sementara) hanya demi menjalankan baris perintah mysql untuk masa pakai skrip (beberapa detik).
Benjamin
Bagaimana cara melakukan ini pada Windows Server 2012? Di mana file config yang berisi opsi --defaults-file?
Jake
Anda cukup menentukan file sebagai opsi untuk --defaults-file seperti pada:mysql --defaults-file c:\some\dirs\my.cnf
lsd
@Benjamin, Jadi jika ini bukan tentang keamanan, maka cukup ketik kata sandi di baris perintah. Apa yang salah dengan melakukan itu (selain keamanan)?
Pacerier
@Benjamin jika Anda sudah menggunakan MySQL dari PHP, mengapa Anda memalsukan mysqlklien konsol?
Josip Rodin
5

Anda memiliki 4 opsi per http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html

  • Gunakan opsi -pyour_passatau --password=your_passpada baris perintah
  • Gunakan opsi -patau --passwordpada baris perintah tanpa nilai kata sandi yang ditentukan. Dalam hal ini, program klien mengumpulkan kata sandi secara interaktif:
  • Simpan kata sandi Anda dalam file opsi.
  • Simpan kata sandi Anda di MYSQL_PWDvariabel lingkungan

Untuk kebutuhan Anda, MYSQL_PWDmungkin merupakan opsi, tetapi tidak lebih aman. Benar-benar Anda harus menelurkan proses interaktif dengan --passworddan mengirimkan kata sandi secara interaktif, tapi itu solusi yang cukup kompleks untuk masalah ini.

RS
sumber
1
Bagaimana MYSQL_PWD menjadi kurang aman daripada baris perintah? PW tidak pernah muncul dalam daftar proses, yang tampaknya menjadi perhatian utama
TheLQ
1
Tentu saja. man psmemiliki -E Display the environment as well. Dari url saya terkait dengan: Metode menentukan sandi MySQL Anda harus dianggap sangat tidak aman dan tidak boleh digunakan. Beberapa versi ps menyertakan opsi untuk menampilkan lingkungan proses yang sedang berjalan. Pada beberapa sistem, jika Anda mengatur MYSQL_PWD, kata sandi Anda akan terpapar ke pengguna lain yang menjalankan ps. Bahkan pada sistem tanpa versi ps seperti itu, tidak bijaksana untuk berasumsi bahwa tidak ada metode lain di mana pengguna dapat memeriksa lingkungan proses.
RS
Mengambil dari opsi MYSQL_PWD ini: Saya kira bahwa jika Anda mengatur variabel lingkungan di awal beberapa skrip, maka aktifkan baris perintah MySQL, lalu jelaskan bahwa setelah itu di akhir skrip, Anda dapat mengurangi pada waktu paparan minimum . Apakah itu masuk akal?
superjos
@ kormoc, Tolong jelaskan pada paragraf terakhir. Apa solusi yang cukup rumit yang Anda bicarakan?
Pacerier
1
Tampaknya bahwa menggunakan variabel lingkungan adalah lebih aman dari baris perintah. Pada sistem debian default, Anda dapat melakukan psdan melihat argumen baris perintah untuk setiap proses setiap pengguna. Tetapi ps ehanya menampilkan lingkungan untuk proses Anda sendiri (kecuali Anda root tentu saja). Hanya sedikit lebih aman, tetapi masih lebih aman.
jlh
4

Jika skrip PHP Anda sudah memiliki koneksi database terbuka, mengapa Anda tidak menggunakan saja mysqli_multi_query()untuk mengimpor file .sql? Jika sintaks file .sql valid, tentu saja ...

Michael Hampton
sumber
Saya tidak yakin seberapa bagus itu akan bekerja dengan file .sql yang cukup besar?
Benjamin
1
@Benjamin Saya bayangkan tidak lebih buruk daripada yang akan dilakukan oleh klien MySQL - jika Anda benar-benar khawatir tentang keamanan meskipun ini akan menjadi cara yang paling tidak hack untuk menyelesaikannya, dan ukuran adalah masalah yang dapat Anda pecahkan dalam beberapa cara.
voretaq7
Apakah Anda tahu apakah itu mungkin dengan PDO?
Benjamin
PDO tampaknya tidak memiliki fungsi yang setara untuk melempar banyak pertanyaan ke database sekaligus. Maaf. Itu adalah sebuah ide ...
Michael Hampton