Menggunakan mysqldump dalam pekerjaan cron tanpa kata sandi root

14

Jika saya login dengan kata sandi root pada kotak saya, saya cukup mengetik

mysqldump --all-database dan saya akan mendapatkan "Dump" yang diharapkan.

Saya mengatur pekerjaan di cron.daily untuk menjalankan dan membuang ini ke drive cadangan. Masalah yang saya miliki adalah bahwa meskipun pengguna berjalan sebagai root, saya mendapatkan pesan berikut

mysqldump: Ada kesalahan: 1045: Akses ditolak untuk pengguna 'root' @ 'localhost' (menggunakan kata sandi: TIDAK)

ketika mencoba terhubung. Saya tidak ingin kode hard password root database mysql di skrip (siapa yang mau).

Menimbang bahwa saya bisa mengetik "mysqldump" di baris perintah di bash shell saya harus ada cara untuk berkeliling menggunakan parameter -u. Saya sudah memiliki #! / Bin / bash di bagian atas skrip.

Apa yang saya lewatkan di sini agar tidak meminta kata sandi root ke database?

Perangkat Lunak Mech
sumber

Jawaban:

12

Untuk dapat terhubung ke server mysql, Anda harus memberikan kredensial. Anda dapat menentukannya dalam file konfigurasi, meneruskannya melalui baris perintah, atau cukup membuat akun yang tidak memerlukan kredensial.

Tentu saja opsi tanpa kata sandi tidak boleh digunakan, baris perintah pass-by tidak bagus karena siapa pun yang dapat menjalankan ps mungkin dapat melihat baris perintah.

Opsi yang disarankan adalah membuat file konfigurasi mysql dengan kredensial di dalamnya dan kemudian melindungi file itu dengan izin sistem file sehingga hanya pengguna cadangan Anda yang dapat mengaksesnya.

Anda dapat masuk ke server mysql saat login secara interaktif karena tampaknya root menyarankan Anda untuk tidak memiliki kumpulan kata sandi root, atau bahwa Anda memiliki file konfigurasi yang tidak ditemukan oleh skrip Anda. Jika Anda memiliki .my.cnf, Anda mungkin perlu menunjuknya secara manual. Jika akun root Anda tidak memiliki set kata sandi maka saya sangat menyarankan Anda untuk memperbaikinya.

Pembaruan (2016-06-29) Jika Anda menjalankan mysql 5.6.6 atau lebih tinggi, Anda harus melihat alat mysql_config_editor yang memungkinkan Anda untuk menyimpan kredensial dalam file terenkripsi. Terima kasih kepada Giovanni karena menyebutkan ini padaku.

Sakit kepala
sumber
1
Metode itu masih memerlukan kata sandi yang tidak terenkripsi dalam teks biasa untuk berada di sistem. Itulah yang saya coba hindari.
Perangkat Lunak Mech
> Anda juga tidak memiliki set kata sandi root, atau bahwa Anda memiliki file konfigurasi yang tidak ditemukan oleh skrip Anda. Penulis dengan jelas menyatakan bahwa ada kata sandi mysql untuk root, dan bahwa ia mencoba mengakses database tanpa menyediakannya ke perintah mysqldump: "(menggunakan kata sandi: TIDAK)". Karenanya akses ditolak kesalahan.
monomyth
1
@monomyth, penulis juga menyatakan bahwa ia dapat masuk tanpa kata sandi saat login secara interaktif sebagai root. Ini memberitahu saya ada sesuatu yang tidak benar.
Zoredache
2
@Mech Software, Tidak banyak gunanya mencoba melindungi diri dari akun root. Jika seseorang memiliki akun root, mereka bisa memulai kembali mysql dan mem-bypass sistem izin sepenuhnya.
Zoredache
1
Alasan saya bisa masuk adalah akun root memiliki .my.cnf yang ditentukan dengan 600 izin, jadi dengan demikian shell dapat mengakses. Namun cron, harus mengabaikan file jadi saya menggunakan parameter dalam posting ini untuk menunjukkannya.
Perangkat Lunak Mech
3

Keamanan seharusnya tidak dilakukan melalui ketidakjelasan. Jika Anda takut seseorang memiliki akses ke akun root Anda, tidak masalah apakah kata sandi root mysql disimpan dalam skrip, karena Anda memiliki semua data yang tersedia di dump mysql, atau file database. Jadi, pertanyaan sebenarnya adalah apa yang Anda coba lindungi?

Jika Anda tidak ingin orang lain mendapatkan kata sandi yang akan memungkinkan mereka mengubah data dalam database Anda, Anda harus membuat pengguna dengan izin yang sesuai .

Jika Anda tidak ingin kata sandi mysql dilihat oleh akun lokal mana pun kecuali izin file root set pada skrip tersebut menjadi 0700 dan pemilik untuk melakukan root.

monomyth
sumber
1
Saya kira apa yang saya masih tidak mengerti adalah bahwa Jika saya bisa mengetik (dari prompt root) mysqldump tanpa input kata sandi, mengapa saya tidak dapat menjalankannya melalui pekerjaan cron dengan cara yang sama. Potongan apa yang hilang yang memerlukan parameter -p. Saya tidak mencoba untuk "mengaburkan" kata sandi, saya lebih suka tidak pernah memasukkannya. Sesuatu yang khusus untuk login root itu sendiri memungkinkan akses, jadi mengapa ini tidak dapat direplikasi dengan cron?
Perangkat Lunak Mech
Jika Anda melihat bahwa Anda dapat masuk tanpa kata sandi dan dengan kata sandi menggunakan pengguna "root" yang sama, ada kemungkinan bahwa ada beberapa pengguna root di database mysql Anda. Beberapa dari mereka mungkin tidak memiliki set kata sandi. Anda dapat menghapus kata sandi dari 'root' @ 'localhost' tetapi tidak hanya cron yang dapat terhubung ke database Anda, tetapi siapa pun yang memiliki akun lokal. Ini tidak berbeda (atau lebih buruk) daripada memiliki kata sandi dalam skrip teks yang jelas.
monomyth
Saya pikir intinya adalah bahwa MechSoftware membuat adalah bahwa menjadi root pada dasarnya memberi Anda akses baca ke file database, dan mereka tidak dienkripsi. Oleh karena itu, memerlukan kata sandi root MySQL dari pengguna root hanya untuk cukup mencetak data yang pada dasarnya sudah dapat diakses adalah "keamanan melalui ketidakjelasan". Selain itu, izin sangat mudah dikacaukan, misalnya jika seseorang mengaturnya secara rekursif untuk direktori, jika ada tautan simbolis ke file dll.
Septagram
2

Penggunaan shell Anda dapat melakukannya karena Anda memiliki shell untuk menjalankannya, yaitu ketika Anda masuk, semua skrip shell Anda di profil Anda dijalankan.

Cron tidak memiliki kemewahan seperti itu. Ketika logon (sebagai root) akan masuk dengan shell default. Ini mencegah siapa pun untuk masuk dari jarak jauh, tetapi itu juga berarti tidak ada skrip login otomatis yang dijalankan.

Anda dapat mengatur agar cron dijalankan di bawah, edit crontab dan tambahkan variabel SHELL dan HOME, mis.

SHELL=/bin/bash
HOME=/root

jika ini tidak disetel, maka cron akan berjalan dengan direktori shell dan home yang ditentukan di / etc / passwd (yang mungkin bukan apa-apa, mungkin / bin / sh).

Jika Anda ingin melihat lingkungan cron berjalan, tambahkan pekerjaan cron yang mengekspor env ke file, misalnya:

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq
gbjbaanb
sumber
1

Jika skrip dijalankan oleh root, Anda dapat membuat file /root/.my.cnf dengan izin 600 dan konten berikut:

[client]
user = DBUSERNAME
password = DBPASSWORD

(tempat Anda memasukkan nama pengguna dan kata sandi MySQL Anda tentu saja).

File ini akan secara otomatis dibaca oleh piranti baris perintah mysql, jika dijalankan sebagai root. Tidak perlu lagi menyediakannya di command-linea. 600 izin melindunginya dari pengintaian.

Martijn Heemels
sumber
1
Saya menemukan ini adalah kasus BAGAIMANA saya bisa mendapatkan mysqldump tanpa kata sandi. Jadi ini memecahkan misteri bagaimana SHELL melakukannya, jadi mengapa cron tidak membacanya?
Perangkat Lunak Mech
1
mysqldump saat dijalankan dari cron mungkin tidak dapat menemukan file .my.cnf. Obatnya adalah dengan menambahkan parameter mysqldump untuk secara eksplisit membaca opsi dalam file.my.cnf, yaitu --defaults-extra-file = / root / .my.cnf Saya mempelajari ini dari dua jawaban lain pada Stack Overflow. Lihat stackoverflow.com/a/602054/854680 dan stackoverflow.com/a/890554/854680
MikeOnline
1

Cron bisa sangat menyebalkan untuk debug. Ketika pekerjaan cron dijalankan, mereka tidak memiliki lingkungan yang ditetapkan seperti yang Anda terima dengan sebuah shell.

Kiat untuk cron:

  • gunakan path lengkap untuk semuanya - "ECHO = / bin / echo", dll: (tentukan variabel di bagian atas untuk membuatnya lebih mudah)
  • atur MAILTO, sehingga Anda mendapatkan email dari setiap pekerjaan (atau minta pekerjaan mengalihkan stderr / stdout ke file)

Jika pengguna root Anda dapat melakukannya dari shell, cron harus dapat melakukannya. Pastikan Anda secara spesifik menentukan file konfigurasi untuk digunakan pada baris perintah.


sumber
0

Meskipun beberapa respons ini sangat membantu, beberapa membingungkan karena pengguna root unix dan pengguna root mysql tidak sama dan pada dasarnya tidak memiliki hubungan selain mereka berdua menggunakan nama login 'root'. Mungkin itu sudah jelas tetapi tampaknya beberapa tanggapan membingungkan keduanya.

Apa yang mungkin merupakan opsi yang berguna (mungkin ada?) Untuk mysqld akan memungkinkan program klien seperti mysql atau mysqldump dll berjalan sebagai root unix untuk mengakses root mysqld @ localhost tanpa kata sandi tanpa harus menyimpan kata sandi root @ localhost (mysql) dalam file my.cnf atau yang serupa.

Saya tahu itu membuat sedikit gugup tetapi alasannya adalah siapa pun yang berjalan sebagai lokal (ke server mysqld) root unix dapat memotong keamanan mysqld, cukup mudah. Dan memiliki my.cnf dengan password root mysqld 7x24 atau bahkan membuat / menghapus my.cnf dengan password root mysql (dari mana kata sandi itu berasal?) Dengan cepat (misalnya, untuk melakukan mysqldump) membuat saya gugup.

Dibutuhkan beberapa infrastruktur dan pemikiran karena kita harus mempercayai mysql / mysqldump / etc untuk mentransmisikan ke mysqld yang benar-benar percaya itu dijalankan oleh akun root unix lokal.

Tetapi misalnya membatasi hanya unix socket mysqld, tidak ada TCP, bisa membantu, setidaknya sebagai opsi yang sangat direkomendasikan untuk opsi ini. Itu bisa menetapkan bahwa klien berjalan secara lokal yang mungkin tidak cukup. Tapi itu bisa menjadi awal dari sebuah ide. Mungkin mengirim deskriptor file melalui soket unix bisa menjadi bagian lain (google jika kedengarannya seperti pembicaraan gila.)

PS Tidak. Saya tidak akan mencoba untuk bertukar pikiran di sini bagaimana semua itu dapat bekerja pada sistem operasi non-unix yang mungkin diterjemahkan ke OS lain.

Barry Shein
sumber
1
Menempatkan kredensial /root/.my.cnfdengan izin yang tepat akan menyelesaikan masalah dengan baik.
Michael Hampton
Saya tidak setuju, sekarang siapa pun yang bisa mendapatkan akses ke file itu, termasuk melalui beberapa cacat sistem lain, memiliki pw root mysql. Dan itu ada 24x7 untuk diserang, dan di lokasi file tetap (harus diakui itu tidak harus di / root.) Tapi misalnya siapa pun yang menjalankan dump sistem file, atau bisa mendapatkan akses ke satu, dapat menariknya keluar dari file dump sistem file. Dalam hal ini kedengarannya seperti godaan untuk karyawan yang tidak puas. Saya pikir ini adalah tujuan yang masuk akal bahwa tidak ada kata sandi teks-jelas pada sistem, di mana saja.
Barry Shein
Mungkin begitu, tapi proposal yang Anda buat adalah jauh lebih buruk, karena memungkinkan setiap pengguna lokal untuk sepele berpura-pura menjadi root.
Michael Hampton
Tidak, proposal saya adalah mereka sudah harus unix root di server lokal di mana mysqld lokal mempercayai mysql atau mysqldump dll (klien) dijalankan sebagai root unix dan memungkinkan mereka untuk melanjutkan seolah-olah mereka akan diotentikasi sebagai root mysql . Seperti yang saya katakan jika mereka sudah meng-unix root local ke server, mereka dapat mem-by-pass password root mysql dengan beberapa perintah yang terdokumentasi dengan baik ("mysql root password recovery").
Barry Shein