HƯỚNG DẪN 25 cách thực hiện bảo mật php đối với Sysadmin

Thảo luận trong 'KIẾN THỨC VPS/SERVER' bắt đầu bởi quyet1990, 14/12/16.

  1. quyet1990

    quyet1990 New Member

    Tham gia ngày:
    22/10/16
    Bài viết:
    220
    Đã được thích:
    0
    PHP là một ngôn ngữ mã nguồn mở server-side scripting, và nó được sử dụng rộng rãi. Các máy chủ web Apache/Nginx/Lighttpd cung cấp quyền truy cập vào các tập tin và nội dung thông qua các giao thức HTTP hoặc HTTPS.

    Một server-side scripting cấu hình sai có thể tạo ra nhiều loại vấn đề. Vì vậy, PHP nên được sử dụng một cách thận trọng. Dưới đây là 25 cách thực hành bảo mật tốt nhất php cho quản trị hệ thống để cấu hình PHP một cách an toàn.

    Thiết lập hệ thống của chúng tôi cho hướng dẫn này:
    • DocumentRoot: /var/www/html
    • Default Web server: Apache (bạn có thể sử dụng Lighttpd hoặc Nginx thay vì Apache)
    • Mặc định tập tin cấu hình PHP: /etc/php.ini
    • Mặc định thư mục mở rộng PHP config: /etc/php.d/
    • Tập tin mẫu của chúng tôi để cấu hình bảo mật: /etc/php.d/security.ini (bạn cần tạo ra tập tin này bằng một trình soạn thảo văn bản)
    • Hệ điều hành: RHEL/CentOS/Fedora Linux (các hướng dẫn sẽ làm việc với bất kỳ bản phân phối Linux khác như Debian/Ubuntu hoặc Unix khác như hệ điều hành như OpenBSD/FreeBSD/HP-UX).
    • Mặc định PHP máy chủ TCP/UDP: none
    Hầu hết các hành động được liệt kê trong bài viết này được viết với giả định rằng chúng sẽ được thực hiện bởi user root.
    Mã:
    php -v
    Ví dụ kết quả đầu ra:
    Mã:
     PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41)
    Copyright (c) 1997-2010 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies 
    Đối với mục đích trình bày tôi sẽ sử dụng các hệ điều hành sau đây:
    Mã:
     cat /etc/redhat-release 
    Ví dụ kết quả đầu ra:
    Mã:
     Red Hat Enterprise Linux Server release 6.1 (Santiago) 
    # 1: Biết kẻ thù của bạn
    PHP có thể phải đối mặt với các loại khác nhau của các cuộc tấn công. Tôi đã nhận thấy các loại tấn công khác nhau như:

    XSS - Cross-site scripting là một lỗ hổng trong các ứng dụng web php, kẻ tấn công có thể khai thác để đánh cắp thông tin người dùng. Bạn có thể cấu hình Apache và viết script PHP an toàn hơn (xác nhận tất cả các đầu vào người sử dụng) để tránh các cuộc tấn công XSS.

    SQL injection - Đây là một lỗ hổng trong lớp cơ sở dữ liệu của một ứng dụng PHP. Là một kỹ thuật tấn công vào câu lệnh cơ sở dữ liệu thông qua chèn các đoạn mã độc vào SQL để đánh lạc hướng xử lý với mục đích phá hủy dữ liệu hoặc ăn cắp. Bạn có thể cấu hình Apache và viết mã an toàn (xác nhận và thoát tất cả người dùng nhập vào) để tránh các cuộc tấn công SQL injection. Một thực tế phổ biến trong PHP là để thoát khỏi các thông số bằng cách sử dụng chức năng gọi mysql_real_escape_string () trước khi gửi các truy vấn SQL.

    File uploads - Nó cho phép khách truy cập của bạn có thể đặt các tập tin (tập tin tải lên) vào máy chủ của bạn. Điều này có thể dẫn đến các vấn đề bảo mật khác nhau chẳng hạn như xóa các tập tin của bạn, xóa cơ sở dữ liệu, ăn cắp thông tin chi tiết người dùng và nhiều hơn nữa. Bạn có thể vô hiệu hóa file uploads sử dụng php hay viết mã an toàn (như xác nhận người dùng nhập vào và chỉ cho phép các loại tập tin hình ảnh như png hay gif).

    Bao gồm cả các tập tin địa phương và từ xa - Một kẻ tấn công có thể mở tập tin từ máy chủ từ xa và thực hiện bất kỳ mã PHP. Điều này cho phép họ tải lên tập tin, xóa tập tin và cài đặt backdoor. Bạn có thể cấu hình php để vô hiệu hóa tập tin thực thi từ xa.

    eval () - Đánh giá một chuỗi như là mã PHP. Điều này thường được sử dụng bởi một kẻ tấn công giấu mã và các công cụ của họ trên máy chủ của họ. Bạn có thể cấu hình php để vô hiệu hóa eval ().

    Sea-surf Attack (Cross-site request forgery - CSRF) – CSRF (Cross-site request forgery) hay one-click attack, session riding là một phương thức khai thác lỗ hổng của website theo đó những lệnh không được phép được thực hiện bởi nạn nhân – những user được website cấp quyền mà họ không hề hay biết.CSRF sẽ lừa trình duyệt của nạn nhân gửi đi các câu lệnh http đến các ứng dụng web. Trong trường hợp phiên làm việc của nạn nhân chưa hết hiệu lực thì các câu lệnh trên sẽ được thực hiện với quyền chứng thực của nạn nhân. Nếu người sử dụng cuối là các tài khoản quản trị, điều này có thể làm tổn hại đến toàn bộ ứng dụng web.


    # 2: Xây dựng PHP module
    Để xem các module php gõ lệnh sau:
    Mã:
    php -m
    Ví dụ kết quả đầu ra:
    Mã:
    [PHP Modules]
    apc
    bcmath
    bz2
    calendar
    Core
    ctype
    curl
    date
    dom
    ereg
    exif
    fileinfo
    filter
    ftp
    gd
    gettext
    gmp
    hash
    iconv
    imap
    json
    libxml
    mbstring
    memcache
    mysql
    mysqli
    openssl
    …
    
    Tôi khuyên bạn nên sử dụng PHP với số lượng module hạn chế để cải thiện hiệu suất và an ninh. Ví dụ, bạn có thể vô hiệu hóa mô-đun sqlite3 bằng cách xóa tập tin cấu hình , hoặc đổi tên (di chuyển) một tập tin gọi là /etc/php.d/sqlite3.ini như sau:
    Mã:
     rm /etc/php.d/sqlite3.ini 
    Hoặc:
    Mã:
     mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable 
    Các module có thể được gỡ bỏ bằng reinstallating PHP với một cấu hình ngắn gọn hơn. Bạn có thể tải về mã nguồn php từ php.net và biên dịch nó như sau với GD, fastcgi, và hỗ trợ MySQL:
    Mã:
    ./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
    
    Coi tài liệu này để biết thêm thông tin.
    # 3: Giới hạn rò rỉ thông tin PHP
    Để hạn chế những rò rỉ thông tin PHP vô hiệu hóa expose_php. Chỉnh sửa /etc/php.d/secutity.ini và thiết lập chỉ thị sau đây:
    Mã:
     expose_php=Off 
    Khi expose_php kích hoạt, bạn có thể xem phiên bản php bằng cách sử dụng lệnh sau:
    Mã:
     curl -I http://www.aluhost.com/index.php 
    Ví dụ kết quả đầu ra:
    Mã:
    HTTP/1.1 200 OK
    X-Powered-By: PHP/5.3.3
    Content-type: text/html; charset=UTF-8
    Vary: Accept-Encoding, Cookie
    X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session
    Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT
    ...
    
    Bạn có thể sử dụng hướng dẫn này để ẩn phiên bản Apache.
    # 4: Giảm thiểu Loadable PHP module (Dynamic Extensions)
    PHP hỗ trợ " Dynamic Extensions ". Theo mặc định, RHEL load tất cả các module mở rộng được tìm thấy trong thư mục /etc/php.d/. Để kích hoạt hoặc vô hiệu hóa một module cụ thể, chỉ cần tìm các tập tin cấu hình trong thư mục /etc/php.d/ và comment tên module.

    Bạn cũng có thể đổi tên hoặc xóa các tập tin cấu hình mô-đun. Đối với hiệu suất PHP tốt nhất và an toàn, bạn chỉ nên cho phép các phần mở rộng yêu cầu cho ứng dụng web của bạn. Ví dụ, để tắt tiện ích gd, gõ các lệnh sau:
    Mã:
     cd /etc/php.d/
    mv gd.{ini,disable}
    /sbin/service httpd restart 
    Để kích hoạt mô-đun php gọi gd, hãy nhập:
    Mã:
     mv gd.{disable,ini}
    /sbin/service httpd restart 
    # 5: Log tất cả các lỗi PHP
    Không để rò rỉ thông báo lỗi PHP cho tất cả các khách truy cập trang. Chỉnh sửa /etc/php.d/security.ini và thiết lập các chỉ thị sau đây:
    Mã:
     display_errors=Off 
    Hãy chắc chắn rằng bạn log tất cả các lỗi php vào một tập tin log:
    Mã:
    log_errors=On
    error_log=/var/log/httpd/php_scripts_error.log
    
    # 6: Không cho phép tải lên tập tin
    Chỉnh sửa /etc/php.d/security.ini và thiết lập chỉ thị sau đây để vô hiệu hóa tập tin tải lên vì lý do an ninh:
    Mã:
     file_uploads=Off 
    Nếu người sử dụng các ứng dụng của bạn cần phải tải lên các tập tin, tắt tính năng này bằng cách thiết lập post_max_filesize để giới hạn kích thước tối đa của tập tin mà PHP sẽ chấp nhận thông qua cập nhật:
    Mã:
    file_uploads=On
    # user can only upload upto 1MB via php
    upload_max_filesize=1M
    
    Xem hướng dẫn này để biết thông tin chi tiết.

    # 7: Turn Off Remote Code Execution
    Nếu được kích hoạt, allow_url_fopen cho phép chức năng tập tin PHP - chẳng hạn như file_get_contents() và bao gồm và require statements - có thể lấy dữ liệu từ các địa điểm từ xa, giống như một FTP hoặc trang web.

    Các lập trình viên thường hay quên điều này và không làm lọc đầu vào thích hợp khi xem xét dữ liệu do người dùng cung cấp cho các chức năng này, điều này tạo ra lỗ hổng code injection. Một số lượng lớn các lỗ hổng code injection báo cáo trong các ứng dụng web dựa trên PHP được gây ra bởi sự kết hợp của việc kích hoạt allow_url_fopen và lọc input sai . Chỉnh sửa /etc/php.d/security.ini và thiết lập các chỉ thị sau đây:
    Mã:
     allow_url_fopen=Off 
    Tôi cũng khuyên bạn nên vô hiệu hóa allow_url_include vì lý do an ninh:
    Mã:
     allow_url_include=Off 
    # 8: Kích hoạt chế độ Safe Mode SQL
    Chỉnh sửa /etc/php.d/security.ini và thiết lập chỉ thị sau đây:
    Mã:
     sql.safe_mode=On 
    Nếu chế độ được kích hoạt, mysql_connect () và mysql_pconnect () bỏ qua bất kỳ đối số truyền cho chúng.
    Tôi cũng khuyên bạn nên tắt magic_quotes_gpc cho tất cả các cài đặt php 5.3.x vì mysql_escape_string() có thể là lựa chọn thay thế tốt hơn:
    Mã:
     magic_quotes_gpc=Off 
    # 9: Kiểm soát kích thước POST
    Các phương thức yêu cầu HTTP POST được sử dụng khi khách hàng (trình duyệt hay người dùng) cần gửi dữ liệu đến máy chủ web Apache, chẳng hạn như khi tải lên một tập tin hoặc gửi một biểu mẫu hoàn thành. Những kẻ tấn công có thể cố gắng để gửi yêu cầu POST quá kích thước để ăn tài nguyên hệ thống của bạn. Bạn có thể giới hạn các yêu cầu POST kích thước tối đa mà PHP sẽ xử lý. Chỉnh sửa /etc/php.d/security.ini và thiết lập các chỉ thị sau đây:
    Mã:
    ; Set a realistic value here
    post_max_size=1K 
    1K đặt kích thước tối đa của dữ liệu post cho phép các ứng dụng php. Thiết lập này cũng ảnh hưởng đến tập tin tải lên. Để tải lên tập tin lớn, giá trị này phải lớn hơn post_max_filesize. Tôi cũng đề nghị bạn nên hạn chế sử dụng phương pháp có sẵn máy chủ web Apache. Chỉnh sửa httpd.conf và thiết lập các chỉ thị sau đây cho DocumentRoot /var/www/html:
    Mã:
    <Directory /var/www/html>
      <LimitExcept GET POST>
      Order allow,deny
      </LimitExcept>
    ## Add rest of the config goes here... ##
    </Directory>
    
    # 10: Kiểm soát tài nguyên (DoS Control)
    Bạn có thể thiết lập thời gian thực thi tối đa của mỗi script php trong vài giây. Một đề nghị lựa chọn là để thiết lập thời gian tối đa mỗi script có thể phân tích dữ liệu theo yêu cầu, và tối đa bộ nhớ một script có thể tiêu thụ. Chỉnh sửa /etc/php.d/security.ini và thiết lập các chỉ dẫn sau:
    Mã:
    # set in seconds
    max_execution_time =  30
    max_input_time = 30
    memory_limit = 40M
    # 11: Cài đặt hệ thống bảo vệ nâng cao Suhosin cho PHP
    Từ trang dự án:
    Suhosin là một hệ thống bảo vệ tiên tiến cho việc cài đặt PHP. Nó được thiết kế để bảo vệ máy chủ và người dùng từ các lỗi biếtvà chưa biết trong các ứng dụng PHP và lõi PHP. Suhosin có hai phần độc lập, có thể được sử dụng riêng rẽ hoặc kết hợp. Phần đầu tiên là một bản vá nhỏ so với lõi PHP, mà thực hiện một vài sự bảo vệ ở mức độ thấp chống lại các bufferoverflows hoặc các lỗ hổng chuỗi định dạng và phần thứ hai là một phần mở rộng PHP mạnh mẽ mà thực hiện tất cả các biện pháp bảo vệ khác.
    Xem hướng dẫn cài đặt Suhosin tại đây.

    # 12 Vô hiệu hóa chức năng PHP nguy hiểm
    PHP có rất nhiều chức năng mà có thể được sử dụng để bẻ khóa server của bạn nếu không được sử dụng đúng cách. Bạn có thể thiết lập danh sách các chức năng bị vô hiệu hóa trong /etc/php.d/security.ini sử dụng chỉ thị disable_functions,
    Chỉ thị này cho phép bạn vô hiệu hóa chức năng nhất định vì lý do an ninh. Nó sử dụng dấu phẩy phân cách tên của các chức năng. disable_functions không bị ảnh hưởng bởi chế độ Safe Mode. Chỉ thị này phải được thiết lập trong tập tin php.ini.

    Mã:
     disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source 
    Tôi cũng khuyên bạn nên vô hiệu hóa allow_url_include và allow_url_fopen vì lý do an ninh:
    Mã:
    allow_url_fopen=Off
    allow_url_include=Off
    #13 PHP Fastcgi / CGI – cgi.force_redirect Directive
    PHP làm việc với FastCGI. Fascgi làm giảm bộ nhớ của máy chủ web của bạn, nhưng vẫn mang lại cho bạn tốc độ và sức mạnh của toàn bộ ngôn ngữ PHP. Chỉ thị cấu hình cgi.force_redirect ngăn chặn bất cứ ai từ calling PHP trực tiếp với một URL ví dụ như http://www.aluhost.com/cgi-bin/php/hackerdir/backdoor.php. Bật cgi.force_redirect vì lý do an ninh. Chỉnh sửa /etc/php.d/security.ini và thiết lậpchỉ thị sau đây:
    Mã:
    ; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup
    cgi.force_redirect=On
    
    # 14 PHP User và Group ID
    mod_fastcgi là một cgi-module cho máy chủ web Apache. Nó có thể kết nối đến một máy chủ FastCGI bên ngoài. Bạn cần phải chắc chắn php chạy như người sử dụng không phải user root. Nếu PHP thực hiện như một root hay UID dưới 100, nó có thể truy cập và/hoặc thao tác tập tin hệ thống.

    Bạn phải thực thi PHP CGI như một người dùng không có đặc quyền sử dụng Apache's suEXEC hoặc mod_suPHP . Tính năng suEXEC cung cấp cho người dùng Apache khả năng chạy các chương trình CGI dưới ID người dùng khác nhau Trong ví dụ này, php-cgi của tôi là chạy với user phpcgi và apache đang chạy với user apache:
    Mã:
     ps aux | grep php-cgi 
    Ví dụ kết quả đầu ra:
    Mã:
    phpcgi  6012  0.0  0.4 225036 60140 ?   S  Nov22  0:12 /usr/bin/php-cgi
    phpcgi  6054  0.0  0.5 229928 62820 ?  S  Nov22  0:11 /usr/bin/php-cgi
    phpcgi  6055  0.1  0.4 224944 53260 ?  S  Nov22  0:18 /usr/bin/php-cgi
    phpcgi  6085  0.0  0.4 224680 56948 ?   S  Nov22  0:11 /usr/bin/php-cgi
    phpcgi  6103  0.0  0.4 224564 57956 ?  S  Nov22  0:11 /usr/bin/php-cgi
    phpcgi  6815  0.4  0.5 228556 61220 ?  S  00:52  0:19 /usr/bin/php-cgi
    phpcgi  6821  0.3  0.5 228008 61252 ?  S   00:55  0:12 /usr/bin/php-cgi
    phpcgi  6823  0.3  0.4 225536 58536 ?  S  00:57  0:13 /usr/bin/php-cgi
    
    # 15 Giới hạn truy cập PHP đến hệ thống tập tin
    Chỉ thị open_basedir thiết lập các thư mục mà từ đó PHP được phép truy cập vào các tập tin sử dụng các chức năng như fopen (), và một số câu lệnh khác. Nếu một tập tin bên ngoài của các đường dẫn được định nghĩa bởi open_basdir, PHP sẽ từ chối để mở nó.

    Bạn không thể sử dụng một liên kết tượng trưng như một cách giải quyết. Ví dụ chỉ cho phép truy cập vào thư mục /var/www/html và không cho truy cập thư mục /var/www, hoặc /tmp hoặc /etc:
    Mã:
    ; Limits the PHP process from accessing files outside
    ; of specifically designated directories such as /var/www/html/
    open_basedir="/var/www/html/"
    ; ------------------------------------
    ; Multiple dirs example
    ; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"
    ; ------------------------------------
    
    # 16 Session path
    Hỗ trợ Session trong PHP bao gồm một cách để bảo vệ dữ liệu nhất định trên các truy cập tiếp theo. Điều này cho phép bạn xây dựng các ứng dụng tùy chỉnh hơn và tăng sự hấp dẫn của trang web của bạn.

    Đường dẫn này được định nghĩa trong tập tin /etc/php.ini và tất cả các dữ liệu liên quan đến một phiên cụ thể sẽ được lưu trữ trong một tập tin trong thư mục chỉ định bởi tùy chọn session.save_path. Mặc định là như sau trên RHEL/CentOS/Fedora Linux:
    Mã:
    session.save_path="/var/lib/php/session"
    ; Set the temporary directory used for storing files when doing file upload
    upload_tmp_dir="/var/lib/php/session"
    
    Hãy chắc chắn rằng đường dẫn bên ngoài /var/www/html và không thể đọc hoặc ghi được bởi bất kỳ người sử dụng hệ thống khác:
    Mã:
     ls -Z /var/lib/php/ 
    Ví dụ kết quả đầu ra:
    Mã:
    drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
    
    # 17 Giữ PHP, phần mềm, hệ điều hành luôn được cập nhật
    Áp dụng các bản vá lỗi bảo mật là một phần quan trọng của việc duy trì Linux, Apache, PHP và MySQL server. Tất cả các bản cập nhật bảo mật php nên được xem xét và áp dụng ngay khi có thể bằng cách sử dụng bất kỳ một trong những công cụ sau đây:
    Mã:
    yum update
    Hoặc:
    Mã:
     apt-get update && apt-get upgrade 
    Bạn có thể cấu hình Red hat/CentOS/Fedora Linux để gửi yum thông báo gói cập nhật qua email. Một lựa chọn khác là để áp dụng tất cả các bản cập nhật bảo mật thông qua một cron job. Đối với Debian/Ubuntu Linux, bạn có thể sử dụng apticron để gửi các thông báo an ninh.
    Lưu ý: Kiểm tra php.net thường xuyên để cập nhật phiên bản mới nhất.

    # 18: Hạn chế truy cập tập tin và thư mục
    Hãy chắc chắn rằng bạn chạy Apache như là một người sử dụng không phải root ví dụ như Apache hoặc www. Tất cả các tập tin và thư mục cần được sở hữu bởi uer không phải root trong thư mục var/www/html:
    Mã:
     chown -R apache:apache /var/www/html/ 
    Hãy chắc chắn rằng tập tin trong thư mục /var/www/html/ được thiết lập đến 0444 (chỉ đọc):
    Mã:
     chmod -R 0444 /var/www/html/ 
    Tìm hiểu về user, group, phân quyền bạn có thể tham khảo hướng dẫn này.
    Hãy chắc chắn rằng tất cả các thư mục con cho phép trong thư mục /var/www/html/ được thiết lập đến 0455:
    Mã:
    find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}
    Tìm hiểu về lệnh find bạn có thể tham khảo hướng dẫn này.

    Hãy chắc chắn rằng httpd.conf có các chỉ dẫn sau để cấu hình hạn chế:
    Mã:
    <Directory / >
      Options None
      AllowOverride None
      Order allow,deny
    </Directory>
    
    Bạn chỉ nên cấp ghi truy cập khi cần thiết. Một số ứng dụng web như wordpress…có thể cần một thư mục bộ nhớ đệm. Bạn có thể cấp quyền truy cập vào bộ nhớ đệm bằng cách sử dụng lệnh sau:
    Mã:
    # chmod a+w /var/www/html/blog/wp-content/cache
    ### block access to all ###
    # echo 'deny from all' > /var/www/html/blog/wp-content/cache/.htaccess
    
    # 19: Bảo vệ tập tin cấu hình Apache, PHP và MySQL
    Sử dụng lệnh chattr để bảo vệ các tập tin cấu hình:
    Mã:
    chattr +i /etc/php.ini
    chattr +i /etc/php.d/*
    chattr +i /etc/my.ini
    chattr +i /etc/httpd/conf/httpd.conf
    chattr +i /etc/
    
    Lệnh chattr có thể bảo vệ tập tin php của bạn hoặc các tập tin trong thư mục /var/www html:
    Mã:
     chattr +i /var/www/html/file1.php
    chattr +i /var/www/html/ 
    # 20: Sử dụng tiện ích an ninh Linux (như SELinux)
    Linux đi kèm với các bản vá lỗi bảo mật khác nhau mà có thể được sử dụng để bảo vệ chống lại các chương trình máy chủ cấu hình sai hoặc bị tổn thương. Nếu có thể sử dụng SELinux và tiệc ích an ninh khác Linux để thực thi các hạn chế trên mạng và các chương trình khác.

    Ví dụ, SELinux cung cấp một loạt các chính sách bảo mật cho Linux kernel và máy chủ web Apache. Để liệt kê tất cả các biến bảo vệ Apache SELinux, hãy nhập:
    Mã:
     getsebool -a | grep httpd 
    Ví dụ kết quả đầu ra:
    Mã:
    allow_httpd_anon_write --> off
    allow_httpd_mod_auth_ntlm_winbind --> off
    allow_httpd_mod_auth_pam --> off
    allow_httpd_sys_script_anon_write --> off
    httpd_builtin_scripting --> on
    httpd_can_check_spam --> off
    httpd_can_network_connect --> off
    httpd_can_network_connect_cobbler --> off
    httpd_can_network_connect_db --> off
    httpd_can_network_memcache --> off
    httpd_can_network_relay --> off
    httpd_can_sendmail --> off
    httpd_dbus_avahi --> on
    httpd_enable_cgi --> on
    httpd_enable_ftp_server --> off
    httpd_enable_homedirs --> off
    httpd_execmem --> off
    httpd_read_user_content --> off
    httpd_setrlimit --> off
    httpd_ssi_exec --> off
    httpd_tmp_exec --> off
    httpd_tty_comm --> on
    httpd_unified --> on
    httpd_use_cifs --> off
    httpd_use_gpg --> off
    httpd_use_nfs --> off
    
    Để vô hiệu hóa hỗ trợ cgi Apache, hãy nhập:
    Mã:
     setsebool -P httpd_enable_cgi off 
    # 21 Cài đặt mod_security
    ModSecurity là một phần mền mã nguồn mở giúp phát hiện và phòng chống xâm nhập cho các ứng dụng web. Bạn có thể dễ dàng cài đặt mod_security trên Linux và bảo vệ các ứng apache và php chống lại XSS và các cuộc tấn công khác nhau:
    Mã:
    ## A few Examples ##
    # Do not allow to open files in /etc/
    SecFilter /etc/
    
    # Stop SQL injection
    SecFilter "delete[[:space:]]+from"
    SecFilter "select.+from" 
    # 22 Chạy Apache/PHP Trong một Chroot Jail nếu có thể
    Đặt PHP và/hoặc Apache trong một chroot jail có thể giảm thiểu những thiệt hại do các cuộc tấn công, thực hiện điều đó bằng cách cô lập các máy chủ web đến một phần nhỏ của hệ thống tập tin. Bạn có thể sử dụng chroot truyền thống của thiết lập với Apache. Tuy nhiên, tôi khuyên khích sử dụng các FreeBSD jail, XEN virtulization, KVM virtulization, hoặc ảo hóa OpenVZ trong đó sử dụng các khái niệm của container.

    # 23 Sử dụng Firewall để hạn chế các kết nối gửi đi
    Kẻ tấn công sẽ tải tập tin cục bộ trên máy chủ web của bạn sử dụng các công cụ như wget. Sử dụng iptables để chặn các kết nối gửi đi từ người sử dụng apache. Module ipt_owner cố gắng xem xét các đặc điểm gói tin. Nó chỉ hợp lệ trong chuỗi OUTPUT. Trong ví dụ này, cho phép người dùng vivek kết nối bên ngoài sử dụng cổng 80:
    Mã:
     /sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --state NEW,ESTABLISHED  -j ACCEPT 
    Dưới đây là một ví dụ khác chặn tất cả các kết nối gửi đi từ người sử dụng apache ngoại trừ việc máy chủ SMTP của riêng của chúng tôi, và dịch vụ xác nhận thư rác API:
    Mã:
    # ....
    /sbin/iptables --new-chain apache_user
    /sbin/iptables --append OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    /sbin/iptables --append OUTPUT -m owner --uid-owner apache -j apache_user
    # allow apache user to connec to our smtp server
    /sbin/iptables --append apache_user -p tcp --syn -d 192.168.1.100 --dport 25 -j RETURN
    # Allow apache user to connec to api server for spam validation
    /sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.62 --dport 80 -j RETURN
    /sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.61 --dport 80 -j RETURN
    /sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.89 --dport 80 -j RETURN
    /sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.88 --dport 80 -j RETURN
    #########################
    ## Add more rules here ##
    #########################
    # No editing below
    # Drop everything for apache outgoing connection
    /sbin/iptables --append apache_user -j REJECT
    
    # 24 Xem Logs & Auditing của bạn
    Kiểm tra các tập tin log apache:
    Mã:
     tail -f /var/log/httpd/error_log
    grep 'login.php' /var/log/httpd/error_log
    egrep -i "denied|error|warn" /var/log/httpd/error_log 
    Kiểm tra các tập tin php log:
    Mã:
     tail -f /var/log/httpd/php_scripts_error.log
    grep "...etc/passwd" /var/log/httpd/php_scripts_error.log 
    # 25 Chạy dịch vụ trên mỗi hệ thống hoặc VM Instance
    Để cài đặt dữ liệu lớn, cách này được khuyến khích, nó sẽ giúp cơ sở dữ liệu, tĩnh, và nội dung động từ các máy chủ khác nhau.
    Ví dụ kết quả đầu ra:
    Mã:
    ///////////////
    / ISP/Router /
    //////////////
      \
      |
      Firewall
      \
      |
      +------------+
      | LB01  |
      +------------+  +--------------------------+
      |  | static.lan.aluhost.com |
        +-----------------+--------------------------+
       | phpcgi1.lan. aluhost.com |
      +--------------------------+
       | phpcgi2.lan. aluhost.com |
      +--------------------------+
       | mysql1.lan. aluhost.com |
      +--------------------------+
       | mcache1.lan. aluhost.com |
      +--------------------------+
    
    Chạy các dịch vụ mạng khác nhau trên các máy chủ riêng biệt hoặc các VM Instance. Điều này hạn chế số lượng các dịch vụ khác có thể bị tổn hại. Ví dụ, nếu một kẻ tấn công có thể khai thác thành công một phần mềm như dòng Apache, anh/cô ấy sẽ nhận được quyền truy cập vào toàn bộ máy chủ bao gồm các dịch vụ khác đang chạy trên cùng một máy chủ (như MySQL, máy chủ e-mail và vv). Nhưng, theo ví dụ trên được xử lý như sau:

    • static.lan.aluhost.com- Sử dụng lighttpd hoặc máy chủ nginx cho tài sản tĩnh như js/css/images.
    • phpcgi1.lan.aluhost.comvà phpcgi2.lan.aluhost.com- Apache web server với php sử dụng để tạo nội dung động.
    • mysql1.lan.aluhost.com- máy chủ cơ sở dữ liệu MySQL.
    • mcache1.lan.aluhost.com- máy chủ Memcached là hệ thống bộ nhớ đệm rất nhanh cho MySQL. Nó sử dụng libevent hoặc epoll (Linux runtime) để mở rộng cho bất kỳ số lượng các kết nối mở và mạng I/O không bị block.
    • LB01 - Một web nginx và máy chủ reverse proxy ở phía trước của máy chủ Web Apache. Tất cả các kết nối đến từ Internet tới một trong các máy chủ Web được định tuyến thông qua máy chủ nginx proxy. LB01 cung cấp đơn giản cân bằng tải.
    # 26 Công cụ bổ sung
    Từ trang dự án:
    PhpSecInfo cung cấp một chức năng tương đương với phpinfo(), giúp báo cáo bảo mật thông tin về môi trường PHP, và cung cấp các gợi ý để cải thiện. Nó không phải là một sự thay thế cho kỹ thuật phát triển an toàn, và không là bất kỳ loại code nào hoặc ứng dụng auditing, nhưng có thể là một công cụ hữu ích trong một cách tiếp cận an ninh nhiều lớp.

    Lưu ý về PHP Backdoors
    Bạn có thể đi qua các script php hay còn gọi là backdoor thông thường như c99, c99madshell, R 57 …. Một php script backdoor là một kịch bản ẩn cho phép bỏ qua tất cả xác thực khi truy cập vào máy chủ của bạn.
    Nó được cài đặt bởi một kẻ tấn công để truy cập vào máy chủ của bạn trong khi cố gắng để không bị phát hiện. Thông thường một script PHP (hoặc bất kỳ script CGI khác) có thể mắc lỗi và sẽ cho phép tạo ra các lỗ hổng trong các trình duyệt web. Một kẻ tấn công có thể sử dụng các lỗ hổng khai thác như tải lên backdoor mà có thể cho anh ta hoặc cô ấy một số khả năng như:
    • Tải tập tin
    • Upload tập tin
    • Cài đặt rootkit
    • Thiết lập một máy chủ thư rác/relay.
    • Thiết lập một máy chủ proxy để ẩn dấu vết.
    • Kiểm soát của máy chủ
    • Kiểm soát của máy chủ cơ sở dữ liệu
    • Ăn cắp tất cả thông tin
    • Xóa tất cả các thông tin và cơ sở dữ liệu
    • Mở cổng TCP/UDP và nhiều hơn nữa
    Mẹo: Làm sao tôi tìm kiếm PHP Backdoors?
    Sử dụng Unix / Linux lệnh grep để tìm kiếm c99 hoặc r57:
    Mã:
     grep -iR 'c99' /var/www/html/
    grep -iR 'r57' /var/www/html/
    find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99
    grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/html/ 
     
    #1 quyet1990, 14/12/16
    Sửa lần cuối: 17/12/16

Chia sẻ trang này

Đang tải...