Đọc tiêu đề của bài đăng blog này có thể đặt ra một số câu hỏi. Tường lửa SQL - đó là gì? Nó làm gì? Tại sao tôi lại cần một thứ như vậy ngay từ đầu? Chà, khả năng chặn một số truy vấn có thể hữu ích trong một số tình huống nhất định. Khi sử dụng ProxySQL trước máy chủ cơ sở dữ liệu của bạn, proxy có thể kiểm tra tất cả các câu lệnh SQL đang được gửi. ProxySQL có một công cụ quy tắc phức tạp và có thể khớp với các truy vấn được cho phép, bị chặn, được viết lại khi đang di chuyển hoặc được chuyển đến một máy chủ cơ sở dữ liệu cụ thể. Hãy xem qua một số ví dụ.
Bạn có một nô lệ chuyên dụng được các nhà phát triển sử dụng để kiểm tra các truy vấn của họ dựa trên dữ liệu sản xuất. Bạn muốn đảm bảo rằng các nhà phát triển chỉ có thể kết nối với máy chủ cụ thể đó và chỉ thực thi các truy vấn CHỌN.
Một trường hợp khác, giả sử rằng bạn đã gặp quá nhiều tai nạn với những người đang chạy các thay đổi giản đồ và bạn muốn giới hạn người dùng nào có thể thực thi câu lệnh ALTER.
Cuối cùng, hãy nghĩ về một cách tiếp cận hoang tưởng, trong đó người dùng chỉ được phép thực thi một tập hợp các truy vấn trong danh sách cho phép được xác định trước.
Trong môi trường của chúng tôi, chúng tôi có một thiết lập sao chép với chủ và hai nô lệ.
Trước cơ sở dữ liệu của chúng tôi, chúng tôi có ba nút ProxySQL với Keepalived quản lý IP ảo. Chúng tôi cũng đã định cấu hình cụm ProxySQL (như đã giải thích trong blog trước này), vì vậy chúng tôi không phải lo lắng về việc thực hiện các thay đổi cấu hình hoặc quy tắc truy vấn ba lần trên cả ba nút ProxySQL. Đối với các quy tắc truy vấn, một phân tách đọc-ghi đơn giản được thiết lập:
Hãy xem cách ProxySQL, với cơ chế quy tắc truy vấn mở rộng, có thể giúp chúng ta đạt được mục tiêu của mình trong cả ba trường hợp đó.
Khóa quyền truy cập của người dùng vào một nhóm máy chủ duy nhất
Một nô lệ chuyên dụng có sẵn cho các nhà phát triển - đây không phải là một thực tế phổ biến. Miễn là các nhà phát triển của bạn có thể truy cập dữ liệu sản xuất (và nếu chúng không được phép, ví dụ:vì lý do tuân thủ, việc che dữ liệu như được giải thích trong hướng dẫn ProxySQL của chúng tôi có thể hữu ích), điều này có thể giúp họ kiểm tra và tối ưu hóa các truy vấn trên dữ liệu thế giới thực đặt. Nó cũng có thể giúp xác minh dữ liệu trước khi thực hiện một số thay đổi giản đồ. Ví dụ:cột của tôi có thực sự là duy nhất trước khi thêm chỉ mục duy nhất không?
Với ProxySQL, việc hạn chế quyền truy cập khá dễ dàng. Đối với người mới bắt đầu, hãy giả sử rằng nhóm máy chủ 30 có chứa nô lệ mà chúng tôi muốn các nhà phát triển truy cập.
Chúng tôi cần một người dùng sẽ được các nhà phát triển sử dụng để truy cập nô lệ đó. Nếu bạn đã có nó trong ProxySQL, điều đó không sao cả. Nếu không, bạn có thể cần nhập nó vào ProxySQL (nếu nó được tạo trong MySQL nhưng không phải trong ProxySQL) hoặc tạo nó ở cả hai vị trí (nếu bạn sẽ tạo một người dùng mới). Hãy bắt đầu với tùy chọn cuối cùng, tạo người dùng mới.
Hãy tạo một người dùng mới với các đặc quyền hạn chế trên cả MySQL và ProxySQL. Chúng tôi sẽ sử dụng nó trong các quy tắc truy vấn để xác định lưu lượng truy cập đến từ các nhà phát triển.
Trong quy tắc truy vấn này, chúng tôi sẽ chuyển hướng tất cả các truy vấn được thực thi bởi người dùng dev_test đến nhóm máy chủ 30. Chúng tôi muốn quy tắc này hoạt động và nó phải là quy tắc cuối cùng để phân tích cú pháp, do đó chúng tôi đã bật ‘Áp dụng’. Chúng tôi cũng đã định cấu hình RuleID nhỏ hơn ID của quy tắc hiện có đầu tiên vì chúng tôi muốn truy vấn này được thực thi bên ngoài thiết lập phân tách đọc / ghi thông thường.
Như bạn có thể thấy, chúng tôi đã sử dụng tên người dùng nhưng cũng có các tùy chọn khác.
Nếu bạn có thể dự đoán máy chủ phát triển nào sẽ gửi lưu lượng truy cập đến cơ sở dữ liệu (ví dụ:bạn có thể yêu cầu các nhà phát triển sử dụng một proxy cụ thể trước khi họ có thể truy cập cơ sở dữ liệu), bạn cũng có thể sử dụng tùy chọn “Địa chỉ máy khách” để khớp với các truy vấn được thực thi bởi đó máy chủ duy nhất và chuyển hướng chúng đến một nhóm máy chủ chính xác.
Không cho phép người dùng thực hiện các truy vấn nhất định
Bây giờ, hãy xem xét trường hợp chúng ta muốn giới hạn việc thực thi một số lệnh cụ thể cho một người dùng nhất định. Điều này có thể hữu ích để đảm bảo rằng những người phù hợp có thể chạy một số hiệu suất ảnh hưởng đến các truy vấn như thay đổi giản đồ. ALTER sẽ là truy vấn mà chúng ta sẽ sử dụng trong ví dụ này. Đối với người mới bắt đầu, hãy thêm một người dùng mới sẽ được phép thực hiện các thay đổi giản đồ. Chúng tôi sẽ gọi nó là ‘admin_user’. Tiếp theo, chúng ta cần tạo các quy tắc truy vấn bắt buộc.
Chúng tôi sẽ tạo một quy tắc truy vấn sử dụng biểu thức chính quy ‘. * ALTER TABLE. *’ Để khớp với các truy vấn. Quy tắc truy vấn này nên được thực thi trước các quy tắc phân chia đọc / ghi khác. Chúng tôi đã chỉ định ID quy tắc là 20 cho nó. Chúng tôi xác định một thông báo lỗi sẽ được trả lại cho máy khách trong trường hợp quy tắc truy vấn này được kích hoạt. Sau khi hoàn tất, chúng tôi chuyển sang quy tắc truy vấn khác.
Ở đây, chúng tôi sử dụng cùng một biểu thức chính quy để bắt truy vấn nhưng chúng tôi không xác định bất kỳ văn bản lỗi nào (có nghĩa là truy vấn đó sẽ không trả lại lỗi). Chúng tôi cũng xác định người dùng nào được phép thực thi nó (admin_user trong trường hợp của chúng tôi). Chúng tôi đảm bảo rằng truy vấn này được kiểm tra trước truy vấn trước đó, vì vậy chúng tôi đã chỉ định một ID quy tắc thấp hơn là 19 cho nó.
Khi hai quy tắc truy vấn này có sẵn, chúng tôi có thể kiểm tra cách chúng hoạt động. Hãy thử đăng nhập với tư cách người dùng ứng dụng và chạy truy vấn 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
Như mong đợi, chúng tôi không thể thực hiện truy vấn này và chúng tôi nhận được thông báo lỗi. Bây giờ hãy thử kết nối bằng ‘admin_user’ của chúng tôi:
[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
Chúng tôi đã quản lý để thực thi ALTER khi chúng tôi đăng nhập bằng ‘admin_user’. Đây là một cách rất đơn giản để đảm bảo rằng chỉ những người được chỉ định mới có thể chạy các thay đổi giản đồ trên cơ sở dữ liệu của bạn.
Tạo danh sách trắng các truy vấn được phép
Cuối cùng, hãy xem xét một môi trường bị khóa chặt chẽ, nơi chỉ có thể thực thi các truy vấn xác định trước. ProxySQL có thể dễ dàng được sử dụng để triển khai thiết lập như vậy.
Trước hết, chúng ta cần loại bỏ tất cả các quy tắc truy vấn hiện có trước khi có thể triển khai những gì chúng ta cần. Sau đó, chúng ta cần tạo quy tắc truy vấn tóm tắt, quy tắc này sẽ chặn tất cả các truy vấn:
Phần còn lại chúng ta phải làm là tạo các quy tắc truy vấn cho tất cả các truy vấn được phép. Bạn có thể thực hiện một quy tắc cho mỗi truy vấn. Hoặc bạn có thể sử dụng biểu thức chính quy nếu chẳng hạn như các CHỌN luôn chạy được. Điều duy nhất bạn phải nhớ là ID quy tắc phải nhỏ hơn ID quy tắc của quy tắc nhận tất cả này và đảm bảo rằng cuối cùng truy vấn sẽ đạt được quy tắc đã bật "Áp dụng".
Chúng tôi hy vọng rằng bài đăng trên blog này đã cung cấp cho bạn một số thông tin chi tiết về cách bạn có thể sử dụng ClusterControl và ProxySQL để cải thiện tính bảo mật và đảm bảo tính tuân thủ của cơ sở dữ liệu của bạn.