บทช่วยสอนนี้จะแสดงวิธีปกป้องเซิร์ฟเวอร์ FreeBSD ของคุณโดยใช้ไฟร์วอลล์ OpenBSD PF เราจะสมมติว่าคุณมีการติดตั้ง FreeBSD ที่สะอาดซึ่งปรับใช้โดย Vultr โดยไม่มีผู้ใช้เพิ่ม เราจะทำสิ่งอื่นนอกเหนือจากการกำหนดค่าไฟร์วอลล์ซึ่งจะทำให้ความปลอดภัยของเซิร์ฟเวอร์ FreeBSD ของเราแข็งแกร่งขึ้น ก่อนการกำหนดค่าไฟร์วอลล์เราจะติดตั้งบางแพคเกจเนื่องจากการติดตั้ง FreeBSD ที่เป็นค่าเริ่มต้นมาพร้อมกับชุดเครื่องมือและแพ็คเกจขั้นต่ำ (ซึ่งถูกต้อง) เพื่อให้ง่ายต่อการทำงาน
เปลือกเริ่มต้นใน FreeBSD /bin/sh
คือ นี่เป็นเชลล์พื้นฐานที่ไม่มีฟังก์ชั่นเติมภาพอัตโนมัติ เราจะใช้สิ่งที่ดีกว่า zsh
เราจะติดตั้ง
ก่อนอื่นให้ติดตั้งแพ็คเกจเหล่านี้:
# 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 เป็นls
โปรแกรมจาก Linux เราแค่ต้องการมีls
คำสั่งเดียวกันใน Linux และ FreeBSD
เพิ่มผู้ใช้ปกติในระบบ: (แทนที่ john ด้วยชื่อผู้ใช้ของคุณและอย่าลืมเพิ่มผู้ใช้ในกลุ่มล้อ)
# 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!
สร้างไฟล์ zsh config:
# ee /home/your-username/.zshrc
คัดลอกไฟล์นี้ไปยังไฟล์. zshrc ของคุณ:
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
เรียกใช้คำสั่งนี้: (แทนที่ john ด้วยชื่อผู้ใช้ของคุณ)
chown john:john /home/john/.zshrc
ตอนนี้เข้าสู่ระบบเซิร์ฟเวอร์ FreeBSD ด้วยชื่อผู้ใช้ของคุณและเปลี่ยนรหัสผ่านรูตเริ่มต้น:
<vultr>[~]$ su
Password:
<vultr>[~]# passwd
Changing local password for root
New Password:
Retype New Password:
<vultr>[~]#
เราไม่ต้องการ sendmail หยุดและปิดใช้งานบริการนี้:
<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.
ต่อไปเราจะเปลี่ยนไฟล์ rc.conf ของเราให้ดูเป็นธรรมชาติยิ่งขึ้น:
# ee /etc/rc.conf
เปลี่ยนเป็นแบบนี้:
#----------- 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"
แก้ไข/etc/hosts
ไฟล์:
# ee /etc/hosts
เพิ่มที่อยู่ IP และชื่อโฮสต์ของคุณ:
::1 localhost localhost.ceph ceph
127.0.0.1 localhost localhost.ceph ceph
108.61.178.110 ceph.domain1.com ceph
ตั้งค่าเขตเวลา:
# bsdconfig
เมื่อใดก็ตามที่คุณสามารถปิดการเข้าถึงระยะไกลสำหรับผู้ใช้รูต การโจมตี SSH ส่วนใหญ่จะพยายามเข้าถึงผ่านบัญชีผู้ใช้รูท เชื่อมต่อกับชื่อผู้ใช้ของคุณและจากนั้นsu
จะรูทเสมอ ผู้ใช้จากwheel
กลุ่มเท่านั้นที่สามารถsu
รูทได้ นั่นเป็นเหตุผลที่เราเพิ่มผู้ใช้ของเราในกลุ่มล้อ
ปิดใช้งานการเข้าสู่ระบบหลัก:
# ee /etc/ssh/sshd_config
ยกเลิกการใส่เครื่องหมายบรรทัดนี้:
PermitRootLogin no
Reboot:
# reboot
หลังจากรีบูตเสร็จสิ้นคุณจะเห็นข้อความเช่นนี้ในคอนโซล Vultr:
time correction of 3600 seconds exceeds sanity limit (1000); set clock manually to
correct UTC time.
นั่นเป็นเหตุผลที่เราต้องแก้ไขนาฬิกาด้วยตนเอง ทำตามคำสั่งเหล่านี้ก่อนsu
ถึงรูท:
$ su
Password:
# ntpdate 0.europe.pool.ntp.org
ตอนนี้เรากำลังจะกำหนดค่าไฟร์วอลล์ OpenBSD PF รวมอยู่ในเคอร์เนล FreeBSD ดังนั้นคุณไม่จำเป็นต้องติดตั้งแพ็คเกจใด ๆ
ด้วยee
เครื่องมือแก้ไขให้สร้างไฟล์/etc/firewall
:
# ee /etc/firewall
แทรกสิ่งนี้: (แทนที่ที่อยู่ IP ของคุณด้วย)
#######################################################################
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
สร้าง/etc/trusted
ไฟล์ ในไฟล์นี้เราจะใส่ IP ที่เรา "เชื่อถือ"
# ee /etc/trusted
เพิ่ม IP บางส่วน:
# Hosting
1.2.0.0/16
# My friends
1.2.4.0/24
ตอนนี้คำอธิบายบางอย่าง พอร์ตขยะและ IP ขยะเป็นเพียงบางพอร์ต / IP ที่เราไม่ต้องการเห็นในบันทึก เราได้ทำสิ่งนี้ด้วยกฎนี้:
# ---- 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
นี่เป็นค่าเริ่มต้นและคุณไม่ต้องกังวลเกี่ยวกับมัน:
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
กฎนี้บล็อกทราฟฟิก SMTP ขาออกจากเซิร์ฟเวอร์ของคุณ (ซึ่งเป็นค่าเริ่มต้นบน Vultr)
# ---- block SMTP out
block quick proto tcp from $me to any port 25
ยกเว้น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)
Bruteforcers เพิ่งพูดว่า: อนุญาตจาก <trusted> IP ไปยังพอร์ต 22 แต่สามารถทำการเชื่อมต่อได้พร้อมกันเพียง 10 ตัวจาก IP ต้นทางเดียว ถ้ามันมากกว่า 10 บล็อก IP นี้และวางไว้ในตาราง bruteforcers เช่นเดียวกันสำหรับกฎ 20/60 มันหมายถึงการเชื่อมต่อสูงสุด 20 การเชื่อมต่อใน 60 วินาที
เปิดใช้งานไฟร์วอลล์:
# ee /etc/rc.conf
ยกเลิกหมายเหตุบรรทัดเหล่านี้:
pf_enable="YES"
pf_rules="/etc/firewall"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Reboot:
# reboot
หากคุณทำทุกอย่างถูกต้องแล้วคุณจะสามารถเข้าสู่ระบบและไฟร์วอลล์จะเปิดใช้งาน คุณไม่ต้องรีบูตทุกครั้งที่คุณเปลี่ยน/etc/firewall
ไฟล์ แค่ทำ:
# /etc/rc.d/pf reload
ดูว่าใครกำลังพยายามเชื่อมต่อกับเซิร์ฟเวอร์ของคุณแบบเรียลไทม์:
# tcpdump -n -e -ttt -i pflog0
แสดงประวัติ:
# tcpdump -n -e -ttt -r /var/log/pflog
ดูว่าคุณมีใครบางคนในตาราง bruteforcers:
# pfctl -t bruteforcers -T show
และนั่นคือมัน คุณได้ติดตั้งไฟร์วอลล์ PF เรียบร้อยแล้วบนเซิร์ฟเวอร์ FreeBSD!