Keamanan adalah salah satu elemen terpenting dari lingkungan basis data yang dirancang dengan benar. Ada banyak vektor serangan yang digunakan dengan injeksi SQL yang mungkin paling populer. Anda dapat merancang lapisan pertahanan dalam kode aplikasi tetapi apa yang dapat Anda lakukan pada lapisan basis data? Hari ini kami ingin menunjukkan kepada Anda betapa mudahnya Anda dapat menerapkan firewall SQL di atas MySQL menggunakan ProxySQL. Di bagian kedua blog ini, kami akan menjelaskan bagaimana Anda dapat membuat daftar putih kueri yang diizinkan untuk mengakses database.
Pertama, kami ingin menerapkan ProxySQL. Cara termudah untuk melakukannya adalah dengan menggunakan ClusterControl. Dengan beberapa klik, Anda dapat menerapkannya ke cluster Anda.
Tentukan tempat untuk menyebarkannya, Anda dapat memilih host yang ada di cluster atau tulis saja IP atau nama host apa pun. Tetapkan kredensial untuk pengguna administratif dan pemantauan.
Kemudian Anda dapat membuat pengguna baru di database untuk digunakan dengan ProxySQL atau Anda dapat mengimpor salah satu yang sudah ada. Anda juga perlu menentukan node database yang ingin Anda sertakan dalam ProxySQL. Jawab jika Anda menggunakan transaksi implisit atau tidak dan Anda siap untuk menggunakan ProxySQL. Dalam beberapa menit, ProxySQL dengan konfigurasi yang disiapkan berdasarkan input Anda siap digunakan.
Mengingat masalah kami adalah keamanan, kami ingin dapat memberi tahu ProxySQL cara menangani kueri yang tidak sesuai. Mari kita lihat aturan kueri, mekanisme inti yang mengatur bagaimana ProxySQL menangani lalu lintas yang melewatinya. Daftar aturan kueri mungkin terlihat seperti ini:
Mereka diterapkan dari ID terendah dan seterusnya.
Mari kita coba membuat aturan kueri yang hanya mengizinkan kueri SELECT untuk pengguna tertentu:
Kami menambahkan aturan kueri di awal daftar aturan. Kami akan mencocokkan apa pun yang bukan PILIH (harap perhatikan Pola Pencocokan Negasi diaktifkan). Aturan kueri hanya akan digunakan jika nama pengguna adalah 'devuser'. Jika semua kondisi sudah sesuai, pengguna akan melihat error seperti pada kolom “Error Msg”.
[email protected]:~# mysql -u devuser -h 10.0.0.144 -P6033 -ppass
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 3024
Server version: 5.5.30 (ProxySQL)
Copyright (c) 2009-2019 Percona LLC and/or its affiliates
Copyright (c) 2000, 2019, 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> create schema myschema;
ERROR 1148 (42000): The query is not allowed
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.01 sec)
mysql> SELECT * FROM sbtest.sbtest1 LIMIT 1\G
*************************** 1. row ***************************
id: 1
k: 503019
c: 18034632456-32298647298-82351096178-60420120042-90070228681-93395382793-96740777141-18710455882-88896678134-41810932745
pad: 43683718329-48150560094-43449649167-51455516141-06448225399
1 row in set (0.00 sec)
Contoh lain, kali ini kami akan mencoba untuk mencegah kecelakaan terkait dengan situasi Bobby Tables.
Dengan aturan kueri ini, tabel 'siswa' Anda tidak akan dijatuhkan oleh Bobby:
mysql> use school;
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> INSERT INTO students VALUES (1, 'Robert');DROP TABLE students;--
Query OK, 1 row affected (0.01 sec)
ERROR 1148 (42000): Only superuser can execute DROP TABLE;
Seperti yang Anda lihat, Bobby tidak dapat menghapus tabel 'siswa' kami. Dia hanya dimasukkan dengan baik ke dalam tabel.