Saya baru saja menginstal Ubuntu 16.04 LTS beserta paketnya php
, mariadb
dan nginx
. Saya berlari mysql_secure_installation
dan mengubah kata sandi root.
Sekarang ketika saya mencoba login untuk mysql
menggunakan akun root saat login di Ubuntu sebagai akun pengguna normal saya mendapat akses ditolak.
Ketika saya login menggunakan sudo mysql
, mysql bahkan tidak meminta saya kata sandi. Jika saya menjalankan, mysql_secure_installtion
saya melihat bahwa pengaturan lama tidak pernah diset secara permanen.
Apa yang saya lakukan salah?
sumber
%
berarti Anda dapat terhubung dari mana saja ... dari jarak jauh?grant all privileges on *.* to 'root'@'localhost' with grant option;
Diambil dari Ubah Kata Sandi Pengguna di MySQL 5.7 Dengan "plugin: auth_socket"
Jadi untuk mengubah
plugin
kembali kemysql_native_password
:Login dengan sudo:
Ubah
plugin
dan atur kata sandi dengan satu perintah:Tentu saja Anda juga dapat menggunakan perintah di atas untuk mengatur kata sandi kosong.
Sebagai catatan, (dan
MariaDB < 10.2
pengguna) juga ada cara lain untuk hanya mengubahplugin
tanpa memberikan kata sandi (membiarkannya kosong):sumber
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;
Sumber: stackoverflow.com/a/41537019/1004587Singkatnya, di MariaDB
tempat Anda mengganti NEWPASSWORD dengan kata sandi yang Anda inginkan, dan yang lainnya kata demi kata.
Masalahnya di sini adalah ketika MariaDB atau MySQL diinstal / diperbarui (terutama jika pada beberapa titik root diatur tanpa kata sandi) maka dalam tabel Users kata sandi itu benar-benar kosong (atau diabaikan), dan masuk tergantung pada sistem pengguna yang sesuai ke pengguna MySQL. Anda dapat menguji ini sebagai berikut dengan beralih ke root sistem, lalu ketik:
Kemudian masukkan tanpa kata sandi atau kata sandi yang salah . Anda mungkin akan diijinkan masuk (Anda bahkan dapat masuk dari root unix hanya
# mysql
karena kata sandi tidak relevan dan pengguna didefinisikan).Jadi, apa yang terjadi? Nah, jika Anda login sebagai root dan lakukan hal berikut:
Anda akan perhatikan
auth_socket
(yang dapat dibacaunix_socket
di MariaDB). Soket ini mengabaikan kata sandi dan memungkinkan pengguna Unix yang sesuai masuk tanpa pemeriksaan kata sandi. Inilah sebabnya mengapa Anda bisa masuk dengan root tetapi tidak dengan pengguna yang berbeda.Jadi solusinya adalah memperbarui Pengguna untuk tidak menggunakan
auth_socket/unix_socket
dan mengatur kata sandi dengan benar.Pada MariaDB (<10.2, lihat komentar di bawah) yang ada di Ubuntu versi 16 pada 2017 ini sudah cukup. NEWPASSWORD adalah kata sandi Anda.
mysql_native_password
Anda mengetik kata demi kata.(Mungkin saja pengaturan plugin untuk dikosongkan akan berfungsi. YMMV. Saya tidak mencoba ini. Jadi ini adalah alternatif.)
Jika tidak:
Kemudian
Sebagai catatan, solusi yang melibatkan menghapus pengguna dan membuatnya kembali dengan '%' membuat saya benar-benar terkunci dari database, dan dapat menyebabkan masalah lain kecuali Anda mendapatkan
grant
pernyataan yang tepat - lebih mudah untuk hanya memperbarui root yang sudah Anda miliki.Dalam pengalaman saya, masalah hanya terjadi pada pengguna root, karena pengguna lain akan ditambahkan secara manual bukan bagian dari instalasi / pembaruan awal.
sumber
mysql_secure_installation
tidak memiliki efek yang sama. Di mana ia menyimpan kata sandi baru?UPDATE
s yang berlaku untuk MariaDB <10.2 danALTER
untuk versi lain? Dan apakah yang keduaUPDATE
merupakan alternatif dari yang pertama, atau apakah kita perlu mengetik keduanya? Akhirnya, apakah 'mysql_native_password' adalah sesuatu untuk mengetik kata demi kata, atau haruskah kita menggantinya dengan kata sandi root yang kami maksud untuk MySQL?mysql_native_password
adalah pilihan yang.Jika Anda telah menginstal MySQL / MariaDB dari repositori dasar, pengguna tidak dapat masuk ke MySQL sebagai pengguna root MySQL dari login Unix mereka (tidak berlaku jika mereka memiliki akses sudo )
Login ke shell root MySQL:
Jalankan pertanyaan di bawah ini:
Buka shell baru, lalu:
Sumber
sumber
mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Cobalah untuk membuat akun mysql baru, bagi saya itu telah berfungsi (mysql 5.7.12):
Login sebagai sudo:
Buat pengguna baru dan berikan dia hak istimewa (tanpa kata sandi):
Masuk sebagai pengguna baru:
sumber
Saya harus melakukan dua hal (terima kasih kepada @Toror dan @Loremhipsum):
lalu:
Saya tidak akan merekomendasikan untuk menjatuhkan pengguna
root
.sumber
Coba kode ini dulu,
lalu,
lalu tekan
Ctrl+Z
dan ketik:bg
untuk menjalankan proses dari latar depan ke latar belakang, lalu verifikasi akses Anda dengan:sumber
Jika Anda hanya menjalankan perintah mysql di bawah pengguna root, Anda akan diberikan akses tanpa diminta kata sandi, karena otentikasi soket diaktifkan untuk root @ localhost. .
Satu-satunya cara untuk mengatur kata sandi adalah beralih ke otentikasi asli seperti:
sumber
Saya telah mengadaptasi beberapa skrip provisi yang telah saya buat untuk menggunakan MariaDB dan mengalami masalah yang tepat ini. Menyusun banyak informasi di sini jawaban Gazzer benar-benar nol dalam masalah ini; semuanya bermuara pada pengaturan
auth_socket
/unix_socket
.Jadi ketika menggunakan MariaDB 5.5 (di bawah Ubuntu 14.04) dan MariaDB 10 di bawah (Ubuntu 16.04), masuk ke MySQL dan menjalankan perintah ini segera menghapus semuanya:
Jawaban lain — termasuk jawaban dengan suara paling tinggi pada pos ini oleh Loremhipsum — benar-benar mendorong praktik buruk dengan merekomendasikan menjatuhkan pengguna dan kemudian membuatnya kembali. Bagi saya, itu adalah solusi yang cukup radikal. Solusi terbaik / paling sederhana untuk menghapus
plugin
nilai, menghapus hak istimewa dan melanjutkan kehidupan.sumber
Saya memiliki masalah yang sama dan menjalankan yang berikut ini memperbaikinya:
sumber
root
yang diatur denganplugin
pengaturan yang tidak standar. Satu-satunya kasus tepi di mana pemutakhiran DB mungkin membantu dalam kasus seperti ini adalah jikamysql_upgrade
proses itu sendiri menyumbangplugin
pengaturan yang saya ragu.