Hoạt động của chương trình 67 3.6.

Một phần của tài liệu Nghiên cứu giải pháp hệ thống phát hiện xâm nhập đảm bảo an toàn thông tin (Trang 140)

3. Thiết kế xây dựng mô hình hệ thống giám sát

3.5.Hoạt động của chương trình 67 3.6.

Chương trình sẽ tìm (đọc) các dòng (lines) được thêm vào mới từ các logfiles đã được cấu hình để đưa vào giám sát. Sau đó các thành phần của các URI mà các logfiles ghi lại sẽ được so sành với các mẫu mà nhà quản trị cấu hình. Các mẫu này sẽ chứa các Regex để so sánh kèm theo các thông báo nếu phát hiện các xâm nhập không hợp lệ. Các IP có xâm nhập không hợp lệ sẽ bị chặn lại (drop) bằng các luật được config trong firewall và được cho vào Banned list. Các IP này sẽ không thể truy cập vào server trong maxage được config sẵn, sau thời gian này, các luật chặn của firewall đối với IP này sẽ bị bỏ và IP này sẽ được remove ra khỏi banned list.

3.6. Các thông số chính của chương trình

- Các config file có trên hệ thống Workdir Patterns Firewall Banlist Pidfile Maxatt Mailto Logpri

Thư mục chứa các file hoạt động của chương trình

Chứa các mẫu để so sánh với các log file từ hệ thống log server

Chứa các tập luật được định nghĩa sẵn nhằm xử lý các xâm nhập bất hợp pháp

Tập hợp các IP bị chặn và thời gian chặn các IP đấy Lưu giữ thông tin Process ID (pid) của chương trình

Số tối đa một IP có thể thực hiện xâm nhập vào webserver trước khi bị Block

Email sẽ nhận được các báo cáo về các IP bị chặn Thứ tự ưu tiên các log file khi kiểm tra

Alert LOG_ALERT : Lưu các thông báo có tính báo động của hệ thống webserver.

Crit LOG_CRIT : Lưu các thông báo có tính nguy cấp của hệ thống webserver.

Debug LOG_DEBUG: Lưu các thông tin về sửa lỗi của hệ thống emerg LOG_EMERG: Lưu các cảnh báo có tính nguy cấp của hệ

thống. Thông thường cảnh báo trước khi server down. err LOG_ERR : Lưu trữ các thông báo lỗi của các service trên

hệ thống webserver.

info LOG_INFO : Lưu giữ thông tin của các thông báo từ hệ thống. notice warning auth authpriv cron daemon kern mail news syslog user local0-7

LOG_NOTICE : Lưu trữ các thông báo có tính lưu ý, là thông báo bình thường nhưng khá quan trọng.

LOG_WARNING: Lưu giữ các cảnh báo của hệ thống webserver.

LOG_AUTH: Lưu giữ các thông báo về phân quyền và bảo mật của hệ thống.

LOG_AUTHPRIV: Cũng giống như LOG_AUTH nhưng các thông báo mạng tính private.

LOG_CRON: Lưu giữ các thông báo liên quan đến các chương trình chạy theo lịch đặt sẵn (Cron).

LOG_DAEMON: Lưu giữ các thông báo từ các daemon. LOG_KERN: Lưu giữ các thông báo từ Kernel của OS LOG_MAIL: Lưu giữ các thông báo của hệ thống mail của webserver.

LOG_NEWS: Các thông tin vận hành của webserver.

LOG_SYSLOG: Lưu trữ các thông tin về các ứng dụng của hệ th

ố ng.

LOG_USER: Lưu giữ thông tin chung về level của users . LOG_LOCAL0-LOG_LOCAL7: Thông tin về các lưu trữ nội bộ.

+ Các luật được lưu trong firewall :

Hai hệ thống tập luật dưới đây sẽ thực hiện cấm hay cho phép các IP được xác định là xâm nhập bất hợp pháp truy cập trở lại hay không. Các allow rules để cho phép các IP bị block (cấm truy cập) có thể được truy cập trở lại. Còn reject rules thì có ý nghĩa ngược lại. Các quy tắc trong tập luật reject sẽ cấm các IP có dấu hiệu xâm nhập sau khi nhận được cảnh báo từ khối IPController.

reject=inrej,outrej,fwdrej

inprej=/sbin/iptables -I INPUT -s %i -j DROP outrej=/sbin/iptables -I OUTPUT -d %i -j DROP fwdrej=/sbin/iptables -I FORWARD -d %i -j DROP # Allow rules for IPCHAINS

allow=inalw,outalw,fwdalw

inpalw=/sbin/iptables -D INPUT -s %i -j DROP outalw=/sbin/iptables -D OUTPUT -d %i -j DROP fwdalw=/sbin/iptables -D FORWARD -d %i -j DROP (adsbygoogle = window.adsbygoogle || []).push({});

Dòng đầu tiên của hai hệ thống tập luật trên là 2 dòng chú thích chung cho hai tập luật bao gồm các quy tắc nhỏ (chains):

Dòng thứ 2 ấn định các tham số của các biến (reject và allow):

Với Reject rules thì đó là : inrej, outrej và fwdrej và inalw,outalw,fwdalw với allow rules. Các biến này sẽ được ấn định giá trị chứa iptable binary tại /sbin/iptables

Dòng 3, 4, 5 sẽ từ chối (cấm) tất cả các gói tin đi vào (input), đi ra (output ) hay các gói tin đi đến server khác (forward) nếu nó không phù hợp.

+ Một số mẫu được đưa vào thử nghiệm trong chương trình:

CHƯƠNG IV. THỬ NGHIỆM VÀ ĐÁNH GIÁ HỆ THỐNG GIÁM SÁT 4.1. Mô tả giao diện của chương trình

Vì chương trình hoạt động dưới dạng CLI Script nên giao diện của chương trình là giao diện Command Line. Sau khi được start lên, LIDS sẽ liên tục check các logfiles.

Giao diện Command Line được mô tả trên hình 33. 4.2. Cài đặt chương trình

Cài đặt: File cài đặt được viết dưới dạng Bash Script. Sau khi đưa thư mục cài đặt lên server, chúng ta tiến hành cài đặt bằng command:

./install.sh

Sau khi cài đặt thành công, người quản trị có thể thực hiện thay đổi, chỉnh sửa các thông số hệ thống cho phù hợp:

Hình 34. Các file trong LIDS sau khi cài đặt thành công 4.3. Kết xuất dữ liệu

Dữ liệu được kết xuất dưới dạng text file: Các text file này cũng được định dạng lưu trữ như là một logfile của hệ thống LIDS.

Để xem logfile của LIDS trên hệ thống, ta thực hiện lệnh: [root@localhost ~ ]# tail -f /var/log/lids

Sẽ cho chúng ta kết quả của logfile thu được:

Hình 35. Log LIDS trên Console

Như kết quả logfile thu được: Xâm nhập có IP 1.2.3.4 liên tục đăng nhập với user root của hệ thống nhưng không đúng password (Một kiểu Brute Force), IP này đã bị đưa vào banned list và bị block trong khoảng thời gian định sẵn.

4.4. Đánh giá kết quả Số liệu thử

Sau khi thực hiện test với các log secure, log access được đưa vào giám sát đều cho các kết quả khá chính xác. Các access như kiểu brute force, hay các attack sql injection, XSS đều

Các tham số đưa vào để test: + $maxage *= 60;

+ Các rules của firewall: # Reject rules for IPTABLES reject=inprej,outrej,fwdrej

inprej=/sbin/iptables -I INPUT -s %i -j DROP outrej=/sbin/iptables -I OUTPUT -d %i -j DROP fwdrej=/sbin/iptables -I FORWARD -d %i -j DROP # Allow rules for IPTABLES

allow=inpalw,outalw,fwdalw

inpalw=/sbin/iptables -D INPUT -s %i -j DROP outalw=/sbin/iptables -D OUTPUT -d %i -j DROP fwdalw=/sbin/iptables -D FORWARD -d %i -j DROP + Mẫu (patterns) để so sánh:

/var/log/secure:sshd[:/Failed password for invalid user [A-z]* from \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b not allowed/@14

/var/log/secure:sshd[:/[Uu]ser [A-z]* from \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b not allowed/@9

/var/log/secure:sshd[:Failed gssapi-with-mic for invalid user@7 /var/log/secure:sshd[:Did not receive ident@12

/var/log/secure:sshd[:Invalid user@10 4.5. Khả năng thực hiện được

Nhìn chung, chương trình đã phát hiện và chống được một số các kiểu tấn công cơ bản như Sql Ịnection, XSS hay Brute Force. Tuy nhiên với kiểu tấn công DDOS thì chương trình vẫn còn hạn chế nhiều.

CHƯƠNG V. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 5.1. Vấn đề đạt được (adsbygoogle = window.adsbygoogle || []).push({});

Theo yêu cầu đặt ra ban đầu đối với bài luận văn là "Nghiên cứu và xây dựng hệ thống giám sát webserver", cho đến thời điểm hiện tại, luận văn đã đạt được các nội dung sau:

+ Nghiên cứu tìm hiểu các lỗ hổng an toàn thông tin và các kỹ thuật tấn công ứng dụng Web bao gồm:

- Thao tác trên tham số truyền như URL, biến ẩn form, cookie, HTTP header. - Chèn mã lệnh thực thi trên trình khách Cross-site Scripting.

- Chèn câu truy vấn SQL

- Đánh chiếm phiên làm việc của người dùng - Từ chối dịch vụ

+ Nghiên cứu đề xuất các biện pháp đảm bảo an toàn thông tin từ sự kết hợp giữa nhà quản trị mạng, các cộng cụ phòng chống và người dùng.

+ Thiết kế xây dựng hệ thống giám sát Webserver dựa trên việc phân tích logfiles của webserver. Trên cơ sở đó phát hiện các xâm nhập trái phép vào Webserver.

+ Thử nghiệm hệ thống với chương trình "Hệ thống giám sát Webserver" với một số nội dung cơ bản sau:

- Giám sát được các truy cập vào các webserver qua việc check các logfiles được ghi lại. Các truy cập vào hệ thống sẽ được lưu lại dưới dạng các logfiles, và sẽ gửi các truy cập trái phép bằng email tới nhà quản trị hệ thống.

- Chương trình cho phép các nhà quản trị hệ thống có thể theo dõi được tình hình webserver, phát hiện và chống kịp thời các cuộc tấn công.

5.2. Hướng phát triển tiếp

Trong phạm vi một luận văn đại học, luận văn cơ bản đã đạt được các yêu cầu đặt

ra. Tuy nhiên, các kết quả còn khá khiêm tốn do hạn chế về tài liệu và thời gian. Trong thời gian tới, nếu có điều kiện, luận văn sẽ cố gắng phát triển thêm những nội dung sau:

- Tìm hiểu thêm về các kỹ thuật tấn công để đưa ra các mẫu lọc cũng như các phương pháp bảo mật cao hơn cho webserver.

- Phát triển chương trình để nó có thể ứng dụng cho các Platform hệ điểu hành khác nhau chứ không chỉ giới hạn cho hệ điều hành Linux.

- Phát triển giao diện web cho chương trình chứ không chỉ dừng lại dưới dạng Commands Line.

Tài liệu tham khảo Tiếng Việt

[1] Hỗ trợ bảo mật các hệ thống tin học Việt Nam - Sở khoa học và công nghệ [2] Giải pháp kỹ thuật cho bảo mật vành đai - Ths Nguyễn Hoàng. [3] Lập trình vượt Firewall - Ths Đỗ Hoàng Cường.

Tiếng Anh

[4] Bộ tiêu chuẩn ISO/IEC 17799, phiên bản 2005.

[5] Managing Security with Snort and IDS Tools - KerryJ. Cox & Christopher Gerg. [6] Hacking Exposed- Network Security Secrets and Solutions - JOEL SCAMBRAY STUART MCCLURE, GEORGE KURTZ.

[7] SNORT COOKBOOK - OREILLY

[8] SNORT INSTRUSION DETECTION 2.0 - SYNGRESS Website [9] www.quantrimang.com. [10] www.hvaonline.net. [11] www.sqlsecurity.com [12] www.nextgenss.com/papers/ [13] http://www.owasp.org/ [14] http://www.4guysfromrolla.com/webtech/ [15] http://www.guardent.com/ [16] http://www.idefense.com/ [17] http://www.jmu.edu/computing/info-security/engineering/issues/ [18] http://www.microsoft.com/technet/support/ [19] http://www.microsoft.com/technet/security/ [20] http://community.whitehatsec.com/ [21] http://www.codeproject.com/ ---

Phụ lục: Chương trình chính: #!/usr/bin/php <? require_once('functions/matchfuns.inc.php'); require_once('functions/gettests.inc.php'); require_once('functions/logfac.inc.php'); $forked = false;

$opt = getopt("-c:-d:hfm:"); $us = basename($argv[0]);

if(isset($opt['h'])) {

error( "$us:\tusage: $us -c file -d dir -m age -fh\n"); error( "\t-c config-file\n");

error( "\t-d workdir\n");

error( "\t-m maximum age, in minutes, to hold dropped IPs\n"); error( "\t-f (do not fork)\n");

error( "\t-h (this list\n"); exit; (adsbygoogle = window.adsbygoogle || []).push({});

}

$do_fork = true; $iplist = array(); $dropped = array(); $rdir = "/usr/local/lids"; / ** * config values */ if(isset($opt['d'])) $rdir = $opt['d']; if(isset($opt['c'])) $cfile = $opt['c']; else

$cfile = $rdir . "/lids.conf"; if(!file_exists($cfile)) {

error( "Cannot find configuration, Exiting"); exit;

$cf = configure($cfile);

$citems = array("maxatt","maxage","pidfile","patterns","firewall", "banlist","logpri","logfacility");

$fitems = array("pidfile" => "runfile", "patterns" => "tfile", "firewall" => "fwfile", "banlist" => "drfile", ); foreach($citems as $ci) { if(!isset($cf[$ci])) {

error("Configuration has no entry for \"$ci\". Please update config."); exit; } } $maxage = $cf['maxage']; $icnt = $cf['maxatt']; if(isset($cf['mailto'])) $mailto = $cf['mailto']; else $mailto = ""; if(!isset($cf['workdir'])) $dav = dirname($argv[1]); else $dav = $cf['workdir']; if(($logpri=getLogPri($cf['logpri'])) == false) { error("Log priority {$cf['logpri']} is invalid.\n"); exit;

}

if(($logfacility=getLogFacility($cf['logfacility'])) == false) { error("Log facility {$cf['logfacility']} is invalid.\n"); exit;

$il = array(); foreach($fitems as $fi => $vn) { $f = $cf[$fi]; $il[$vn] = $f; } extract($il); if(isset($cf['fork'])) $do_fork = $cf['fork']; if(isset($opt['f'])) $do_fork = false; if(isset($opt['m'])) $maxage = $opt['m']; $fw = setupFirewall($fwfile); echo "lids $version\n";

echo "Firewall: $fwfile\n"; echo "\tPatterns: $tfile\n";

echo "\tMax Age: $maxage minutes.\n"; echo "\tSending mail to $mailto\n"; if(!$do_fork)

echo "\tWill not go to background.\n"; if(((int)$maxage) === 0) {

error("age value ($maxage) is invalid.\n"); exit;

}

if(($tests = gettests($tfile)) === false) { error("Cannot open $tfile\n"); exit;

}

$logs = array(); foreach($tests as $t) {

if(!isset($logs[$t[0]])) {

if(($f = fopen($t[0],"r")) !== false) { fseek($f,0,SEEK_END);

$pos = ftell($f); $logs[$t[0]] = $pos; fclose($f);

} else

error("WARNING: Cannot open {$t[0]}"); }

}

if(isset($opt['f'])) $do_fork = false; //

// since IPs can still be banned after a restart we reload those IPs

// unban the ones who have expired and reban the ones who are still valid in the list. // if(file_exists($drfile)) { $l = file($drfile); foreach($l as $i) { list($x,$y) = explode(':',trim($i)); $dropped[$x] = $y; } }

$maxage *= 60; // Convert minutes to seconds.

$dropped = dropMaintenance($dropped,$maxage,true); /*--- * daemonize script ---*/ if($do_fork) { if(file_exists($runfile)) { $pid = trim(file_get_contents($runfile)); @$x = pcntl_getpriority($pid); if($x !== false) { (adsbygoogle = window.adsbygoogle || []).push({});

error("lids is already running at pid: $pid\n"); exit;

} }

if($pid == -1) {

error(" ** ERROR STARTING daemon **\n"); exit(1);

} else if($pid) {

error( " ** daemon started at PID $pid **\n"); file_put_contents($runfile,$pid);

exit(0); }

if (!posix_setsid()) {

die("could not detach from terminal"); }

$forked = true; } else

error( " ** Interactive mode, not detaching. **\n");

/*---*/ while(true) {

foreach($logs as $l => $pos) { if(($f = fopen($l,"r")) !== false) {

fseek($f,$pos,SEEK_SET);

while (($line = fgets($f,512)) !== false) {

if(($ip = matchline($l,$tests,trim($line))) !== false) { if(!isset($iplist[$ip])) $iplist[$ip] = 1; else $iplist[$ip]++; if($iplist[$ip] >= $icnt) { if(!isset($dropped[$ip])) ipdrop($ip,true,$line); $dropped[$ip] = time(); } } } $logs[$l] = ftell($f); } } writedropstate(); sleep(1); }

/** Utilities **/ function error($text) { global $forked; $text = trim($text); if($forked) writelog($text); else fwrite(STDERR,$text . "\n"); } function ipdrop($ip,$glance,$logent = "") { global $icnt, $mailto, $cf,$fw;

if(($ip = lookupip($ip)) === false) return;

firewall($fw,$ip,true); if($glance) {

if($mailto != "")

mail($mailto,"lids dropped IP: $ip", "$ip was dropped by adding a firewall rule.\nThis was done after $icnt invalid attempts to access server.\nLog file read:\n$logent");

writelog("Dropped IP: $ip"); }

}

function undrop($ip,$glance) {

global $icnt, $mailto, $cf, $maxage,$fw; firewall($fw,$ip,false);

if($glance) {

$minutes = $maxage / 60; if($mailto != "")

mail($mailto,"lids undropped IP: $ip", "$ip was re-enabled afer $minutes minutes\n");

writelog("Undropped IP: $ip"); } } function writelog($text) { global $us,$logpri,$logfacility; if(openlog($us,LOG_PID,$logfacility)) { syslog($logpri,$text); closelog();

} } (adsbygoogle = window.adsbygoogle || []).push({});

function writedropstate() {

global $dropped, $drfile, $iplist, $maxage; $x = ""; $dropped = dropMaintenance($dropped,$maxage,false); foreach($dropped as $d => $z) $x .= "$d:$z\n"; file_put_contents($drfile,$x); } function configure($conf) { $cf = array(); if(!file_exists($conf)) return $cf; $lines = file($conf); foreach($lines as $line) { $line=trim($line); $i = strpos($line,'#'); if($i !== false) $line = trim(substr($line,0,$i-1)); if($line == "") continue; @list($lhs,$rhs) = explode('=',$line); $lhs = trim($lhs); $rhs = trim($rhs); if($rhs == "") continue; $rhl = strtolower($rhs);

if($rhl == "false" || $rhl == "off" || $rhl == "no") $rhs = false;

if($rhl == "true" || $rhl == "on" || $rhl == "yes") $rhs = true; $cf[$lhs] = $rhs; } return $cf; } function dropMaintenance($dropped,$maxage,$dropnow) { global $iplist;

$t = array(); $now = time(); foreach($dropped as $ip => $tm) { if(($now - $tm) > $maxage) { undrop($ip,true); if(isset($iplist[$ip])) unset($iplist[$ip]); } else { if($dropnow) ipdrop($ip,false); $t[$ip] = $tm; } } return $t; } function syscmd($cmd) { // echo "$cmd\n"; system($cmd); } function firewall($fw,$ip,$onoff) { if($ip == "") {

echo "firewall: ip is empty, this is bad.\n"; return; } if($onoff === true) $onof f = 1; else $onof f = 0; $set = $fw[$onoff]; foreach($set as $s) { $s = str_replace("%i",$ip,$s); syscmd($s); } } function setupFirewall($fwfile) { $cf = configure($fwfile); if(!isset($cf['reject'])) {

exit; }

$rjkeys = explode(",",str_replace(" ","",$cf['reject'])); if(!isset($cf['allow'])) {

error("setupFirewall: There are no allow rules.\n"); exit;

}

$alkeys = explode(",",str_replace(" ","",$cf['allow'])); $rej = array(); $alw =

array();

foreach($alkeys as $r) { if(!isset($cf[$r])) {

error("setupFirewall: key $r is missing.\n"); exit; } $alw[] = $cf[$r]; } foreach($rjkeys as $r) { if(!isset($cf[$r])) {

error("setupFirewall: key $r is missing.\n"); exit; } $rej[] = $cf[$r]; } $fw = array($alw,$rej); return $fw; } function lookupip($ip) {

for($i = 0; $i < 5 && ctype_alpha(substr($ip,0,1)) !== false; $i++) { $x = strpos($ip,"=");

echo "strpos(): " . (($x === false) ? "false" : $x) . "\n"; if(strpos($ip,"=") !== false) { echo "Found = \n"; list($junk,$ip) = explode('=',$ip); continue; } $rr = gethostbyname($ip); if($rr === false || $rr === $ip) {

return false; } $i p = $r r ; } return $ip; } ?>

Một phần của tài liệu Nghiên cứu giải pháp hệ thống phát hiện xâm nhập đảm bảo an toàn thông tin (Trang 140)