Menjalankan dump mysql di pekerjaan cron tanpa memaparkan kata sandi

11

saya ingin berlari

mysqldump -u aUser -p P4SSw0rd --all-databases > backup.sql

dalam pekerjaan cron. Bagaimana saya bisa melakukannya dengan aman?

Saya tahu saya bisa meletakkan perintah di sana, tetapi siapa pun yang memiliki akses ke mesin akan langsung melihatnya melalui crontab. Apakah ada cara yang lebih baik untuk melakukannya?

slycat
sumber
1
Contoh Anda salah, seharusnya -pP4SSw0rd tanpa spasi.
Simon Woodside

Jawaban:

14

Sebagaimana dinyatakan dalam man mysqldump: lihat 6.1.2.1. Panduan Pengguna Akhir untuk Keamanan Kata Sandi dalam manual referensi MySQL.

File opsi adalah taruhan teraman, paling tidak menurut referensi di atas. Memberikannya dalam plaintext di crontab tidak baik, paling tidak karena baris perintah proses secara default dapat dilihat oleh pspengguna lain. Hal yang sama sebenarnya berlaku untuk variabel lingkungan seperti yang dijelaskan dalam referensi.

Bagian yang relevan dari manual referensi MySQL:

Simpan kata sandi Anda dalam file opsi. Misalnya, di Unix, Anda dapat mencantumkan kata sandi di [client]bagian .my.cnffile di direktori home Anda:

[client]
password=your_pass

Untuk menjaga keamanan kata sandi, file tidak boleh diakses oleh siapa pun kecuali Anda sendiri. Untuk memastikan ini, atur mode akses file ke 400atau 600. Sebagai contoh:

shell> chmod 600 .my.cnf

Untuk memberi nama dari baris perintah file opsi tertentu yang berisi kata sandi, gunakan --defaults-file=file_nameopsi, di mana file_namenama path lengkap ke file. Sebagai contoh:

shell> mysql --defaults-file=/home/francis/mysql-opts

Bagian 4.2.3.3, “Menggunakan File Opsi” , membahas file opsi secara lebih rinci.

Lihat juga https://stackoverflow.com/q/10725209 .

Daniel Andersson
sumber
Tampaknya perintah ps mengaburkan kata sandi dengan satu x: ps: mysqldump -uroot -px xx mydb. Saya tidak mengatakan bahwa itu adalah perlindungan yang baik (jika Anda mengetik pekerjaan, maka kata sandi akan terungkap dalam teks biasa).
ling
4

Jalankan cronjob sebagai pengguna tertentu dan gunakan beberapa logika Bash sederhana untuk mengekstrak kata sandi dari file plaintext yang disimpan di suatu tempat di sistem dengan izin yang hanya memungkinkan pengguna (atau mungkin grup) untuk mengaksesnya.

PASS=`cat /path/to/pwdfile`

 mysqldump -u aUser -p $PASS--all-databases > backup.sql

Jadi jika cronjob berjalan sebagai 'contoh' pengguna, kepemilikan file harus "contoh: contoh" dan diizinkan 0400.

Anda juga dapat mencapai fungsi serupa menggunakan tingkat pengguna .my.cnf .

Garrett
sumber
1
read PASS < /path/to/pwdfileadalah pembersih yang lebih baik untuk melakukan hal yang sama (mungkin saya kira; superuser.com/q/323060/49184 berlaku).
Daniel Andersson
* "adalah AN WAY yang secara otomatis lebih bersih" ... Hilang dalam mengedit.
Daniel Andersson
Seseorang yang bahkan dengan pemahaman paling dasar tentang Bash harus dapat melihat apa yang terjadi dengan kucing itu. :)
Garrett
1
Benar, saya bahkan akan mengatakan itu adalah cara yang paling umum untuk melakukannya, tetapi masih sedikit merusak pemandangan :-). Jika seseorang membuat UUOC kebiasaan yang akan digigitnya ketika file lebih besar dari ARGMAX, dibutuhkan proses tambahan daripada menggunakan shell built-in, itu mungkin menggoda konstruksi seperti for i in `cat file`; do ...dengan array masalah sendiri, dll. Tapi tentu saja, seperti dengan banyak hal: jika seseorang tahu apa yang terjadi, ia bebas untuk melakukan apa yang ia pilih. Saya tidak berada di perang salib di sini, terlepas dari bagaimana hal itu muncul :-D.
Daniel Andersson
0

Siapa pun yang memiliki akses ke mesin memiliki tingkat akses yang /var/spool/cron/crontabs/sama dengan yang /var/lib/mysqlAnda izinkan. Jadi, atur izin yang tepat pada direktori dan selesai. Siapa pun yang memiliki akses root memiliki akses langsung ke file database secara langsung. Siapa pun yang Anda tidak percaya memiliki akses ke mesin tidak boleh memiliki akses sama sekali ke mesin.

Biasanya orang hanya melihat cronjobs mereka sendiri via crontab -l.

akira
sumber
0

Untuk tujuan pencadangan, pertimbangkan untuk memiliki pengguna hanya baca di mysql, seperti itu

CREATE USER bUser IDENTIFIED BY 'p4ss';

GRANT SELECT ON *.* TO bUser@localhost;
GRANT LOCK TABLES ON *.* TO bUser@localhost;

mysqldump hanya membutuhkan SELECTdan LOCK TABLEShak istimewa untuk melakukan tugasnya.

Saptarshi Biswas
sumber