Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana mengelola pengguna dan otentikasi di MySQL


Pengantar

Manajemen pengguna adalah tanggung jawab yang paling penting dari siapa pun yang berharap untuk mengelola sistem database MySQL. Membuat, mengubah, dan menghapus akun pengguna agar paling mewakili pengguna dan layanan di lingkungan Anda membantu meletakkan dasar untuk mengunci akses, membatasi ruang lingkup untuk perubahan, dan menerapkan audit dan akuntabilitas untuk modifikasi.

Dalam panduan ini, kita akan berbicara tentang cara mengelola akun pengguna di dalam MySQL. Pertama, kita akan membahas pengguna yang valid di MySQL dan menunjukkan cara menambahkan pengguna tambahan ke sistem. Ini mengarah ke diskusi tentang cara mengkonfigurasi otentikasi untuk setiap pengguna dan bagaimana sistem memilih opsi otentikasi dari daftar kemungkinan. Kami akan terus berbicara tentang membuat perubahan pada pengguna yang ada, cara masuk dengan akun yang Anda buat, dan cara menghapus pengguna yang tidak lagi Anda perlukan.



Prasyarat

Untuk mengikuti panduan ini, Anda memerlukan akun di server MySQL dengan hak istimewa yang sesuai.


Perintah yang akan kita gunakan

Untuk membuat, memodifikasi, dan menghapus pengguna dalam MySQL, perintah inti yang Anda butuhkan adalah:

  • CREATE USER :buat akun pengguna baru
  • ALTER USER :membuat perubahan pada akun pengguna yang ada
  • DROP USER :menghapus akun pengguna yang ada


Hak istimewa yang diperlukan

Untuk menjalankan perintah di atas, Anda harus login ke MySQL dengan akun CREATE USER hak istimewa. CREATE USER hak istimewa memungkinkan Anda untuk membuat, memodifikasi, menghapus, dan mengganti nama pengguna, di antara tindakan lainnya. Kami juga membutuhkan SELECT hak istimewa pada mysql database untuk melihat informasi tentang pengguna yang ada.

Sesuai urutan preferensi, Anda harus login menggunakan:

  • Akun terbatas yang memiliki CREATE USER hak istimewa dan SELECT hak istimewa pada mysql basis data
  • root atau pengguna administratif yang memiliki hak penuh dalam MySQL



Memahami bagaimana MySQL mendefinisikan dan menginterpretasikan akun pengguna

Sebelum kita mulai membuat akun baru, ada baiknya meluangkan waktu untuk membiasakan diri dengan berbagai yang digunakan MySQL untuk membuat dan merujuk ke pengguna. Anda juga harus memahami algoritme autentikasi MySQL untuk memahami akun pengguna apa yang akan digunakan untuk mengautentikasi koneksi.


Apa sintaks MySQL untuk akun pengguna?

Di MySQL, akun pengguna terdiri dari dua bagian informasi yang terpisah, digabungkan dengan tanda (@):

  • Nama pengguna
  • Host tempat pengguna terhubung

Secara umum, akun pengguna pada sistem akan terlihat seperti berikut:

'<user>'@'<host>'

Kutipan tunggal dapat digunakan, seperti di atas, untuk membungkus pengguna dan komponen host akun pengguna satu per satu. Mereka kadang-kadang diperlukan jika salah satu komponen mengandung karakter yang sebaliknya akan disalahartikan. Secara umum, menambahkannya selalu merupakan ide yang bagus untuk eksplisit.

Jadi daripada hanya memiliki akun bernama 'john' , di MySQL, nama akun lengkap akan memerlukan beberapa jenis host, seperti 'john'@'localhost' . Ini berarti mungkin ada beberapa 'john' akun pada sistem dan MySQL akan melihat masing-masing akun tersebut sebagai akun unik selama akun tersebut berasal dari domain yang berbeda.

Dengan semua ini, dimungkinkan untuk menentukan akun pengguna yang tidak memiliki komponen pengguna atau host, tetapi ada implikasi penting yang harus Anda waspadai.

Anda dapat menentukan akun pengguna tanpa nilai pengguna dengan menggunakan string kosong:

''@'<host>'

Misalnya, Anda dapat membuat pengguna sebagai ''@'localhost' . Pengguna ini akan cocok dengan apa pun nama pengguna yang terhubung dari komputer lokal.

Demikian juga, Anda dapat memiliki akun pengguna yang cocok dari host mana pun. Daripada menggunakan string kosong, untuk nilai host, Anda akan menggunakan % wildcard, seperti ini:

'<user>'@'%'

Misalnya, jika Anda membuat 'john'@'%' , akun itu akan cocok dengan 'john' pengguna terhubung dari apa saja tuan rumah.



Bagaimana cara MySQL mengautentikasi pengguna?

Memahami bagaimana MySQL sebenarnya memproses setiap permintaan otentikasi sangat penting untuk menghindari kelas umum masalah otentikasi yang dihasilkan dari asumsi yang masuk akal, tetapi salah. Ini telah dibahas secara mendalam dalam pengantar kami untuk otentikasi dan otorisasi di artikel MySQL.

Saat mengautentikasi permintaan koneksi, MySQL menggunakan sejumlah bidang dalam user tabel mysql internalnya database untuk memutuskan apakah akan mengizinkan koneksi. MySQL akan menggunakan paling banyak satu catatan akun pengguna untuk mencoba mengotentikasi koneksi. Ini berarti MySQL memerlukan cara untuk memutuskan akun pengguna mana yang akan digunakan jika ada lebih dari satu akun yang cocok dengan koneksi.

Algoritme MySQL untuk mengautentikasi pengguna dimulai saat server dinyalakan. Saat start up, MySQL memuat seluruh mysql.user tabel ke dalam memori. Itu juga melakukan ini setiap kali akun pengguna dibuat menggunakan perintah MySQL biasa. Saat memuat tabel, ia mengurutkan entri dari prioritas tertinggi hingga terendah.

MySQL menggunakan Host kolom sebagai bidang pengurutan utama dan memprioritaskan hasil dengan nilai yang lebih spesifik. Jadi nilai literal diurutkan ke atas sebagai prioritas tertinggi dan nilai yang menggunakan karakter pengganti, seperti % , diurutkan ke bawah. Entri terakhir adalah entri yang hanya berisi % tanpa karakter lain, diikuti dengan entri yang memiliki host yang benar-benar kosong.

User kolom digunakan sebagai bidang pengurutan sekunder untuk entri apa pun yang memiliki Host same yang sama nilai. Sekali lagi, kecocokan yang lebih tepat diprioritaskan. Sejak User kolom tidak dapat menggunakan wildcard, semua entri memiliki pijakan yang sama kecuali entri dengan User kosong nilai. Itu diurutkan ke bawah. Jika ada entri dengan User kosong nilai dipilih, pengguna akan diautentikasi sebagai "pengguna anonim", yang biasanya sama dengan tidak memiliki hak istimewa.

Sekarang, setiap kali permintaan koneksi dibuat, MySQL melewati tabel yang diurutkan dalam memori dari atas ke bawah. Ia menggunakan pertama entri yang ditemukan untuk mengotentikasi pengguna, terlepas dari apakah ada entri lain yang juga cocok. Jika klien gagal mengautentikasi menggunakan metode yang ditentukan oleh entri itu, koneksi akan gagal dan tidak ada entri lain yang akan diperiksa.



Apa implikasi tidak menyertakan pengguna atau host dalam definisi akun pengguna MySQL?

Karena algoritma otentikasi MySQL, masalah dapat muncul jika Anda tidak berhati-hati saat membuat akun pengguna tanpa komponen pengguna atau host. Ini karena cara MySQL memutuskan record mana yang akan digunakan untuk mengautentikasi Anda bisa jadi tidak intuitif dan mengejutkan.

Misalnya, jika pengguna mengautentikasi ke MySQL dengan bagian pengguna sebagai string kosong, MySQL akan menganggap mereka sebagai "pengguna anonim" untuk sisa sesi. Sebagai aturan, pengguna anonim hampir tidak memiliki kekuatan dan dapat melakukan sangat sedikit setelah terhubung. Bahkan dimungkinkan untuk mengautentikasi secara tidak sengaja sebagai pengguna anonim ketika mencoba mengautentikasi menggunakan akun pengguna yang berbeda.

Tantangan menggunakan wildcard host untuk akun pengguna adalah akun pengguna lain yang termasuk nilai host dapat dengan mudah menutupi, atau membuat tidak tersedia, akun pengguna yang menggunakan karakter pengganti.

Misalnya, jika Anda memiliki akun pengguna yang didefinisikan sebagai 'emily'@'%' , Anda mungkin berharap dapat mengautentikasi ke 'emily' dari tuan rumah mana pun. Namun, jika Anda memiliki akun pengguna dengan pengguna kosong tetapi nilai host yang cocok dengan host 'emily' terhubung dari, MySQL akan mengautentikasi menggunakan akun itu (mengarah ke login pengguna anonim seperti dijelaskan di atas).

Jadi sebagai contoh, MySQL akan mengurutkan akun-akun berikut ke dalam urutan berikut:

Prioritas Akun MySQL Komentar
1 'emily'@'localhost' dan 'emily'@'example.com' Ini adalah prioritas yang sama, tidak apa-apa karena hanya mungkin salah satunya cocok dengan koneksi.
2 ''@'localhost' dan ''@'example.com' Dua entri ini, sekali lagi memiliki prioritas yang sama. Karena mereka tidak memiliki komponen pengguna, tetapi mereka mempunyai memiliki komponen host literal, mereka ditempatkan di bagian bawah entri yang memiliki nilai host yang tepat.
3 'emily'@'%.example.com' Entri ini memiliki karakter pengganti di komponen host, sehingga diberikan prioritas lebih rendah daripada entri dengan nilai host yang tepat.
4 ''@'%.example.com' Entri ini dikelompokkan dengan entri yang memiliki wildcard dalam nilai hostnya. Karena tidak memiliki komponen pengguna, ia berada di bagian bawah grup ini.
5 'emily'@'%' Entri ini memiliki nilai host yang hanya terdiri dari wildcard. Karena cocok dengan host mana pun, prioritasnya sangat rendah.
7 ''@'%' Entri ini dapat digunakan untuk mengautentikasi pengguna mana pun dari host mana pun sebagai pengguna anonim. Prioritasnya sangat rendah karena cocok dengan koneksi apa pun.
6 'emily'@'' Entri ini memiliki nilai host yang sepenuhnya kosong, yang bahkan memiliki prioritas lebih rendah daripada host yang hanya berisi host wildcard.
8 ''@'' Ini adalah pengguna prioritas serendah mungkin. Ini tidak mengandung informasi host sehingga ditempatkan di akhir selama penyortiran host. Karena itu juga berisi pengguna kosong, itu ditempatkan di bawah entri lain dalam grup ini. Seperti semua entri tanpa pengguna, koneksi yang diautentikasi dengan entri ini akan masuk sebagai pengguna anonim.



Bagaimana cara membuat pengguna?

Sekarang setelah Anda merasakan cara MySQL menangani akun pengguna, kita dapat mulai membuat beberapa pengguna baru. Ingatlah untuk masuk dengan pengguna dengan hak istimewa yang dijelaskan dalam prasyarat.


Sintaks dasar

Sintaks dasar untuk membuat pengguna baru relatif sederhana. Anda menggunakan CREATE USER perintah dan kemudian tentukan pengguna dan host untuk akun baru:

CREATE USER '<user>'@'<host>';

Ini akan membuat akun dasar tanpa mengonfigurasi detail apa pun selain pengguna dan hostnya saat pembuatan.



Bagaimana cara membuat pengguna dengan kata sandi?

Seringkali, Anda ingin mengonfigurasi otentikasi saat Anda membuat pengguna. Anda dapat melakukannya dengan menambahkan IDENTIFIED BY opsional klausa ke CREATE USER pernyataan:

CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';

Ini membuat akun pengguna baru, seperti sebelumnya, dan memberikan kata sandi untuk akun tersebut pada saat yang bersamaan. Kami akan membahas cara menetapkan kata sandi setelah fakta atau cara mengubah kata sandi pengguna nanti.



Bagaimana Anda membuat pengguna dengan otentikasi soket Unix?

Meskipun otentikasi kata sandi adalah metode otentikasi yang paling umum bagi sebagian besar pengguna, itu bukan satu-satunya pilihan. MySQL menyediakan banyak mekanisme otentikasi internal dan eksternal yang berbeda yang dapat Anda konfigurasikan ke akun pengguna Anda untuk digunakan. Sebagai contoh, kami akan mengonfigurasi akun baru menggunakan otentikasi soket Unix.

Otentikasi soket Unix dapat digunakan di Linux atau lingkungan mirip Unix sehingga akun di sistem operasi diberikan akses ke nama akun yang sama di dalam MySQL tanpa otentikasi lebih lanjut. Dalam konfigurasi ini, administrator MySQL mengetahui bahwa akun pengguna pada sistem operasi dikontrol dengan ketat.

Jadi jika ada mary pengguna pada sistem operasi, mereka akan dapat login ke 'mary'@'localhost' akun dalam MySQL jika otentikasi soket Unix adalah mekanisme otentikasi yang ditentukan. Mari konfigurasikan ini sekarang.

Otentikasi soket memerlukan auth_socket plugin, jadi pertama-tama muat plugin dengan mengetik:

INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

Selanjutnya, buat akun pengguna yang cocok dengan akun pengguna yang Anda miliki di sistem operasi Anda. Untuk contoh ini, kita akan menggunakan mary akun yang kita bahas di atas. Jika Anda tidak menggunakan nama yang cocok dengan salah satu nama sistem operasi Anda, Anda tidak akan dapat mengautentikasi menggunakan pengguna ini.

Untuk membuat pengguna dengan otentikasi soket, kita perlu menggunakan IDENTIFIED WITH klausa (berbeda dari IDENTIFIED BY klausa yang digunakan sebelumnya) untuk menentukan plugin autentikasi yang akan digunakan:

CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;

Sekarang, Anda seharusnya dapat mengautentikasi ke 'mary'@'localhost' Pengguna MySQL dari mary pengguna di sistem operasi Anda. Saat login sebagai mary , sambungkan ke database tanpa memberikan nama pengguna atau kata sandi apa pun:

mysql

Anda harus masuk secara otomatis melalui otentikasi soket Unix yang Anda konfigurasikan.




Bagaimana cara menampilkan pengguna yang sudah ada?

Selanjutnya, mari kita lihat bagaimana menemukan informasi tentang pengguna yang ada.

Untuk menampilkan semua pengguna MySQL yang ada, yang terdiri dari komponen pengguna dan host mereka, serta plugin autentikasi yang sedang mereka gunakan, Anda dapat SELECT bidang-bidang itu dari mysql.user basis data:

SELECT user,host,plugin FROM mysql.user
+------------------+-----------+-----------------------+  user             | host      | plugin                |+------------------+-----------+-----------------------+  mary             | localhost | auth_socket           |  mysql.infoschema | localhost | caching_sha2_password |  mysql.session    | localhost | caching_sha2_password |  mysql.sys        | localhost | caching_sha2_password |  root             | localhost | caching_sha2_password |  useradmin        | localhost | caching_sha2_password |+------------------+-----------+-----------------------+6 rows in set (0.00 sec)

Di sini, kita dapat melihat bahwa ada enam pengguna yang ditentukan pada sistem, yang semuanya hanya dapat login secara lokal. Lima dari akun dikonfigurasi untuk menggunakan otentikasi kata sandi. 'mary'@'localhost' akun dikonfigurasi untuk menggunakan otentikasi soket Unix.

Kami dapat menemukan informasi tambahan tentang properti pengguna dengan menggunakan SHOW CREATE USER memerintah. Terlepas dari namanya, ini menunjukkan semua properti akun pengguna saat ini, tidak harus yang digunakan selama pembuatan akun awal.

SHOW CREATE USER perintah mengambil nama akun sebagai argumen:

SHOW CREATE USER '<user>'@'<host>'\G

Biasanya yang terbaik adalah mengakhiri perintah dengan \G terminator pernyataan alih-alih titik dua biasa (; ) sehingga Anda dapat melihat hasilnya sedikit lebih jelas.

Untuk menampilkan properti untuk 'useradmin'@'localhost' akun, Anda akan mengetik:

SHOW CREATE USER 'useradmin'@'localhost'\G
*************************** 1. row ***************************CREATE USER for useradmin@localhost: CREATE USER 'useradmin'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$O                                              Rl7lM;@Gt{roB4EWchqDdYM142Lq7pfzcCNiK4yUxnRBlrAgr0sE3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT1 row in set (0.00 sec)


Bagaimana Anda mengubah pengguna MySQL yang ada?

Anda dapat mengubah pengguna yang ada dalam MySQL menggunakan ALTER USER memerintah. Ini dapat digunakan untuk mengubah sebagian besar properti akun yang terkait dengan pengguna, dengan pengecualian hak istimewa akun, yang dikendalikan oleh GRANT dan REVOKE perintah.

Sintaks dasar untuk ALTER USER terlihat seperti ini:

ALTER USER <user> <properties_to_change>;

Bagaimana Anda mengubah kata sandi untuk pengguna MySQL?

Bagi kebanyakan orang, penggunaan paling umum dari ALTER USER adalah mengubah kata sandi.

Misalnya, Anda dapat mengubah kata sandi untuk 'kamal'@'localhost' dengan mengetik:

ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';

Jika Anda ingin menyetel sandi sementara untuk pengguna yang harus segera mereka ganti, Anda dapat menyetel dan kedaluwarsa sandi secara bersamaan:

ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;

Anda selalu dapat mengubah sandi Anda sendiri, bahkan tanpa CREATE USER hak istimewa. Paling mudah menggunakan USER() fungsi untuk secara otomatis mengisi nama pengguna Anda sendiri:

ALTER USER USER() IDENTIFIED BY '<new_password>';


Bagaimana Anda mengubah plugin otentikasi untuk pengguna MySQL?

Anda juga dapat mengubah mekanisme atau plugin yang digunakan untuk mengautentikasi akun.

Dalam contoh sebelumnya, kami mengonfigurasi akun bernama 'mary'@'localhost' untuk menggunakan otentikasi soket Unix. Jika nanti kita ingin mengubah akun tersebut untuk menggunakan otentikasi password konvensional, kita dapat menggunakan ALTER USER perintah lagi.

Pertama, identifikasi plugin otentikasi default untuk server Anda. Jika ini adalah metode otentikasi berbasis kata sandi, mungkin yang terbaik adalah menggunakan kembali pilihan default:

SHOW VARIABLES LIKE 'default_authentication_plugin';

Dalam hal ini, plugin autentikasi default adalah caching_sha2_password , jadi kami akan menggunakannya saat beralih ke otentikasi kata sandi.

Sekarang, ubah 'mary'@'localhost' untuk menggunakan caching_sha2_password plugin dengan kata sandi baru:

ALTER USER 'mary'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<marys_password>';

'mary'@'localhost' pengguna tidak lagi dapat masuk menggunakan otentikasi soket Unix, tetapi mereka dapat masuk menggunakan kata sandi yang diberikan.




Bagaimana cara login ke MySQL?

Kami telah membahas cara membuat dan memodifikasi akun pengguna MySQL, termasuk otentikasi. Namun, kita belum membicarakan tentang bagaimana sebenarnya login menggunakan metode autentikasi ini.

mysql klien adalah klien baris perintah yang kuat yang dapat digunakan untuk terhubung ke database lokal dan jarak jauh. Kami akan menggunakannya untuk berbicara tentang cara mengautentikasi menggunakan metode yang kami konfigurasikan di atas.


Bagaimana cara login ke database lokal dengan sandi?

Untuk masuk ke database MySQL yang dihosting secara lokal menggunakan akun pengguna dengan kata sandi, sintaks dasarnya terlihat seperti ini:

mysql --user=<username> --password <dbname>

Jadi, jika 'kamal'@'localhost' pengguna ingin login ke MySQL dan terhubung ke testing database dari komputer tempat sistem di-host, mereka dapat mengetik:

mysql --user=kamal --password testing

mysql klien akan meminta kata sandi untuk 'kamal'@'localhost' . Jika Anda memberikan kredensial yang benar, Anda akan terhubung ke testing basis data.

Menentukan database pada baris perintah adalah opsional. Jika tidak ada yang ditentukan, Anda akan terhubung ke server tetapi tidak ke database tertentu.



Bagaimana Anda login ke database lokal dengan otentikasi soket Unix?

Untuk masuk ke server MySQL lokal menggunakan otentikasi soket Unix, Anda harus masuk ke sistem operasi Anda sebagai nama akun yang cocok. Jadi, jika kita ingin mengautentikasi ke 'mary'@'localhost' menggunakan otentikasi soket Unix, pertama-tama kita harus login ke komputer kita dengan nama pengguna yang disebut mary .

Setelah Anda menggunakan akun sistem operasi yang benar, Anda dapat terhubung langsung ke database lokal dengan menjalankan klien, tanpa opsi.

mysql

Seperti sebelumnya, Anda dapat menambahkan nama database secara opsional untuk terhubung ke database tertentu yang Anda inginkan.



Bagaimana Anda login ke database jarak jauh dengan kata sandi?

Jika server MySQL Anda tidak berjalan di server lokal Anda, Anda harus menentukan host yang akan disambungkan oleh klien. Anda dapat melakukannya dengan menambahkan --host pilihan.

Sebagian besar waktu, Anda akan mengautentikasi dengan kata sandi ke server MySQL jarak jauh, sehingga perintahnya akan terlihat seperti ini:

mysql --user=<username> --password --host=<host> <dbname>

Jadi 'tanya'@'<tanyas_domain>' dapat terhubung ke server MySQL yang terletak di example.com dengan mengetik:

mysql --user='tanya' --password --host='example.com' 



Bagaimana cara menghapus pengguna MySQL?

Menyimpan akun pengguna yang tidak lagi memiliki tujuan adalah risiko keamanan. Anda dapat menghapus akun dengan mudah dengan DROP USER perintah.

Sintaks dasarnya terlihat seperti ini:

DROP USER '<user>'@'<host>';

Jadi untuk menghapus 'mary'@'localhost' pengguna, Anda akan mengetik:

DROP USER 'mary'@'localhost';

Jika Anda mencoba menghapus pengguna yang tidak ada, Anda akan menerima pesan kesalahan:

ERROR 1396 (HY000): Operation DROP USER failed for 'mary'@'localhost'

Untuk menghindari hal ini, Anda dapat menambahkan IF EXISTS klausa sebelum nama akun. Jika pengguna ada, itu akan dihapus. Jika tidak, hanya akan diberikan peringatan:

Query OK, 0 rows affected, 1 warning (0.00 sec)


Kesimpulan

Manajemen akun pengguna MySQL dan konfigurasi otentikasi sangat fleksibel. Mempelajari cara membuat, memodifikasi, dan mendapatkan informasi tentang pengguna di dalam MySQL akan membantu Anda mengelola sistem database dengan lebih efektif.

Praktik terbaik keamanan menentukan bahwa Anda harus membuat akun untuk setiap kasus penggunaan unik, hanya dengan tingkat akses yang diperlukan untuk menjalankan cakupannya. Pembuatan akun dan otentikasi adalah tahap pertama dari proses ini. Dalam panduan lain, kita akan membahas tentang memberikan dan mencabut hak istimewa untuk memenuhi bagian lain dari strategi tersebut.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL TIDAK DALAM permintaan

  2. Bagaimana menghubungkan Android dengan MySQL menggunakan driver Mysql JDBC

  3. PDO mengambil satu kolom dari tabel ke dalam array 1 dimensi

  4. node.js + penyatuan koneksi mysql

  5. MAX() – Temukan Nilai Maksimum dalam Kolom di MySQL