Firewall va UFW
Eng kam imtiyoz (least privilege) maqolasida default deny firewall ushbu moduldagi boshqa barcha joylarda qo'llaniladigan o'sha tamoyilning tarmoq qatlamidagi ko'rinishi sifatida ta’riflangan edi. Bu maqola shuni aniq amalda ko'rsatadi. UFW (Uncomplicated Firewall) — Ubuntu’da paketlarni filtrlash uchun standart front end. U "aniq kerak bo'lganidan boshqa hamma narsani rad et" degan qoidani xom qoidalar jadvali o'rniga bir nechta o'qilishi oson buyruq bilan ifodalash imkonini beradi.
Nimalarni o'rganasiz
Bu maqola oxirida siz quyidagilarni qila olasiz:
- default deny siyosati amalda nimani anglatishini tushuntirish va uni UFW bilan o'rnatish;
- trafikka port, protokol, application profile va manba manzil bo'yicha ruxsat berish va uni rad etish;
ufw status verboseni o'qish va har bir ustun nimani anglatishini tushunish;- firewall darajasining o'zida brute-force urinishini susaytirish uchun rate limiting'dan foydalanish;
- to'g'ri ko'rinadigan qoida nega kuchga kirmayotganini diagnostika qilish.
UFW aslida nima
UFW alohida paket filtrlash dvigateli emas — u kernel’ning o'z netfilter framework’i ustidagi boshqaruv qatlami (iptables va nftables bevosita muloqot qiladigan o'sha dvigatel, iptables va nftables maqolasida ko'rib chiqiladi). UFW ularning har birining xom sintaksisi uzun va unda nozik xato qilish oson bo'lgani uchun mavjud. U ularning moslashuvchanligining bir qismini siyosat bayonotidek o'qiladigan buyruqlarga almashtiradi.
Yangi o'rnatilgan UFW standart holatda faol emas. Uni haqiqatan kerakli qoidalarni avval tasdiqlamasdan yoqish — masofaviy serverdan o'zingizni qulflab qo'yishning eng keng tarqalgan usuli. Bu quyida alohida ko'rib chiqiladi.
Standart siyosat: kiruvchini rad etish, chiquvchiga ruxsat berish
Bu Eng kam imtiyoz (least privilege) maqolasidagi default deny tamoyilining bevosita qo'llanishi: hech bir qoida aniq ruxsat bermaguncha bu hostdagi tinglayotgan servisga hech narsa yetib bormaydi. Hostning o'zi esa har bir mumkin bo'lgan manzil uchun qoida talab qilmasdan chiquvchi ulanishlarni (paketlarni yuklab olish, DNS’ni resolve qilish va hokazo uchun) boshlay oladi. Chiquvchi trafikni ham cheklash mumkin (default deny outgoing), lekin bu doimiy texnik xizmatni sezilarli darajada oshiradi. Ko'pchilik serverlarga bu kerak emas va xato tufayli apt update kabi kundalik amallarni buzib qo'yish oson.
Trafikka ruxsat berish va uni rad etish
22/tcp— bitta port va protokol;80,443/tcp— vergul bilan ajratilgan portlar ro'yxati, bitta qoida;from 203.0.113.0/24 to any port 5432— portni aniq manba tarmog'i bilan cheklash. Umumiy internetdan hech qachon ochiq bo'lmasligi, faqat ma’lum ilova subnet’idan ochiq bo'lishi kerak bo'lgan ma’lumotlar bazasi porti uchun to'g'ri yondashuv shu.
Masofaviy serverda UFW’ni yoqishdan oldin SSH kirishini tasdiqlang
UFW’ni default deny kiruvchi siyosati bilan va SSH’ga ruxsat beradigan qoidasiz yoqish serverni boshqarish uchun ishlatilayotgan sessiyaning o'zini uzib qo'yadi. Shundan keyin hosting provayderining konsoli orqali kirishdan boshqa qaytish yo'li qolmaydi. sudo ufw enable ni ishga tushirishdan oldin:
- avval joriy, faol bo'lmagan holatni tekshiring:
sudo ufw status; - joriy SSH sessiyasi ishlatayotgan portga aniq ruxsat bering:
sudo ufw allow 22/tcp(yoki agar u o'zgartirilgan bo'lsa, haqiqatda sozlangan portga — qarang: SSH hardening); - faqat shundan keyin
sudo ufw enableni ishga tushiring; - birinchisini yopmasdan, ikkinchi terminalda darhol yangi SSH ulanishini sinab ko'ring;
- agar yangi ulanish muvaffaqiyatsiz bo'lsa, hali ochiq turgan birinchi sessiyada
sudo ufw disableni ishga tushirib, darhol tiklash mumkin.
Nomlangan application profile’lar keng tarqalgan servislar uchun xom port raqamlarini eslab qolishning muqobili:
ufw app list bu ta’riflarni /etc/ufw/applications.d/ dan o'qiydi. U yerga ular nginx va openssh-server kabi paketlar o'rnatilganda avtomatik qo'shiladi. Profil allaqachon mavjud bo'lsa, bu sudo ufw allow 80,443/tcp ga qaraganda o'zini o'zi hujjatlashtiradigan muqobil.
Rad etish ruxsat berishning ko'zgudagi aksi va qoidalar tartibi muhim — birinchi mos kelgan qoida g'olib bo'ladi:
Bu ikki qoida aynan shu tartibda bo'lsa, SSH uchun aniq istisno hech qachon kuchga kirmaydi. Chunki oldinroq turgan, kengroq rad etish qoidasi o'sha manzildan kelgan har qanday trafikka, portlar bilan birga, birinchi bo'lib mos keladi. Istisno ta’sir qilishi uchun u kengroq rad etishdan oldin ro'yxatda turishi kerak. Buni keyingi bo'limda ko'rsatilgan ufw status numbered bilan tekshirish mumkin.
Holatni o'qish
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80,443/tcp ALLOW IN Anywhere
[ 3] 5432 ALLOW IN 203.0.113.0/24
Raqamlar o'chirish uchun muhim. Asl allow/deny sintaksisini aynan qayta tiklash o'rniga raqam bo'yicha o'chirish aniq qoidani olib tashlashning ishonchli usuli:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
Logging: on (low) rad etilgan paketlar kernel log'iga past darajadagi tafsilot bilan yozilishini anglatadi. Bu nimadir bloklangani va qayerdan kelganini ko'rish uchun yetarli, lekin ruxsat berilgan har bir paketni ham yozadigan full logging hajmini bermaydi.
Rate limiting
allow o'rniga ishlatilgan limit ma’lum manzildan kelayotgan ulanish urinishlarini kuzatadi va 30 soniya ichida taxminan 6 tadan ortiq ulanish kelsa, keyingi urinishlarni avtomatik rad etadi. Bu SSH’ni brute-force skanerlashga qarshi firewall darajasidagi qo'pol himoya. U shu modulda keyinroq ko'rib chiqiladigan fail2ban ning log shablonlariga asoslangan yondashuvidan farq qiladi. Ikkalasi bir-birini takrorlamaydi, balki to'ldiradi. limit urinishlar haqiqatan autentifikatsiyadan o'ta olmaganmi yoki yo'qmi, bilmagan holda faqat ulanish tezligiga javob beradi. fail2ban esa autentifikatsiya log'larining o'zini o'qiydi va shuning uchun haqiqatan muvaffaqiyatsiz bo'lgan kamroq sondagi logindan keyin ban qila oladi. Buning narxi — log shabloni to'g'ri mos kelishi kerakligi.
IPv6
UFW IPv6 uchun umuman yoqilgan bo'lsa, IPv6 qoidalarini sezdirmasdan boshqaradi. Zamonaviy Ubuntu o'rnatmasida bu standart holat:
IPV6=yes bo'lganda oddiy sudo ufw allow 22/tcp ikkala manzil oilasi uchun ham mos qoidalarni yaratadi — odatda alohida IPv6 buyrug'i kerak emas. Lekin servis bir manzil oilasi orqali ochiq bo'lib, boshqasi orqali ochiq bo'lmasa, dual-stack hostda ufw status verbose ni alohida tekshirishga arziydi.
Amaliy vaziyat: web serverni berkitish
Muammo. Yangi Ubuntu Server LTS instansi nginx ni ishga tushiradi va SSH orqali ochiq. U faqat HTTP/HTTPS va SSH’ni qabul qilishi, qolgan barcha kiruvchi trafikni rad etishi va SSH’ni brute-force skanerlashga qarshi rate limit qilishi kerak.
Boshlang'ich holatni tekshirish:
Standart siyosat va kerakli qoidalarni o'rnatish, birinchi navbatda SSH:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit 22/tcp
sudo ufw allow 'Nginx Full'
Yoqish va birinchisini yopishdan oldin ikkinchi sessiyadan tekshirish:
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
22/tcp LIMIT IN Anywhere
Nginx Full ALLOW IN Anywhere
Natija. Ikkinchi terminaldan ochilgan yangi SSH sessiyasi kirish hali ham ishlashini tasdiqlaydi. Tashqaridan istalgan boshqa portni skanerlash esa endi refused emas, umuman javob olmaydi, chunki default deny paketni faol rad etmaydi, balki tashlab yuboradi (drop).
Xulosa. Server endi tarmoqqa aynan ikkita servisni — SSH (rate limit bilan) va web trafikni — ochiq qoldiradi, qolgan hamma narsa jimgina yetib bo'lmaydigan holatda. Bu Linux xavfsizligi asoslari maqolasidagi attack surface’ni qisqartirish maqsadiga mos keladi.
Keng tarqalgan xatolar
- SSH uchun allow qoidasini tasdiqlamasdan UFW’ni yoqish. Yuqorida batafsil ko'rib chiqilgan — masofaviy serverdan o'zingizni qulflab qo'yishning eng keng tarqalgan usuli.
- Aniq allow qoidasini kengroq deny qoidasidan keyin joylashtirish. UFW qoidalarni tartib bilan tekshiradi va birinchi moslikda to'xtaydi. Xuddi shu trafik uchun keng deny’dan keyin qo'yilgan tor istisno hech qachon kuchga kirmaydi.
- UFW’ning o'zi allaqachon autentifikatsiyadan o'tgan hujumchini to'xtatadi deb o'ylash. UFW servisga nima yetib bora olishini boshqaradi. Trafik zaif ilova ishlayotgan portga qonuniy ruxsat bilan o'tgandan keyin u hech narsa qilmaydi. U defense in depth’ning to'liq emas, faqat bitta qatlami.
- Har bir o'zgarishdan keyin
ufw reloadyokienablekerak deb o'ylash. Ba’zi firewall front end’laridan farqli o'laroq, UFW qoidalaridagi o'zgarishlar (allow/deny/delete) darhol kuchga kiradi. Alohida "qo'llash" qadami yo'q va bu ba’zan shunday qadam kerak deb kutganlarni hayron qoldiradi.
Mashqlar
- Lab VM’da default deny kiruvchi siyosatini o'rnating, faqat SSH’ga ruxsat bering va
ufw status numberedbilan, ikkinchi mashinadan esa boshqa hech bir port javob bermasligini tekshiring. - Ma’lum portga faqat bitta manba IP’dan ruxsat beradigan qoida qo'shing va unga istalgan joydan ruxsat berish bilan solishtirganda
ufw status verboseda nima o'zgarishini tushuntiring. - Ikkita qoida yarating — manzildan keng deny va xuddi shu manzildan bitta port uchun torroq allow — allow ta’sir qilmaydigan tartibda. Keyin tartibni tuzating va
ufw status numberedbilan tasdiqlang. ufw limit 22/tcpnimadan himoya qilishi va fail2ban nimadan himoya qilishi o'rtasidagi farqni o'z so'zlaringiz bilan tushuntiring.
Xulosa
UFW — kernel’ning netfilter paket filtri ustidagi o'qilishi oson front end. U default deny kiruvchi siyosatini ifodalash va keyin serverga kerak bo'lgan aynan portlar va manbalarga ruxsat berish atrofida qurilgan. Qoidalar tartibi moslikda qaysi biri g'olib bo'lishini belgilaydi, limit skanerlashga qarshi tezlikka asoslangan qo'pol himoya qo'shadi. Eng muhim operatsion odat esa masofaviy mashinada firewall’ni yoqishdan oldin SSH uchun allow qoidasini tasdiqlash. Keyingi maqola, iptables va nftables, UFW’ning soddalashtirilgan sintaksisi beradigandan ko'proq nazorat kerak bo'lgan holatlar uchun UFW’ning o'zi qurilgan quyi darajadagi vositalarni ko'rib chiqadi.