Hướng dẫn này sẽ chỉ cho bạn cách bảo vệ máy chủ FreeBSD bằng tường lửa PF của OpenBSD. Chúng tôi sẽ cho rằng bạn có bản cài đặt FreeBSD sạch do Vultr triển khai mà không có người dùng nào được thêm vào. Chúng tôi sẽ làm một số thứ khác bên cạnh cấu hình Tường lửa cũng sẽ tăng cường bảo mật cho máy chủ FreeBSD của chúng tôi. Trước khi cấu hình tường lửa, chúng tôi sẽ cài đặt một số gói vì cài đặt FreeBSD mặc định đi kèm với một bộ công cụ và gói tối thiểu (chính xác), để giúp chúng tôi làm việc dễ dàng hơn.
Shell mặc định trong FreeBSD là /bin/sh
. Đây là một shell cơ bản không có chức năng tự động hoàn thành. Chúng tôi sẽ sử dụng một cái gì đó tốt hơn. Chúng tôi sẽ cài đặt zsh
.
Đầu tiên, cài đặt các gói này:
# pkg install zsh gnuls
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait...
...
GNULS là ls
chương trình từ Linux. Chúng tôi chỉ muốn có cùng một ls
lệnh trong Linux và FreeBSD.
Thêm người dùng bình thường vào hệ thống: (thay thế john bằng tên người dùng của bạn và đừng quên thêm người dùng vào nhóm bánh xe)
# adduser
Username: john
Full name: John Doe
Uid (Leave empty for default):
Login group [john]:
Login group is john. Invite john into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh rzsh nologin) [sh]: zsh
Home directory [/home/john]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username : john
Password : *****
Full Name : John Doe
Uid : 1001
Class :
Groups : john wheel
Home : /home/john
Home Mode :
Shell : /usr/local/bin/zsh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (john) to the user database.
Add another user? (yes/no): no
Goodbye!
Tạo tập tin cấu hình zsh:
# ee /home/your-username/.zshrc
Sao chép tệp này vào tệp .zshrc của bạn:
PS1="<%U%m%u>$[%B%1~%b]%(#.#.$) "
bindkey -e
alias su='su -m'
alias du='du -h -d0'
alias df='df -h'
alias l=less
alias ll='gnuls --color=always -l'
alias ls='gnuls --color=always'
alias pkg_ver='pkg version -v -l "<" | > upgrade'
export EDITOR=ee
autoload -U colors && colors
autoload -U promptinit && promptinit
autoload -U compinit && compinit
# History settings
SAVEHIST=1000
HISTSIZE=1000
HISTFILE=~/.history
setopt histignoredups appendhistory
Chạy lệnh này: (thay thế john bằng tên người dùng của bạn)
chown john:john /home/john/.zshrc
Bây giờ, đăng nhập vào máy chủ FreeBSD bằng tên người dùng của bạn và thay đổi mật khẩu gốc mặc định:
<vultr>[~]$ su
Password:
<vultr>[~]# passwd
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]#
Chúng tôi không cần sendmail. Dừng và vô hiệu hóa dịch vụ này:
<vultr>[~]# /etc/rc.d/sendmail stop
Stopping sendmail.
Waiting for PIDS: 7843.
sendmail_submit not running? (check /var/run/sendmail.pid).
Stopping sendmail_msp_queue.
Waiting for PIDS: 7846.
Tiếp theo, chúng tôi sẽ thay đổi tệp RC.conf của chúng tôi để trông tự nhiên hơn:
# ee /etc/rc.conf
Thay đổi nó để trông như thế này:
#----------- NETWORKING ------------------------------------------------#
hostname="ceph.domain1.com" # replace ceph.domain1.com with your domain
ifconfig_vtnet0="dhcp"
static_routes=linklocal
route_linklocal="-net 169.254.0.0/16 -interface vtnet0"
#--------- SERVICES BSD LOCAL ----------------------------------------#
sshd_enable="YES"
ntpd_enable="YES"
#pf_enable="YES"
#pf_rules="/etc/firewall"
#pf_flags=""
#pflog_enable="YES"
#pflog_logfile="/var/log/pflog"
#pflog_flags=""
sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
Chỉnh sửa /etc/hosts
tập tin:
# ee /etc/hosts
Thêm địa chỉ IP và tên máy chủ của bạn:
::1 localhost localhost.ceph ceph
127.0.0.1 localhost localhost.ceph ceph
108.61.178.110 ceph.domain1.com ceph
Đặt múi giờ:
# bsdconfig
Bất cứ khi nào bạn có thể, vô hiệu hóa truy cập từ xa cho người dùng root. Hầu hết các cuộc tấn công vào SSH sẽ cố gắng truy cập thông qua tài khoản người dùng root. Luôn kết nối với tên người dùng của bạn và sau đó su
để root. Chỉ người dùng trong wheel
nhóm có thể su
root. Đó là lý do tại sao chúng tôi đã thêm người dùng của mình vào nhóm bánh xe.
Vô hiệu hóa đăng nhập root:
# ee /etc/ssh/sshd_config
Bỏ ghi chú dòng này:
PermitRootLogin no
Khởi động lại:
# reboot
Sau khi khởi động lại kết thúc, bạn sẽ thấy một thông báo như thế này trong bảng điều khiển Vultr:
time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.
Đó là lý do tại sao chúng ta cần sửa đồng hồ bằng tay. Thực hiện theo các lệnh này, đầu tiên su
để root:
$ su
Password:
# ntpdate 0.europe.pool.ntp.org
Bây giờ, chúng ta sẽ cấu hình tường lửa. OpenBSD PF được bao gồm trong kernel FreeBSD, vì vậy bạn không phải cài đặt bất kỳ gói nào.
Với ee
trình chỉnh sửa, tạo tệp /etc/firewall
:
# ee /etc/firewall
Chèn cái này: (thay thế bất kỳ địa chỉ IP nào bằng của bạn)
#######################################################################
me="vtnet0"
table <bruteforcers> persist
table <trusted> persist file "/etc/trusted"
icmp_types = "echoreq"
junk_ports="{ 135,137,138,139,445,68,67,3222 }"
junk_ip="224.0.0.0/4"
set loginterface vtnet0
scrub on vtnet0 reassemble tcp no-df random-id
# ---- First rule obligatory "Pass all on loopback"
pass quick on lo0 all
# ---- Block junk logs
block quick proto { tcp, udp } from any to $junk_ip
block quick proto { tcp, udp } from any to any port $junk_ports
# ---- Second rule "Block all in and pass all out"
block in log all
pass out all keep state
############### FIREWALL ###############################################
# ---- Allow all traffic from my Home
pass quick proto {tcp, udp} from 1.2.3.4 to $me keep state
# ---- block SMTP out
block quick proto tcp from $me to any port 25
# ---- Allow incoming Web traffic
pass quick proto tcp from any to $me port { 80, 443 } flags S/SA keep state
# ---- Allow my team member SSH access
pass quick proto tcp from 1.2.3.5 to $me port ssh flags S/SA keep state
# ---- Block bruteforcers
block log quick from <bruteforcers>
# ---- Allow SSH from trusted sources, but block bruteforcers
pass quick proto tcp from <trusted> to $me port ssh \
flags S/SA keep state \
(max-src-conn 10, max-src-conn-rate 20/60, \
overload <bruteforcers> flush global)
# ---- Allow ICMP
pass in inet proto icmp all icmp-type $icmp_types keep state
pass out inet proto icmp all icmp-type $icmp_types keep state
Tạo /etc/trusted
tập tin. Trong tệp này, chúng tôi sẽ đặt IP mà chúng tôi "tin tưởng".
# ee /etc/trusted
Thêm một số IP:
# Hosting
1.2.0.0/16
# My friends
1.2.4.0/24
Bây giờ một số giải thích. Cổng rác và IP rác chỉ là một số cổng / IP mà chúng tôi không muốn thấy trong nhật ký. Chúng tôi đã làm điều này với quy tắc này:
# ---- Block junk logs
block quick proto { tcp, udp } from any to $junk_ip
block quick proto { tcp, udp } from any to any port $junk_ports
Đây chỉ là mặc định và bạn không phải lo lắng về điều đó:
icmp_types = "echoreq"
set loginterface vtnet0
scrub on vtnet0 reassemble tcp no-df random-id
pass quick on lo0 all
block in log all
pass out all keep state
Quy tắc này chặn lưu lượng truy cập SMTP đi từ máy chủ của bạn (là mặc định trên Vultr).
# ---- block SMTP out
block quick proto tcp from $me to any port 25
Ngoại trừ bruteforcers
phần còn lại là khá thẳng về phía trước.
# ---- Allow SSH from trusted sources, but block bruteforcers
pass quick proto tcp from <trusted> to $me port ssh \
flags S/SA keep state \
(max-src-conn 10, max-src-conn-rate 20/60, \
overload <bruteforcers> flush global)
Bruteforcin chỉ nói: Cho phép từ <tin cậy> IP đến cổng 22 nhưng chỉ có 10 kết nối đồng thời có thể được thực hiện từ một IP nguồn. Nếu nó nhiều hơn 10, hãy chặn IP này và đặt nó vào bảng bruteforcin. Điều tương tự cũng xảy ra với quy tắc 20/60. Nó có nghĩa là tối đa 20 kết nối trong 60 giây.
Kích hoạt tính năng tường lửa:
# ee /etc/rc.conf
Bỏ ghi chú những dòng này:
pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Khởi động lại:
# reboot
Nếu bạn đã làm mọi thứ đúng, thì bạn sẽ có thể đăng nhập và tường lửa sẽ được bật. Bạn không phải khởi động lại mỗi khi thay đổi /etc/firewall
tệp. Cứ làm đi:
# /etc/rc.d/pf reload
Xem ai đang cố gắng kết nối với máy chủ của bạn trong thời gian thực:
# tcpdump -n -e -ttt -i pflog0
Hiển thị lịch sử:
# tcpdump -n -e -ttt -r /var/log/pflog
Xem nếu bạn có ai đó trong bảng bruteforcin:
# pfctl -t bruteforcers -T show
Và đó là nó. Bạn đã thực hiện thành công tường lửa PF trên máy chủ FreeBSD!