ApsaraDB for SelectDB menggunakan mekanisme pengelolaan izin MySQL untuk mengimplementasikan kontrol izin tingkat halus pada tingkat tabel, serta mendukung kontrol izin berdasarkan peran dan daftar putih. Topik ini menjelaskan cara menggunakan sistem pengelolaan izin SelectDB, termasuk detail sintaksis dan catatan penggunaannya.
Operasi yang diizinkan oleh izin
Setelah membuat pengguna, gunakan akun istimewa untuk memberikan izin akses ke kluster, database, dan tabel.
Untuk informasi lebih lanjut tentang cara memberikan izin akses ke kluster, lihat Berikan Pengguna Izin Mengakses Kluster.
Untuk informasi lebih lanjut tentang cara memberikan izin akses ke database dan tabel, lihat tabel berikut.
Operasi | Kata kunci operasi | Sintaksis |
Buat pengguna | CREATE USER | |
Hapus pengguna | DROP USER | |
Berikan izin kepada pengguna | GRANT | |
Cabut izin dari pengguna | REVOKE | |
Buat peran | CREATE ROLE | |
Hapus peran | DROP ROLE | |
Kueri izin yang diberikan kepada satu atau semua pengguna | SHOW (ALL) GRANTS | |
Kueri peran yang dibuat | SHOW ROLES | |
Kueri properti pengguna | SHOW PROPERTY | |
Konfigurasi properti pengguna | SET PROPERTY | |
Deskripsi Parameter
Parameter | Deskripsi |
[password_policy] | Kebijakan yang terkait dengan otentikasi masuk berbasis kata sandi. Kebijakan kata sandi berikut didukung:
|
Contoh operasi
Contoh 1: Buat pengguna bernama
test_user. Kata sandi pengguna adalah 123456, dan pengguna dapat mengirim permintaan masuk dari Blok CIDR 172.10.0.0/16.CREATE USER test_user@'172.10.%' IDENTIFIED BY '123456';Contoh 2: Hapus pengguna dengan identitas pengguna
test_user@'172.10.%'.DROP USER 'test_user'@'172.10.%'Contoh 3: Berikan pengguna dengan identitas pengguna
test_user@'172.10.%'izin baca, modifikasi, dan impor pada tabeltest_db.test_table.GRANT SELECT_PRIV,ALTER_PRIV,LOAD_PRIV ON test_db.test_table TO 'test_user'@'172.10.%';Contoh 4: Cabut izin baca pada database test_db dari pengguna bernama
test_user.REVOKE SELECT_PRIV ON test_db.* FROM 'test_user'@'172.10.%';Contoh 5: Buat peran bernama
test_role.CREATE ROLE test_role;Contoh 6: Hapus peran bernama
test_role.DROP ROLE test_role;Contoh 7: Berikan peran bernama
test_roleizin impor pada semua tabel di databasetest_db.GRANT LOAD_PRIV ON test_db.* TO ROLE 'test_role';Contoh 8: Ubah peran yang ditetapkan kepada pengguna dengan identitas pengguna
test_user@'172.10.%'menjaditest_role.GRANT "test_role" TO test_user@'172.10.%';Contoh 9: Kueri izin pengguna dengan identitas pengguna
test_user@'%'.SHOW GRANTS FOR test_user@'%';Contoh 10: Kueri properti pengguna bernama
test_user.# Kueri semua properti pengguna. SHOW PROPERTY FOR 'test_user'; # Gunakan ekspresi LIKE untuk kueri properti tertentu dari pengguna. SHOW PROPERTY FOR 'test_user' LIKE '%max_user_connections%';Contoh 11: Konfigurasikan properti pengguna bernama
test_user.SET PROPERTY FOR 'test_user' 'max_user_connections' = '1000';
Praktik terbaik
Sistem pengelolaan izin umumnya digunakan dalam skenario berikut:
Skenario 1
Pengguna kluster diklasifikasikan menjadi administrator, insinyur R&D, dan pengguna biasa. Administrator memiliki izin penuh pada kluster dan bertanggung jawab atas manajemen kluster, seperti membangun kluster dan mengelola node. Insinyur R&D bertanggung jawab atas pemodelan layanan, seperti membuat database dan tabel, serta mengimpor dan memodifikasi data. Pengguna biasa mengakses data di database dan tabel yang berbeda.
Dalam skenario ini, Anda dapat memberikan izin ADMIN_PRIV atau GRANT_PRIV kepada administrator. Insinyur R&D dapat diberikan izin CREATE, DROP, ALTER, LOAD, dan SELECT pada satu atau beberapa database dan tabel. Pengguna biasa dapat diberikan izin SELECT pada satu atau beberapa database dan tabel. Anda juga dapat membuat peran berbeda untuk memberikan izin kepada banyak pengguna secara lebih efisien.
Skenario 2
Sebuah kluster menyediakan layanan berbeda. Setiap layanan mungkin menggunakan satu atau lebih rekaman data. Anda perlu mengelola izin pengguna setiap layanan. Dalam skenario ini, administrator dapat membuat pengguna yang memiliki izin GRANT_PRIV di tingkat database untuk setiap database. Pengguna ini hanya dapat memberikan izin pada database yang ditentukan kepada pengguna.
Skenario 3
SelectDB tidak mendukung blacklist, tetapi hanya whitelist. Namun, Anda dapat menggunakan metode tertentu untuk mensimulasikan blacklist. Misalnya, buat pengguna dengan identitas pengguna
test_user1@'192.%'. Pengguna dapat mengirim permintaan masuk dari alamat IP192.*. Jika Anda ingin menolak permintaan masuk dari Blok CIDR192.168.0.0/16, buat pengguna lain dengan identitas penggunatest_user2@'192.168.%'dan konfigurasikan kata sandi baru untuk pengguna tersebut. Prioritas192.168.%lebih tinggi daripada192.%. Oleh karena itu, pengguna tidak dapat lagi menggunakan kata sandi asli untuk masuk ke instans SelectDB dari Blok CIDR192.168.0.0/16.
Catatan penggunaan izin
Ketika instans SelectDB diinisialisasi, peran dan pengguna berikut secara otomatis dibuat:
operator: Peran ini memiliki izin NODE_PRIV dan ADMIN_PRIV pada SelectDB dan memungkinkan Anda masuk ke instans SelectDB dari node mana pun. Peran ini hanya diberikan kepada pengguna instans bawaan dengan identitas pengguna root@'%'.
admin: Peran ini adalah peran manajemen dan memiliki izin ADMIN_PRIV. Peran ini memiliki semua izin kecuali izin untuk mengubah node, dan memungkinkan Anda masuk ke instans SelectDB dari node. Saat instans SelectDB diinisialisasi, sistem secara otomatis membuat pengguna dengan identitas pengguna admin@'%' dan menetapkan peran admin kepada pengguna tersebut. Anda dapat membuat beberapa pengguna dan menetapkan peran admin kepada mereka.
Anda tidak dapat mencabut atau mengubah izin peran atau pengguna yang dibuat secara otomatis.
Jika Anda lupa kata sandi pengguna yang ditetapkan peran admin dan tidak dapat masuk ke instans SelectDB, Anda dapat menyetel ulang kata sandi pengguna di konsol SelectDB. Untuk informasi lebih lanjut, lihat Setel Ulang Kata Sandi Pengguna Admin untuk Instans.
Izin ADMIN_PRIV hanya dapat diberikan atau dicabut di tingkat global.
Izin GRANT_PRIV di tingkat global setara dengan izin ADMIN_PRIV karena yang pertama memiliki izin untuk memberikan semua izin. Berhati-hatilah saat menggunakan izin GRANT_PRIV di tingkat global.
Anda dapat menjalankan pernyataan
SELECT current_user();untuk menanyakancurrent_userdan pernyataanSELECT user();untuk menanyakanuser.current_usermenunjukkan identitas pengguna yang digunakan oleh pengguna saat ini untuk melewati otentikasi identitas, danmenunjukkan identitas pengguna sebenarnya dari pengguna. Semua izin diberikan kepada identitas pengguna yang digunakan oleh pengguna saat ini untuk melewati otentikasi identitas dan pengguna memiliki izin dari identitas pengguna tersebut.Sebagai contoh, Anda membuat pengguna dengan identitas pengguna
user1@'192.%'dan pengguna bernamauser1masuk ke instans SelectDB dari Blok CIDR 192.168.0.0/16. Dalam hal ini, identitas pengguna yang digunakan oleh pengguna saat ini adalahuser1@'192.%'dan identitas pengguna sebenarnya dari pengguna adalahuser1@'192.168.%'.
Detail sintaksis izin
Jenis izin
Izin | Deskripsi |
GRANT_PRIV | Izin untuk mengubah izin. Izin ini memungkinkan Anda memberikan izin kepada dan mencabut izin dari pengguna dan peran, serta membuat, menghapus, dan memodifikasi pengguna dan peran. |
SELECT_PRIV | Izin read-only pada database dan tabel. |
LOAD_PRIV | Izin tulis pada database dan tabel, termasuk izin LOAD, INSERT, dan DELETE. |
ALTER_PRIV | Izin ubah pada database dan tabel, termasuk izin untuk mengganti nama database dan tabel, izin untuk membuat, menghapus, dan memodifikasi kolom, serta izin untuk membuat dan menghapus partisi. |
CREATE_PRIV | Izin untuk membuat database, tabel, dan tampilan. |
DROP_PRIV | Izin untuk menghapus database, tabel, dan tampilan. |
USAGE_PRIV | Izin untuk menggunakan sumber daya. |
Tingkat izin
Tingkat izin berlaku untuk data dan sumber daya.
Data diklasifikasikan menjadi tingkat berikut: Global, Katalog, Database, dan Tabel. Tabel berikut menjelaskan tingkat izin.
Tingkat izin | Deskripsi |
GLOBAL LEVEL Izin global | Izin |
CATALOG LEVEL Izin tingkat katalog | Izin |
DATABASE LEVEL Izin tingkat database | Izin |
TABLE LEVEL Izin tingkat tabel | Izin |
Izin ADMIN_PRIV dan GRANT_PRIV
Baik izin ADMIN_PRIV maupun GRANT_PRIV memungkinkan Anda memberikan izin. Bagian ini menjelaskan catatan penggunaan izin ADMIN_PRIV dan GRANT_PRIV.
CREATE USER
Pengguna yang memiliki izin ADMIN_PRIV atau izin GRANT_PRIV di tingkat global dan database dapat membuat pengguna.
DROP USER
Pengguna yang memiliki izin ADMIN_PRIV atau izin GRANT_PRIV di tingkat global dapat menghapus pengguna.
CREATE/DROP ROLE
Pengguna yang memiliki izin ADMIN_PRIV atau izin GRANT_PRIV di tingkat global dapat membuat peran.
GRANT/REVOKE
Pengguna yang memiliki izin ADMIN_PRIV atau izin GRANT_PRIV di tingkat global dapat memberikan izin kepada dan mencabut izin dari pengguna.
Pengguna yang memiliki izin GRANT_PRIV di tingkat katalog dapat memberikan izin pada katalog yang ditentukan kepada atau mencabut izin dari pengguna.
Pengguna yang memiliki izin GRANT_PRIV di tingkat database dapat memberikan izin pada database yang ditentukan kepada atau mencabut izin dari pengguna.
Pengguna yang memiliki izin GRANT_PRIV di tingkat tabel dapat memberikan izin pada tabel tertentu di database yang ditentukan kepada atau mencabut izin dari pengguna.
SET PASSWORD
Pengguna yang memiliki izin ADMIN_PRIV atau izin GRANT_PRIV di tingkat global dapat menetapkan kata sandi untuk semua pengguna.
Pengguna biasa dapat menetapkan kata sandi yang sesuai dengan identitas pengguna mereka sendiri. Anda dapat menjalankan pernyataan
SELECT CURRENT_USER();untuk menanyakan identitas pengguna Anda.Pengguna yang memiliki izin GRANT_PRIV yang tidak berada di tingkat global tidak dapat menetapkan kata sandi untuk pengguna yang ada. Pengguna seperti itu hanya dapatmenetapkan kata sandi saat mereka membuat pengguna.
Properti pengguna
Tabel berikut menjelaskan properti yang terkait dengan pengguna.
Properti | Deskripsi |
cpu_resource_limit | Sumber daya CPU maksimum yang tersedia untuk kueri. Untuk informasi lebih lanjut, lihat variabel sesi |
default_load_cluster | Kluster default tempat data diimpor. |
exec_mem_limit | Ukuran maksimum memori yang tersedia untuk kueri. Untuk informasi lebih lanjut, lihat variabel sesi |
insert_timeout | Periode waktu habis untuk operasi INSERT. |
max_query_instances | Jumlah maksimum instans yang dapat digunakan pengguna untuk kueri pada satu waktu. |
max_user_connections | Jumlah maksimum koneksi pengguna. |
query_timeout | Periode waktu habis untuk kueri pengguna. |
resource_tags | Tag sumber daya. |
sql_block_rules | Aturan untuk memblokir kueri SQL. Jika pengguna mengirim kueri yang sesuai dengan aturan yang ditentukan, kueri tersebut akan ditolak. |
Jika properti pengguna seperti query_timeout juga ditentukan sebagai variabel, sistem mengambil nilai properti pengguna berdasarkan prioritas berikut: variabel sesi > properti pengguna > variabel global > nilai default. Jika tidak ada variabel sesi yang ditentukan untuk properti pengguna, sistem memeriksa apakah properti pengguna ditentukan secara langsung. Jika tidak, sistem memeriksa apakah variabel global ditentukan untuk properti pengguna. Jika tidak, sistem menggunakan nilai default untuk properti pengguna.
Tanya Jawab Umum
Pertanyaan: Apa yang harus saya lakukan jika nama domain bertentangan dengan alamat IP atau terjadi konflik alamat IP saat saya membuat pengguna dan memberikan izin kepada pengguna?
Jalankan pernyataan DROP USER untuk menghapus pengguna dan buat pengguna lain.
Skenario di mana nama domain bertentangan dengan alamat IP:
Setelah Anda menghapus pengguna, buat pengguna baru dan berikan izin kepada pengguna tersebut. Contoh kode:
CREATE USER test_user@['domain']; GRANT SELECT_PRIV ON.TO test_user@['domain'];Sebagai contoh, nama domain diselesaikan oleh DNS menjadi dua alamat IP: IP1 dan IP2.
Berikan izin kepada pengguna dengan identitas pengguna
test_user@['IP1']. Contoh kode:GRANT ALTER_PRIV ON.TO test_user@'IP1';Izin pengguna dengan identitas pengguna
test_user@'IP1'diubah dari SELECT_PRIV menjadi ALTER_PRIV. Pengguna dapat mengirim permintaan masuk dari IP1. Jika Anda mengubah izin pengguna dengan identitas penggunatest_user@['domain'], izin pengguna dengan identitas penggunatest_user@'IP1'tidak berubah.
Skenario di mana terjadi konflik alamat IP:
Buat pengguna baru. Contoh kode:
CREATE USER test_user@'%' IDENTIFIED BY "12345"; CREATE USER test_user@'192.%' IDENTIFIED BY "abcde";Prioritas '192.%' lebih tinggi daripada '%'. Jika pengguna bernama
test_usermenggunakan kata sandi '12345' untuk masuk ke instans SelectDB dari mesin dengan Blok CIDR192.168.0.0/16, permintaan masuk akan ditolak.