MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Tips dan Trik untuk Menerapkan Kontrol Akses Berbasis Peran Database untuk MariaDB

Dalam sistem manajemen basis data (DBMS), kontrol akses berbasis peran (RBAC), adalah pembatasan sumber daya basis data berdasarkan sekumpulan kelompok hak istimewa yang telah ditentukan sebelumnya dan telah menjadi salah satu metode untuk kontrol akses lanjutan. Peran basis data dapat dibuat dan dijatuhkan, serta memiliki hak istimewa yang diberikan dan dicabut darinya. Peran dapat diberikan dan dicabut dari akun pengguna individu. Peran aktif yang berlaku untuk akun dapat dipilih dari yang diberikan ke akun dan diubah selama sesi untuk akun tersebut.

Dalam posting blog ini, kami akan membahas beberapa tip dan trik dalam menggunakan peran database untuk mengelola hak pengguna dan sebagai mekanisme kontrol akses lanjutan untuk akses database kami. Jika Anda ingin mempelajari dasar-dasar role di MySQL dan MariaDB, lihat postingan blog ini, Database User Management:Managing Roles for MariaDB.

Peran MySQL vs MariaDB

MySQL dan MariaDB menggunakan dua mekanisme peran yang berbeda. Di MySQL 8.0 dan yang lebih baru, perannya mirip dengan pengguna lain, dengan nama pengguna dan host ('role1'@'localhost'). Ya, itulah nama peran, yang secara praktis mirip dengan definisi host-pengguna standar. MySQL menyimpan definisi peran seperti halnya menyimpan hak istimewa pengguna di tabel sistem mysql.user.

MariaDB telah memperkenalkan peran dan hak akses di MariaDB versi 10.0.5 (Nov 2013), baik 8 tahun sebelum MySQL menyertakan fitur ini di MySQL8.0. Ini mengikuti manajemen peran serupa dalam sistem database yang sesuai dengan SQL, lebih kuat dan lebih mudah dipahami. MariaDB menyimpan definisi di tabel sistem mysql.user yang ditandai dengan kolom yang baru ditambahkan yang disebut is_role. MySQL menyimpan peran secara berbeda, menggunakan kombinasi host-pengguna yang mirip dengan manajemen pengguna MySQL standar.

Karena itu, migrasi peran antara kedua DBMS ini sekarang tidak kompatibel satu sama lain.

Peran Administratif dan Cadangan MariaDB

MySQL memiliki hak istimewa dinamis, yang menyediakan serangkaian hak istimewa untuk tugas administrasi umum. Untuk MariaDB, kita dapat mengatur hal serupa menggunakan peran, terutama untuk hak istimewa pencadangan dan pemulihan. Untuk Pencadangan MariaDB, karena ini adalah pencadangan fisik dan memerlukan serangkaian hak istimewa yang berbeda, kami dapat membuat peran khusus untuk ditetapkan ke pengguna basis data lain.

Pertama, buat peran dan tetapkan dengan hak istimewa yang tepat:

MariaDB> CREATE ROLE mariadb_backup;
MariaDB> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO mariadb_backup;

Kami kemudian dapat membuat pengguna cadangan, memberikannya dengan peran mariadb_backup dan menetapkan peran default:

MariaDB> CREATE USER [email protected] IDENTIFIED BY 'passw0rdMMM';
MariaDB> GRANT mariadb_backup TO [email protected];
MariaDB> SET DEFAULT ROLE mariadb_backup FOR [email protected];

Untuk mysqldump atau mariadb-dump, hak minimal untuk membuat cadangan dapat diatur seperti di bawah ini:

MariaDB> CREATE ROLE mysqldump_backup;
MariaDB> GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES ON *.* TO mysqldump_backup;

Kami kemudian dapat membuat pengguna cadangan, memberikannya dengan peran mysqldump_backup dan menetapkan peran default:

MariaDB> CREATE USER [email protected] IDENTIFIED BY 'p4ss182MMM';
MariaDB> GRANT mysqldump_backup TO [email protected];
MariaDB> SET DEFAULT ROLE mysqldump_backup FOR [email protected];

Untuk pemulihan, biasanya memerlukan serangkaian hak istimewa yang berbeda, yaitu sedikit:

MariaDB> CREATE ROLE mysqldump_restore;
MariaDB> GRANT SUPER, ALTER, INSERT, CREATE, DROP, LOCK TABLES, REFERENCES, SELECT, CREATE ROUTINE, TRIGGER ON *.* TO mysqldump_restore;

Kami kemudian dapat membuat pengguna pemulihan, memberikannya dengan peran mysqldump_restore, dan menetapkan peran default:

MariaDB> CREATE USER [email protected] IDENTIFIED BY 'p4ss182MMM';
MariaDB> GRANT mysqldump_restore TO [email protected];
MariaDB> SET DEFAULT ROLE mysqldump_restore FOR [email protected];

Dengan menggunakan trik ini, kami dapat menyederhanakan proses pembuatan pengguna administratif dengan menetapkan peran dengan hak istimewa yang telah ditentukan sebelumnya. Dengan demikian, pernyataan GRANT kami dapat dipersingkat dan mudah dipahami.

Menciptakan Peran Di Atas Peran Di MariaDB 

Kita dapat membuat peran lain di atas peran yang sudah ada serupa dengan keanggotaan grup bersarang dengan kontrol yang lebih halus atas hak istimewa. Misalnya, kita dapat membuat 4 peran berikut:

MariaDB> CREATE ROLE app_developer, app_reader, app_writer, app_structure;

Berikan hak istimewa untuk mengelola struktur skema ke peran app_structure:

MariaDB> GRANT CREATE, ALTER, DROP, CREATE VIEW, CREATE ROUTINE, INDEX, TRIGGER, REFERENCES ON app.* to app_structure;

Berikan hak istimewa untuk Bahasa Manipulasi Data (DML) ke peran app_writer:

MariaDB> GRANT INSERT, DELETE, UPDATE, CREATE TEMPORARY TABLES app.* to app_writer;

Berikan hak istimewa untuk Data Query Language (DQL) ke peran app_reader:

MariaDB> GRANT SELECT, LOCK TABLES, SHOW VIEW app.* to app_reader;

Dan terakhir, kita dapat menetapkan semua peran di atas ke app_developer yang seharusnya memiliki kontrol penuh atas skema:

MariaDB> GRANT app_structure TO app_developer;
MariaDB> GRANT app_reader TO app_developer;
MariaDB> GRANT app_writer TO app_developer;

Peran sudah siap dan sekarang kita dapat membuat pengguna database dengan peran app_developer:

MariaDB> CREATE USER 'michael'@'192.168.0.%' IDENTIFIED BY 'passw0rdMMMM';
MariaDB> GRANT app_developer TO 'michael'@'192.168.0.%';
MariaDB> GRANT app_reader TO 'michael'@'192.168.0.%';

Karena Michael sekarang termasuk dalam peran app_deleloper dan app_reader, kami juga dapat menetapkan hak istimewa terendah sebagai peran default untuk melindunginya dari kesalahan manusia yang tidak diinginkan:

MariaDB> SET DEFAULT ROLE app_reader FOR 'michael'@'192.168.0.%';

Hal yang baik tentang menggunakan peran adalah Anda dapat menyembunyikan hak istimewa yang sebenarnya dari pengguna database. Pertimbangkan pengguna database berikut yang baru saja login:

MariaDB> SELECT user();
+----------------------+
| user()               |
+----------------------+
| [email protected] |
+----------------------+

Saat mencoba mengambil hak istimewa menggunakan SHOW GRANTS, Michael akan melihat:

MariaDB> SHOW GRANTS FOR 'michael'@'192.168.0.%';
+----------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                   |
+----------------------------------------------------------------------------------------------------------------+
| GRANT `app_developer` TO `michael`@`localhost`                                                                 |
| GRANT USAGE ON *.* TO `michael`@`localhost` IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
+----------------------------------------------------------------------------------------------------------------+

Dan ketika Michael mencoba mencari hak istimewa app_developer, dia akan melihat kesalahan ini:

MariaDB> SHOW GRANTS FOR FOR app_developer;
ERROR 1044 (42000): Access denied for user 'michael'@'localhost' to database 'mysql'

Trik ini memungkinkan DBA hanya menampilkan pengelompokan logis tempat pengguna berada dan tidak lebih. Kami dapat mengurangi vektor serangan dari aspek ini karena pengguna tidak akan mengetahui hak istimewa yang sebenarnya diberikan kepada mereka.

Menegakkan Peran Default Di MariaDB

Dengan menerapkan peran default, pengguna database dapat dilindungi pada lapisan pertama dari kesalahan manusia yang tidak disengaja. Misalnya, pertimbangkan pengguna Michael yang telah diberikan peran app_developer, di mana peran app_developer adalah superset dari peran app_strucutre, app_writer, dan app_reader, seperti yang diilustrasikan di bawah ini:

Karena Michael termasuk dalam peran app_deleloper, kami juga dapat menyetel hak istimewa terendah sebagai peran default untuk melindunginya dari modifikasi data yang tidak disengaja:

MariaDB> GRANT app_reader TO 'michael'@'192.168.0.%';
MariaDB> SET DEFAULT ROLE app_reader FOR 'michael'@'192.168.0.%';

Adapun pengguna "michael", dia akan melihat yang berikut ini setelah login:

MariaDB> SELECT user(),current_role();
+-------------------+----------------+
| user()            | current_role() |
+-------------------+----------------+
| [email protected] | app_reader     |
+-------------------+----------------+

Peran defaultnya adalah app_reader, yang merupakan hak read_only untuk database yang disebut "app". Pengguna saat ini memiliki kemampuan untuk beralih di antara peran apa pun yang berlaku menggunakan fitur SET ROLE. Adapun Michael, ia dapat beralih ke peran lain dengan menggunakan pernyataan berikut:

MariaDB> SET ROLE app_developer;

Pada titik ini, Michael seharusnya dapat menulis ke database 'app' karena app_developer adalah superset dari app_writer dan app_structure. Untuk memeriksa peran yang tersedia untuk pengguna saat ini, kita dapat menanyakan tabel information_schema.applicable_roles:

MariaDB> SELECT * FROM information_schema.applicable_roles;
+-------------------+---------------+--------------+------------+
| GRANTEE           | ROLE_NAME     | IS_GRANTABLE | IS_DEFAULT |
+-------------------+---------------+--------------+------------+
| [email protected] | app_developer | NO           | NO         |
| app_developer     | app_writer    | NO           | NULL       |
| app_developer     | app_reader    | NO           | NULL       |
| app_developer     | app_structure | NO           | NULL       |
| [email protected] | app_reader    | NO           | YES        |
+-------------------+---------------+--------------+------------+

Dengan cara ini, kami menetapkan peran utama untuk pengguna, dan peran utama dapat menjadi hak istimewa serendah mungkin untuk pengguna tertentu. Pengguna harus menyetujui peran aktifnya, dengan beralih ke peran istimewa lainnya sebelum menjalankan aktivitas berisiko apa pun ke server database.

Pemetaan Peran di MariaDB

MariaDB menyediakan tabel pemetaan peran yang disebut mysql.roles_mapping. Pemetaan memungkinkan kita untuk dengan mudah memahami korelasi antara pengguna dan perannya, dan bagaimana peran dipetakan ke peran lain:

MariaDB> SELECT * FROM mysql.roles_mapping;
+-------------+-------------------+------------------+--------------+
| Host        | User              | Role             | Admin_option |
+-------------+-------------------+------------------+--------------+
| localhost   | root              | app_developer    | Y            |
| localhost   | root              | app_writer       | Y            |
| localhost   | root              | app_reader       | Y            |
| localhost   | root              | app_structure    | Y            |
|             | app_developer     | app_structure    | N            |
|             | app_developer     | app_reader       | N            |
|             | app_developer     | app_writer       | N            |
| 192.168.0.% | michael           | app_developer    | N            |
| localhost   | michael           | app_developer    | N            |
| localhost   | root              | mysqldump_backup | Y            |
| localhost   | dump_user1        | mysqldump_backup | N            |
| localhost   | root              | mariadb_backup   | Y            |
| localhost   | mariabackup_user1 | mariadb_backup   | N            |
+-------------+-------------------+------------------+--------------+

Dari output di atas, kita dapat mengetahui bahwa Pengguna tanpa Host pada dasarnya adalah peran di atas peran dan pengguna administratif (Admin_option =Y) juga ditugaskan ke peran yang dibuat secara otomatis. Untuk mendapatkan daftar role yang dibuat, kita dapat melakukan query ke tabel pengguna MySQL:

MariaDB> SELECT user FROM mysql.user WHERE is_role = 'Y';
+------------------+
| User             |
+------------------+
| app_developer    |
| app_writer       |
| app_reader       |
| app_structure    |
| mysqldump_backup |
| mariadb_backup   |
+------------------+

Pemikiran Terakhir

Menggunakan peran dapat meningkatkan keamanan database dengan memberikan lapisan perlindungan tambahan terhadap modifikasi data yang tidak disengaja oleh pengguna database. Selain itu, menyederhanakan manajemen hak istimewa dan operasi pemeliharaan untuk organisasi yang memiliki banyak pengguna database.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana SUARA SEPERTI Bekerja di MariaDB

  2. Bagaimana WEEKOFYEAR() Bekerja di MariaDB

  3. MariaDB LENGTH() vs LENGTHB():Apa Bedanya?

  4. Bagaimana TRUNCATE() Bekerja di MariaDB

  5. Bagaimana DATE() Bekerja di MariaDB