Máy chủ VPS thường xuyên bị nhắm mục tiêu bởi những kẻ xâm nhập. Một kiểu tấn công phổ biến xuất hiện trong nhật ký hệ thống khi hàng trăm lần đăng nhập ssh trái phép. Thiết lập tường lửa rất hữu ích, nhưng bản thân nó có thể không kiểm soát đầy đủ các nỗ lực xâm nhập đột phá.
Hướng dẫn này cho thấy cách xây dựng một rào cản xâm nhập nâng cao cho FreeBSD bằng hai chương trình, ipfw
tường lửa và sshguard
. SSHGuard là một chương trình bổ trợ nhỏ theo dõi nhật ký hệ thống cho các mục "lạm dụng". Khi người phạm tội cố gắng truy cập, hãy sshguard
hướng dẫn ipfw
chặn lưu lượng truy cập bắt nguồn từ địa chỉ IP của người phạm tội. Người phạm tội sau đó bị đóng cửa một cách hiệu quả.
Khi đã hiểu cách thức các chương trình này hoạt động, việc quản lý bảo vệ máy chủ khá đơn giản. Mặc dù hướng dẫn này tập trung vào việc định cấu hình FreeBSD, các phần của nó áp dụng cho các phần mềm tường lửa và hệ điều hành khác.
Bước 1. Cấu hình IPFW
FreeBSD cung cấp 3 tường lửa trong mặc định (của nó GENERIC
kernel), ipfw
, pf
, và ipfilter
. Mỗi cái đều có ưu điểm và người hâm mộ, nhưng ipfw
là phần mềm tường lửa riêng của FBSD và khá đơn giản để sử dụng cho mục đích của chúng tôi. Điều đáng chú ý là ipfw
có nhiều thứ như trang người dùng của nó cho thấy, tuy nhiên các khả năng như NAT, định hình lưu lượng truy cập, v.v., không cần thiết cho tình huống VPS điển hình. May mắn thay, các tính năng cơ bản của tường lửa dễ dàng đáp ứng yêu cầu của chúng tôi.
Để khởi động tường lửa khi khởi động, hãy thêm vào như sau /etc/rc.conf
:
firewall_enable="YES"
firewall_script="/usr/local/etc/IPFW.rules"
firewall_logging="YES"
Các service
lệnh có sẵn để bắt đầu / dừng các bức tường lửa bằng tay:
[user@vultr ~]$ sudo service ipfw start
Đương nhiên, ipfw
sẽ không làm bất cứ điều gì cho đến khi nó thêm quy tắc, thường là từ một tệp, trong ví dụ này nằm ở /usr/local/etc/IPFW.rules
. Trên thực tế, tệp quy tắc có thể được đặt ở bất kỳ đâu hoặc có bất kỳ tên nào, miễn là nó phù hợp với tham số "tường lửa". Các tập tin quy tắc được mô tả chi tiết dưới đây.
sshguard
có nhiều hương vị để sử dụng với các tường lửa khác nhau. Sử dụng pkg
tiện ích để tìm nạp và cài đặt sshguard-ipfw
:
[user@vultr ~]$ sudo pkg install sshguard-ipfw
Trong hầu hết các trường hợp đó là tất cả một người cần phải làm. Biến thích hợp được tự động chèn vào /etc/rc.conf
để bắt đầu khởi động:
sshguard_enable="YES"
Mặc định thường hoạt động tốt. Nếu các giá trị khác nhau là cần thiết, sshguard
trang man cung cấp thông tin chi tiết về các tham số:
# sshguard--program defaults, so don't need to be in rc.conf unless assigning different value
# sshguard_pidfile="/var/run/sshguard.pid"
# sshguard_watch_logs="/var/log/auth.log:/var/log/mail"
# sshguard_blacklist="40:/var/db/sshguard/blacklist.db"
# sshguard_safety_thresh="40"
# sshguard_pardon_min_interval="420"
# sshguard_prescribe_interval="1200"
Bạn có thể bắt đầu sshguard
với service
lời gọi thông thường :
[user@vultr ~]$ sudo service sshguard start
Bước 3. Tạo một kịch bản quy tắc
Phần khó nhất là tạo quy tắc tường lửa. ipfw
có thể sử dụng /etc/rc.firewall
tập lệnh được cung cấp , nhưng nó phải được sửa đổi để phù hợp với SSHGuard, cũng như các kịch bản hoạt động khác nhau. Một số trang web và Hướng dẫn FreeBSD có thông tin hữu ích về việc này. Tuy nhiên, viết một tệp quy tắc không khó lắm, ngoài ra, một quy tắc tùy chỉnh có thể dễ hiểu và thay đổi hơn khi cần thiết.
Một tính năng quan trọng của ipfw
quy tắc là trận đấu đầu tiên thắng có nghĩa là thứ tự quy tắc là quan trọng. Trong ipfw
, mỗi quy tắc là một lệnh và tệp quy tắc là một tập lệnh shell thực thi. Điều đó cho phép thay đổi quy tắc bằng cách thay đổi quy tắc sau đó chạy tệp quy tắc dưới dạng tập lệnh shell:
[user@vultr /usr/local/etc]$ sudo ./IPFW.rules
Nói chung, một tệp quy tắc sẽ xác định một biến cho ipfw
lệnh, sau đó xóa các quy tắc hiện tại, ban hành các quy tắc chung, sau đó tiến hành đặt quy tắc "ra", theo sau là quy tắc "trong". Trang hướng dẫn ipfw và các tài nguyên khác chứa nhiều thông tin về cấu trúc quy tắc và các tùy chọn có rất nhiều điều để nói.
Do phiên bản sshguard FreeBSD đã được cập nhật lên phiên bản 1.6.2, nên phương thức chèn quy tắc chặn cho người phạm tội đã thay đổi. Bây giờ địa chỉ của người phạm tội được giữ trong một bảng ipfw (bảng 22 cụ thể), thay vì chèn vào các quy tắc trên 55000 như trước đây.
May mắn thay, việc thiết lập tệp quy tắc để sử dụng bảng khá đơn giản. Đây chỉ là vấn đề đặt quy tắc bảng vào đúng vị trí và đảm bảo sử dụng đúng cú pháp khi viết quy tắc.
Khi sshguard
tìm thấy một kẻ phạm tội, nó sẽ đưa địa chỉ của người phạm tội vào danh sách đen của mình và cũng chèn địa chỉ vào ipfw
bảng để nó "kích hoạt" từ chối truy cập. Quy tắc này sẽ thực hiện các mục đích sau:
01000 deny ip from table\(22\) to any
Vẫn cần đặt quy tắc cho phép các dịch vụ trong nước trên 01000 trong trường hợp này. Ví dụ: giả sử địa chỉ 10.20.30.40
là người phạm tội trong bảng 22 và chúng tôi có quy tắc ipfw này:
56420 allow tcp from any to me dst-port 22 in via $vif
Kể từ ipfw
cuộc gặp gỡ cai trị 01.000 trước khi quy tắc 56.420 , 10.20.30.40
đang bị chặn . Nó sẽ không bao giờ được nhìn thấy bởi quy tắc "cho phép 22 trong". Nếu quy tắc cho phép có số "thông thường" như 00420 , lưu lượng truy cập xấu sẽ được đưa vào và không bao giờ bị chặn (vì 00420 nhỏ hơn 01000 và "trận thắng đầu tiên").
Một tính năng hay của phiên bản cập nhật là bây giờ khi sshguard khởi động tất cả các địa chỉ trong danh sách đen được thêm vào bảng và có sẵn để chặn những kẻ phạm tội đến mà không bị chậm trễ. Danh sách đen được tích lũy và giữ lại giữa các phiên.
Tại thời điểm này, có thể hợp lý để hiển thị một ipfw
quy tắc hoàn chỉnh được sửa đổi cho sshguard
. Các ý kiến sẽ làm cho nó khá dễ dàng để tuân theo logic quy tắc:
#!/bin/sh
# ipfw config/rules
# from FBSD Handbook, rc.firewall, et. al.
# Flush all rules before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add "
vif="vtnet0"
# allow all for localhost
$cmd 00010 allow ip from any to any via lo0
# checks stateful rules. If marked as "keep-state" the packet has
# already passed through filters and is "OK" without futher
# rule matching
$cmd 00101 check-state
# allow DNS out
$cmd 00110 allow tcp from me to any dst-port 53 out via $vif setup keep-state
$cmd 00111 allow udp from me to any dst-port 53 out via $vif keep-state
# allow dhclient connection out (port numbers are important)
$cmd 00120 allow udp from me 68 to any dst-port 67 out via $vif keep-state
# allow HTTP HTTPS replies
$cmd 00200 allow tcp from any to any dst-port 80 out via $vif setup keep-state
$cmd 00220 allow tcp from any to any dst-port 443 out via $vif setup keep-state
# allow outbound mail
$cmd 00230 allow tcp from any to any dst-port 25 out via $vif setup keep-state
$cmd 00231 allow tcp from any to any dst-port 465 out via $vif setup keep-state
$cmd 00232 allow tcp from any to any dst-port 587 out via $vif setup keep-state
# allow icmp re: ping, et. al.
# comment this out to disable ping, et.al.
$cmd 00250 allow icmp from any to any out via $vif keep-state
# alllow timeserver out
$cmd 00260 allow tcp from any to any dst-port 37 out via $vif setup keep-state
# allow ntp out
$cmd 00270 allow udp from any to any dst-port 123 out via $vif keep-state
# allow outbound SSH traffic
$cmd 00280 allow tcp from any to any dst-port 22 out via $vif setup keep-state
# otherwise deny outbound packets
# outbound catchall.
$cmd 00299 deny log ip from any to any out via $vif
# inbound rules
# deny inbound traffic to restricted addresses
$cmd 00300 deny ip from 192.168.0.0/16 to any in via $vif
$cmd 00301 deny ip from 172.16.0.0/12 to any in via $vif
$cmd 00302 deny ip from 10.0.0.0/8 to any in via $vif
$cmd 00303 deny ip from 127.0.0.0/8 to any in via $vif
$cmd 00304 deny ip from 0.0.0.0/8 to any in via $vif
$cmd 00305 deny ip from 169.254.0.0/16 to any in via $vif
$cmd 00306 deny ip from 192.0.2.0/24 to any in via $vif
$cmd 00307 deny ip from 204.152.64.0/23 to any in via $vif
$cmd 00308 deny ip from 224.0.0.0/3 to any in via $vif
# deny inbound packets on these ports
# auth 113, netbios (services) 137/138/139, hosts-nameserver 81
$cmd 00315 deny tcp from any to any dst-port 113 in via $vif
$cmd 00320 deny tcp from any to any dst-port 137 in via $vif
$cmd 00321 deny tcp from any to any dst-port 138 in via $vif
$cmd 00322 deny tcp from any to any dst-port 139 in via $vif
$cmd 00323 deny tcp from any to any dst-port 81 in via $vif
# deny partial packets
$cmd 00330 deny ip from any to any frag in via $vif
$cmd 00332 deny tcp from any to any established in via $vif
# allowing icmp re: ping, etc.
$cmd 00310 allow icmp from any to any in via $vif
# allowing inbound mail, dhcp, http, https
$cmd 00350 allow udp from any 53 to me in via $vif
$cmd 00360 allow tcp from any 53 to me in via $vif
$cmd 00370 allow udp from any 67 to me dst-port 68 in via $vif keep-state
$cmd 00400 allow tcp from any to me dst-port 80 in via $vif setup limit src-addr 2
$cmd 00410 allow tcp from any to me dst-port 443 in via $vif setup limit src-addr 2
# SSHguard puts offender addresses in table 22. Set up the table rule
# Please note the '\(22\)' syntax, necessary since it's run as shell command
$cmd 01000 deny ip from table\(22\) to any
# allow inbound ssh, mail. PROTECTED SERVICES: numbered ABOVE sshguard blacklist range
$cmd 56420 allow tcp from any to me dst-port 22 in via $vif setup limit src-addr 2
$cmd 56530 allow tcp from any to any dst-port 25 in via $vif setup keep-state
$cmd 56531 allow tcp from any to any dst-port 465 in via $vif setup keep-state
$cmd 56532 allow tcp from any to any dst-port 587 in via $vif setup keep-state
# deny everything else, and log it
# inbound catchall
$cmd 56599 deny log ip from any to any in via $vif
# ipfw built-in default, don't uncomment
# $cmd 65535 deny ip from any to any
Bước 4. Khởi động và thử nghiệm
Nhu cầu hệ thống khác nhau và các lựa chọn khác nhau về cổng để chặn hoặc bỏ chặn được phản ánh trong bộ quy tắc. Khi quy tắc kết thúc, lưu tệp vào /usr/local/etc/IPFW.rules
và bắt đầu dịch vụ FBSD:
# service ipfw start
# service sshguard start
Tường lửa tăng cường nên được chạy! Kiểm tra sshguard
:
[user@vultr ~]$ sudo pgrep -lfa ssh
Nếu sshguard
đang chạy, dòng lệnh và lệnh đầy đủ của nó được hiển thị:
720 /usr/local/sbin/sshguard -b 40:/var/db/sshguard/blacklist.db -l /var/log/auth.log -l /var/log/maillog -a 40 -p 420 -s 1200 -w /usr/local/etc/sshguard.whitelist -i /var/run/sshguard.pid
Điều này cho thấy quy tắc tường lửa có số liệu thống kê và lần cuối cùng một gói khớp với quy tắc:
[user@vultr ~]$ sudo ipfw -cat list
Sau nhiều giờ hoặc nhiều ngày, địa chỉ của những người phạm tội được thêm vào danh sách đen và cả bảng 22. Để xem tất cả các địa chỉ trong bảng, hãy sử dụng lệnh này:
ipfw table 22 list
Kết quả được in là:
10.10.10.118/32 0
10.10.10.72/32 0
...
Như mô tả ở trên, các kết nối từ các địa chỉ này không được phép. Tất nhiên, trong lần chạy đầu tiên sshguard
, sẽ không có bất kỳ địa chỉ nào trong danh sách, nhưng theo thời gian, nó có thể trở nên khá dài. Một tùy chọn là tạo các quy tắc chặn riêng cho các địa chỉ có nhiều mục trong bảng và sau đó xóa chúng khỏi danh sách đen.
Bước 5. Giữ cảnh giác ...
Thỉnh thoảng nên kiểm tra nhật ký để đảm bảo kiểm soát xâm nhập. Nói chung, /var/log/auth.log
và /var/log/security
là thông tin. Các lỗ hổng hoặc lỗi trong việc bao phủ các dịch vụ mạng có thể trở nên rõ ràng. Sửa đổi quy tắc tường lửa khi cần là một phần bình thường của quản trị máy chủ.
Trong các phiên bản sshguard trước, khi /var/db/sshguard/blacklist.db
tệp đã lớn, nó có thể ngăn không sshguard
cho khởi động hệ thống. Xóa hoặc đổi tên tệp danh sách đen được phép sshguard
bắt đầu. Vấn đề này dường như được khắc phục trong phiên bản sshguard mới nhất, vì vậy cách khắc phục này có lẽ không còn cần thiết nữa.
Đảm bảo lập danh sách trắng Địa chỉ IP mà bạn được kết nối với Phiên SSH từ đó. Nếu bạn vô tình tự khóa mình, bạn luôn có thể kết nối với Bảng điều khiển noVNC trong https://my.vultr.com và liệt kê danh sách IP của bạn.
Tóm tắt, sử dụng kết hợp ipfw
và sshguard
giúp giữ cho hệ thống FreeBSD của bạn an toàn và thực hiện công việc của nó. Giảm thiểu hoạt động mạng xâm nhập có một lợi ích bổ sung: ít "nhiễu" hơn giúp theo dõi và điều chỉnh hoạt động của hệ thống dễ dàng hơn, góp phần vào một máy chủ an toàn hơn, chạy tốt hơn.
Bảo vệ hiệu quả một hệ thống / máy chủ FreeBSD không đặc biệt phức tạp. Mặc dù một nỗ lực khiêm tốn là cần thiết để có được nó và chạy, nhưng nó được đền đáp bằng sự bảo mật dự án và VPS lớn hơn đáng kể.