Thứ Ba, 30 tháng 7, 2013

Giảm thiểu tác hại của http flood với nginx và roboo

Cơ bản

Các cuộc tấn công http flood hiện tại thường với cách thức là tạo truy vấn đến các file cần khả năng xử lý lớn của server. Kết quả của cuộc tấn công thường làm cho mysql bị lỗi, web service bị qúa tải vì quá nhiều các cgi đang chạy.

Cách thức để giảm thiểu ảnh hưởng của cuộc tấn công http flood.

Để giảm thiểu việc tiêu tốn khả năng xử lý cũng như tài nguyên của server ta phải cách ly những script chạy rất nặng ra khỏi tầm ngắm của botnet hay các công cụ dùng để ddos. Muốn làm được việc này ta phải làm thế nào? Đặc điểm của botnet hay các công cụ tấn công dos http flood ra sao:
  • Các công cụ thường là gửi các request với header và mọi thứ có sẵn đến một số script nhất định.
  • Thường không xử lý được javascript hay flash do không thể ôm cả bộ webkit hay component lớn để xử lý ddos.
Việc chặn request bằng đặc điểm của header khó có thể áp dụng vì kẻ tấn công có thể thay đổi header một cách dễ dàng để qua được các cách mà ta đã viết. Do đó việc dùng javascript hoặc flash để tạo các đặc điểm nhận dạng và xác thực request của người dùng sẽ là một phương án hiệu quả hơn.

Cách thức roboo giải quyết vấn đề

Roboo sẽ tạo và xác thực người dùng bằng một mã hash từ thông tin của người dùng như: ip, useragent. Khi người dùng tạo request lên lần đầu roboo sẽ tạo mã xác thực và đưa mã xác thực vào cookie thông qua javascript hoặc flash. Khi mỗi request đưa lên roboo sẽ kiểm tra xem mã xác thực của người dùng có hợp lệ không? nếu hợp lệ thì cho qua còn nếu không hợp lệ sẽ bắt xác thực lại.
 Cách thức làm việc của roboo sẽ khiến cho botnet nếu không hiểu javascript hay được viết riêng
 cho site của mình thì sẽ không thể request lên các script nặng của server mình.
Với đặc điểm trên roboo hoạt động rất hiệu quả trong việc chặn các cuộc tấn công dos/ddos kiểu http flood bây giờ

Cài đặt roboo với nginx

Cài đặt nginx với perl module

 $./configure --with-http_ssl_module --without-http_uwsgi_module --without-http_scgi_module 
  --without-http_geo_module --sbin-path=/usr/local/sbin --with-http_perl_module
  --with-perl_modules_path=/usr/local/nginx/perl
 $make
 $make install

 

Cài đặt roboo

cài đặt các module cần thiết
$cpan -i Net::IP::Match::Regexp Digest::SHA Crypt::Random Compress::Zlib 

chi tiết có thể xem ở đây cài đặt roboo với nginx
Cấu hình
location / {
        perl Roboo::handler;
        set $Roboo_challenge_modes "JS,gzip"; # SWF or JS, optionally gzip for encoding ("JS,gzip" or "SWF,gzip")
        
        # Defaults
        set $Roboo_cookie_name "Anti-Robot"; # Cookie name used for challenge/response
        set $Roboo_validity_window 600; # Authentication validity time window
        set $Roboo_whitelist "IP(),UA(''),URI('')"; # Whitelist - IP addresses (CIDR), user-agents or URIs (PCRE)
        set $Roboo_charset "UTF-8"; # Charset used during challenge (for proper POST resubmissions)
        set $Roboo_challenge_hash_input $remote_addr; # Advanced - challenge hash basis, can add $server_name$server_port$http_host$http_user_agent

        error_page 555 = @proxy;
        expires epoch;
        add_header Last-Modified "";
        if ($Roboo_challenge_modes ~ gzip) {
            gzip on;
        }
        access_log /var/log/nginx/challenged.log;
    }

    location @proxy {
        proxy_pass http://example.com;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_cache cache;
        proxy_cache_valid 5m;
        gzip on;
        access_log /var/log/nginx/verified.log;
    }

Trong đó
$Roboo_cookie_name là tên cookie dùng để lưu mã xác thực của người dùng.
$Roboo_challenge_modes cách để set mã xác thực cho người dùng javascript hay flash.
$Roboo_validity_window thời gian tồn tại của mã xác thực, sau thời gian này mã xác thực sẽ không còn giá trị.
$Roboo_challenge_hash_input các tham số đầu vào đã tính mã xác thực.
$Roboo_whitelist cài đặt các thông tin về whitelist.

Nhược điểm của roboo.

  • Việc dùng javascript để set mã xác thực không hoạt động với các ajax request.
  • Nếu để cho googlebot vào site với việc config UA $Roboo_whitelist chưa có cơ chế xác thực xem ip có phải đúng là của google bot không.

Kết luận.

Roboo có thể là một giải pháp tốt để bạn đương đầu với các cuộc tấn công http flood. Nhưng để có được một giải pháp toàn diện chúng ta còn cần làm rất nhiều việc để tối ưu nó.

Không có nhận xét nào:

Đăng nhận xét