MySQL Lockdown Checklist . Giới Thiệu : MySQL được xem là hệ thống cơ sở dữ liệu mã nguồn mở được sử dụng phổ biến nhất trên thế giới. Vời điều kiện đó, sản phẩm này hoàn toàn miễn phí, có thể kể đến các điểm mạnh của Mysql đó là chạy ổn định trên hầu hết các hệ điều hành, tương đối đơn giản, dễ dàng cấu hình, thực hiện các tác vụ tốt ngay cả với những vấn đề nghiêm trọng nhất. Bằng viêc so sánh với các hệ thống quản lí cơ sở dữ liệu khác, ta thấy Mysql việc cấu hình khá đơn giản, nhưng xét về tính bảo mật, mysql vẫn còn những chặng đường thách thức phía trước. Tài liệu này tóm tắt các kiểu tấn công thông dụng nhất, cũng như các bước bảo mật dành cho nhà quản trị. Phiên bản Mysql và vấn đề về lỗi: Mysql AB vẫn tích cực duy trì một vài phiên bản phần mềm cơ sở dữ liệu của họ, và xác định phiên bản nào còn khó khăn trong việc cài đặt. Từ việc kiểm tra các điểm bảo mật, họ đi đến giải quyết các vấn đề khó khăn còn tồn tại trong sản phẩm, sau đó thêm các chức năng bảo mật vào sản phẩm và thường được xem là phiên bản alpha vì thế nó ko được xem là phiên bản chính thức. Phiên bản 3.23.x và các phiên bản cũ hơn, một số ít đã quá lỗi thời. Nhiều cải tiến đã được đưa vào phiên bản 4. Phiên bản 4.0.x là phiên bản chính thức khi tôi đang viết bài hướng dẫn này, phiên bản này được cải tiến hown nhiều so với phiên bản 3.23.x đặc biệt ở phiên bản này là có hỗ trợ UNION (sẽ nói rõ sau trong phần SQL injection ), hỗ trợ giao thức kết nối mã hóa SSL, và nhiều đặc tính nổi bật khác. Phiên bản 4.1.x hiện thời là phiên bản alpha, nó có 1 vài thay đổi trong giao thức xac thực bao goomg một hàm tên là SHA1.Việc bổ sung giao thức xác thực trong phiên bản trước của Mysql được mã hóa kém và đã có 1 vài lời than phiền về các cuộc tấn công liên quan đến phiên bản này. Ngoài ra cơ chế xác thực mới trong 4.1 cho phép hỗ trợ subqueris, unicode, và thêm một số đặc tính nổi bật đối với phiên bản 4.0. Phiên bản 5.0 là phiên bản phát triển. Điểm chú ý nhất trong phiên bản này là có thêm một vài tính năng cho phép hỗ trợ stored procedures. Trong lúc tôi viết bài này, phiên bản hiện thời là 4.0.20. Có một vài tính năng bảo mật mới trong 4.1, ví dụ như cơ chế mật khẩu mới với 1 giao thức xác thực bảo mật hơn, nhưng các tính nĂng này là phiên bản alpha và vì thế bạn ko nên quá tin tưởng nó. Nếu bạn muốn cài phiên bản bảo mật hãy cài phiên bản mới nhất và câp nhật thông tin thường xuyên. Trong phiên bản mới, vấn đề bảo mật được tìm thấy hàng ngày và có cảm tưởng như bản vá lỗi được tung ra đều đặn. Nếu bạn có một lí do tốt để sử dụng các phiên bản khác với phiên bản thịnh hành , trong ý nghĩ bản thân bạn có thể khám phá ra cac vấn đề về bảo mật và thu gom được kết quả đáng tin cậy. Người đi trước có thể triển khai các công việc không hoàn chình, và người sau thông qua các nhìn tỉ mỉ và thấu đáo cung đóng góp 1 chút nào cho công việc kia. MySQL in the network : Kể từ khi Mysql được tung ra miễn phí và sử dụng thịnh hành, bạn có thể ngạc nhiên khi tìm thấy nó có mọi nơi trên mạng máy tính. Đã có nhiều đề án mã nguồn mở tích hợp với sản phẩm này, vì vậy việc tìm thấy người dùng Mysql trên máy tính của họ thì hiếm hơn so với sử dụng cho server. Trong các cấu hình đặc trưng, một máy khách sẽ kết nối tới Mysql thông qua TCP cổng 3306. Trên HĐH Windows, Mysql có thể được cấu hình để chạy thông qua các pipe ( kí hiệu ống dẫn ) với lựa chon 'enable-named-pipe' nhưng cách này ko được khuyến cáo. Theo mặc định, mysql sẽ chạy rong chế đọ named pipe, sẽ lắng nghe trên ca 2 cổng TCP 3306 và một named pipe được đặt tên là "MySSQL". Giao thức mạng mà MySQL sử dụng thì tương đối đơn giản ( khi so sánh với các DBMS khác như Oracle) theo mặc định là plaintext, mặc dù phiên bản được kích hoạt SSL có sẵn trong phiên bản hiện thời (4.0.0 và cao hơn). Phiên bản được kích hoạt SSL vẫn thi hành qua TCP cổng 3306 và vượt qua luồng SSL Bạn có thể dễ dàng kiểm tra phiên bản MySQL mà 1 host đang chạy khi nó được trả về trên biểu ngữ lúc bạn kết nối. Một số phiên bản thường trả bề manh mối của hệ điều hành, ví dụ như 4.0.18-nt được trả về bởi phiên bản 4.0.18 MySQL trên Windows. Tại thời điểm bài viết đặc tính này ko thể thay đổi bởi nhà quản trị trừ khi thay đổi mã nguồn hay sửa giá trị nhị phân, vì thế có nghiã là phiên bản MySql bạn nhìn thấy là chính xác. Một số CT quét cổng TCP chộp biểu ngữ cũng có thể cho ta phiên bản Mysql. Có thể công dụng phổ biến nhất của mysql là phụ trợ cho các ứng dụng web động. Nó thường được xem như là CT phụ trợ của ứng dụng Apache/PHP và cũng có thể chạy trên cùng host như một web server. Trong môi trường rộng hơn nó có thể được sử dụng như một logging server, như đích cho IDS logs, web server logs hay các audit task ( kiểm tra thao tác ) khác. Trong mạng nội bộ bạn có thể thấy Mysql được sử dụng nhiều hơn theo lối cổ, chế độ phục vụ - khách, có thể phụ trợ cho helpdesk system ( tạm dich là hệ thống giúp đỡ văn phòng ). Đấy là một số lí do vì sao người dùng trên khắp thế giới sử dụng Mysql trên may tính để bàn của họ, vì thế ko hiếm khi thấy mysql trong các trạm làm việc, đặc biệt là trong các môi trường phát triển. Cách cấu hình phổ biến thường là triển khai một SSH serrver chung trên một host như là Mysql server và sử dụng cổng chuyển tiếp để kết nối tới cổng 3306 thông qua tunnel được mã hóa. Có một số thuận lợi khi đề cập tới điều này, nó có nghĩa là dữ liệu được mã hóa trong khi chuyển tiếp, nó bắt buộc phải thêm vào một bước xác thực và nó cũng cung cấp một mẫu tin kiểm tra việc kết nối tới một DB server. Để xem chi tiết về vấn đề triển khai cách cấu hình này, bạn có thể tham khảo tại: http://dev.mysql.com/doc/mysql/en/Se st_attack.html http://dev.mysql.com/doc/mysql/en/Se nnections.html Và tài liệu về client-server của người bạn. Duy chỉ có một lời khuyên với bạn về việc cấu hình bảo mật cho Mysql chạy trên cùng một host với web server là thực sự nguy hiểm, để các kết nối từ xa đến Mysql server bị ngăn chặn. Vì thế những cách cấu hình này có thể tự nó có những mối nguy hiểm tiềm ẩn bởi vì các table trong Mysql được lưu trữ trong các thư mục mà bản thân nó ko được khóa (bảo mật kĩ lưỡng ). Lỗi để lộ một thư mục trong ứng dụng wweb có thể là mục tiêu tố cho kẻ tấn công có thể download cá thực thể nhạy cảm trong một DB. Một cái nhìn khác, nếu trong một ứng dụng wweb bị lỗi SQL injection có thể là một cơ hội cho kẻ tấn công thay đổi nội dung các script trên web server. Nhìn nhận đúng vấn đề này sẽ ngăn ngừa được các mỗi nguy hiểm trên, nhưng điều mà bạn phải ghi nhớ đó là đặt web server và DB server trên cùng một host sẽ mở nhiều con đường khai thác cho kẻ tấn công. Bugs In The Authentication Protocol : Có một số lỗi đáng kể tần tại trong giao thức xác thực của Mysql. Lỗi chúng tôi đề cập để bạn tham khảo là: Basic Cryptographic Weakness in the Authentication Protocol Prior to 4.1 ( Có thể hiểu đây là lỗi mã hóa kém trong giao thức xác thực ) Trong phiên bản của Mysql trước 4.1, việc nhận biết password hassh ( lưu trong table mysql.user ) có khả năng xác thực hơn là nhận biết password. Điều này có nghĩa là việc viết ra công cụ crack password trong phiên bản Mysql trước 4.1 là có thể, công cụ này bạn có thể tìm thấy dễ dàng trên internet. Thuật toán xác thực tự bản thân nó cũng hàm chứa những lỗi mã hóa trong phiên bản 4.1. Để hiểu thêm điều này bạn có thể tham khảo tại: http://icat.nist.gov/icat.cfm?cvename=CVE-2000-0981 Authentication Bypass and Stack Overflow in Version 4.1.0-4.1.2 and 5.0 : Bằng kĩ thuật đệ trình gói dữ liệu xác thực, kể tấn công có thể bypass password xác thực trong Mysql 4.1.0 -4.1.2 và phiên bản 5.0 mới phát hành. Từ hàm check_connection (sql_parse.cp), dòng ~837: /* Old clients send null-terminated string as password; new clients send the size (1 byte) + string (not null-terminated). Hence in case of empty password both send '\0'. */ uint passwd_len= thd->client_capabilities & CLIENT_SECURE_CONNECTION ? *passwd++ : strlen(passwd); Provided 0x8000 is specified in the client capabilities flags, the use can specify the passwd_len field of their choice. For this attack, we will choose 0x14 (20) which is the expected SHA1 hash length. Several checks are now carried out to ensure that the user is authenticating from a host that is permitted to connect. Provided these checks are passed, we reach: /* check password: it should be empty or valid */ if (passwd_len == acl_user_tmp->salt_len) { if (acl_user_tmp->salt_len == 0 || acl_user_tmp->salt_len == SCRAMBLE_LENGTH && check_scramble(passwd, thd->scramble, acl_user_tmp->salt) == 0 || check_scramble_323(passwd, thd->scramble, (ulong *) acl_user_tmp->salt) == 0) { acl_user= acl_user_tmp; res= 0; } } the check_scramble function fails, but within the check_scramble_323 function we see: my_bool check_scramble_323(const char *scrambled, const char *message, ulong *hash_pass) { struct rand_struct rand_st; ulong hash_message[2]; char buff[16],*to,extra; /* Big enough for check */ const char *pos; hash_password(hash_message, message, SCRAMBLE_LENGTH_323); randominit(&rand_st,hash_pass[0] ^ hash_message[0], hash_pass[1] ^ hash_message[1]); to=buff; for (pos=scrambled ; *pos ; pos++) *to++=(char) (floor(my_rnd(&rand_st)*31)+64); extra=(char) (floor(my_rnd(&rand_st)*31)); to=buff; while (*scrambled) { if (*scrambled++ != (char) (*to++ ^ extra)) return 1; /* Wrong password */ } return 0; } Tại thời điểm này, người dùng đã chỉ định một chuỗi "scrambled" theo ý mình. Đây là 1 chuỗi zero-length (theo mình hiểu đây là 1 chuỗi rỗng ) trong trường hợp dễ dàng bypass authentication. Bằng cách so sánh vòng lặp cuối cùng của 1 kí tự trong chuỗi "scrambled" đối với đoạn chuỗi mà mysql biết để đáp ứng đúng cho đến khi ko còn các kí tự trong chuỗi "scrambled", ngay lập tức hàm trở về "0", cho phép người dùng xác thực với chuỗi zero-length. Lỗi này thì tương đối dễ khai thác, mặc dù thông thường nó cần thiết phải viết một máy khác myssql để làm điều này. Ngoài lỗi zero-length string authentication bypass, lỗi tràn bộ đệm trên ngăn xếp có thể gây tràn bộ nhớ bởi một chuỗi "scrambled" dài. Bộ nhớ tràn do các kí tự xuất ra từ hàm my_rnd(), một số gải mạo được tạo ra ngẫu nhiên. Các kí tự nằm trong phạm vi 0x40 0x5f. Trên một HDH, việc tùy ý thực thi các đoạn mã là điều có thể, mặc dù việc khai thác khá phức tap và cần dùng đến kĩ thuật brute force, hoặc ít nhất là phải có hiểu biết về password hash. Cách tấn công này mới thực sự hiệu quả nếu kẻ tấn công biết hoặc có thể đoán ra tên một user, vì thế cách phòng ngừa đó là đổi tên tài khoản "root" mặc định của Mysql. Cũng vậy, tài khoản đang được nói đến cũng phải được accessible từ host của kẻ tấn công, vì vậy việc ứng dụng kiểu hạn chế truy cập cơ bản trên địa chỉ Ip cũng có thể giảm thiểu nguy cơ bảo mật của lỗi hổng này.