Upload
khanh-tran
View
14
Download
3
Embed Size (px)
Citation preview
Một số phương pháp bảo vệ php trên linux
PHP là ngôn ngữ lập trình đang rất phổ biến và đang được rất nhiều nhà quản trị, lập trình viên
ưa chuộng. Đề chạy PHP dĩ nhiên là không khó, tuy nhiên nhiều cấu hình mặc định của PHP có
thể bị lợi dụng để tấn công. Sau đây, mình xin giới thiệu tổng hợp một số phương pháp giúp cấu
hình bảo vệ PHP tốt hơn. Bài viết sẽ chia làm 3 phần, sau đây là phần 1
I. Thông tin ban đầu
Để tiện cho việc theo dõi, mình list ra những thông tin thư muc, platform mình sử dụng như sau
DocumentRoot: /var/www/html
Platform : CentOS 6.5
Webserver : Apache
Php.ini : /etc/ php.ini (với Ubuntu là /etc/php5/apache2/php.ini)
PHP extension config file: /etc/php.d (với Ubuntu là /etc/php5/apache2/conf.d)
Sample php security config file: /etc/php.d/security.ini (file này các bạn tự tạo)
Quyền: Các thông tin dưới đây sẽ được thực hiện với quyền root.
II. Phương pháp
1. Các nguy cơ đối với PHP
Những nguy cơ với php hay chính là những điểm yếu trong quá trình lập trình, hacker sẽ lợi
dụng để tấn công vào hệ thống. Những lỗ hổng này có rất nhiều thông tin trên mạng, do đó mình
chỉ liệt kê tên thôi
XSS
SQL injection
File uploads
Including local and remote files
eval()
Sea-surf Attack (Cross-site request forgery – CSRF)
2. Tìm các module Built- in của PHP
Sử dụng câu lệnh sau để tìm các module
1 php -m
Rất nhiều đúng không các bạn, theo khuyến cáo của nhiều site thì chúng ta nên disable một số
module đi, ví dụ như sqlite3 chúng ta có thể xóa bằng câu lệnh
hoặc disable nó đi bằng câu lệnh
Những module còn lại, chúng ta chỉ có thể xóa php đi và cài lại, trong quá trình ./configure sẽ
loại bỏ những module thừa đi. Ví dụ:
1
./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr --
bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --
includedir=/usr/include --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/usr/com
--mandir=/usr/share/man --infodir=/usr/share/info --cache-file=../config.cache --with-config-
file-path=/etc --with-config-file-scan-dir=/etc/php.d --enable-fastcgi --enable-force-cgi-
redirect
3. Hạn chế thông tin bị lộ
Như bài viết của mình đã trình bày, nên phần này mình không nói lại nữa
4. Hạn chế Loadable PHP Modules (Dynamic Extensions)
PHP hỗ trợ tính anwng Dynamic Extensions, nên mặc định với Ubuntu, nó sẽ load hết các
module trong thư mục /etc/php.d/, chúng ta có thể xóa hoặc disable những module này đi tương
tự câu lệnh trong phần 2.
5. Ghi nhật ký tất cả các lỗi phát sinh của PHP
Những lỗi phát sinh từ PHP không nên hiển thị cho người dùng view website, các bạn thêm dòng
code sau vào trong file /etc/php.d/security.ini
6. Disallow Uploading Files
Trong file /etc/php.d/security.ini thực hiện thêm dòng code sau
Hoặc bạn có thể cho phép upload nhưng hạn chế size upload chẳng hạn
7. Turn Off Remote Code Execution
Nếu được enable, module allow_url_fopen sẽ cho phép các chức năng file của php như
file_get_contents(), include(), require().. có thể truy xuất dữ liệu từ xa thông qua ftp hoặc
website.
Lập trình viên thường hay quên điều này và không xây dựng các bộ lọc dữ liệu đầu vào phù hợp
dẫn đến lỗ hổng code injection. Trong những báo cáo về điểm yếu của PHP, thì đây là lỗ hổng
chiếm tỉ trọng rất lớn. Để hạn chế điều đó, chúng ta có thể thực hiện thông qua
/etc/php.d/security.ini
Ngoài ra, chúng ta cần disable allow_url_include
Đây là phần 2 của bài viết một số phương pháp bảo vệ php, nếu bạn chưa xem phần 1, các bạn có
thể theo dõi tại đây. Chúng ta tiếp tục phần 2
8. Enable SQL Safe Mode
Cấu hình này được thực hiện trên file /etc/php.d/security.ini
Khi chức năng này được bật, mysql_connect() và mysql_pconnect() sẽ không nhận bất thì đối số
nào được truyền tới chúng. Lưu ý rằng, bạn có thể tùy chỉnh tùy thuộc vào code của bạn. Những
ứng dụng mã nguồn mở như WordPress lại không hoạt động khi tính năng này được bật. Chuyên
gia khuyến cáo nên tắt magic_quotes_gpc trong tất cả các phiên bản php 5.3.x do bộ lọc này
thực sự không hiệu quả. Thay vào đó, chúng ta có thể sử dụng mysql_escape_string() hoặc các
bộ lọc khác hiệu quả hơn.
9. Kiểm soát POST Size
Giao thức HTTP POST được dùng khi client cần gửi dữ liệu tới Apache web server ví dụ như
upload file hay submit form. Hacker có thể gửi gói tin POST quá tải nhằm tiêu tốn tài nguyên
của server. Do đó, để an toàn chúng ta nên hạn chế dung lượng tối đa của POST request thông
qua file /etc/php.d/security.ini
1K là dung lượng tối đa dữ liệu dạng post được phép chấp nhận, setting này cũng ảnh hưởng tới
file upload. Để upload file lớn hơn, giá trị này cần lớn hơn giá trị trong upload_max_filesize (đã
giới thiệu trong mục 6 của part 1). Ngoài ra, cần hạn chế những giao thức request tới server,
chúng ta có thể cấu hình thông qua file gedit /etc/httpd/conf/httpd.conf
1 <Directory “/var/www/html”>
2 <LimitExcept GET POST>
3 Order allow,deny
4 </LimitExcept>
5 </Directory>
10. Kiểm soát tài nguyên (DoS Control)
Chúng ta có thể giới hạn thời gian tối đa mỗi php script có thể chạy. Ngoài ra, chúng ta có thể
giới hạn thời gian tối đa mỗi script này có thể request data cũng như giới hạn bộ nhớ tối đa mà
mỗi php script có thể sử dụng. Chúng ta thực hiện việc này thông qua file /etc/php.d/security.ini
11. Cài đặt Suhosin để bảo vệ PHP
Suhosin là một chương trình dùng để bảo vệ PHP, nó được thiết kế để bảo vệ server và người
dùng từ những điểm yếu đã biết và chưa biết trong ứng dụng PHP và trong PHP core. Sohosin
bao gồm hai thành phần, có thể sử dụng riêng biệt hoặc kết hợp với nhau. Thành phần đầu tiên là
một bản patch cho PHP core, trong đó có chứa một số cơ chế bảo vệ mức thấp đối với lỗ hổng
buffer overflow và format string. Thành phần thứ 2 bao gồm rất nhiều thành phần mở rộng mạnh
mẽ cho PHP bla bla …
Đó là những giới thiệu về Suhosin, quá trình cài đặt và cấu hình suhosin mình sẽ giới thiệu với
các bạn trong bài viết tới.
12. Disable những chức năng nguy hiểm của PHP
PHP có rất nhiều tính năng là con dao 2 lưỡi, nếu không cẩn thận, chúng ta sẽ bị chính những
tính năng này làm hại, do đó, để an toàn, chúng ta có thể disable những chức năng này thông qua
file /etc/php.d/security.ini
13. Cấu hình Fastcgi / CGI
PHP có thể hoạt động với FastCGI. FastCGI có thể giảm năng suất của server tuy nhiên lại làm
tăng tốc độ của PHP. Các bạn có thể cấu hình Apache2+PHP+FastCGI. Cấu hình cgi.
force_redirect nhằm ngăn chặn việc gọi PHP trực tiếp như http://www.cyberciti.biz/cgi-
bin/php/hackerdir/backdoor.php. Chúng ta thực hiện việc này thông qua /etc/php.d/security.ini
14. PHP User and Group ID
mod_fastcgi là một cgi-module của Apache, nó có thể connect tới FASTCGI server bên ngoài.
Do đó, bạn nên chạy php bằng tài khoản non-root (tài khoản không phải root). Nếu PHP được
chạy với tài khoản root hoặc tài khoản có UID nhỏ hơn 100, kẻ tấn công có thể lợi dụng fastcgi
để xâm nhập và thay đổi các file trong hệ thống. Do đó, nên chạy PHP CGI bằng những tài
khoản như suEXEC hoặc mod_suPHP. Đây là những tài khoản có đủ quyền để thực thi công
việc chạy php.
15. Hạn chể quyền truy cập đến các file hệ thống.
Tính năng open_basedir dùng để xác định những thư mục nào PHP được phép truy cập thông
qua những function như fopen()… Nếu ứng dụng truy cập đến file ở các thư mục khác,PHP sẽ từ
chối việc này. Chúng ta cấu hình thông qua file /etc/php.ini
Đây là phần 3 (phần cuối) của bài viết một số phương pháp bảo vệ php, nếu bạn chưa xem phần
1 và phần 2, các bạn có thể theo dõi tại đây
Link phần 1
Link phần 2
Chúng ta sẽ đi và phần cuối:
16. Session Path
Session trong PHP nhằm bảo vệ dữ liệu trong những lần truy cập tiếp theo. Điều này cho phép
chúng ta có thể xây dựng những ứng dụng tùy chỉnh khác cho website. Đường dẫn này được
định nghĩa trong /etc/php.ini và tất cả những dư liệu liên quan đến phiên đó sẽ được lưu trữ trong
thư mục được định nghĩa qua session.save_path
Ngoài ra, chúng ta có thể cấu hình thư mục tạm cho việc upload file
17. Cập nhật thường xuyên hệ điều hành, PHP
Lợi ích thì đã quá rõ rồi, chúng ta sử dụng câu lệnh
1 yum update
Hoặc
1 apt-get update && apt-get upgrade
18. Bảo vệ các file cấu hình của Apache, PHP, MySQL
Sử dụng câu lênh chattr để bảo vệ chống ghi đè file cấu hình:
19. Sử dụng Linux Security Extensions (ví dụ như SELinux)
Linux có rất nhiều bản vá lỗi cho các lỗi về cấu hình hoặc những chương trình trên hệ thống. Bạn
có thể sử dụng SELinux nhằm hạn chế việc sử dụng băng thông mạng cũng như hạn chế các
chương trình khác. Ví dụ như, SELinux có một số những policy cho Linux kernel và Apache
web server. Để liệt kê tất cả chính sách liên quan đến Apache của SELinux, chúng ta sử dụng
câu lệnh
1 getsebool -a | grep httpd
Ví dụ, để tắt httpd_enable_cgi, ta sử dụng câu lệnh:
1 setsebool -P httpd_enable_cgi off
20. Install Mod_security
ModSecurity là ứng dụng IPS mã nguồn mở cho ứng dụng web, việc sử dụng mod_security có
thể giúp ứng dụng web chống lại những tấn công như xss hay sql injection
21. Sử dụng firewall để hạn chế những truy cập từ bên ngoài.
Kẻ tấn công có thể download các file từ máy tính của chúng ta thông qua wget. Để hạn chế điều
này, chúng ta có thể sử dụng iptables để block các kết nối từ bên ngoài.
22. Thường xuyên kiểm tra file log
Log của apache:
1 tail -f /var/log/httpd/error_log
2 grep 'login.php' /var/log/httpd/error_log
3 egrep -i "denied|error|warn" /var/log/httpd/error_log
Log của php
1 tail -f /var/log/httpd/php_scripts_error.log
2 grep "...etc/passwd" /var/log/httpd/php_scripts_error.log
Những câu lệnh trên có thể giúp các bạn tìm hiểu xem có những tấn công xảy ra với server của
mình hay không
23. Những lưu ý khác
Sử dụng các công cụ bảo vệ khác: như PHPIDS hoặc PhpSecInfo. Trong đó, PHPIDS có tác
dụng lọc các dữ liệu đầu vào có thể gây ảnh hưởng tới ứng dụng, PhpSecInfo kiểm tra function
phpinfo() của PHP, đưa ra những thông tin hữu ích về hiện trạng cũng như những gợi ý nhằm
nâng cao hiệu năng ứng dụng.
Tìm xem hệ thống có dính backboor hay không
Nếu hệ thống có dính một số backdoor thông dụng như c99 hay r57, chúng ta có thể tìm kiếm
trên hệ thống thông qua grep
1 grep -iR 'c99' /var/www/html/
2 grep -iR 'r57' /var/www/html/
3 find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99
4 grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/html/
Kết luận
Trên đây là một số phương pháp tăng cường bảo mật cho PHP. Tuy nhiên, hacker là những
người rất giỏi, những biện pháp vừa rồi không thể hoàn toàn ngăn cản họ. Do đó, ngoài việc duy
trì hệ thống ổn định, êm ái, các bạn cần thường xuyên pentest nó để phát hiện điểm yếu sớm và
khắc phục kịp thời.