Tải bản đầy đủ (.docx) (21 trang)

Tiểu luận môn an ninh mạng Xây Dựng Chuẩn Chính Sách Cho Doanh Nghiệp DATABASE SECURITY

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (381.81 KB, 21 trang )

DATABASE 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
Giáo viên hướng dẫn: Nguyễn Duy
Sinh viên thực hiện:
08520260 – Nguyễn Thọ Nguyên
08520386 – Phạm Minh Thịnh
08520047 – Trịnh Xuân Công
4/2012ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Nội dung
Trang 2
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Lời mở đầ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 3
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
I. Tổng quan về an ninh trong MYSQL
1. Sơ lược về bảo mậ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:
shell> 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.
2. Bảo mật password trong MYSQL
• Bảo mật password cho các tài khoản quản trị
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:
Trang 4
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
 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ườ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.
Mộ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ưng
vẫ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_name
Enter 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
Trang 5
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Để 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.
• Chuỗ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ảng
user, 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ữ trong
bả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ột
hash 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:
Trang 6
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
 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.
3. Bảo vệ MYSQL khỏi những kẻ tấ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 và bản thương mại tại .
Để 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.
4. Bảo mật với mysqld
Bảng tóm lược các tùy chọn và giá trị:
Trang 7
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Name CMD-Line Option-File System var Status
Var
Var
Scope
Dynamic
Trang 8
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
allow-suspicious-udfs Yes Yes
automatic_sp_privilege
s
Yes Global Yes
chroot Yes Yes
des-key-file Yes Yes
local-infile Yes Yes Global Yes
- Variable: local_infile Yes Global Yes
old-passwords Yes Both Yes
- Variable:
old_passwords
Yes Both Yes
safe-show-database Yes Yes Yes Global Yes

safe-user-create Yes Yes
secure-auth Yes Yes Global Yes
- Variable: secure_auth Yes Global Yes
secure-file-priv Yes Yes Global No
- Variable:
secure_file_priv
Yes Global No
skip-grant-tables Yes Yes
skip-name-resolve Yes Yes Global No
- Variable:
skip_name_resolve
Yes Global No
skip-networking Yes Yes Global No
- Variable:
skip_networking
Yes Global No
skip-show-database Yes Yes Global No
- Variable:
skip_show_database
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';
Trang 9
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Đ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 disable-grant-
options
• 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
ở dạng IP hoặc localhost.
• skip-networking: Không cho phép kết nối TCP / IP qua mạng. Tất cả các kết nối đến mysqld
phải được thực bằng tập tin socket Unix.
• skip-show-database: với tùy chọn này, lệnh SHOW DATABASES chỉ được cho phép đối với
những tài khoản có quyền SHOW DATABASES, và câu lệnh sẽ hiển thị tên tất cả các
database. Nếu không có tùy chọn này, lệnh SHOW DATABASE sẽ được cho phép với tất cả
các user, nhưng chỉ hiện tên những database mà user này có đặc quyền.
• ssl: tùy chọn này cho phép các máy client kết nối tới server sử dụng giao thức SSL, và chỉ rõ
nơi nào để tìm khóa và chứng thư cho SSL. Thông tin chi tiết sẽ được mô tả trong phần 3.
5. Bảo mật với LOAD_DATA_LOCAL

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):
Trang 10
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
 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.
 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ướng dẫn an ninh trong việc lập trình
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ụ.
Kiểm tra:
 Kích hoạt chế độ nghiêm ngặt của SQL để bảo cho máy chủ hạn chế những giá trị dữ liệu
có thể chấp nhận.
 Thử thêm dấu nháy đơn và nháy kép (' và “) vào tất cả các Web form. Nếu có xuất hiện
bất kì lỗi SQL nào thì có vấn đề rồi đó.
 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ự.
 Thử thêm vào những kí tự, khoảng cách, kí tự đặc biệt thay cho số vào những trường số.
Ứng dụng của bạn phải lọc hết những kí tự này ra trước khi gởi tới cho server Mysql nếu
không sẽ gây ra lỗi. Gửi những dữ liệu chưa được kiểm tra tới MYSQL là rất nguy hiểm.
 Kiểm tra dung lượng của ổ cứng trước khi gửi tới Mysql.
Trang 11
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
 Không cho ứng dụng của bạn kết nối tới database mà sử dụng tài khoản administrator.
Không cho ứng dụng bất kì quyền nào mà nó không cần.

Nhiều giao diện chương trình ứng dụng cung cấp một phương tiện để thoát những kí tự đặc biệt
trong giá trị của dữ liệu. Sử dụng chúng để ngăn cản người dùng ứng dụng nhập các giá trị để
tạo ra những câu lệnh có ý nghĩa khác với bạn quy định.
 MySQL C API : sử dụng API mysql_real_escape_string() để lược bỏ các kí tự đặc biệt.
 MySQL++ : sử dụng escape và quote để chỉnh sửa lại câu lệnh SQL.
 PHP : Sử một trong hai phần mở rộng mysqli hoặc pdo_mysql.
 Perl DBI: sử dụng placeholders hay phương thức method().
 Java JDBC: sử dụng đối tượng PreparedStatement và placeholders.
Những ngôn ngữ lập trình khác có thể có những chức năng tương tự.
II. Hệ thống đặc quyền truy cập MYSQL
Phương thức chính của hệ thống đặc quyền MYSQL là xác thực một người dùng kết nối tới và
cấp cho người dùng đó những đặc quyền trên một cơ sở dữ liệu như là SELECT, INSERT,
UPDATE, và DELETE. Các chức năng chính là xác định một người dùng bất kì và gán những đặc
quyền cho những phương thức MYSQL cụ thể như là LOAD_DATA_INFILE và những hoạt động
quản trị.
Có một vài điều bạn không thể làm được với hệ thống đặc quyền MYSQL:
 Bạn không thể xác định chính xác một người dùng có nên bị từ chối truy cập. Nghĩa là
bạn không thể tính toán chính xác cho một người dùng và sau đó từ chối kết nối.
 Bạn không thể chỉ định quyền cho một user có thể tạo và xóa bảng trong một cơ sở dữ
liệu mà không thể tạo và xóa trong cơ sở dữ liệu của chính mình.
 Một password được áp dụng cho một tài khoản. Bạn không thể kết hợp một mật khẩu
với một đối tượng cụ thể như cơ sở dữ liệu, bảng hay routine.
MYSQL xác định cả tên người dùng và tên host của bạn khi xác định bạn là ai vì không có lí do gì
để giả định rằng tên một user chỉ thuộc về một người dùng trên tất cả các host. Ví dụ người
dùng tên joe kết nối từ office.example.com cần phải được phân biệt với người dùng tên joe kết
nối từ home.example.com. Mysql làm việc này để phân biệt các người dùng trên các máy khác
nhau có thể cùng tên. Bạn có thể cấp một tập hợp các đặc quyền cho tài khoản joe từ
office.example.com và một tập đặc quyền khác cho tài khoản joe từ home.example.com. Để
xem một tài khoản cụ thể có những đặc quyền gì, sử dụng câu lệnh SHOW GRANTS. Ví dụ:
SHOW GRANTS FOR 'joe'@'office.example.com';

SHOW GRANTS FOR 'joe'@'home.example.com';
Mysql điều khiển truy cập bằng bao gồm 2 giai đoạn khi bạn chạy một chương trình client để kết
nối tới server:
Trang 12
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Bước 1: server chấp nhận hoặc từ chối kết nối dựa trên nhận dạng của bạn khi bạn xác minh
bằng một mật khẩu chính xác.
Bước 2: giả sử rằng bạn đã kết nối thành công, mysql sẽ kiểm tra từng câu lệnh bạn sử dụng để
xác định xem bạn có đủ quyền lực để thi hành nó hay không.
1. Hệ thống đặc quyền cung cấp bởi MYSQL
MYSQL cung cấp những đặc quyền được áp dụng bởi nhiều nội dung và nhiều mức độ của hành
động:
• Quyền administrator có thể cho user quản lí những hoạt động trên Mysql Server. Những
quyền này quyền toàn cục vì nó không đặc trưng cho một cơ sở dữ liệu nào cả.
• Đặc quyền database được áp cho một database và tất cả các đối tượng trong nó. Những
quyền này có thể được áp cho một database cụ thể hay là toàn cục nghĩa là được áp cho
mọi database.
• Quyền cho những đối tượng như là các table, ndexes, views, và stored routines có thể
được gán cho những đối tượng cụ thể trong database, cho tất cả các đối tượng cùng loại
trong database ( ví dụ: tất cả các tables trong database), hay trong cục bộ với các đối
tượng cùng loại trong tất cả các databases.
Thông tin về các quyền của tài khoản được lưu trữ trong bảng user, db, host, tables_priv,
columns_priv, and procs_priv trong cơ sở dữ liệu mysql (xem thêm phần “Bảng đặc quyền
GRANT”). Mysql đọc nội dung của những bảng đó lên bộ nhớ khi nó bắt đầu và nạp lại trong các
trường hợp được nêu trong “6. Tác dụng khi thay đổi đặc quyền”. Cơ chế điều khiển truy nhập
dựa trên bộ nhớ được sao chép từ bảng GRANT.
Bảng sau mô tả tên của những đặc quyền sử dụng những cấp độ của SQL trong lệnh GRANT và
REVOKE, với những tên cột liên quan tới mỗi quyền trong bảng GRANT và nội dung của mỗi
quyền đó được áp dụng:

Quyền Cột Nội dung
CREATE Create_priv databases, tables, or indexes
DROP Drop_priv databases, tables, or views
GRANT OPTION Grant_priv databases, tables, or stored
routines
LOCK TABLES Lock_tables_priv databases
REFERENCES References_priv databases or tables
EVENT Event_priv databases
ALTER Alter_priv tables
DELETE Delete_priv tables
INDEX Index_priv tables
INSERT Insert_priv tables or columns
SELECT Select_priv tables or columns
Trang 13
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
UPDATE Update_priv tables or columns
CREATE TEMPORARY TABLES Create_tmp_table_priv tables
TRIGGER Trigger_priv tables
CREATE VIEW Create_view_priv views
SHOW VIEW Show_view_priv views
ALTER ROUTINE Alter_routine_priv stored routines
CREATE ROUTINE Create_routine_priv stored routines
EXECUTE Execute_priv stored routines
FILE File_priv file access on server host
CREATE USER Create_user_priv server administration
PROCESS Process_priv server administration
RELOAD Reload_priv server administration
REPLICATION CLIENT Repl_client_priv server administration
REPLICATION SLAVE Repl_slave_priv server administration

SHOW DATABASES Show_db_priv server administration
SHUTDOWN Shutdown_priv server administration
SUPER Super_priv server administration
ALL [PRIVILEGES] server administration
USAGE server administration
Danh sách sau cung cấp một mô tả chung của mỗi lệnh trong MYSQL.
 Quyền ALL hay ALL PRIVILEGES là từ viết tắt. Nó nghĩa là “all privileges available at a given
privilege level” (ngoại trừ GRANT OPTION).
 Đặc quyền ALTER có thể sử dụng cho ALTER TABLE để thay đổi cấu trúc của bảng. ALTER
TABLE yêu cầu phải có quyền CREATE và INSERT. Đổi tên cho một bảng cần ALTER và DROP
trên bảng cũ, ALTER, CREATE và INSERT trên bảng mới.
 Quyền ALTER ROUTINE cho phép thay đổi hay xóa một routine.
 Quyền CREATE cho phép tạo database và table mới.
 Quyền CREATE ROUTINE cần cho việc lưu trữ những routine.
 Quyền CREATE TEMPORARY TABLES cho phép tạo ra những bảng tạm thời bằng lệnh
CREATE TEMPORARY TABLES.
 Quyền CREATE USER cho phép sử dụng CREATE USER, DROP USER, RENAME USER, and
REVOKE ALL PRIVILEGES.
 Quyền CREATE VIEW cho phép sử dụng CREATE VIEW.
 Quyền DELETE cho phép xóa những hàng trong bảng trong database.
 Quyền DROP cho phép bạn xóa những database, table và khung.
 Quyền EVENT được yêu cầu để tạo, sửa đổi, xóa hay xem các sự kiện trong Event Scheduler.
Quyền này được thêm vào từ phiên bản MySQL 5.1.6.
 Quyền EXECUTE được yêu cầu để thực thi những Routine
 Quyền FILE cho bạn đọc và viết tập tin trên máy server sử dụng lệnh LOAD DATA INFILE và
SELECT INTO OUTFILE và LOAD_FILE().
 Quyền GRANT OPTION cho phép bạn thêm cho một user nào đó hoặc gỡ từ user đó những
quyền mà bạn sỡ hữu.
Trang 14
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY

MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
….
2. Hệ thống bảng đặc quyền GRANT
Thông thường bạn thao tác với nội dung của bảng GRANT trong cơ sở dữ liệu mysql một các
gián tiếp bằng các sử dụng các lệnh như GRANT và REVOKE để thiết lập và điều khiển các quyền
có sẵn cho mỗi tài khoản. Nội dung trong phần này sẽ giới thiệu về cấu trúc của bảng GRANT.
Database mysql chứa đựng những thông tin sau:
 user : Chứa đựng những tài khoản, quyền cục bộ và những cột không phân quyền.
 db : chứ đựng những quyền database theo cấp độ
 tables_priv : chứa những quyền table theo cấp độ
 columns_priv : chứa những quyền column theo cấp độ
 procs_priv : chứa những quyền của thủ tục và phương thức.
 …
III. Quản lý tài khoản trong MYSQL
Chương này giới thiệu làm thế nào để tạo một tài khoản cho client của mysql server. Gồm các
chủ đề sau:
 Ý nghĩa của username và password được sử dụng trong Mysql và phân biệt nó với user của
hệ điều hành.
 Làm thế nào để tạo một tài khoản
 Thay đổi password
 Giới thiệu các sử dụng password an toàn.
 Sử dụng kết nối an toàn với SSL
1. User name và password:
MySQL lưu trữ các tài khoản trong bảng user của cơ sỡ dữ liệu mysql. Một tài khoản được xác
định dựa trên username và client host hoặc host mà từ đó người dùng để kết nối đến server.
Một tài khoản chỉ có thể có một mật khẩu.
Có một vài phân biệt giữa cách username và password được sử dụng bới MYSQL và cách chúng
được sử dụng bởi hệ điều hành:
 User được sử dụng trong MySQL cho mục đích xác thực, không liên quan gì tới user trên
Unix hay trên Windows. Trên Unix hầu hết các client MySQL đăng nhập vào bằng cách

sử dụng tên người dùng hiện hành Unix cũng là tên người sử dụng MySQL, điều đó chỉ
để cho tiện. Mặc định có thể được ghi đè một cách dể dàng, bởi vì các chương trình
khách hàng cho phép bất kỳ tên người dùng được xác định với một –U hoặc –USER tùy
chọn. Bất cứ ai kết nối server sử dụng bất kỳ username nào, bạn không thể làm cho
database an toàn trừ khi tất cả các user đều có password. Bất cứ ai dùng một tài khoản
không có password đều có thể kết nối tới server thành công.
Trang 15
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
 Tên người sử dụng MySQL có thể lên đến 16 ký tự. Tên người sử dụng trong hệ thống,
nó không liên quan đến tên người dùng MySQL, có thể có chiều dài tối da khác nhau. Ví
dụ, tên người sử dụng Unix thường giới hạn 8 ký tự.
2. Thêm mới một tài khoản:
Bạn có thể tạo một tài khoản cho MYSQL bằng 2 cách:
 Sử dụng câu lệnh để tạo tài khoản như là CREATE USER hay GRANT. Những câu lệnh này
khi server thực thi sẽ tự động chỉnh sửa lại bảng GRANT.
 Thao tác trực tiếp với bảng GRANT bằng cách sử dụng lệnh INSERT, UPDATE, hay
DELETE.
Sau khi đăng nhập vào hệ thống với quyền root, bạn có thể tạo user mới. Sử dụng câu lệnh
GRANT như sau để tạo ra bốn tài khoản mới:
mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
-> WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
-> WITH GRANT OPTION;
mysql> CREATE USER 'admin'@'localhost';
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> CREATE USER 'dummy'@'localhost';
Hai trong số các tài khoản có tên người dùng là monty và mật khẩu của some_pass . Cả hai tài

khoản là superuser tài khoản với quyền đầy đủ để làm bất cứ điều gì . Tài khoản của
‘monty'@'localhost' có thể chỉ được sử dụng khi kết nối từ các localhost . ‘monty ' @' % tài
khoản sử dụng '%' ký tự đại diện cho một host, nó có thể được sử dụng để kết nối từ bất kỳ host
nào.
IV. Giới thiệu chương trình Acunetix Web Vulnerability Scanner 8
Acunetix WVS (Web Vulnerability Scanner) là chương trình tự động kiểm tra các ứng dụng Web
để tìm kiếm các lỗ hổng bảo mật như SQL Injection, hay Cross-Site Scripting,… và tìm kiếm
những chính sách đối với mật khẩu đăng nhập cũng như các phương thức xác thực vào Web
Site.
Trang 16
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Như thường thấy, các lỗi bảo mật ở Việt Nam tập trung vào những lỗ hổng nguy hiểm mà bất cứ
công cụ Scan cao cấp nào cũng có thể quét thấy. Nhưng hầu hết các admin dường như quên
mất, hoặc không biết đến những lỗ hổng vốn dĩ rất dễ phát hiện này.
Hiện nay, trên thế giới có những công cụ quét lỗi bảo mật khá nổi tiếng như là: Shadow Security
Scanner, Retina Network Security Scanner, Metasploit cao cấp hơn và phải có độ hiểu biết nhất
định là Nmap, Netcat …
Trong phần này nhóm xin giới thiệu đến các bạn phần mềm Acunetix WVS dùng để quét các lỗi
bảo mật hệ thống của mình.
Giao diện chính của chương trình:
Cửa sổ bên trái cung cấp cho ta một dãy các công cụ: Web Scanner, Site Crawer, Target Finder,
Subdomain Scanner …, chỉ cần nhấp chuột vào công cụ nào đó để AWV thực hiện nhiệm vụ của
mình. Ưu điểm của Tool này là tương tác trực quan mà không phải nhớ từng dòng lệnh như
Nmap hoặc Netcat …
Trang 17
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Acunetix WVS là một công cụ quét lỗi cho ứng dụng Web dựa trên một cơ sở dữ liệu rộng lớn
được cập nhật thường xuyên, với các thuật toán heuristic đáp ứng được các cơ chế họat động

phức tạp của môi trường Web. Acunetix WVS có thể tự động kiểm tra các lổ hỗng thông dụng
như cross site scripting, sql injection và các mối nhạy cảm khác của những web site có thể truy
cập bằng trình duyệt, hay những ứng dụng được xây dụng trên các kỹ thuật tiên tiến như AJAX
để thực hiện được điều này Acunetix WVS dựa trên nhiều phương pháp và công cụ tích hợp
như:
• Crawling (lấy về) toàn bộ website gồm tất cả các liên kết trên site và cả trong tập tin robots.txt
sau đó hiển thị tòan bộ cấu trúc này một cách chi tiết.
• Sau tiến trình cwarling và khám phá tình trạng của ứng dụng web, Acunetix WVS tự động phát
động các đợt tấn công đã được lập trình sẳn dựa trên các lổ hổng, giống như khi web site bị 1
hacker tấn công thực sự, phân tích các trang và những vị trí có thể nhập liệu cùng với các sự kết
hợp khác nhau của dữ liệu đầu vào có thể làm cho website hiển thị những thông tin nhạy cảm.
Trang 18
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
• Sau khi tìm ra được các lổ hổng, Acunetix WVS thông báo trên các “Alerts Node”, mỗi alert
gồm các thông tin về lỗi cũng như các mối nguy hiểm có thể gặp phải
Bạn có thể nhấp vào mỗi alert để xem thêm thông tin chi tiết về loại lỗi đó, cũng như những
khuyến cáo về cách khắc phục
• Sau khi tiến trình kiểm tra hòan tất, chúng ta có thể lưu lại thành một tập tin để phân tích sau
này, với công cụ báo cáo chuyên nghiệp sẽ giúp cho các web master dễ dàng tổng hợp các kết
quả kiểm tra khác nhau trên ứng dụng Web của mình.
Trang 19
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
Sau khi quét, Acunetix WVS sẽ liệt kê cấu trúc của site, phiên bản webserver đang sử dụng, URL
không tồn tại, các lỗi phát hiện được cũng như mức độ Security của site đang quét, nhìn hình
các bạn sẽ thấy những liệt kê rất cụ thể.
Mức độ bảo mật của website được AWV đánh giá từ low, medium, high. Nếu website của bạn
được liệt kê ở mức low, hãy nhanh chóng fix lỗi mà AWV liệt kê.
Danh sách các lổ hổng bảo mật được kiểm tra bởi Acunetix WVS:

- Code Execution
- Directory Traversal
- File Inclusion
- Script Source Code Disclosure
- CRLF Injection
- Cross Frame Scripting (XFS)
- PHP Code Injection
- XPath Injection
- Full Path Disclosure
- LDAP Injection
- Cookie Manipulation
- MultiRequest Parameter Manipulation
- Blind SQL/XPath Injection
- File Checks
- Checks Backup Files hay Directories – Tìm kiếm các tập tin thông dụng (như là logs, application
traces, CVS web repositories)
- Cross Site Scripting trong URL
Trang 20
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY
MMT03 - ĐẠI HỌC CÔNG NGHỆ THÔNG TIN – ĐHQG TPHCM
- Checks Script Errors
- Directory Checks
- Tìm kiếm các tập tin quan trọng như logs, traces, CVS.
- Discover Sensitive Files/Directories
- Kiểm tra các quyền gán cho thư mục không hợp lệ – Weak Permissions
- Cross Site Scripting trong Path and PHPSESSID Session Fixation.
- Web Applications
- Text Search
- Directory Listings
- Source Code Disclosure

- Kiểm tra Common Files
- Kiểm tra Email Addresses
- Microsoft Office Possible Sensitive Information
- Local Path Disclosure
- Error Messages
- GHDB Google Hacking Database
- Over 1200 GHDB Search Entries in the Database
- …
Trang 21
XÂY DỰNG CHUẨN CHÍNH SÁCH CHO DOANH NGHIỆP – DATABASE SECURITY

×