Để bảo mật, giám sát hệ thống, ngăn chặn truy cập trái phép, chống lại DOSS, brutefore ... trên server hiện nay thì phần mềm CSF được khuyến khích cài đặt, bài viết này chúng ta sẽ đi tìm hiểu về cách cài CSF cũng như cấu hình CSF để tăng sức mạnh cho server.
ConfigServer Security & Firewall(csf) là gì?
CSF là một firewall, nó giám sát trạng thái các kết nối đang hoạt động, nó sử dụng trạng thái giám sát được đẻ quyết định cho phép các gói tin đi qua firewall hay không. CSF
cũng giám sát việc xác thực Login trên hệ thống (ví dụ login ftp 3 lần sai sẽ bí block IP), cũng như bảo mật các ứng dụng trên Server Linux
Cài đặt CSF trên CentOS / RHEL
Ví dụ
yum install wget bind-utils -y & update -y
yum install perl-libwww-perl net-tools perl-LWP-Protocol-https -y
cd scr_csf & mkdir scr_csf
wget https://download.configserver.com/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh
Sau khi cài xong, cần kiểm tra server đã có đủ các module để CSF làm việc không bằng lệnh:
Ví dụ
perl /usr/local/csf/bin/csftest.pl
Nếu không có báo lỗi nào thì đã thành công. Trên CentOS 7 có thể tắt firewall mặc định firewalld
Ví dụ
systemctl stop firewalld
Thậm chí tắt hẳn chế độ chạy tự động
Ví dụ
systemctl disable firewalld
Nếu muốn gỡ bỏ CSF thì dùng lệnh:
Ví dụ
sh /etc/csf/uninstall.sh
Cấu hình và sử dụng CSF
Cấu hình chính lưu tại /etc/csf/csf.conf
Đầu tiên mở csf.conf
tìm và thiết lập cấu hình TEST
Ví dụ
vi /etc/csf/csf.conf TESTING = "1" RESTRICT_SYSLOG = "3"
Nạp lại CSF
Ví dụ
csf -r
Lệnh | Tác dụng |
---|---|
csf -h |
Trợ giúp lệnh |
csf -s |
Chạy firewall |
csf -f |
Dừng - Flush firewall |
csf -r |
Nạp lại CSF (nhất là sau khi thay đổi cấu hình, thiết lập) |
csf -l |
Hiện thị các luật iptables (IP4) |
csf -p |
Kiểm tra các port đang mở |
csf --lfd |
với tham số [stop|start|restart|status] để điều khiện, chạy, dừng dịch vụ lfd. Dịch vụ này giám sát quá trình đăng nhập (kiểm tra xem nó có đang hoạt động csf --lfd status ) |
csf --lfd |
với tham số [stop|start|restart|status] để điều khiện, chạy, dừng dịch vụ lfd. Dịch vụ này giám sát quá trình đăng nhập (kiểm tra xem nó có đang hoạt động csf --lfd status ) |
csf -a |
Cho phép một IP truy cập, nó thêm vào danh sách /etc/csf/csf.allow , các IP liệt kê trong danh sách này mặc định được qua Firewall, tuy nhiên nó vẫn bị LFD kiểm tra. Ví dụ thêm IP 123.123.123.123 vào thì gõ csf -a 123.123.123.123 |
csf -d |
Cấm một IP truy cập, nó thêm vào danh sách /etc/csf/csf.deny , ví dụ csf -d 123.123.123.123 |
csf -df |
Gỡ một IP ra khỏi danh sách chặn csf -df 123.123.123.123 |
csf -t |
hiện thị danh sách ip cho phép và bị chặn tạm thời (ip tự ra khỏi danh sách sau một khoảng thời gian) |
csf -x |
Tắt hoàn toàn csf và lfd |
csf -e |
Kích hoạt lại csf và lfd |
Một số thiết lập CSF, LFD
Nói chung tất cả cấu hình CSF, các luật firewall đều thiết lập, chỉnh sửa từ các file trong thư mục: /etc/csf
. Sau khi chỉnh các thiết lập trong những file này cần khởi động lại để có hiệu lực bằng lệnh
Ví dụ
csf -r && csf --lfd restart
Nếu chưa có nano
thì có thể cài vào để mở sửa các file config cho tiện
Ví dụ
yum install nano -y
Mở file config ra để sửa đổi một số tính năng dưới
Ví dụ
nano /etc/csf/csf.conf
1) Bảo vệ khỏi tấn công DOS bằng cách giới hạn số lượng truy cập tới cổng
Cấu hinh tại CONNLIMIT=""
với giá trị gán là "port1;limit1,port2,limit2 ..."
Ví dụ:
Ví dụ
CONNLIMIT = "22;5,80;20"
Có nghĩa là cổng 80 (http) cho phép 20 kết nối với 1 IP => Như vậy từ một máy tạo ra truy cấn liên tục tới server tạo ra quá 20 kết nối sẽ bị block, cổng 22 (ssh) là 5 kết nối 1 IP
Có thể đặt
Ví dụ
CONNLIMIT = "80;75 21;50"
2) Phòng chống Port Flood
Giám sát tổng số lượng kết nối từ một IP tới một cổng trong một khoảng thời gian chỉ ra với thiết lập PORTFLOOD
. Giá trị gán vào có dạng
Ví dụ:
Ví dụ
PORTFLOOD = "80;tcp;100;5"
Có nghĩa là 1 IP nào đó kết nối tới cổng 80 bằng giao thức tcp, trong vòng 5s mà tạo ra tới 100 kết nối thì bị block
3) Phòng chống SYN FLOOD
Ví dụ
SYNFLOOD = "1"
SYNFLOOD_RATE = "75/s"
SYNFLOOD_BURST = "25"
Trong đó SYNFLOOD = "1"
để kích hoạt SYN FLOOD. SYNFLOOD_RATE
thiết lập số gói SYN gửi tới từ 1 IP /1s. Số lần mà một IP có thể chạm tới SYNFLOOD_RATE
trước khi bị block.
4) Mở cổng, đóng cổng
Ví dụ
#Các công mở cho phép nhận gói tin từ bên ngoài (IP4)
TCP_IN = "20,21,22,25,53,80"
#Các công mở cho phép gửi gói tin ra ngoài (IP4)
TCP_OUT = "443,20,21,22,25,80"
#Tương tự nếu có dùng IP6
TCP6_IN = "20,21,22,25"
TCP6_OUT = "20,21,22,25"
* Các cổng mà các dịch vụ trên server sử dụng:
- Port 20: FTP data transfer
- Port 21: FTP
- Port 22: SSH
- Port 25: SMTP
- Port 53: DNS
- Port 80: HTTP
- Port 110: POP3
- Port 113: Authentication service/identification protocol
- Port 143: IMAP
- Port 443: SSL/TLS (HTTPS)
5) Server quá tải?
CSF mặc định có kiểm tra mức độ hoạt động của CPU xem nó có bị quá tải hay không. Nếu có sự kiện đó xảy ra thì một email sẽ được gửi đi, trong nhiều trường hợp quá tải dẫn tới Server bị treo. Bạn có thể thiết lập khi quá tải CPU như vậy sẽ chạy script bạn tạo ra để làm một số việc bạn thiết lập ví dụ như khởi động lại Apache
Giả sử bạn tạo ra một script để khởi động lại Apache, lưu tại /restartapache.sh
, nhớ chmod cho nó chạy được chmod +x /restartapache.sh
Ví dụ
#!/bin/sh
service httpd restart >> overload.log
Bây giờ muốn mỗi khi CPU quá tải sẽ chạy script /restartapache.sh
thì sửa config:
Ví dụ
#!/bin/sh
PT_LOAD_ACTION="/restartapache.sh"
6) Cấm tất cả các IP đến từ một quốc gia nào đó
Tìm đến dòng CC_DENY và điền mã quốc gia cần cấm. Ví dụ chặn IP đến từ Nga và TQ
7)Email thông báo
Các sự kiện do CSF xử lý, bắt được sẽ được gửi tới một email
8) Block nếu đăng nhập các dịch vụ thất bại
Ví dụ
#KÍCH HOẠT GIÁM SÁT LOGIN
LF_TRIGGER = "1"
#Block nếu đăng nhập ssh sai 3 lần
LF_SSHD = "3"
LF_SSHD_PERM = "1"
#Block nếu đăng nhập ftp sai 3 lần
LF_FTPD = "3"
LF_FTPD_PERM = "1"
Còn một số dịch vụ nữa xem thêm ngay sau các thiết lập này
9) Block danh sách IP SPAM
CSF cung cấp khóa cả danh sách IP, bằng cách đưa URL của danh sách đó vào file /etc/csf/csf.blocklists
. Bạn có thể mở file đó ra thêm các danh sách IP mà các dịch vụ phát hiện IP SPAM sau cung cấp:
Ví dụ
# Spamhaus Don't Route Or Peer List (DROP)
# Details: http://www.spamhaus.org/drop/
SPAMDROP|86400|0|http://www.spamhaus.org/drop/drop.lasso
# Spamhaus Extended DROP List (EDROP)
# Details: http://www.spamhaus.org/drop/
SPAMEDROP|86400|0|http://www.spamhaus.org/drop/edrop.lasso
# DShield.org Recommended Block List
# Details: http://dshield.org
DSHIELD|86400|0|http://www.dshield.org/block.txt
# TOR Exit Nodes List
# Set URLGET in csf.conf to use LWP as this list uses an SSL connection
# Details: https://trac.torproject.org/projects/tor/wiki/doc/TorDNSExitList
TOR|3600|0|https://check.torproject.org/cgi-bin/TorBulkExitList.py?ip=1.2.3.4
# Alternative TOR Exit Nodes List
# Details: http://torstatus.blutmagie.de/
ALTTOR|86400|0|http://torstatus.blutmagie.de/ip_list_exit.php/Tor_ip_list_EXIT.csv
# BOGON list
# Details: http://www.team-cymru.org/Services/Bogons/
BOGON|86400|0|http://www.cymru.com/Documents/bogon-bn-agg.txt
# Project Honey Pot Directory of Dictionary Attacker IPs
# Details: http://www.projecthoneypot.org
HONEYPOT|86400|0|http://www.projecthoneypot.org/list_of_ips.php?t=d&rss=1
# C.I. Army Malicious IP List
# Details: http://www.ciarmy.com
CIARMY|86400|0|http://www.ciarmy.com/list/ci-badguys.txt
# BruteForceBlocker IP List
# Details: http://danger.rulez.sk/index.php/bruteforceblocker/
BFB|86400|0|http://danger.rulez.sk/projects/bruteforceblocker/blist.php
# OpenBL.org 30 day List
# Set URLGET in csf.conf to use LWP as this list uses an SSL connection
# Details: https://www.openbl.org
OPENBL|86400|0|https://www.openbl.org/lists/base_30days.txt
# Autoshun Shun List
# Details: http://www.autoshun.org/
AUTOSHUN|86400|0|http://www.autoshun.org/files/shunlist.csv
# MaxMind GeoIP Anonymous Proxies
# Set URLGET in csf.conf to use LWP as this list uses an SSL connection
# Details: https://www.maxmind.com/en/anonymous_proxies
MAXMIND|86400|0|https://www.maxmind.com/en/anonymous_proxies
# Blocklist.de
# Set URLGET in csf.conf to use LWP as this list uses an SSL connection
# Details: https://www.blocklist.de
# This first list only retrieves the IP addresses added in the last hour
#BDE|3600|0|https://api.blocklist.de/getlast.php?time=3600
# This second list retrieves all the IP addresses added in the last 48 hours
# and is usually a very large list (over 10000 entries), so be sure that you
# have the resources available to use it
BDEALL|86400|0|http://lists.blocklist.de/lists/all.txt
# Stop Forum Spam
# Details: http://www.stopforumspam.com/downloads/
# Many of the lists available contain a vast number of IP addresses so special
# care needs to be made when selecting from their lists
STOPFORUMSPAM|86400|0|http://www.stopforumspam.com/downloads/listed_ip_1.zip
Một số cấu hình khác cho CSF
Ta bắt đầu thực hiện config CSF. Bạn hãy mở file: csf.conf và chỉnh sủa theo hướng dẫn bên dưới:
Mặc định khi cài xong CSF thì TESTING = “1″, với TESTING = “1″ thì LFD daemon (Login Fail Detect daemon) sẽ không hoạt động, do đó nếu VPS/server bị tấn công thì CSF cũng sẽ không block IP tấn công.
Thời gian chạy cronjob để clear iptables nếu như TESTING=1 , tính bằng phút.
tắt chế độ auto update của CSF.
Cho phép kết nối TCP qua các cổng: Dùng cho các dịch vụ SSH, sendmail, DNS, Web trên server. (nếu bạn không sử dụng https và email có thể bỏ 25 và 443)
Cho phép kết nối từ VPS/Server ra bên ngoài: cho phép server kết nối đến web server, sendmail server khác.
cho phép người dùng sử dụng dịch vụ DNS trên server.
cho phép server truy vấn DNS bên ngoài.
Cho phép người dùng thực hiện lệnh ping đến server.
nếu để giá trị này thấp thì khi ping sẽ nhận được giá trị request time out.
Mặc định csf sẽ cấu hình iptables để filter traffic trên toàn bộ các card mạng , ngoại trừ card loopback . Nếu như bạn muốn rules iptables chỉ applied vào card mạng “eth0″ thì khai báo ở đây.
Nếu bạn không muốn rules iptables không applied vào card mạng nào thì khai báo ở đây. Ví dụ card “eth1″ là card local , bạn không muốn filter trên card này thì cấu hình như trên.
Giới hạn số lượng IP bị block “vĩnh viễn” bởi CSF (các IP này được lưu trong file /etc/csf/csf.deny
).
Con số này để 200 nếu bạn sử dụng VPS và 500 nếu bạn sử dụng server.
Khi số lượng IP bị block vượt qua con số này , csf sẽ tự động unblock IP cũ nhất.
Enable tính năng Login fail detection.
Tự động restart CSF khi csf bị stop.
Filter các gói tin TCP không hợp lệ… )
Disable IPV6 support
Ví dụ
SYNFLOOD = "1"
SYNFLOOD_RATE = "30/s"
SYNFLOOD_BURST = "40"
Bật chức năng synflood protection : Nếu 1 IP gửi 30 cú SYN trong vòng 1s và số lượng SYN connection tồn tại trên server đạt trên 40 thì block IP đó (block tạm thời (temp))
Giới hạn số lượng new concurrent connection đến server trên mỗi IP.
Ví dụ trên có nghĩa : mỗi IP được phép mở 20 concurrent new connection đến port 80 trên server.
Giới hạn số lượng connection đến một port cụ thể trong một khoảng thời gian nhất định. Ví dụ như trên có nghĩa : nếu nhiều hơn 20 kết nối tcp đến port 80 trong vòng 5s thì block IP đó tối thiểu 5s tính từ packet cuối cùng của IP đó. Sau 5s IP đó sẽ tự động được unlock và truy cập bình thường.
Danh sách các port khi bị drop sẽ không cần phải ghi vào log
Ghi log các IP vượt quá giới hạn CONNLIMIT cấu hình ở bước trên.
Mặc định toàn bộ email thông báo sẽ được gửi về root của server . Nếu bạn muốn gửi đến địa chỉ email khác thì khai báo ở đây.
Ví dụ
LF_PERMBLOCK = "1"
LF_PERMBLOCK_INTERVAL = "86400"
LF_PERMBLOCK_COUNT = "6"
LF_PERMBLOCK_ALERT = "1"
Enable tính năng block vĩnh viễn một IP . Nếu một IP bị temp ban (ban tạm) 6 lần khi vi phạm các rule sẽ block ip này 86400s ( 1 ngày) đồng thời gửi email về cho ngừoi quản trị biết.
Enable tính năng Login Fail Detect cho từng dịch vụ cụ thể (được khai báo bên dưới)
Khi LF_TRIGGER = “1″ thì có thể enable LF_TRIGGER_PERM để kích hoạt block IP permanent
+ LF_TRIGGER_PERM = “1″ => IP sẽ bị block permanent
+ LF_TRIGGER_PERM = “86400″ => IP sẽ bị block 1 ngày
Khi một IP vi phạm các rule của LFD thay vì block toàn bộ traffic từ IP này đến server thì chỉ block traffic đến dịch vụ mà IP này login fail (ví dụ login ftp sai nhiều lần thì block truy cập đến FTP nhưng vẫn cho phép truy cập vào website)
Gửi email thông báo nếu một IP bị block bởi các trigger bên dưới
Ví dụ
LF_SSHD = "5"
LF_SSHD_PERM = "1"
Nếu login SSH sai 5 lần thì sẽ bị block IP (temp block)
Nếu bị temp block lớn hơn số lần quy định ở LF_PERMBLOCK_COUNT (cấu hình bước trên ) thì sẽ block permanent.
Ví dụ
LF_FTPD = "0"
LF_FTPD_PERM = "1"
Không kích hoạt login fail detect cho dịch vụ FTP.
Tương tự cho các dịch vụ còn lại bên dưới ( SMTP , POP3 , IMAP , .htpasswd , mod_security … )
Không gửi email thông báo khi có một ai đó login thành công thông qua SSH
Không gửi email thông báo khi có một người dùng “su” (switch user) qua người dùng khác. Không gửi email khi họ dùng lệnh “su” , bất kể “su” thành công hoặc thất bại.
LFD sẽ check thư mục /tmp và /dev/shm định kỳ sau mỗi 3600s , nếu phát hiện ra các file nghi vấn là file độc hại sẽ gửi email thông báo đến cho chúng ta. Thường thì trên server thư mục, /temp và /dev/shm phân quyền cho phép mọi người dùng có quyền ghi trên thư mục này , do đó các attacker lợi dụng điều này để ghi mã độc vào đây (các file để back connect , local root exploit … )
Khi phát hiện ra các file nghi vấn ở thư mục /tmp và /dev/shm sẽ mv chúng khỏi 2 thư mục trên và append vào file /etc/csf/suspicious.tar , thuận tiện cho chúng ta theo dõi , phân tích về sau và phần nào vô hiệu hóa cuộc tấn công của attacker.
Theo dõi sự thay đổi của các file và thư mục , nếu có thay đổi gửi email thông báo về cho chúng ta. Để theo dõi file/thư mục nào thì add chúng vào file csf.dirwatch. Cấu hình như trên thì 60s chạy 1 lần.
Kiểm tra tính toàn vẹn của hệ điều hành bằng cách so sánh MD5 của các file binary khi LFD start với MD5 của các file đó lúc kiểm tra. Nếu khác nhau thì sẽ gửi email thông báo. Tính năng này có thể sẽ hoạt động không chính xác khi hệ thống update và sẽ tăng I/O , load của server do phải tính toán MD5 rất nhiều lần.
Phát hiện tấn công brute force từ mạng botnet. Nếu như một account bị login sai quá giới hạn cho phép từ nhiều IP khác nhau thì sẽ block toàn bộ IP đã login sai.
Số lượng IP tối thiểu để nhận biết đây là tấn công phân tán (DDOS).
Block login POP3 nếu một account được login nhiều hơn 30 lần trong 1 giờ từ 1 IP. Tương tự cho LT_IMAPD.
Send email khi một account vượt quá giới hạn cho phép của LT_IMAPD và LT_POP3D
Không áp dụng permanent block cho LT_POP3D/LT_IMAPD
Giới hạn số lượng connection từ một IP đến server . Nếu số lượng đó vượt quá 300 thì temp block IP đó.
Các lần scan để kiểm tra cách nhau 30s.
Gửi email thông báo nếu một IP bị block bởi connection tracking.
Disable block permanent cho connectiong tracking.
Thời gian block một IP nếu như vi phạm Connection tracking limit.
Khi đếm số lượng connection từ 1 IP đến server thì bỏ qua trạng thái TIME_WAIT của connection , không đếm trạng thái này.
Chỉ đếm các kết nối ở trạng thái SYN_RECV
Chỉ áp dụng connection tracking cho các kết nối đến port 80 và 443.
Ví dụ
PS_INTERVAL = "300"
PS_LIMIT = "15"
Trong 500s nếu kết nối đến nhiều hơn 15 port không có trên server sẽ block IP đó.
Giới hạn range port sẽ được theo dõi.
IP bị block bởi Port Scan Tracking sẽ là temp block hoặc là permanent :
PS_PERMANENT = “0″ : IP bị temp block
PS_PERMANENT = “1″ : IP bị block permanent.
Nếu PS_PERMANENT = “0″ thì đây là thời gian temp block của một IP.
Gửi email thông báo khi có một IP bị block.
sau khi thực hiện config xong cấu hình CSF. Bạn phải restart lại CSF để thay đổi có hiệu lực.
Lệnh restart csf:
Vậy là bạn đã hoàn thành cài đặt và cấu hình CSF cho VPS/Server của mình.
Lỗi khi sử dụng CSF và cách sửa
Lỗi “Binary location for [HOST] [/usr/bin/host] in /etc/csf/csf.conf is either incorrect”
Khi bạn khởi động chương trình tường lửa CSF, nếu bạn gặp thông báo lỗi sau :
*WARNING* Missing or incorrect binary locations will break csf and lfd functionality
Lỗi này xảy ra phần nhiều do việc thiếu chương trình “/usr/bin/host
“. Để giải quyết được lỗi này ta chỉ cần cài đặt gói “bind-utils” :
Ví dụ
yum -y install bind-utils
Sau đó khởi động lại là hết thông báo lỗi.
Lỗi “chattr”
*WARNING* Missing or incorrect binary locations will break csf and lfd functionality
Giải quyết :
Lỗi “perl-LWP”
Giải quyết :
Lỗi “LWP-https”
Giải quyết :
Lỗi “unzip”
Giải quyết :
Lỗi “host”
Giải quyết :