Apa itu pengguna MySQL debian-sys-Maint (dan banyak lagi)?

71

Saya telah digigit beberapa kali oleh pengguna 'debian-sys-Maint' yang diinstal secara default pada paket server mysql diinstal dari repositori Ubuntu.

Secara umum yang terjadi adalah saya menarik salinan baru dari basis data produksi kami (yang tidak berjalan di Debian / Ubuntu) untuk pemecahan masalah atau pengembangan baru dan lupa untuk mengecualikan tabel mysql.user sehingga kehilangan pengguna debian-sys-Maint.

Jika kami menambahkan pengguna mysql baru untuk alasan apa pun, saya harus 'menggabungkan' ini ke dalam lingkungan pengembangan saya sebagai lawan dari hanya overlay tabel.

Tanpa pengguna, sistem saya tampaknya masih berfungsi, tetapi terganggu dengan kesalahan seperti:

sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • Untuk apa debian-sys-maint digunakan?
    • Apakah ada cara yang lebih baik bagi pengelola paket untuk melakukan apa yang mereka coba lakukan?
  • Apa cara termudah untuk memulihkannya setelah saya kehilangannya?
  • Apa set privilege yang benar / minimal untuk pengguna ini?
    • Sepertinya ide yang buruk untuk 'memberikan semua hak istimewa pada *. * ...'

Sunting

Pertanyaan tambahan - Apakah kata sandi di /etc/mysql/debian.cnf sudah di-hash atau apakah ini kata sandi plaintext? Itu penting ketika Anda pergi untuk membuat ulang pengguna dan saya sepertinya tidak pernah melakukannya dengan benar pada percobaan pertama.

Terima kasih

Joe Holloway
sumber
8
Kata sandi adalah plaintext di /etc/mysql/debian.cnf
Brent

Jawaban:

57

Untuk apa debian-sys-maint digunakan?

Satu hal utama yang digunakan untuk memberitahu server untuk menggulung log. Setidaknya perlu hak istimewa untuk memuat ulang dan mematikan.

Lihat file /etc/logrotate.d/mysql-server

Ini digunakan oleh /etc/init.d/mysqlskrip untuk mendapatkan status server. Ini digunakan untuk mematikan / memuat kembali server dengan anggun.

Berikut adalah kutipan dari README.Debian

* MYSQL WON'T START OR STOP?:
=============================
You may never ever delete the special mysql user "debian-sys-maint". This user
together with the credentials in /etc/mysql/debian.cnf are used by the init
scripts to stop the server as they would require knowledge of the mysql root
users password else.

Apa cara termudah untuk memulihkannya setelah saya kehilangannya?

Rencana terbaik adalah tidak kehilangannya. Jika Anda benar-benar kehilangan kata sandi, setel ulang, menggunakan akun lain. Jika Anda telah kehilangan semua hak admin di server mysql ikuti panduan untuk mengatur ulang kata sandi root, kemudian perbaiki debian-sys-maint.

Anda bisa menggunakan perintah seperti ini untuk membuat file SQL yang bisa Anda gunakan nanti untuk membuat ulang akun.

mysqldump --complete-insert --extended-insert=0 -u root -p mysql | grep 'debian-sys-maint' > debian_user.sql

Apakah kata sandi di /etc/mysql/debian.cnf sudah di-hash

Kata sandi tidak diacak / dienkripsi saat diinstal, tetapi versi baru mysql sekarang memiliki cara untuk mengenkripsi kredensial (lihat: https://serverfault.com/a/750363 ).

Sakit kepala
sumber
1
"Rencana terbaik adalah tidak kehilangan itu." Serius? Itu nol bantuan untuk orang-orang yang sudah kehilangan itu seperti yang saya lakukan selama upgrade. Bagi mereka yang perlu membuat ulang pengguna, gunakan salah satu opsi "GRANT ALL" di jawaban lain, karena pengguna ini TIDAK hanya digunakan untuk operasi logrotate - itu adalah bagian penting dari proses pemutakhiran.
FKEinternet
Jika Anda kehilangan kredensial, Anda selalu memiliki opsi, hanya memulai daemon mysql / mariadb dengan opsi yang melewatkan sistem izin, atau masuk sebagai pengguna lain dengan root hak istimewa mysql root dan mengatur ulang kata sandi. Menyetel ulang kata sandi, dan melewati sistem privilege didokumentasikan dengan baik di lokasi lain di Google dan pertanyaan lain di situs ini.
Zoredache
22

Pengguna debian-sys-maint secara default setara dengan root . Ini digunakan oleh skrip pemeliharaan tertentu pada sistem Debian, dan sebagai efek samping, memungkinkan pengguna dengan akses root pada kotak untuk melihat kata sandi plaintext di /etc/mysql/debian.cnf (baik atau buruk?)

Anda dapat membuat ulang pengguna dengan:

GRANT ALL PRIVILEGES on *.* TO `debian-sys-maint`@`localhost` IDENTIFIED BY 'your password' WITH GRANT OPTION;

Hanya pastikan password sesuai yang di /etc/mysql/debian.cnf

Brent
sumber
9
Re (baik atau buruk) - Jika seseorang berhasil menjadi root, mereka dapat mem-bypass sistem privilege sepenuhnya dengan hanya me-restart server dengan opsi yang benar. Jika Anda seorang penyerang mendapatkan root, Anda mungkin memiliki masalah lebih besar daripada file konfigurasi itu.
Zoredache
2
juga ulang: baik atau buruk - Saya harus mengandalkan akses debian-sys-Maint untuk mengatur ulang kata sandi akun root MySQL ketika sudah lupa. Itu bagus memiliki opsi mundur ini.
Brent
1
@Brent: Lihat dev.mysql.com/doc/refman/5.0/id/resetting-permissions.html untuk cara mengatur ulang kata sandi root mysql. Saya telah menonaktifkan pengguna ini di banyak pemasangan mysql di Debian karena dapat menyebabkan kekacauan saat startup dengan memeriksa tabel jika mereka adalah tabel besar.
Nathan
1
Nathan, terima kasih atas tautannya. Itu info baru untuk saya. Jika Anda memiliki prosedur untuk menonaktifkan akun debian-sys-Maint sama sekali, mengapa Anda tidak memasukkannya di sini sebagai jawaban terpisah. Itu akan luar biasa!
Brent
3
hibah yang lebih baik akan hanya untuk memberikan hak shutdown / startup.
jmtd
19

Anda juga bisa:

sudo dpkg-reconfigure mysql-server-5.0

Yang akan memberi Anda opsi untuk membuat ulang pengguna debian-sys-Maint. Pengguna dan basis data yang ada aman.


sumber
Ini bekerja pada mysql-server-5.5 juga.
serverSentinel
Ini hanya akan berfungsi jika instalasi mysql-server Anda tidak rusak - seperti yang bisa terjadi jika pengguna debian-sys-maint hilang.
FKEinternet
19

Saya hanya ingin berkomentar, tapi saya pikir sintaks yang benar layak untuk entri itu sendiri. Ini akan membuat pengguna debian-sys-Maint :

mysql> GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'plaintextpassword' WITH GRANT OPTION; FLUSH PRIVILEGES;

Jika Anda masih memiliki file /etc/mysql/debian.cnf, cukup gunakan kata sandi di sana.

Jangan ragu untuk menghasilkan solusi aman yang lebih paranoid .

d -_- b
sumber
1
Itu sama paranoidnya dengan yang seharusnya. Maka hanya satu yang harus bisa membaca file /etc/mysql/debian.cnffile adalah rootpengguna Linux . Dan ketika seseorang dapat membaca file itu, mereka sudah memiliki rootakses ke mesin dan dapat menghentikan server MySQL dan menambahkan admin sistem mereka sendiri. Dan skrip yang memulai MySQL dan paket lainnya tidak dapat melakukan pemeliharaan keamanan dan pemeliharaan lainnya. Jadi ya, itu seaman yang seharusnya. Dan berguna jika Anda kehilangan kata sandi admin MySQL untuk memulihkannya, tanpa perlu me-restart dalam mode tidak aman. ;-)
Anders
Untuk itulah sunting.
RobinJ
6

Jika Anda perlu menambahkan debian-sys-maintpengguna hanya untuk logrotate.dtujuan, Anda tidak boleh memberikan ALL PRIVILEGESatau GRANT OPTION- ini adalah lubang keamanan raksasa yang tidak perlu. Sebagai gantinya, Anda bisa menambahkan pengguna dengan RELOADhak istimewa seperti ini (dengan anggapan Anda sedang mengakses db root, dan Anda mengganti xxxxxx dengan kata sandi Anda)

# add the user with the reload right
GRANT RELOAD on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxx'; 

# reload the rights
FLUSH PRIVILEGES;

# double check
select * from mysql.user;

Pembaruan 2019

Jawaban ini mungkin kedaluwarsa - silakan lihat komentar dengan pendapat kuat di bawah ini.

Mark Chackerian
sumber
Ini adalah satu-satunya jawaban aman karena hanya memberikan izin yang diperlukan untuk debian-sys-maint. Juga, saya dapat mengkonfirmasi bahwa itu berfungsi seperti pesona. Tepuk tangan!
Jealie
2
Apakah ini benar-benar lubang keamanan? Jika seseorang dapat membaca /etc/mysql/debian.cnf, maka mereka mungkin memiliki akses root, dan dapat memulai kembali mysql dengan --skip-grant-tables.
mc0e
Terima kasih. Tetapi tidak perlu menyiram hal-hal dua kali, MySQL sudah tahu apa yang dilakukan perintah GRANT. Lihat dev.mysql.com/doc/refman/5.6/id/privilege-changes.html
ygoe
1
Dan ini tidak akan berfungsi, karena debian-sys-maintpengguna juga digunakan untuk mematikan server. Dan juga untuk memeriksa pengguna root saat memulai server mysql. Jadi, Anda setidaknya perlu memberikan hak pilih pada mysql. * Dan hak mematikan.
Anders
1
TIDAK TIDAK TIDAK, JANGAN mengikuti saran jawaban ini - Anda perlu memberikan semua hak istimewa kepada debian-sys-Main untuk alasan yang diuraikan dalam jawaban lain berjudul "debian-sys-Main-izin yang diperlukan". Singkatnya, Anda mungkin baik-baik saja sehari-hari tetapi mengalami masalah parah ketika Anda menerapkan pembaruan keamanan, menambal, atau memutakhirkan sistem Anda.
Kurt Fitzner
3

Dari pada

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD('your password') WITH GRANT OPTION; FLUSH PRIVILEGES;

kupikir

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'your password' WITH GRANT OPTION; FLUSH PRIVILEGES;

karena kata sandi tidak di-hash ...?

Fortega
sumber
3

izin yang diperlukan debian-sys-Maint

Jawaban lain telah menangani semuanya dengan cukup kecuali set izin minimum yang diperlukan untuk pengguna debian-sys-Maint. Banyak jawaban di sini benar-benar salah dalam hal itu, dan sebenarnya berbahaya. Jangan mengurangi hak istimewa debian-sys-Maint (termasuk opsi hibah) tanpa membaca dan memahami di bawah ini:

Pemelihara Debian tidak memberikan semua hak istimewa kepada pengguna dengan berubah-ubah. Inilah yang dibutuhkan, di mana dan mengapa. Beberapa hak istimewa ini adalah superset dari yang lain, tetapi saya akan mencantumkannya secara independen jika Anda ingin menyesuaikan hal-hal dan menghapus persyaratan untuknya:

  • shutdown dan reload , diperlukan cukup mengejutkan, untuk mematikan atau melakukan database, dilakukan oleh /etc/init.d/mysql
  • pilih pada mysql.user , diperlukan untuk pemeriksaan kewarasan yang dilakukan ketika database dimulai, memastikan bahwa ada pengguna root. Selesai setiap startup dengan / etc / mysql / debian-start (dipanggil oleh /etc/init.d/mysql) dengan kode aktual dalam fungsi check_root_accounts dalam file /usr/share/mysql/debian-start.inc.sh
  • pilih pada information_schema.tables , pilih global , diperlukan untuk memeriksa tabel yang macet. Selesai setiap startup dengan / etc / mysql / debian-start (dipanggil oleh /etc/init.d/mysql) dengan kode aktual dalam fungsi check_for_crashed_tables dalam file /usr/share/mysql/debian-start.inc.sh
  • global semua hak istimewa , diperlukan untuk meningkatkan tabel jika / ketika versi baru MySQL diinstal melalui pembaruan atau peningkatan Debian. Selesai setiap startup dengan / etc / mysql / debian-start (dipanggil oleh /etc/init.d/mysql) dengan kode aktual dalam fungsi upgrade_system_tables_if_n diperlukan dalam file /usr/share/mysql/debian-start.inc.sh - sebenarnya memanggil mysql_upgrade biner MySQL - jangan tertipu oleh nama fungsi (upgrade_system_tables_if_n diperlukan), ini berpotensi menyentuh semua tabel - lihat di bawah

Yang terakhir adalah, tentu saja, persyaratan utama untuk hak istimewa. Halaman manual untuk mysql_upgrade menyatakan bahwa:

mysql_upgrade memeriksa semua tabel di semua database untuk ketidakcocokan dengan versi MySQL Server saat ini. mysql_upgrade juga memutakhirkan tabel sistem sehingga Anda dapat memanfaatkan hak atau kemampuan baru yang mungkin telah ditambahkan.

Jika mysql_upgrade menemukan bahwa sebuah tabel memiliki kemungkinan ketidakcocokan, ia melakukan pemeriksaan tabel dan, jika masalah ditemukan, upaya perbaikan tabel.

PERINGATAN Jika Anda memutuskan untuk mengurangi hak istimewa yang dimiliki debian-sys-Maint, maka pastikan Anda siap untuk menangani secara manual setiap pembaruan keamanan debian di masa depan dan / atau peningkatan yang menyentuh MySQL. Jika Anda melakukan pembaruan pada paket-paket MySQL dengan hak istimewa debian-sys-Main yang berkurang, dan jika mysql_upgrade tidak dapat diselesaikan sebagai hasilnya, itu mungkin membuat database Anda dalam keadaan (baca rusak) yang tidak ditentukan. Mengurangi hak istimewa mungkin tidak memiliki masalah sehari-hari yang jelas sampai pembaruan datang, jadi jangan ikuti kenyataan bahwa Anda telah mengurangi hak istimewa tanpa efek berbahaya sebagai dasar untuk berpikir itu aman.

Kurt Fitzner
sumber
Terima kasih atas jawaban terperincinya. Sulit dipercaya pertanyaan ini sudah berumur hampir 10 tahun!
Joe Holloway
Ini harus menjadi salah satu hal pertama yang dibaca orang.
FKEinternet
2

Sebagai catatan untuk ini, lihat posting mysqlperformanceblog ini untuk alasan mengapa Anda mungkin ingin menonaktifkan hal-hal khusus debian.

Jon Topper
sumber
1
"Perhatikan bahwa ini seharusnya tidak menjadi masalah dengan MySQL dari Debian lenny, karena dikirimkan dengan skrip init yang tidak akan menjalankan CHECK TABLE pada tabel non-MYISAM." - dari halaman tertaut
d -_- b
2

Saat menggunakan MySQL 5.6+, saya akan merekomendasikan menggunakan mysql_config_editorperintah untuk membuat entri untuk pengguna 'debian-sys-maint'@'localhost'menggunakan kata sandi yang relevan, artinya kata sandi tidak perlu disimpan dalam teks biasa di server.

mysql_config_editor set --login-path=debian-sys-maint --host=localhost --user=debian-sys-maint --password

Setelah ini, file konfigurasi khusus debian /etc/mysql/debian.cnfdapat diubah sehingga rincian nama pengguna dan kata sandi tidak disimpan dalam file.

Akhirnya, ubah file logrotate untuk MySQL sehingga menggunakan detail login yang disimpan dalam ~/.mylogin.cnffile alih-alih file spesifik debian dengan mengganti

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf

dengan

/usr/bin/mysqladmin --login-path=debian-sys-maint

Semoga ini membantu :)

Dave

Dave Rix
sumber
Tetapi, akankah tujuan debian-sys-maint pengguna tercapai dengan ini? Paket-paket itu harus dapat menggunakan pengguna / kata sandi ini untuk melakukan beberapa pemeliharaan sistem sebagai rootpengguna di domain Linux (bukan rootpengguna di MySQL tanpa administrator yang diperlukan untuk memasukkan rootkata sandi untuk MySQL?
Anders
Ini tidak berfungsi untuk saya dalam pengujian saya, jika Anda melakukan semua perubahan, seperti mengubah /etc/mysql/debian.cnfuntuk menghapus kata sandi dan mengubah file logrotate untuk referensi menggunakan rincian aman. Saya tidak yakin apakah pengguna debian-sys-Maint digunakan untuk hal lain, tetapi jika ya, ini akan membantu memberi Anda indikasi di mana Debian menggunakan akun pengguna ini atas nama Anda.
Dave Rix