MySql: Berikan opsi hanya baca?

100

Saya memiliki pengguna, yang ingin saya berikan semua izin BACA pada skema db.

Salah satu caranya adalah ini:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

Apakah ada cara untuk mengelompokkan semua operasi baca dalam bentuk hibah?

Ajeet Ganga
sumber
Hak istimewanya adalah SHOW VIEW, bukan SHOW_VIEW, tetapi Anda tidak perlu memberikan ini kepada pengguna kecuali Anda ingin mereka dapat SHOW CREATE VIEWmelihat ... mereka dapat memilih dari tampilan dengan satu-satunya SELECThak istimewa. Apa yang Anda maksud dengan "kelompokkan semua operasi baca dalam hibah"?
Michael - sqlbot
Jika ada satu hak istimewa yang mewakili SEMUA operasi BACA di database. Saya memahami bahwa mereka menyediakan akses yang sangat baik, tetapi abstraksi tingkat tinggi yang nyaman akan membantu kami.
Ajeet Ganga

Jawaban:

163

Jika ada satu hak istimewa yang mewakili SEMUA operasi BACA di database.

Itu tergantung pada bagaimana Anda mendefinisikan "semua baca."

"Membaca" dari tabel dan tampilan adalah SELECThak istimewa. Jika itu yang Anda maksud dengan "semua baca" maka ya:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

Namun, kedengarannya seperti yang Anda maksud adalah kemampuan untuk "melihat" segalanya, untuk "melihat tetapi tidak menyentuh". Jadi, inilah jenis bacaan lain yang muncul di benak:

"Membaca" definisi pandangan adalah SHOW VIEWhak istimewa.

"Membaca" daftar kueri yang sedang dijalankan oleh pengguna lain adalah PROCESShak istimewa.

"Membaca" status replikasi saat ini adalah REPLICATION CLIENThak istimewa.

Perhatikan bahwa salah satu atau semua ini mungkin mengungkap lebih banyak informasi daripada yang ingin Anda ungkapkan, bergantung pada sifat pengguna yang bersangkutan.

Jika itu pembacaan yang ingin Anda lakukan, Anda dapat menggabungkan salah satu dari itu (atau hak istimewa lain yang tersedia ) dalam satu GRANTpernyataan.

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

Namun, tidak ada satu pun hak istimewa yang memberikan sebagian hak istimewa lainnya, seperti yang terdengar seperti yang Anda minta.

Jika Anda melakukan sesuatu secara manual dan mencari cara yang lebih mudah untuk melakukannya tanpa perlu mengingat hibah persis yang biasanya Anda buat untuk kelas pengguna tertentu, Anda dapat mencari pernyataan untuk membuat ulang hibah pengguna yang sebanding, dan mengubahnya. untuk membuat pengguna baru dengan hak yang sama:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Mengubah 'not_leet' dan 'localhost' agar cocok dengan pengguna baru yang ingin Anda tambahkan, bersama dengan kata sandinya, akan menghasilkan GRANTpernyataan yang dapat digunakan kembali untuk membuat pengguna baru.

Tentu, jika Anda ingin satu operasi untuk menyiapkan dan memberikan sekumpulan hak istimewa terbatas kepada pengguna, dan mungkin menghapus hak istimewa yang tidak layak, itu dapat dilakukan dengan membuat prosedur tersimpan yang merangkum semua yang ingin Anda lakukan. Di dalam tubuh prosedur, Anda akan membuat GRANTpernyataan dengan SQL dinamis dan / atau secara langsung memanipulasi tabel hibah itu sendiri.

Dalam pertanyaan baru-baru ini tentang Administrator Basis Data , poster menginginkan kemampuan bagi pengguna yang tidak memiliki hak untuk memodifikasi pengguna lain, yang tentu saja bukanlah sesuatu yang biasanya dapat dilakukan - pengguna yang dapat memodifikasi pengguna lain, secara definisi, tidak pengguna yang tidak DEFINERmemiliki EXECUTEhak istimewa - bagaimanapun - prosedur yang tersimpan memberikan solusi yang baik dalam kasus itu, karena mereka berjalan dengan konteks keamanan pengguna mereka , memungkinkan siapa pun dengan hak istimewa pada prosedur untuk sementara mengambil hak istimewa yang ditingkatkan untuk memungkinkan mereka melakukan hal-hal spesifik prosedur selesai.

Michael - sqlbot
sumber
1
Terima kasih. Selain jawaban yang bagus, saya juga menyukai kata sandi Anda. :)
Ajeet Ganga
2
Perlu diperhatikan: PROSES dan KLIEN REPLIKASI adalah jenis hak istimewa "global", sehingga sintaksisnya akan gagal saat ditentukan dengan pengecualian "per database". PROSES GRANT ON mydb. * Tidak valid, tetapi GRANT PROCESS ON *. * Tidak masalah.
Bee Kay
GRANT SELECT ON db_name. * TO 'demo' @ '%' WITH GRANT OPTION;
Musa
16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Ini akan membuat pengguna dengan SELECThak istimewa untuk semua database termasuk Tampilan.

Mahesh Patil
sumber
9

Berbagai izin yang dapat Anda berikan kepada pengguna adalah

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

Untuk memberikan izin kepada pengguna tertentu, Anda dapat menggunakan kerangka kerja ini:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

Saya menemukan artikel ini sangat membantu

ath j
sumber
3

Panduan langkah demi langkah yang saya temukan di sini .

Untuk membuat akun pengguna database read-only untuk MySQL

Pada prompt UNIX, jalankan program baris perintah MySQL, dan masuk sebagai administrator dengan mengetikkan perintah berikut:

mysql -u root -p

Ketik kata sandi untuk akun root. Pada prompt mysql, lakukan salah satu dari langkah-langkah berikut:

Untuk memberi pengguna akses ke database dari sembarang host, ketik perintah berikut:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

Jika kolektor akan diinstal pada host yang sama dengan database, ketik perintah berikut:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

Perintah ini memberi pengguna akses baca-saja ke database dari host lokal saja. Jika Anda mengetahui nama host atau alamat IP dari host tempat pengumpul akan diinstal, ketik perintah berikut:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

Nama host harus dapat diselesaikan oleh DNS atau dengan file host lokal. Pada prompt mysql, ketik perintah berikut:

flush privileges;

Ketik quit.

Berikut ini adalah daftar contoh perintah dan pesan konfirmasi:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
biniam
sumber
3

Bahkan pengguna telah mendapat jawaban dan @Michael - sqlbot telah membahas sebagian besar poin dengan sangat baik di posnya tetapi satu poin hilang, jadi coba tutupi saja.

Jika Anda ingin memberikan izin baca kepada pengguna sederhana (Bukan semacam admin) -

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

Catatan: EXECUTE diperlukan di sini, sehingga pengguna dapat membaca data jika ada prosedur tersimpan yang menghasilkan laporan (memiliki beberapa pernyataan pilih).

Ganti localhost dengan IP tertentu dari mana pengguna akan terhubung ke DB.

Izin Baca Tambahan adalah-

  • SHOW VIEW: Jika Anda ingin menampilkan skema tampilan.
  • KLIEN REPLIKASI: Jika pengguna perlu memeriksa status replikasi / budak. Tapi perlu memberi izin pada semua DB.
  • PROSES: Jika pengguna perlu memeriksa proses yang sedang berjalan. Akan bekerja dengan semua DB saja.
Zafar Malik
sumber
1

Catatan untuk MySQL 8 itu berbeda

Anda perlu melakukannya dalam dua langkah:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
Daniel Patrick
sumber
Ini adalah satu-satunya solusi yang berhasil untuk saya. Tampaknya solusi lain sudah usang seperti yang Anda katakan. Terima kasih telah memberikan solusi terbaru ini.
Kyle Bridenstine
0

Jika Anda ingin tampilan hanya dibaca setelah memberikan izin baca, Anda dapat menggunakan ALGORITHM = TEMPTABLE dalam definisi DDL tampilan Anda.

Daniel Fisher
sumber