1. Bảo mật máy chủ của bạn
Nhiều cuộc tấn công đã biết chỉ có thể xảy ra khi truy cập vật lý vào một máy. Vì lý do này, tốt nhất là máy chủ ứng dụng và máy chủ cơ sở dữ liệu trên các máy khác nhau. Nếu điều này là không thể, cần phải cẩn thận hơn, Nếu không, bằng cách thực hiện các lệnh từ xa thông qua máy chủ ứng dụng, kẻ tấn công có thể làm hại cơ sở dữ liệu của bạn ngay cả khi không có quyền. Vì lý do này, bất kỳ dịch vụ nào chạy trên cùng một máy với cơ sở dữ liệu phải được cấp quyền thấp nhất có thể mà vẫn cho phép dịch vụ hoạt động.
Đừng quên cài đặt toàn bộ gói bảo mật:Chống vi-rút và chống thư rác, Tường lửa, và tất cả các gói bảo mật được nhà cung cấp hệ điều hành của bạn đề xuất. Ngoài ra, đừng quên dành 10 phút để suy nghĩ về vị trí thực của máy chủ - nếu đặt sai vị trí, máy chủ của bạn có thể bị đánh cắp, ngập lụt, bị động vật hoang dã hoặc người lang thang làm hại.
2. Localhost Security hoặc Tắt hoặc hạn chế quyền truy cập từ xa
Xem xét liệu MySQL sẽ được truy xuất từ hệ thống hay được truy cập trực tiếp từ máy chủ của chính nó. Nếu quyền truy cập từ xa được sử dụng, hãy đảm bảo rằng các máy chủ chỉ có đặc điểm mới có thể truy cập vào máy chủ. Điều này thường được thực hiện thông qua trình bao bọc TCP, bảng IP hoặc một số công cụ hỗ trợ truy cập phần cứng hoặc lập trình tường lửa khác.
Để hạn chế MySQL mở ổ cắm mạng, thông số đi kèm phải được đưa vào vùng [mysqld] của my.cnf hoặc my.ini:
bỏ qua mạng
Tài liệu nằm trong "C:\ Program Files \ MySQL \ MySQL Server 5.1" danh mục trên hệ điều hành Windows hoặc "/etc/my.cnf" hoặc "/etc/mysql/my.cnf" trên Linux.
Dòng này làm tê liệt quá trình bắt đầu quản trị hệ thống ở giữa khi khởi động MySQL. Sẽ là lý tưởng nếu bạn lưu ý rằng kết nối cục bộ có thể được sử dụng để thiết lập kết nối với máy chủ MySQL.
Một giải pháp khả thi khác là buộc MySQL chỉ lắng nghe localhost bằng cách thêm dòng sau vào [mysqld] phần của my.cnf bind-address =127.0.0.1
Bạn có thể không sẵn sàng mất khả năng truy cập hệ thống vào máy chủ cơ sở dữ liệu của mình nếu các máy khách trong tổ chức của bạn giao diện với máy chủ từ máy của họ hoặc máy chủ web được giới thiệu trên một máy thay thế. Trong trường hợp đó, cần xem xét cú pháp cấp quyền hạn chế sau:
mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';
3. Vô hiệu hóa việc sử dụng LOCAL INFILE
Thay đổi tiếp theo là vô hiệu hóa việc sử dụng "THÔNG TIN ĐỊA PHƯƠNG TẢI DỮ LIỆU" lệnh, điều này sẽ giúp giữ cho việc truy cập chưa được phê duyệt từ các bản ghi vùng lân cận. Điều này đặc biệt quan trọng khi tìm thấy các lỗ hổng SQL Injection mới trong các ứng dụng PHP.
Ngoài ra, trong một số trường hợp nhất định, "THÔNG TIN ĐỊA PHƯƠNG" lệnh có thể được sử dụng để truy cập vào các tệp khác trên hệ điều hành, chẳng hạn như "/ etc / passwd" , sử dụng lệnh sau:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
Hoặc thậm chí ít khó hơn đáng kể:
mysql> SELECT load\_file("/etc/passwd")
Để vô hiệu hóa việc sử dụng "LOCAL INFILE" , tham số sau phải được thêm vào [mysqld] của tệp cấu hình MySQL.
set-variable=local-infile=0
4. Thay đổi tên người dùng và mật khẩu gốc, giữ chúng mạnh mẽ.
Tên người dùng quản trị viên mặc định trên máy chủ MySQL là "root" . Tin tặc thường cố gắng giành quyền truy cập vào các quyền của nó. Để thực hiện tác vụ này khó hơn, hãy đổi tên "root" sang thứ khác và cung cấp mật khẩu dài, phức tạp gồm cả chữ và số.
Để đổi tên tên người dùng của quản trị viên, hãy sử dụng lệnh đổi tên trong bảng điều khiển MySQL:
mysql> RENAME USER root TO new\_user;
MySQL "RENAME USER" lệnh lần đầu tiên xuất hiện trong MySQL phiên bản 5.0.2. Nếu bạn sử dụng phiên bản MySQL cũ hơn, bạn có thể sử dụng các lệnh khác để đổi tên người dùng:
mysql> use mysql;
mysql> update user set user="new\_user" where user="root";
mysql> flush privileges;
Để thay đổi mật khẩu của người dùng, hãy sử dụng dòng lệnh sau:
mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');
Cũng có thể thay đổi mật khẩu bằng cách sử dụng "mysqladmin" tiện ích:
shell> mysqladmin -u username -p password newpass
5. Xóa cơ sở dữ liệu "Kiểm tra"
MySQL đi kèm với một cơ sở dữ liệu "thử nghiệm" được dùng làm không gian thử nghiệm. Nó có thể được truy cập bởi người dùng ẩn danh, và do đó được sử dụng bởi nhiều cuộc tấn công.
Để xóa cơ sở dữ liệu này, hãy sử dụng lệnh drop như sau:
mysql> drop database test;
Hoặc sử dụng "mysqladmin" lệnh:
shell> mysqladmin -u username -p drop test
6. Xóa tài khoản ẩn danh và tài khoản lỗi thời
Cơ sở dữ liệu MySQL đi kèm với một số người dùng ẩn danh với mật khẩu trống. Do đó, bất kỳ ai cũng có thể kết nối với cơ sở dữ liệu để kiểm tra xem có phải trường hợp này hay không, hãy làm như sau:
mysql> select \* from mysql.user where user="";
Trong một hệ thống an toàn, không có dòng nào được lặp lại. Một cách khác để làm tương tự:
mysql> SHOW GRANTS FOR ''@'localhost';
mysql> SHOW GRANTS FOR ''@'myhost';
Nếu khoản tài trợ tồn tại, thì bất kỳ ai cũng có thể truy cập cơ sở dữ liệu và ít nhất sử dụng cơ sở dữ liệu mặc định "test" . Kiểm tra điều này với:
shell> mysql -u blablabla
Để xóa tài khoản, hãy thực hiện lệnh sau:
mysql> DROP USER "";
MySQL "DROP USER" lệnh được hỗ trợ bắt đầu với MySQL phiên bản 5.0. Nếu bạn sử dụng phiên bản MySQL cũ hơn, bạn có thể xóa tài khoản như sau:
mysql> use mysql;
mysql> DELETE FROM user WHERE user="";
mysql> flush privileges;
7. Tăng cường bảo mật với Kiểm soát truy cập dựa trên vai trò
Một khuyến nghị bảo mật cơ sở dữ liệu rất phổ biến là hạ thấp các quyền được cấp cho các bên khác nhau. MySQL không có gì khác biệt. Thông thường, khi các nhà phát triển làm việc, họ sử dụng quyền tối đa của hệ thống và ít xem xét các nguyên tắc cấp phép hơn chúng ta có thể mong đợi. Thực hành này có thể khiến cơ sở dữ liệu gặp rủi ro đáng kể.
* Mọi cài đặt MySQL 5.x mới đã được cài đặt bằng các biện pháp bảo mật phù hợp.
Để bảo vệ cơ sở dữ liệu của bạn, hãy đảm bảo rằng thư mục tệp trong đó cơ sở dữ liệu MySQL thực sự được lưu trữ thuộc sở hữu của người dùng "mysql" và nhóm "mysql".
shell>ls -l /var/lib/mysql
Ngoài ra, hãy đảm bảo rằng chỉ người dùng "mysql" và "root" mới có quyền truy cập vào thư mục /var/lib/mysql
.
Các tệp nhị phân mysql, nằm trong thư mục / usr / bin /, phải được sở hữu bởi người dùng "root" hoặc hệ thống cụ thể "mysql". Những người dùng khác sẽ không có quyền ghi vào các tệp này.
shell>ls -l /usr/bin/my\*
8. Kiểm tra các đặc quyền cơ sở dữ liệu
Quyền của hệ điều hành đã được sửa trong phần trước. Bây giờ hãy nói về quyền cơ sở dữ liệu. Trong hầu hết các trường hợp, có một người dùng quản trị viên (đã đổi tên thành "root") và một hoặc nhiều người dùng thực cùng tồn tại trong cơ sở dữ liệu. Thông thường, "gốc" không liên quan gì đến dữ liệu trong cơ sở dữ liệu; thay vào đó, nó được sử dụng để duy trì máy chủ và các bảng của nó, cấp và thu hồi quyền, v.v.
Mặt khác, một số id người dùng được sử dụng để truy cập dữ liệu, chẳng hạn như id người dùng được gán cho máy chủ web để thực hiện các truy vấn "select \ update \ insert \ delete" và thực thi các thủ tục đã lưu trữ. Trong hầu hết các trường hợp, không có người dùng nào khác là cần thiết; tuy nhiên, chỉ bạn, với tư cách là quản trị viên hệ thống mới có thể thực sự biết nhu cầu ứng dụng của bạn.
Chỉ tài khoản quản trị viên mới cần được cấp các đặc quyền SUPER / PROCESS / FILE và quyền truy cập vào cơ sở dữ liệu mysql. Thông thường, bạn nên hạ thấp quyền của quản trị viên để truy cập dữ liệu.
Xem lại các đặc quyền của những người dùng còn lại và đảm bảo rằng các đặc quyền này được đặt một cách thích hợp. Điều này có thể được thực hiện bằng cách sử dụng các bước sau.
mysql> use mysql;
[Xác định người dùng]
mysql> select \* from users;
[Liệt kê các khoản tài trợ của tất cả người dùng]
mysql> show grants for ‘root’@’localhost’;
Câu lệnh trên phải được thực thi cho mỗi người dùng! Lưu ý rằng chỉ những người dùng thực sự cần quyền root mới được cấp cho họ.
Một đặc quyền thú vị khác là "HIỂN THỊ DỮ LIỆU". Theo mặc định, lệnh có thể được sử dụng bởi tất cả mọi người có quyền truy cập vào dấu nhắc MySQL. Họ có thể sử dụng nó để thu thập thông tin (ví dụ:lấy tên cơ sở dữ liệu) trước khi tấn công cơ sở dữ liệu bằng cách lấy cắp dữ liệu. Để ngăn chặn điều này, bạn nên làm theo các quy trình được mô tả bên dưới.
- Thêm "--skip-show-database" vào tập lệnh khởi động của MySQL hoặc thêm nó vào tệp cấu hình MySQL
- Chỉ cấp đặc quyền SHOW DATABASES cho những người dùng bạn muốn sử dụng lệnh này
Để vô hiệu hóa việc sử dụng lệnh "SHOW DATABASES", thông số sau phải được thêm vào phần [mysqld] của /etc/my.cnf
:
[mysqld]
skip-show-database
9. Bật ghi nhật ký
Nếu máy chủ cơ sở dữ liệu của bạn không thực hiện nhiều truy vấn, bạn nên bật ghi nhật ký giao dịch bằng cách thêm dòng sau vào phần [mysqld] của /etc/my.cnf
tệp:
[mysqld]
log =/var/log/mylogfile
Điều này không được khuyến nghị cho các máy chủ MySQL sản xuất nặng vì nó gây ra chi phí cao trên máy chủ.
Ngoài ra, hãy xác minh rằng chỉ id "root" và "mysql" mới có quyền truy cập vào các tệp nhật ký này (ít nhất là quyền truy cập ghi).
Nhật ký lỗi Đảm bảo chỉ "root" và "mysql" mới có quyền truy cập vào tệp nhật ký "hostname.err". Tệp được lưu trữ trong thư mục dữ liệu mysql. Tệp này chứa thông tin rất nhạy cảm như mật khẩu, địa chỉ, tên bảng, tên thủ tục được lưu trữ và các phần mã. Nó có thể được sử dụng để thu thập thông tin và trong một số trường hợp, có thể cung cấp cho kẻ tấn công thông tin cần thiết để khai thác cơ sở dữ liệu, máy mà cơ sở dữ liệu được cài đặt hoặc dữ liệu bên trong nó.
Nhật ký MySQL Đảm bảo chỉ "root" và "mysql" mới có quyền truy cập vào logfile "logfile XY". Tệp được lưu trữ trong thư mục dữ liệu mysql.
10. Thay đổi thư mục gốc
Chroot trên hệ điều hành UNIX {Operating system} là một thao tác thay đổi thư mục gốc trên đĩa biểu kiến cho phương thức đang chạy hiện tại và phương thức con của nó. Một chương trình được root lại vào một thư mục khác không thể truy cập hoặc đặt tên các tệp bên ngoài thư mục đó, và do đó, thư mục được đặt tên là "chroot jail" hoặc (ít phổ biến hơn) là "chroot jail".
Bằng cách sử dụng môi trường chroot, quyền truy cập ghi của các quy trình mySQL (và các quy trình con) có thể bị hạn chế, tăng tính bảo mật của máy chủ.
Đảm bảo rằng một thư mục chuyên dụng tồn tại cho môi trường đã chroot. Đây phải là một cái gì đó giống như:/chroot/mysql
Ngoài ra, để việc sử dụng các công cụ quản trị cơ sở dữ liệu được thuận tiện, nên thay đổi tham số sau trong phần [client] của tệp cấu hình MySQL:
[khách hàng]
socket = /chroot/mysql/tmp/mysql.sock
Nhờ dòng mã đó, sẽ không cần cung cấp các lệnh mysql, mysqladmin, mysqldump, v.v. với --socket=/chroot/mysql/tmp/mysql.sock
tham số mỗi khi các công cụ này được chạy.
11. Xóa nhật ký cũ thường xuyên
Trong quá trình cài đặt, có rất nhiều dữ liệu nhạy cảm sẽ hỗ trợ những người dùng không mong muốn tấn công cơ sở dữ liệu. Dữ liệu này được lưu trong lịch sử của máy chủ và có thể rất hữu ích nếu xảy ra sự cố trong quá trình cài đặt. Bằng cách phân tích các tệp lịch sử, quản trị viên có thể tìm ra những gì đã xảy ra và có thể sửa chữa mọi thứ. Tuy nhiên, những tệp này không cần thiết sau khi cài đặt xong.
Chúng tôi nên xóa nội dung của tệp lịch sử MySQL (~ / .mysql_history), bất cứ nơi nào tất cả các lệnh SQL đã chết được lưu giữ (đặc biệt là mật khẩu, được giữ dưới dạng văn bản thuần túy):
cat /dev/null > ~/.mysql\_history
Kết luận, chúng ta nên nhấn mạnh về bảo mật cơ sở dữ liệu. Tuy nhiên, nó phải là điều đầu tiên đối với bất kỳ cá nhân hay công ty nào.