Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.46 MB, 100 trang )
Hình 16: Luồng dữ liệu đi đến Web Server
Có thể hình dung luồng dữ liệu đi như sau:
-
Bước đầu tiên máy tính của người dùng sẽ tạo kết nối TCP với Máy
chủ web
-
Thông qua kết nối đó, request đến apache được gửi đến Máy chủ web
-
Request được netfilter so sánh với các rule do Iptables nhập vào.
-
Nếu request hợp lệ thì sẽ được chuyển sang user space (apache), apache
nhận request, xử lý rồi trả lời cho web brower.
Thông qua biểu đồ luồng dữ liệu đến Web Server ta thấy có 2 điểm mà
attacker sẽ lợi dụng để tấn công DDoS vào, đó là phần kết nối TCP và request
đến apache. Nếu attacker gửi rất nhiều TCP connection đến Web Server thì đến
một lúc nào đó, Máy chủ web sẽ không thể nhận thêm connection nữa (queue
đầy, …) và những connection của người dùng hợp pháp sẽ không được xử lý.
Mặc khác, do phụ thuộc vào lượng tài nguyên (RAM) trên máy chủ nên apache
chỉ có thể nhận và xử lý được một số có hạn request. Nên nếu attacker gửi càng
70
nhiều reuquest mà những request này đến được apache thì càng ít người dùng
hợp pháp được phục vụ.
Qua đó, em có một số ý tưởng cho giải pháp phòng chống DDoS cho Máy
chủ web đó là:
-
Cấu hình Server để có thể nhận và xử lý được nhiều nhất số kết nối
TCP/IP.
-
Kết thúc nhanh nhất các kết nối mà không làm ảnh huởng đến người
dùng hợp pháp để có thể nhận và xử lý các kết nối mới.
-
Giới hạn số connection đến Web Server, số connection đến apache
Hình 17: Luồng dữ liệu khi triển khai hệ thống phòng chống DDoS
Thông qua các ý tưởng, giải pháp được đưa ra bao gồm:
- Tối ưu hóa Máy chủ web ở tầng TCP/IP để server có thể nhận và xử lý
nhiều kết nối nhất đồng thời có thể giải phóng các kết nối một cách
nhanh nhất mà không làm ảnh hưởng đến người dùng hợp pháp.
- Cài đặt module connlimit cho Iptables để giới hạn số truy cập từ một IP.
- Triển khai hệ thống IPS gồm Snort inline và Iptables để chống lại các
request DDoS đến máy chủ web.
Em xin nhấn mạnh là hiện nay chưa có giải pháp nào tối ưu để chống lại DDoS,
giải pháp em đề xuất là một trong những giải pháp đã được triển khai và đã có
những thành công trong việc chống lại DDoS làm cho máy chủ web nói chung và
apache nói riêng không bị quá tải, không phục vụ được cho những người dùng hợp
lệ.
71
3. Mô hình thử nghiệm
Do điều kiện khách quan nên em chỉ có thể triển khai và kiểm nghiệm trên mô hình
trong mạng LAN. Mô hình thử nghiệm như sau:
Hình 18: Mô hình mạng thử nghiệm
Trong mô hình này:
- Gồm có 5 máy tính có cấu hình là 1Gb ram, CPU 2.2Ghz trong đó có 1 máy
sử dụng làm IPS/Máy chủ web (snort inline, Iptables , module ipt_connlimit, cài đặt
apache, php, mysql) trên đó có cài đặt một trang web sử dụng code joomla, 4 máy
còn lại đóng vai trò là attack host
- Tất cả các kết nối đều là full-duplex 100Mbit/s Ethernet (100BaseT)
4. Triển khai hệ thống
4.1 Tối ưu hóa server ở tầng TCP/IP
Bật chức năng tcp_syncookies : Bật chức năng này là cách đơn giản nhất để
chống lại SYN flood.
72
sysctl -w net.ipv4.tcp_syncookies=1
Đặt giá trị cho backlog queue : Giá trị tcp_max_syn_backlog sẽ quyết định có
bao nhiêu gói SYN được lưu trữ. tcp_syncookies phải được bật giá trị này mới có
hiệu lực.
sysctl -w net.ipv4.tcp_max_syn_backlog="2048"
Đặt lại số lần truyền lại gói SYN,ACK để reply lại gói SYN request. Mặc
định là 5 lần tương đương với thời gian timeout của kết nối TCP là 180 giây. Đặt
giá trị là 1 tương đương với thời gian timeout là 9 giây.
sysctl -w net.ipv4.tcp_synack_retries="1"
Bật chức năng IP spoofing protaction
sysctl -w net.ipv4.conf.all.rp_filter ="1"
Không chấp nhận forward broadcast
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts="1"
Không chấp nhận source routed packet
sysctl -w net.ipv4.conf.all.accept_source_route=0
Tắt ICMP redirect
sysctl -w net.ipv4.conf.all.accept_redirects=1
Bật bad error message protection
sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1j
Một số cấu hình TCP khác :
• tcp_abort_on_overflow : Có 2 giá trị 0(mặc định) và 1.
Nếu có giá trị là 1 kernel sẽ reset những kết nối mới khi
queue đầy.
• tcp_fin_timeout : Mặc định là 60 giây.Giá trị của biến này
quyết định kernel sẽ giữ những socket ở trạng thái
FIN_WAIT-2 trong bao lâu nếu không nhận được gói
ACK/FIN từ phía client
• tcp_orphan_retries: Mặc định là 7.Giá trị này sẽ quyết
định TCP/IP stack thử ngắt kết nối ở phía client trước khi
đóng kết nối từ server.
73
• somaxconn : Mặc định là 128.Giá trị này giới hạn kích
thước của listen queue cho các gói new SYN
• ip_conntrack_max : số kết nối tcp lớn nhất mà hệ thống
có thể quản lý.
4.2 Cài đặt module connlimit cho Iptables
Cài rpm-build
yum install rpm-build
Tạo user ruby
useradd -d /home/ruby -s /bin/bash ruby
Đặt password cho user ruby
passwd ruby
Login vào user ruby
Xác định version của kernel đang dùng
uname -a
Xác định version của Iptables đang dùng
iptables -v
Download các packet và đặt ở thư mục home của user
wget http://mirror.centos.org/centos/5/updates/SRPMS/kernel-2.6.1892.1.22.el5.src.rpm (cùng version với kernel đang dùng)
wget http://www.netfilter.org/projects/iptables/files/iptables-1.3.5.tar.bz2
(cùng version với Iptables đang dùng)
wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-maticng-20090326.tar.bz2
Xây dựng môi trường build cho user
cd ~
mkdir -p \ rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
echo ‘%_topdir %(echo $HOME)/rpmbuild’ > .rpmmacros
Cài kernel source
rpm -i kernel-2.6.18-92.1.22.e15.src.rpm
cd ~/rpmbuild/SPECS
74
rpmbuild -bp –target=`uname -m` kernel-2.6.spec
Sau bước trên kernel source sẽ được tạo ra tại :
~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i686
Giải nén iptables và path-o-matic-ng
cd ~
tar -xvjf iptables-1.3.5.tar.bz2
tar -xvjf path-o-matic-ng-20090326.tar.bz2
Tạo và gán giá trị cho 2 biến môi trường
export KERNEL_DIR=~/rpmbuild/BUILD/kernel-2.6.18/linux2.6.18.i686
export IPTABLES_DIR=~/iptables-1.3.5/
Patch modules connlimit
cd path-o-matic-ng-20090326
./runme download
./runme connlimit
Cập nhật module vào kernel
cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i686
make oldconfig
make prepare
make modules_prepare
cd net/ipv4/netfilter
make -C ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i686
M=$PWD modules
Copy new modules into update directory of the current system to set them active:
sudo cp ipt_connlimit.ko /lib/modules/2.6.18-92.1.22.e15/updates
sudo cd /lib/modules
sudo depmod 2.6.18-92.1.22.e15
Load module ipt_connlimit
sudo modprobe ipt_connlimit
Sử dụng : Giới hạn chỉ có 5 connection từ một IP đến apache
75
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit -connlimit-above 5 -j REJECT
4.3 Cài đặt Snort inline
4.3.1 Cài đặt Snort inline
- Cài libnet-1.0.2a (các version mới hơn không thích hợp với snort inline )
wget http://www.packetfactory.net/libnet/dist/deprecated/libnet1.0.2a.tar.gz
tar xzvf libnet-1.0.2a.tar.gz
cd Libnet-1.0.2a
./configure
make
make install
- Cài Flex, bison, libpcap,iptables-devel,pcre, pcre-devel
yum install flex bison libpcap iptables-devel pcre pcre-devel
Download snort (snort-2.8.3.1.tar.gz) và rules (snortrulessnapshot-CURRENT.tar.gz) tại http://www.snort.org/
- Giải nén:
tar -xvzf snort-2.8.3.1.tar.g
- Compile và cài đặt snort :
cd snort-2.8.3.1
./configure --enable-inline --enable-flexresp
make
make install
groupadd snort
useradd -g snort snort -s /sbin/nologin
mkdir /etc/snort
mkdir /etc/snort/rules
mkdir /var/log/snort
cd etc/
76
cp * /etc/snort
Giải nén rules
tar -xvzf snortrules-snapshot-CURRENT.tar.gz
cp rules/* /etc/snort/rules
- Chỉnh lại rules.Sửa tất cả các rule alert sang drop
cd /etc/snort_inline/rules/
for file in $(ls -1 *.rules)
do
sed -e 's:^alert:drop:g' ${file} > ${file}.new
mv ${file}.new ${file} -f
done
Chỉnh sửa lại file snort.config :Mở file /etc/snort/snort.config và sửa
theo các dòng sau :
var HOME_NET 192.168.1.0/24 với 192.168.1.0/24 là mạng nội bộ
var EXTERNAL_NET !$HOME_NET
var RULE_PATH /etc/snort/rules
- Tạo file snort tại /etc/init.d/snort có nội dung như sau:
#!/bin/sh
#
# chkconfig: 2345 99 82
# description: Starts and stops the snort intrusion detection
#
system
#
# config: /etc/snort/snort.conf
# processname: snort
# Source function library
. /etc/rc.d/init.d/functions
BASE=snort
DAEMON="-D -Q"
77
INTERFACE="-i eth0"
CONF="/etc/snort/snort.conf"
# Check that $BASE exists.
[ -f /usr/local/bin/$BASE ] || exit 0
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
RETVAL=0
# See how we were called.
case "$1" in
start)
if [ -n "`/sbin/pidof $BASE`" ]; then
echo -n $"$BASE: already running"
echo ""
exit $RETVAL
fi
echo -n $"Starting ip_queue module:"
lsmod | grep ip_queue >/dev/null || /sbin/modprobe ip_queue;
echo -e '\t\t\t\t [ \033[32mOK\033[37m ]'
echo -n $"Starting iptables rules:"
#iptables -N ip_queue
#iptables -I INPUT -p tcp -j ip_queue
#Add new IPTABLES rules here and they will be added into the
#ip_queue Ruleset
78
iptables -I INPUT -p tcp --dport 80 -j QUEUE
echo -n "Starting snort service: "
export PCAP_FRAMES =32768
/usr/local/bin/$BASE $INTERFACE -c $CONF $DAEMON
sleep 1
action "" /sbin/pidof $BASE
RETVAL=$?
[ $RETVAL -eq 0 ] && touch
/var/lock/subsys/snort
;;
stop)
echo -n "Shutting down snort service: "
killproc $BASE
unset PCAP_FRAMES
echo -ne $"\nRemoving iptables rules:"
iptables -F
iptables -X
echo -e '\t\t\t\t [ \033[32mOK\033[37m ]'
echo -n $"Unloading ip_queue module:"
rmmod ip_queue
echo -en '\t\t\t\t [ \033[32mOK\033[37m ]'
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f
/var/lock/subsys/snort
;;
restart|reload)
$0 stop
$0 start
RETVAL=$?
79
;;
status)
status $BASE
RETVAL=$?
;;
*)
echo "Usage: snort {start|stop|restart|reload|status}"
exit 1
esac
exit $RETVAL
- Gán quyền :
chmod 755 /etc/init.d/snort
- Cấu hình để Snort chạy startup.
chkconfig snort on
4.3.2 Tự động cập nhật rule
Để tự động cập nhật rule cho Snort inline ta sẽ cài thêm chương trình
oinkmaster. Nhiệm vụ chính của chương trình này là tự động download các
rule mới nhất về theo lịch định sẵn.
Download oinkmaster-2.0 tại :
http://nchc.dl.sourceforge.net/sourceforge/oinkmaster/oinkmaster2.0.tar.gz
Giải nén :
tar oinkmaster-2.0.tar.gz
cd oinkmaster-2.0
cp oinkmaster.pl /usr/local/bin/
cp oinkmaster.conf /etc/
80