Những thảo luận ở đây không phải chỉ dành riêng cho MYSQL, những ý tưởng chính giống nhau được áp dụng cho hầu hết các ứng dụng cơ sở dữ liệu.Khi sử dụng MYSQL, chúng ta cần chú ý những
Trang 1DATABASE SECURITY
MYSQL SECURITY
Bài Lap s 3 môn h c Xây D ng Chu n Chính Sách Cho Doanh Nghi p ố 3 môn học Xây Dựng Chuẩn Chính Sách Cho Doanh Nghiệp ọc Xây Dựng Chuẩn Chính Sách Cho Doanh Nghiệp ựng Chuẩn Chính Sách Cho Doanh Nghiệp ẩn Chính Sách Cho Doanh Nghiệp ệp Giáo viên h ướng dẫn: Nguyễn Duy ng d n: Nguy n Duy ẫn: Nguyễn Duy ễn Duy
Sinh viên th c hi n: ựng Chuẩn Chính Sách Cho Doanh Nghiệp ệp
08520260 – Nguy n Th Nguyên ễn Duy ọc Xây Dựng Chuẩn Chính Sách Cho Doanh Nghiệp
Trang 2N i dung ội dung
Lời mở đầu: 3
I Tổng quan về an ninh trong MYSQL 4
1 Sơ lược về bảo mật 4
2 Bảo mật password trong MYSQL 5
Bảo mật password cho các tài khoản quản trị 5
Bảo vệ password cho người dùng 5
Chuỗi băm password trong MYSQL 6
3 Bảo vệ MYSQL khỏi những kẻ tấn công 7
4 Bảo mật với mysqld 8
5 Bảo mật với LOAD_DATA_LOCAL 9
6 Hướng dẫn an ninh trong việc lập trình 10
II Hệ thống đặc quyền truy cập MYSQL 11
1 Hệ thống đặc quyền cung cấp bởi MYSQL 12
2 Hệ thống bảng đặc quyền GRANT 14
III Quản lý tài khoản trong MYSQL 15
1 User name và password: 15
2 Thêm mới một tài khoản: 15
IV Giới thiệu chương trình Acunetix Web Vulnerability Scanner 8 16
Trang 3L i m đ u: ời mở đầu: ở đầu: ầu:
Thông tin luôn là một tài sản vô giá của doanh nghiệp và cần được bảo vệ bằng mọi giá Tuy nhiên, với những đòi hỏi ngày càng ngắt gao của môi trường kinh doanh yêu cầu doanh nghiệp phải năng động chia sẻ thông tin của mình cho nhiều đối tượng khác nhau qua Internet hay Intranet (mạng “Internet” trong nội bộ doanh nghiệp), việc bảo vệ thông tin trở nên ngày càng quan trọng và khó khăn hơn bao giờhết
Hầu hết các doanh nghiệp ngày nay đều sử dụng các hệ quản trị cơ sở dữ liệu (CSDL) để lưu trữ tập trung tất cả các thông tin quý giá của mình Hiển nhiên hệ thống này sẽ là tiêu điểm tấn công của những
kẻ xấu Ở mức độ nhẹ, các tấn công sẽ làm hệ thống CSDL bị hỏng hóc, hoạt động không ổn định, mất mát dữ liệu làm cho các giao dịch hàng ngày của doanh nghiệp bị đình trệ Nghiêm trọng hơn, các thông tin sống còn của doanh nghiệp bị tiết lộ (như chiến lược kinh doanh, các thông tin về khách hàng, nhà cung cấp, tài chánh, mức lương nhân viên,…) và được đem bán cho các doanh nghiệp đối thủ Có thể nói
là thiệt hại của việc thông tin bị rò rỉ là vô cùng kinh khủng Đó sẽ là một đòn chí mạng đối với uy tín của doanh nghiệp đối với khách hàng và các đối tác
Nội dung chính trong bài viết này là phân tích các rủi ro có thể gây nguy hại cho cơ sở dữ liệu, đồng thời đưa ra những phương án, khuyến nghị giúp cho việc bảo vệ cơ sở dữ liệu Bài viết lấy hệ quản trị cơ sở
dữ liệu MYSQL làm ví dụ Tuy nhiên, các hệ quản trị cơ sở dữ liệu khác cũng có những phương án tương tự
Trang 4I T ng quan v an ninh trong MYSQL ổng quan về an ninh trong MYSQL ề an ninh trong MYSQL
1 S l ơ lược về bảo mật ược về bảo mật c v b o m t ề an ninh trong MYSQL ảo mật ật
Nói chung về vấn đề bảo mật, luôn cần có một sự bảo vệ đầy đủ máy chủ lưu trữ ( không riêng cho máy chủ MYSQL ) khỏi các cuộc tấn công ứng dụng như: nghe lén, thay đổi, phát lại, từ chối dịch vụ …
Bảo mật trong MYSQL cơ bản dựa trên Access Control Lists (ACLs) cho tất cả các kết nối, truy vấn, và những ứng dụng khác có nhu cầu kết nối tới Ngoài ra nó cũng hỗ trợ kết nối mã hóa SSL giữa máy khách MYSQL và máy chủ Những thảo luận ở đây không phải chỉ dành riêng cho MYSQL, những ý tưởng chính giống nhau được áp dụng cho hầu hết các ứng dụng cơ sở dữ liệu.Khi sử dụng MYSQL, chúng ta cần chú ý những điều sau:
Không cho bất kì ai ( ngoại trừ tài khoản root) có quyền truy xuất vào bảng USER trong MYSQL Đó là điều quan trọng
Tìm hiểu về hệ thống phân quyền của MYSQL Sử dụng câu lện GRANT và REVOKE để điều khiển đăng nhập cho MYSQL Không được phân nhiều quyền hơn lượng cần thiết Không bao giờ cấp đặc quyền cho tất cả các host
Không sử dụng plaintex password trong cơ sở dữ liệu Nếu máy tính của bạn bị xâm nhập, kẻxâm nhập có thể lấy được toàn bộ password và sử dụng nó Cho nên, sử dụng SHA(1),
MD(5) hoặc một giải thuật băm nào đó để lưu trữ chuỗi băm của password.
Không sử dụng 1 password có trong từ điển Một số chương trình dò tìm có thể tìm ra được
password Ví dụ như “xfish98” là một từ rất tệ Bởi vì nó có chứa từ fish Một phương thức đơn giản để tạo ra một password khó đoán là lấy những kí tự đầu của một câu Ví dụ như “ hôm nay là một ngày đẹp trời” thì ta có password là “hnl1ndt” Từ này vùa dễ nhớ, dễ gõ mà
lại rất khó đoán được
Đặt thêm Firewall Nó có thể chặn được 50% các cuộc tấn công các loại Đặt MYSQL đằng sau firewall hoặc trong vùng DMZ
Không truyền plantext ( dữ liệu chưa được mã hóa) trên Internet Sử dụng một giao thức mãhóa như SSL hoặc SSH để mã hóa dữ liệu MYSQL có hỗ trợ những kết nối SSL nội bộ Một công nghệ khác sử dụng chuyển port SSH để tạo ra một kênh mã hóa ( và nén ) cho đường truyền
Tìm hiều về tiện ích tcpdump và strings Trong hầu hết các trường hợp, bạn có thể kiểm tra
dữ liệu của mình đã được mã hóa hay chưa bằng cách sử dụng lệnh như sau:
Trang 5shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
Câu lệnh trên hoạt động trên Linux và với một số chỉnh sửa để chạy trên những hệ điều hành khác
B o m t password cho các tài kho n qu n tr ảo mật ật ảo mật ảo mật ị
Những tài khoản quản trị có thể làm theo những hướng dẫn sau để giữ cho password được
an toàn:
MYSQL lưu trữ tất cả các tài khoản trong bảng user Không gán quyền truy cập vào bảng
này cho tất cả các tài khoản không phải là tài khoản quản trị
Một người dùng được phép truy cập và chỉnh sửa thư mục plugin ( các giá trị biến hệ thống của plugin_dir) hoặc tập tin my.cnf có thể thay thế, bổ sung và chỉnh sửa các plugin
Password có thể xuất hiện ở dạng văn bản gốc (plaintext) trong các câu lệnh SQL như
CREATE USER, GRANT, and SET PASSWORD hay những câu lệnh được gọi như PASSWORD() Nếu những câu lệnh này được lưu lại bởi máy chủ MYSQL, password có
thể bị lộ cho những ai có quyền xem những lược sử này Điều này được áp dụng cho những lược sử truy vấn chung, lược sử truy vấn chậm và lược sử truy vấn nhị phân ( xem mục 5.2, “MySQL Server Logs” – MYSQL Manual) Để ngăn chặn những sự tiếp xúc không nên có tới các tập tin lược sử, chúng nên được lưu trữ ở những thu mục chỉ có quyền truy cập bởi server và những tài khoản quản trị
Những bản backup cơ sở dữ liệu có chứa những bảng hoặc tập lược sử ghi này phải được lưu trữ cẩn thận
B o v password cho ng ảo mật ệ password cho người dùng ười mở đầu: i dùng
Khi bạn chạy một chương trình client để kết nối tới server MYSQL, bạn có thể vô tình để lộ mật khẩu của mình cho người khác Những phương thức mà bạn có thể để lộ password của mình khi chạy một chương trình khách được nêu ra ở đây
Sử dụng tùy chọn -pyour_pass hoặc password=your_pass trên dòng lệnh Ví dụ như:shell> mysql -u francis -pfrank db_name
Nó tiện lợi nhưng không an toàn, bởi vì password của bạn hiển thị trên màn hình làm việc và nó có thể bị đánh cắp nếu có ai nhìn vào màn hình dòng lệnh
Trang 6Một số chương trình client có thể ghi đè các đối số lên các kí tự ngay khi gõ xong, nhưngvẫn có một khoảng thời gian ngắn mà các kí tự được hiển thị Nếu hệ điều hành của bạn mặc định hiển thị dòng lệnh hiện tại lên thanh tiêu đề của cửa sổ dòng lệnh, password của bạn vẫn sẽ bị nhìn thấy mặc dù nó đang chạy Hơn nữa, cửa sổ dòng lệnh còn có thể cuộn lên xuống để xem lại các lệnh trước đó.
Sử dụng tùy chọn –p hoặc – password với giá trị được để trống, khi đó chương trình sẽ yêu cầu nhập mật khẩu như sau:
shell> mysql -u francis -p db_nameEnter password: ********
Kí tự ‘*’ được hiển thị cho bạn biết bạn đã gõ password tới đâu Nó sẽ không được hiển thị khi bạn gõ Cách này an toàn cho password của bạn hơn là hiện thị nó lên dòng lệnh, bởi vì nó được ẩn đi với những người khác Tuy nhiên, phương thức nhập mật khẩu này chỉ phù hợp với những hệ thống mà bạn tương tác trực tiếp Nếu bạn muốn chạy chương trình client từ một script định trước, không có cơ hội nhập password từ bàn phím
Lưu trữ password trong một tập tin tùy chọn Ví dụ trong Unix, bạn có một danh sách các password trong phần [client] của tập tin my.cnf trong thư mục home của bạn.[client]
password=your_pass
Để giữ cho password an toàn, bạn không nên cho quyền truy cập tập tin này cho bất kì
ai, ngoài trừ bạn Để chắc chắn, đặt quyền của tập tin là 400 hoặc 600
shell> chmod 600 my.cnf
Để sử dụng lệnh để xác định chính xác tập tin tùy chọn lưu trữ password, sử dụng tùy chọn defaults-file=file_name, với file_name là đường dẫn đầy đủ của tập tin Ví dụ:shell> mysql defaults-file=/home/francis/mysql-opts
Lưu trữ password của bạn trong biến môi trường MYSQL_PWD
Phương thức này xác định mật khẩu của bạn được coi là cực kỳ không an toàn và không nên được sử dụng Mật khẩu của bạn sẽ bị lộ nếu một người nào đó có thể kiểm tra môi trường của các tiến trình đang chạy
Trang 7 Chu i băm password trong MYSQL ỗi băm password trong MYSQL
Danh sách tài khoản người dùng MYSQL được lưu trữ trong bảng user của cơ sở dữ liệu mysql Mỗi tài khoản được ấn định một password Nó được lưu trữ ở cột Password của bảnguser, nhưng không phải ở dạng plaintext mà là ở dạng chuỗi băm của nó Giá trị chuỗi băm được tính toán bởi hàm PASSWORD()
Mysql sử dụng password trong 2 pha của kết nối client/server
Khi client cố gắng kết nối tới server, có một bước xác thực mà khách hàng phải trình bày một mật khẩu mà có một giá trị băm phù hợp với giá trị hash được lưu trữ trongbảng người dùng cho tài khoản mà khách hàng muốn sử dụng
Sau khi khách hàng kết nối, nó có thể (nếu nó có đủ đặc quyền) thiết lập hoặc thay đổi các hash mật khẩu cho các tài khoản được liệt kê trong bảng người dùng Các khách hàng có thể làm điều này bằng cách sử dụng hàm PASSWORD() để tạo ra mộthash mật khẩu, hoặc bằng cách sử dụng lệnh GRANT hay SET PASSWORD
Ví dụ: đặt password cho một tài khoản nào đó bằng lệnh SET PASSWORD FOR như sau:
Phương thức PASSWORD sẽ tự tạo ra giá trị băm cho chuỗi ‘nguyen’ và lưu vào bảng user Ta có thể kiểm tra lại như sau:
Với phiên bản MYSQL 4.1.1 trở về trước, chuỗi băm password chỉ có 16 kí tự Với những phiên bản mới hơn, chuỗi password dài 41 kí tự như trong hình
Trang 83 B o v MYSQL kh i nh ng k t n công ảo mật ệ password cho người dùng ỏi những kẻ tấn công ững kẻ tấn công ẻ tấn công ấn công
Khi bạn kết nối tới một MYSQL server, bạn phải sử dụng password Password không được truyền
ở dạng cleartext trên kết nối Việc xử lý password trong khi khách hàng kết nối tới server đã được nâng cấp lên ở phiên bản 4.1.1 là rất an toàn Nếu bạn vẫn sử dụng chuỗi password trong phiên bản 4.1.1 trở về trước, giải thuật mã hóa không mạnh bằng những giải thuật mới hơn Một số kẻ tấn công có thể bắt các gói tin được truyền giữa client và server và bẻ khóa được password
Tất cả các thông tin các đều được truyền dưới dạng text, và có thể đọc được nếu có ai đó có thể theo dõi được đường truyền Nếu kết nối giữa client và server đi qua một mạng không được tin tưởng, bạn có thể sử dụng một giải thuật nén để làm đường truyền khó giải mã hơn Bạn cũng
có thể sử dụng SSL nội bộ của MYSQL để làm cho kết nối an toàn hơn Hơn nữa, có thể sử dụng SSH để mã hóa kết nối TCP/IP giữa client và server MYSQL Bạn có thể tìm thấy một SSH client
mã nguồn mở tại http://www.openssh.org và bản thương mại tại http://www.ssh.com
Để làm cho hệ thống MYSQL an toàn hơn, bạn có thể cân nhắc những vấn đề sau:
Yêu cầu tất cả các tài khoản đều phải có một password
Không chạy MYSQL server với tài khoản root trong hệ thống UNIX Bởi vì bất kì người sử dụng nào với đặc quyền FILE cũng có thể gây nguy hại cho hệ thống bằng cách tạo file như
root Để ngăn chặn điều này, mysqld từ chối chạy với quyền root, trừ khi được chỉ định rõ
ràng bằng tùy chọn –user= root
Không gán quyền PROCESS hay SUPER cho tài khoản không phải là administrator Lệnh
SHOW PROCESSLIST() có thể hiển thị trạng thái của các chương trình đang được thực thi Do
đó, bât kì người nào được cho phép xem các tiến trình của server đều có thể xem trạng thái của những user khác, ví dụ UPDATE user SET password=PASSWORD('not_secure')
Không gán quyền FILE cho những tài khoản không phải là administrator Bất kì người dùng
nào cũng có thể tạo một tập tin ở bất kì đâu trên hệ thống với mysqld.
Quyền FILE được sử dụng để đọc bất kì tập tin nào trong vùng có thể đọc hay với quyền hạn của tài khoản hệ thống đang được chạy trong Unix server Điều này có thể bị lạm dụng, ví
dụ, bằng cách sử dụng LOAD DATA để tải /etc/passwd vào một bảng, mà sau đó có thể được với SELECT
Nếu bạn không tin tưởng vào DNS, bạn nên sử dụng địa chỉ IP thay cho hostname trong bảng phân quyền grant table
Nếu bạn muốn hạn chế số lượng kết nối cho phép từ một tài khoản, bạn có thể làm được
điều đó bằng cách đặt giá trị max_user_connections trong mysqld
Trang 94 B o m t v i ảo mật ật ới mysqld
Bảng tóm lược các tùy chọn và giá trị:
Name CMD-Line
Option-File
System var Status
Var
Var Scope
Dynamic
automatic_sp_privilege
s
- Variable:
old_passwords
- Variable:
secure_file_priv
- Variable:
skip_name_resolve
Trang 10skip-networking Yes Yes Global No
allow-suspicious-udfs: chức năng này kiểm soát những hàm người dùng định nghĩa mà chỉ
có một kí tự xxx trong phương thức chính có thể được nạp Mặc định, tùy chọn này được tắt
local-infile[={0|1}]: nếu bạn chạy server với local-infile=0, clients không thể sử dụng lệnh
LOCAL trong LOAD DATA
old-passwords: tùy chọn cho server tạo ra những chuỗi băm password ngắn cho những password mới Nó hữu dụng trong khả năng tương thích với những server cũ
safe-user-create: khi chức năng này được bật, một user không thể tạo một user MYSQL mới bằng lệnh GRANT, trừ khi user đó được cấp đặc quyền trong bảng mysql.user hay bất kìcột nào của nó Nếu bạn muốn một user có quyền tạo một user khác, thì user đó phải được cấp quyền như sau:
GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';
Điều này đảm bảo rằng người dùng không thể thay đổi bất kỳ đặc quyền cho cột nào, nhưng
có thể sử dụng câu GRANT để cấp quyền cho người sử dụng khác
secure-auth: tắt chức năng xác thực cho những user sử dụng password kiểu cũ
secure-file-priv=path: tùy chọn này sẽ giới hạn hiệu lực của hàm LOAD_FILE() và lệnh LOAD
DATA và SELECT INTO OUTFILE để làm việc với những thư mục được chỉ định Tùy chọn
này được thêm vào từ phiên bản MySQL 5.1.17
skip-grant-tables: tùy chọn này làm cho server khởi động mà không sử dụng quyền hệ thống, làm cho bất kì ai đăng nhập vào server cũng không giới hạn quyền truy cập vào database Bạn có thể làm cho một server đang chạy nạp lại bảng GRANT bằng cách dùng lệnh mysqladmin flush-privileges hay mysqladmin reload từ shell system
tùy chọn skip-grant-tables không hoạt động nếu MySQL được cấu hình với options
Trang 11disable-grant- skip-merge: tắt chức năng lưu trữ trộn Tùy chọn này được thêm vào từ MySQL 5.1.12 và được gỡ bỏ từ 5.1.14
skip-name-resolve: không sử dụng hostname Tất cả các giá trị trong cột Host sẽ được lưu
Lệnh LOAD_DATA có thể load một tập tin nằm trên máy server, hoặc có thể load một tập tin nằm trên máy client khi từ khóa LOCAL xuất hiện
Có hai vấn đề chính với sự hỗ trợ của LOCAL với lệnh LOAD_DATA:
Sự chuyển tập tin từ máy client tới máy server đươc bắt đầu từ máy server Về mặt lý thuyết, chương trình server sẽ nói với chương trình máy khách để tải tập tin mà server lựa chọn chứ không phải là tập tin có tên trong lệnh LOAD_DATA Cũng như server có quyền đối với tất cả các tập tin trên máy client mà user trên client có quyền đọc
Trong môi trường Web, khi mà client kết nối từ một Web server, một user có thể sử dụng LOAD_DATA_LOCAL để đọc bất kì tập tin nào mà web server có quyền đọc ( giả định rằng người đó có thể chạy bất kì lệnh nào trên máy chủ MYSQL) Trên môi trường này, máy client đối với Mysql server chính là Web server, không phải là người dùng từ xađang kết nối tới Web server
Để đối phó với những vấn đề này, chúng ta sẽ thiết lập LOAD_DATA_LOCAL như thế nào trên MySQL 3.23.49 và MySQL 4.0.2 (4.0.13 trên Windows):
Theo mặc định, tất khách hàng MySQL và các thư viện trong bản phân phối nhị phân được biên dịch với tùy chọn - enable-local-infile, để tương thích với MySQL 3.23.48 trở
về trước
Trang 12 Nếu bạn biên dịch Mysql mà không thêm vào configure với tùy chọn enable-local-infile,
LOAD DATA LOCAL không thể được sử dụng bởi bất kì client nào, trừ khi nó được gọi
một cách chính xác mysql_options( MYSQL_OPT_LOCAL_INFILE, 0)
Bạn có thể tắt lệnh LOAD DATA LOCAL từ server bằng cách sử dụng mysqld với tùy chọn
local-infile=0
6 H ưới ng d n an ninh trong vi c l p trình ẫn an ninh trong việc lập trình ệ password cho người dùng ật
Những ứng dụng đăng nhập vào MYSQL thì không nên tin tưởng bất kì dữ liệu nào được nhập vào bởi người dùng, họ có thể đánh lừa mã của bạn bằng cách thêm vào những kí tự đặc biệt từ Webform, URLs hay từ bất kì một ứng dụng nào Hãy chắc rằng ứng dụng của bạn được an toàn khi người dùng nhập vào vài thứ như: “DROP DATABASE mysql;” Đó là một ví dụ, nhưng những
lỗ hổng bảo mật lớn và mất mát dữ liệu có thể xảy ra nếu một hacker sử dụng công nghệ tương
tự - thường gọi là SQL Injection
Một sai lầm phổ biến là chỉ kiểm tra kiểu dữ liệu chuỗi Hãy nhớ là luôn kiểm tra kiểu dữ liệu số nếu một chương trình tạo một truy vấn như là “SELECT * FROM table WHERE ID=234 ”, thay vì người dùng nhập “234” thì họ nhập “234 OR 1=1” Kết quả là chương trình tạo ra chuỗi truy vấn
“SELECT * FROM table WHERE ID=234 OR 1=1” và server sẽ trả về tất cả các dòng trong bảng Cách đơn giản nhất để bảo vệ khỏi kiểu tấn công này là sử dụng một dấu nháy cho hằng số như
“SELECT * FROM table WHERE ID=’234’” Nếu người dùng nhập bất kì thông tin gì, nó đều được chuyển thành chuỗi kí tự Nếu nội dung là số, MYSQL sẽ tự động chuyển tất cả chuỗi này thành
số và cắt bỏ hết những kí tự trong đó
Một vài người nghĩ rằng nếu một cơ sở dữ liệu chỉ chứa những thông tin công cộng thì không cần phải bảo vệ nó Điều đó là sai lầm Mặc dù nó cho phép hiển thị tất cả các dòng, nhưng bạn vẫn phải bảo vệ nó khỏi kiểu tấn công từ chối dịch vụ
Thử chỉnh sửa lại URL bằng cách thêm vào %22 (“"”), %23 (“#”), và %27 (“'”)
Thử sửa lại kiểu dữ liệu của những URL động từ số sang những kí tự như trong ví dụ trên Ứng dụng của bạn phải được an toàn chống lại những cuộc tấn công tương tự