12
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

Một số phương pháp bảo vệ php trên linux

Embed Size (px)

Citation preview

Page 1: Một số phương pháp bảo vệ php trên linux

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

Page 2: Một số phương pháp bảo vệ php trên linux

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

Page 3: Một số phương pháp bảo vệ php trên linux

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

Page 4: Một số phương pháp bảo vệ php trên linux

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

Page 5: Một số phương pháp bảo vệ php trên linux

ứ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>

Page 6: Một số phương pháp bảo vệ php trên linux

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

Page 7: Một số phương pháp bảo vệ php trên linux

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

Page 8: Một số phương pháp bảo vệ php trên linux

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:

Page 9: Một số phương pháp bảo vệ php trên linux

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

Page 10: Một số phương pháp bảo vệ php trên linux

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

Page 11: Một số phương pháp bảo vệ php trên linux

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

Page 12: Một số phương pháp bảo vệ php trên linux

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.