Membaca judul posting blog ini mungkin menimbulkan beberapa pertanyaan. Firewall SQL - apa itu? Apa fungsinya? Mengapa saya membutuhkan sesuatu seperti itu di tempat pertama? Nah, kemampuan untuk memblokir kueri tertentu bisa berguna dalam situasi tertentu. Saat menggunakan ProxySQL di depan server database Anda, proxy dapat memeriksa semua pernyataan SQL yang dikirim. ProxySQL memiliki mesin aturan yang canggih, dan dapat mencocokkan kueri yang diizinkan, diblokir, ditulis ulang dengan cepat, atau dialihkan ke server database tertentu. Mari kita lihat beberapa contoh.
Anda memiliki budak khusus yang digunakan oleh pengembang untuk menguji kueri mereka terhadap data produksi. Anda ingin memastikan pengembang hanya dapat terhubung ke host tertentu dan hanya menjalankan kueri SELECT.
Kasus lain, katakanlah Anda mengalami terlalu banyak kecelakaan dengan orang yang menjalankan perubahan skema dan Anda ingin membatasi pengguna mana yang dapat menjalankan pernyataan ALTER.
Terakhir, mari kita pikirkan tentang pendekatan paranoid di mana pengguna diizinkan untuk mengeksekusi hanya serangkaian kueri yang telah ditentukan sebelumnya.
Di lingkungan kami, kami memiliki pengaturan replikasi dengan master dan dua budak.
Di depan database kami, kami memiliki tiga node ProxySQL dengan Keepalive yang mengelola IP Virtual. Kami juga memiliki cluster ProxySQL yang dikonfigurasi (seperti yang dijelaskan di blog sebelumnya) sehingga kami tidak perlu khawatir membuat konfigurasi atau aturan kueri berubah tiga kali pada ketiga node ProxySQL. Untuk aturan kueri, pemisahan baca-tulis sederhana disiapkan:
Mari kita lihat bagaimana ProxySQL, dengan mekanisme aturan kuerinya yang ekstensif, dapat membantu kita mencapai tujuan dalam ketiga kasus tersebut.
Mengunci akses pengguna ke satu grup host
Budak khusus yang tersedia untuk pengembang - ini bukan praktik yang tidak biasa. Selama pengembang Anda dapat mengakses data produksi (dan jika tidak diizinkan, misalnya, karena alasan kepatuhan, penyembunyian data seperti yang dijelaskan dalam tutorial ProxySQL kami dapat membantu), ini dapat membantu mereka menguji dan mengoptimalkan kueri pada data dunia nyata mengatur. Mungkin juga membantu untuk memverifikasi data sebelum menjalankan beberapa perubahan skema. Misalnya, apakah kolom saya benar-benar unik sebelum menambahkan indeks unik?
Dengan ProxySQL, cukup mudah untuk membatasi akses. Sebagai permulaan, mari kita asumsikan bahwa hostgroup 30 berisi slave yang kita ingin agar dapat diakses oleh pengembang.
Kami membutuhkan pengguna yang akan digunakan oleh pengembang untuk mengakses budak itu. Jika Anda sudah memilikinya di ProxySQL, tidak apa-apa. Jika tidak, Anda mungkin perlu mengimpornya ke ProxySQL (jika dibuat di MySQL tetapi tidak di ProxySQL) atau membuatnya di kedua lokasi (jika Anda akan membuat pengguna baru). Mari kita pergi dengan opsi terakhir, membuat pengguna baru.
Mari buat pengguna baru dengan hak istimewa terbatas pada MySQL dan ProxySQL. Kami akan menggunakannya dalam aturan kueri untuk mengidentifikasi lalu lintas yang berasal dari pengembang.
Dalam aturan kueri ini kita akan mengarahkan semua kueri yang dijalankan oleh pengguna dev_test ke grup host 30. Kami ingin aturan ini aktif dan harus menjadi yang terakhir untuk diurai, oleh karena itu kami mengaktifkan 'Terapkan'. Kami juga mengonfigurasi RuleID agar lebih kecil dari ID aturan pertama yang ada karena kami ingin kueri ini dijalankan di luar penyiapan pemisahan baca/tulis biasa.
Seperti yang Anda lihat, kami menggunakan nama pengguna tetapi ada juga opsi lain.
Jika Anda dapat memprediksi host pengembangan mana yang akan mengirimkan lalu lintas ke database (misalnya, Anda dapat meminta pengembang menggunakan proxy tertentu sebelum mereka dapat mencapai database), Anda juga dapat menggunakan opsi "Alamat Klien" untuk mencocokkan kueri yang dijalankan oleh itu host tunggal dan mengarahkan mereka ke grup host yang benar.
Melarang pengguna menjalankan kueri tertentu
Sekarang, mari kita pertimbangkan kasus di mana kita ingin membatasi eksekusi beberapa perintah tertentu untuk pengguna tertentu. Ini mungkin berguna untuk memastikan bahwa orang yang tepat dapat menjalankan beberapa kueri yang memengaruhi kinerja seperti perubahan skema. ALTER akan menjadi kueri yang akan kita gunakan dalam contoh ini. Sebagai permulaan, mari tambahkan pengguna baru yang akan diizinkan untuk menjalankan perubahan skema. Kami akan menyebutnya 'admin_user'. Selanjutnya, kita perlu membuat aturan kueri yang diperlukan.
Kami akan membuat aturan kueri yang menggunakan ekspresi reguler '.*ALTER TABLE.*' untuk mencocokkan kueri. Aturan kueri ini harus dijalankan sebelum aturan pemisahan baca/tulis lainnya. Kami menetapkan ID aturan 20 untuk itu. Kami mendefinisikan pesan kesalahan yang akan dikembalikan ke klien jika aturan kueri ini akan dipicu. Setelah selesai, kami melanjutkan ke aturan kueri lain.
Di sini kami menggunakan ekspresi reguler yang sama untuk menangkap kueri tetapi kami tidak mendefinisikan teks kesalahan apa pun (yang berarti bahwa kueri tidak akan mengembalikan kesalahan). Kami juga menentukan pengguna mana yang diizinkan untuk menjalankannya (admin_user dalam kasus kami). Kami memastikan kueri ini dicentang sebelum kueri sebelumnya, jadi kami menetapkan ID aturan yang lebih rendah yaitu 19.
Setelah dua aturan kueri ini diterapkan, kami dapat menguji cara kerjanya. Mari kita coba masuk sebagai pengguna aplikasi dan menjalankan kueri ALTER TABLE:
[email protected]:~# mysql -P6033 -usbtest -ppass -h10.0.0.111
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 43160
Server version: 5.5.30 (ProxySQL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use sbtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> alter table sbtest1 add index (pad);
ERROR 1148 (42000): You are not allowed to execute ALTER
mysql> ^DBye
Seperti yang diharapkan, kami tidak dapat menjalankan kueri ini dan kami menerima pesan kesalahan. Sekarang mari kita coba terhubung menggunakan 'admin_user' kami:
[email protected]:~# mysql -P6033 -uadmin_user -ppass -h10.0.0.111
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 43180
Server version: 5.5.30 (ProxySQL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use sbtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> alter table sbtest1 add index (pad);
Query OK, 0 rows affected (0.99 sec)
Records: 0 Duplicates: 0 Warnings: 0
Kami berhasil menjalankan ALTER saat kami masuk menggunakan 'admin_user'. Ini adalah cara yang sangat sederhana untuk memastikan bahwa hanya orang yang ditunjuk yang dapat menjalankan perubahan skema pada database Anda.
Membuat daftar putih kueri yang diizinkan
Terakhir, mari kita pertimbangkan lingkungan yang terkunci rapat di mana hanya kueri yang telah ditentukan yang dapat dieksekusi. ProxySQL dapat dengan mudah digunakan untuk mengimplementasikan pengaturan seperti itu.
Pertama-tama, kita perlu menghapus semua aturan kueri yang ada sebelum kita dapat mengimplementasikan apa yang kita butuhkan. Kemudian, kita perlu membuat aturan kueri penampung-semua, yang akan memblokir semua kueri:
Selebihnya yang harus kita lakukan adalah membuat aturan kueri untuk semua kueri yang diizinkan. Anda dapat melakukan satu aturan per kueri. Atau Anda dapat menggunakan ekspresi reguler jika, misalnya, SELECT selalu boleh dijalankan. Satu-satunya hal yang harus Anda ingat adalah bahwa ID aturan harus lebih kecil dari ID aturan aturan penampung-semua ini, dan memastikan bahwa kueri pada akhirnya akan mencapai aturan dengan 'Terapkan' diaktifkan.
Kami berharap posting blog ini memberi Anda beberapa wawasan tentang bagaimana Anda dapat menggunakan ClusterControl dan ProxySQL untuk meningkatkan keamanan dan memastikan kepatuhan database Anda.