16-bo‘lim

Xavfsizlik devori

nftables va ufw, DROP bilan REJECT farqi, o'zingizni bloklab qo'ymaslik va qoidalarni xavfsiz sinash.

🕑 21 daqiqa o‘qish 📄 1 622 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Uchta darajadagi vositalar
  2. Qoidalarni xavfsiz sinash
  3. Birinchi qoidalar to'plami
  4. DROP va REJECT - farqni ko'ramiz
  5. To'liq server uchun qoidalar
  6. O'zingizni bloklab qo'ymaslik
  7. Qoidalarni saqlash
  8. ufw - oddiyroq yo'l
  9. Tezlikni cheklash
  10. Tekshirish
  11. Xulosa

Xavfsizlik devori bitta savolga javob beradi: qaysi paketlar serverga kira oladi. To'g'ri sozlangan devor 15-bo'limdagi "ma'lumotlar bazasi internetga ochiq" muammosini butunlay yo'q qiladi.

Uchta darajadagi vositalar #

Bitta mexanizm, uchta interfeys ufw Oddiy: ufw allow 22/tcp Ubuntu da standart nftables Zamonaviy, to'g'ridan-to'g'ri iptables ning o'rnini bosdi iptables Eski sintaksis Bugun nftables ga tarjima qilinadi netfilter - yadro ichidagi mexanizm Barcha uch vosita oxir-oqibat shu yerga yozadi Qaysi birini tanlash Oddiy veb-server, bir necha port: ufw - kamroq xato qilasiz. Murakkab qoidalar, NAT, tezlik cheklovi: nftables. Ikkalasini BIRGA ishlatmang - qoidalar bir-birini bekor qilishi mumkin.
ufw - nftables ustidagi qulay qobiq, alohida tizim emas

Qoidalarni xavfsiz sinash #

Xavfsizlik devori - serverdan chiqib qolishning eng tez yo'li. Shuning uchun bu bo'limdagi barcha qoidalar alohida tarmoq nomlar fazosida (network namespace) sinaladi.

Terminal
ip netns del sinov 2>/dev/null
ip netns add sinov
ip netns exec sinov ip link set lo up

Nomlar fazosi - o'z tarmoq stegi, o'z interfeyslari va o'z xavfsizlik devori bo'lgan izolyatsiyalangan muhit. Undagi qoidalar haqiqiy serverga hech qanday ta'sir qilmaydi.

Terminal
ip netns exec sinov nft list ruleset | wc -l
Natija
0

Bo'sh - ya'ni toza muhitdan boshlayapmiz.

Bu texnikani ishda ham ishlating

Murakkab qoidalar to'plamini yozganda, uni avval nomlar fazosida sinash - professional amaliyot:

BuyruqVazifa
ip netns add sinovYaratish
ip netns exec sinov buyruqIchida bajarish
ip netns listRo'yxat
ip netns del sinovO'chirish

Ichkarida ishga tushirilgan har qanday jarayon butunlay alohida tarmoqda yashaydi: o'z lo si, o'z portlari, o'z nft jadvallari.

Bu Docker va konteynerlar ishlatadigan mexanizmning aynan o'zi.

Birinchi qoidalar to'plami #

Terminal
ip netns exec sinov nft add table inet filter
ip netns exec sinov nft add chain inet filter input \
    '{ type filter hook input priority 0 ; policy drop ; }'
ip netns exec sinov nft add rule inet filter input ct state established,related accept
ip netns exec sinov nft add rule inet filter input iif lo accept
ip netns exec sinov nft add rule inet filter input tcp dport 22 accept
ip netns exec sinov nft list ruleset
Natija
table inet filter {
    chain input {
        type filter hook input priority filter; policy drop;
        ct state established,related accept
        iif "lo" accept
        tcp dport 22 accept
    }
}

Har qatorni o'qib chiqamiz:

QatorMa'no
type filter hook inputKiruvchi paketlarni filtrlash
policy dropRuxsat berilmagan hamma narsa tashlanadi
ct state established,related acceptJavob paketlariga ruxsat
iif lo acceptLoopback - server o'zi bilan gaplashadi
tcp dport 22 acceptSSH
Birinchi ikki qoida bo'lmasa, server ishlamay qoladi

policy drop bilan boshlaganingizda hamma narsa taqiqlanadi - jumladan siz yuborgan so'rovlarning javoblari ham.

ct state established,related accept bo'lmasa:

Nima buziladiNima uchun
apt updateOmbordan kelgan javob tashlanadi
DNS so'rovlariJavob kelmaydi
curl, git pullXuddi shunday
Ma'lumotlar bazasiga tashqi ulanishJavob yo'q

iif lo accept bo'lmasa:

Nima buziladiNima uchun
Nginx → ilova (127.0.0.1:8080)Loopback bloklangan
Ilova → MySQL (127.0.0.1:3306)Xuddi shunday
Ko'p jarayonlararo aloqalarXuddi shunday

Bu ikki qator - har qanday xavfsizlik devorining majburiy asosi. Ularsiz qoidalar to'plami yozmang.

DROP va REJECT - farqni ko'ramiz #

15-bo'limda curl chiqish kodlari haqida gapirgandik. Endi buni tajribada tasdiqlaymiz.

Terminal
ip netns exec sinov bash -c '
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
sleep 1
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy accept ; }"
printf "qoidasiz: "; curl -s -o /dev/null -w "%{http_code}\n" --max-time 2 http://127.0.0.1:8099/
'
Natija
qoidasiz: 200

Endi reject qo'shamiz:

Terminal
ip netns exec sinov bash -c '
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
sleep 1
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy accept ; }"
nft add rule inet filter input tcp dport 8099 reject
printf "reject: "; curl -s -o /dev/null -w "%{http_code}" --max-time 3 http://127.0.0.1:8099/; printf " kod=%s\n" "$?"
'
Natija
reject: 000 kod=7

Va drop:

Terminal
ip netns exec sinov bash -c '
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
sleep 1
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy accept ; }"
nft add rule inet filter input tcp dport 8099 drop
printf "drop: "; curl -s -o /dev/null -w "%{http_code}" --max-time 3 http://127.0.0.1:8099/; printf " kod=%s\n" "$?"
'
Natija
drop: 000 kod=28
AmalMijoz nima ko'radicurl kodiTezlik
acceptJavob0-
rejectDarhol rad javobi (ICMP)7Tez
dropSukunat - taymautgacha kutadi28Sekin
Qaysi birini tanlash
VaziyatTanlovSabab
Internetga qaragan portdropSkanerlarni sekinlashtiradi
Ichki tarmoqrejectXatoni tez ko'rasiz, tashxis oson
Xizmatni vaqtincha yopishrejectIlova darhol xato oladi, osilib qolmaydi

drop ning foydasi: port skanerlari har port uchun taymaut kutishga majbur bo'ladi va butun serverni skanerlash soatlarga cho'ziladi. reject bilan esa skaner sekundiga minglab portni tekshiradi.

Kamchiligi: siz ham tashxis qo'yganda kutasiz. Shuning uchun ichki tarmoqda reject, tashqarida drop.

Bu 15-bo'limdagi jadval bilan bir xil: 7 - eshik yopiq, 28 - eshik yo'q.

To'liq server uchun qoidalar #

Terminal
ip netns exec sinov bash -c '
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy drop ; }"
nft add chain inet filter forward "{ type filter hook forward priority 0 ; policy drop ; }"
nft add chain inet filter output "{ type filter hook output priority 0 ; policy accept ; }"
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
nft add rule inet filter input iif lo accept
nft add rule inet filter input ip protocol icmp icmp type echo-request limit rate 5/second accept
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
nft list chain inet filter input
'
Natija
table inet filter {
    chain input {
        type filter hook input priority filter; policy drop;
        ct state established,related accept
        ct state invalid drop
        iif "lo" accept
        ip protocol icmp icmp type echo-request limit rate 5/second burst 5 packets accept
        tcp dport { 22, 80, 443 } accept
    }
}
QatorNima uchun
forward policy dropServer marshrutizator emas
output policy acceptChiquvchi trafik erkin
ct state invalid dropBuzilgan paketlarni erta tashlash
icmp ... limit rate 5/secondping ishlaydi, lekin suiiste'mol qilinmaydi

nft chiqishga burst 5 packets ni o'zi qo'shdi - bu standart qiymat. Ya'ni qisqa vaqtda beshta paket to'planib kelishi mumkin, o'rtacha tezlik esa sekundiga beshtadan oshmaydi. | tcp dport { 22, 80, 443 } | Faqat uchta port |

Ma'lumotlar bazasi porti ro'yxatda yo'q

3306, 5432, 6379 ataylab qo'shilmagan.

15-bo'limda ko'rganimizdek, ma'lumotlar bazasi 127.0.0.1 da turishi kerak - shunda unga faqat serverning o'zi ulanadi va iif lo accept qoidasi kifoya.

Agar sizga haqiqatan ham tashqi ulanish kerak bo'lsa (masalan alohida ilova serveri), portni hammaga emas, aniq manzilga oching:

Natija
nft add rule inet filter input ip saddr 10.0.0.5 tcp dport 3306 accept

Va bu ham to'liq yechim emas: ustiga TLS va parol ham kerak.

Umumiy qoida: portni ochishdan oldin, uni ochmasdan hal qilish yo'lini qidiring. SSH tunneli yoki VPN ko'pincha ochiq portdan yaxshiroq.

O'zingizni bloklab qo'ymaslik #

Bu xatoni har bir administrator bir marta qiladi

Siz policy drop qo'yasiz, SSH qoidasini yozishni unutasiz - va ulanish darhol uziladi. Server ishlayapti, lekin siz unga kira olmaysiz.

To'rtta himoya:

ChoraQanday
SSH qoidasini birinchi yozingpolicy drop dan oldin
Ikkinchi sessiya ochiq tursin7 va 8-bo'limlardagi kabi
Avtomatik bekor qilish qo'yingPastda
Provayder konsolini bilingOxirgi chora

Avtomatik bekor qilish - eng ishonchli usul:

Terminal
sudo systemd-run --on-active=300 --unit=fw-qaytarish \
    nft flush ruleset

Bu besh daqiqadan keyin barcha qoidalarni tozalaydi. Agar yangi qoidalar to'g'ri ishlasa va siz hali ham ulangan bo'lsangiz - taymerni bekor qiling:

Terminal
sudo systemctl stop fw-qaytarish.timer

Ulanishni yo'qotsangiz esa - besh daqiqa kuting va qayta ulaning.

Xuddi shu naqsh SSH sozlamasi va Nginx uchun ham ishlaydi.

Qoidalarni saqlash #

nft qoidalari xotirada yashaydi - qayta yuklashda yo'qoladi.

VazifaBuyruq
Faylga saqlashnft list ruleset > /etc/nftables.conf
Fayldan yuklashnft -f /etc/nftables.conf
Sintaksisni tekshirishnft -c -f /etc/nftables.conf
Yuklanishda avtomatiksystemctl enable nftables
Hammasini tozalashnft flush ruleset
Terminal
ip netns exec sinov bash -c '
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy drop ; }"
nft add rule inet filter input tcp dport 22 accept
nft list ruleset > qoidalar.nft
nft flush ruleset
printf "tozalangach: %s qator\n" "$(nft list ruleset | wc -l)"
nft -f qoidalar.nft
printf "qayta yuklangach: %s qator\n" "$(nft list ruleset | wc -l)"
'
Natija
tozalangach: 0 qator
qayta yuklangach: 6 qator
nft -c - visudo -c ning tarmoqdagi ekvivalenti
Terminal
sudo nft -c -f /etc/nftables.conf

-c (check) faylni qo'llamaydi, faqat sintaksisni tekshiradi.

Bu darslikdagi to'rtinchi shunday buyruq:

SozlamaTekshiruv
sudoersvisudo -cf
sshd_configsshd -t -f
.servicesystemd-analyze verify
nftables.confnft -c -f
nginx.confnginx -t (17-bo'lim)

Odat qiling: sozlamani qo'llashdan oldin tekshiring.

ufw - oddiyroq yo'l #

Ubuntu Server da ufw standart o'rnatilgan va ko'p holatlar uchun yetarli.

Terminal
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80,443/tcp comment 'Veb'
sudo ufw limit 22/tcp
sudo ufw enable
sudo ufw status verbose
BuyruqVazifa
ufw default deny incomingAsosiy siyosat
ufw allow 22/tcpPortni ochish
ufw allow from 10.0.0.5 to any port 3306Aniq manzildan
ufw limit 22/tcpTezlikni cheklash - brute-force ga qarshi
ufw delete allow 80/tcpQoidani o'chirish
ufw status numberedRaqamlangan ro'yxat
ufw --dry-run allow 80Nima bo'lishini ko'rish
ufw enable SSH ni uzishi mumkin

ufw enable buyrug'i ogohlantirish beradi:

Natija
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

Bu bo'sh ogohlantirish emas. allow 22/tcp ni enable dan oldin yozganingizga ishonch hosil qiling.

ufw limit 22/tcp esa alohida foydali: u bir IP dan 30 soniyada 6 martadan ko'p ulanishga urinishni bloklaydi. Bu SSH brute-force hujumlarining katta qismini to'xtatadi - fail2ban ga qo'shimcha qatlam sifatida (19-bo'lim).

Tezlikni cheklash #

Terminal
ip netns exec sinov bash -c '
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy drop ; }"
nft add rule inet filter input tcp dport 22 ct state new limit rate 6/minute accept
nft add rule inet filter input tcp dport 22 ct state established accept
nft list chain inet filter input | grep -c "limit rate"
'
Natija
1
NaqshNima qiladi
limit rate 6/minuteDaqiqasiga 6 ta yangi ulanish
limit rate over 10/second dropChegaradan oshganini tashlash
ct state newFaqat yangi ulanishlarga - mavjudlariga tegmaydi
Tezlik cheklovi - to'siq, himoya emas

Bu chora hujumni sekinlashtiradi, to'xtatmaydi. Uning vazifasi - avtomatik skanerlarni foydasiz qilish va jurnalni o'qish mumkin holga keltirish.

Haqiqiy himoya - bu bir necha qatlam:

QatlamNima qiladi
Xavfsizlik devoriKeraksiz portlarni yopadi
Tezlik chekloviHujum tezligini kamaytiradi
Kalit bilan kirishParol taxminini butunlay foydasiz qiladi
fail2banTakroriy urinuvchilarni bloklaydi
MonitoringSizni xabardor qiladi

Ulardan eng kuchlisi - uchinchisi (8-bo'lim). Xavfsizlik devori uni almashtirmaydi, faqat to'ldiradi.

Tekshirish #

SavolBuyruq
Qanday qoidalar borsudo nft list ruleset
ufw holatisudo ufw status verbose
Qaysi portlar tinglanmoqdasudo ss -tlnp
Tashqaridan ochiqmiBoshqa mashinadan nc -zv IP port
Qoida ishlayaptiminft list ruleset da hisoblagichlar
Tashqaridan tekshirish - yagona ishonchli usul

Serverning o'zidan port ochiqligini tekshirib bo'lmaydi: iif lo accept qoidasi tufayli hammasi ochiq ko'rinadi.

To'g'ri usullar:

UsulIzoh
Boshqa serverdan nc -zvEng aniq
Telefon internetidanUy tarmog'idan farqli manba
Onlayn port skaner xizmatiTez, lekin ishonch cheklangan

Sozlagandan keyin albatta tashqaridan tekshiring. "Menda ishlayapti" bu yerda hech nimani anglatmaydi.

Terminal
ip netns del sinov 2>/dev/null; ip netns list | grep -c sinov || true
Natija
0
Amaliy topshiriq
  1. ip netns bilan sinov muhitini yarating.
  2. policy drop bilan input zanjirini tuzing.
  3. established,related va iif lo qoidalarini qo'shing.
  4. Ularsiz nima buzilishini tushuntiring.
  5. reject va drop ni sinab, curl kodlarini solishtiring.
  6. 22, 80, 443 portlarini ochadigan to'liq to'plam yozing.
  7. Qoidalarni faylga saqlab, tozalab, qayta yuklang.
  8. nft -c -f bilan sintaksisni tekshiring.
  9. limit rate bilan tezlik cheklovi qo'ying.
  10. systemd-run --on-active bilan avtomatik bekor qilishni sozlang.

Xulosa #

  • ufw, nftables, iptables - bitta netfilter ustidagi uch interfeys.
  • Ikkalasini birga ishlatmang.
  • Qoidalarni nomlar fazosida sinang - serverga tegmaydi.
  • ct state established,related accept va iif lo accept - majburiy asos.
  • reject darhol rad javobi (curl kodi 7), drop - sukunat (28).
  • Tashqarida drop, ichki tarmoqda reject.
  • Ma'lumotlar bazasi portini ochmang - 127.0.0.1 va iif lo kifoya.
  • policy drop dan oldin SSH qoidasini yozing.
  • systemd-run --on-active bilan avtomatik bekor qilish qo'ying.
  • Portni tashqaridan tekshiring - serverning o'zidan emas.

Keyingi bo'limda Nginx ni sozlaymiz: statik fayllar, teskari proksi va veb-server darajasidagi himoya.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.