Tarkibga o'tish

Production’da yangilanishlar: xavfsiz va oldindan aytib bo'ladigan yangilash siyosati

Oldingi maqolalarda apt, dpkg va Snap orqali paketlarni o'rnatish, yangilash va boshqarish ko'rib chiqildi. Ish stantsiyasida apt upgrade ni istalgan paytda ishga tushirish kam xavfli — eng yomon holatda brauzerni qayta ishga tushirasiz. Production serverda esa aynan shu buyruqning og'irligi boshqacha: noto'g'ri paytda qo'llangan, sinovdan o'tmagan yangilanish xizmatni to'xtatishi, konfiguratsiyani buzishi yoki qayta yuklashni majburiy qilishi mumkin — va bularning hammasi foydalanuvchilarga real, ko'zga ko'rinadigan ta’sir qiladi.

Bu maqola yangi buyruq haqida emas — u allaqachon biladigan apt/dpkg buyruqlaringizni qachon, qanday tartibda va qanday ehtiyot choralari bilan qo'llash kerakligi haqida. Unda xavfsizlik patch’i va kattaroq versiya yangilanishi o'rtasidagi farq, buni xavfsiz avtomatlashtiradigan vositalar va yangilanish haqiqatan qo'llangandan keyin nimani tekshirish kerakligi ko'rib chiqiladi.

Xavfsizlik yangilanishlari va oddiy yangilanishlar: nega ular bir xil emas

Ubuntu repozitoriysi ikki alohida yangilanish oqimini ajratadi:

  • xavfsizlik yangilanishlari — noble-security kabi alohida repozitoriydan keladi, aniqlangan muayyan zaiflikni bartaraf etadi va dasturning tashqi xatti-harakatini deyarli o'zgartirmaydi; bu apt-cache policy chiqishida alohida manba sifatida ko'rinadigan qatlam;
  • oddiy versiya yangilanishlari (feature/point yangilanishlar) — noble-updates dan keladi va yangi imkoniyat, o'zgargan sukut bo'yicha sozlama yoki kutubxonaning yangiroq asosiy versiyasini olib kelishi mumkin.

Bu farq amalda muhim: xavfsizlik yangilanishini kechiktirish tizimni ma’lum zaiflik oldida ochiq qoldirish degani, shuning uchun u odatda iloji boricha tez, ko'pincha avtomatik qo'llanadi. Oddiy versiya yangilanishi ko'proq o'zgarish olib keladi, shuning uchun u odatda production’ga yetib borishidan oldin staging muhitida sinab ko'riladi.

apt-get upgrade -s

-s (simulate) hech narsani o'zgartirmasdan qaysi paketlar yangilanishini ko'rsatadi. Ro'yxatdagi har bir paket uchun apt-cache policy <package> u noble-security dan yoki noble-updates dan kelayotganini ko'rsatadi.

Faqat xavfsizlik yangilanishlarini qo'llash

Ba’zan production serverda faqat xavfsizlik patch’larini darhol qo'llash, qolgan hammasini esa navbatdagi rejalashtirilgan texnik xizmat oynasiga qoldirish kerak bo'ladi. Buni faqat fayl nomi bo'yicha ajratish ishonchli emas — Ubuntu 24.04 da apt va repozitoriylar maqolasida tasvirlangan standart ubuntu.sources fayli noble, noble-updates va noble-security ni bitta faylda birlashtiradi, shuning uchun odatda ko'rsatish mumkin bo'lgan alohida "faqat xavfsizlik" fayli bo'lmaydi.

Filtrlash aslida fayl bo'yicha emas, manbaning kelib chiqishi (origin) bo'yicha amalga oshadi — quyida ko'riladigan unattended-upgrades vositasi aynan shunday ishlaydi. U qaysi paketlarni qo'llashini haqiqatan ishga tushirishdan oldin ko'rish uchun:

sudo unattended-upgrade --dry-run -d

--dry-run hech narsa o'rnatmaydi; -d (debug) qaysi paket qaysi origin’dan tanlanganini batafsil ko'rsatadi. Bu apt-get flag'larini qo'lda filtrlashga urinishdan ancha ishonchli, rasman qo'llab-quvvatlanadigan yo'l.

unattended-upgrades: xavfsizlik patch’larini avtomatlashtirish

unattended-upgrades — tizimni belgilangan repozitoriylardan (odatda faqat xavfsizlik) jadval asosida mustaqil yangilab borish uchun Ubuntu’ning rasmiy paketi. Uni quyidagicha o'rnating:

sudo apt install unattended-upgrades

Asosiy konfiguratsiya /etc/apt/apt.conf.d/50unattended-upgrades da turadi:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";
  • Allowed-Origins qaysi manbalar avtomatik yangilanishga loyiq ekanini belgilaydi — sukut bo'yicha odatda faqat -security qatlami; -updates faqat administratorning ataylab qilgan tanlovi bilan qo'shiladi;
  • Automatic-Reboot agar yangilanish talab qilsa, tizim o'zini avtomatik qayta yuklashi kerakmi-yo'qmi, shuni boshqaradi.

Danger

Automatic-Reboot "true" — production serverda ehtiyotkorlik bilan ishlatiladigan sozlama: kernel patch’i o'rnatilgach, u mashinani so'ramasdan qayta yuklashi mumkin. Agar bu serverda uzoq davom etadigan jarayonlar yoki xizmatdagi ko'rinadigan uzilishni minimal darajada ushlab turish muhim bo'lsa, buni false qoldiring va qayta yuklashni quyida ko'rib chiqiladigan usul bilan rejalashtirilgan texnik xizmat oynasida qo'lda bajaring. Agar avtomatik qayta yuklash haqiqatan kerak bo'lsa ham, uni Automatic-Reboot-Time yordamida aniq, trafik kam bo'lgan vaqtga (masalan, tunga) bog'lang.

Yoqilgan yoki yoqilmaganini tekshiring:

systemctl status unattended-upgrades.service
cat /etc/apt/apt.conf.d/20auto-upgrades

Ikkinchi buyruq odatda shuni ko'rsatadi:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

1 yoqilgan, 0 o'chirilgan degani. Bu fayl har kuni ishlaydigan, systemd timer orqali boshqariladigan mexanizmni yoqadi. U ruhan keyinroq Cron asoslari maqolasida ko'riladigan rejalashtirish tushunchasiga o'xshaydi, lekin faqat apt ga xos.

Qayta yuklashni talab qiladigan yangilanishlar

Kernel, glibc yoki ayrim asosiy kutubxonalar yangilanganda o'zgarish faqat qayta yuklashdan keyin to'liq kuchga kiradi — shu orada ishlab turgan jarayon xotirada kodning eski nusxasini saqlab turadi. Ubuntu buni maxsus belgi fayli bilan bildiradi:

cat /var/run/reboot-required

Agar mavjud bo'lsa:

*** System restart required ***

Agar mavjud bo'lmasa, cat "No such file or directory" deb xabar beradi — bu yaxshi belgi, ya’ni hozir qayta yuklash talab qilinmaydi. Aynan qaysi paket bu talabni keltirib chiqarganini ko'rish uchun:

cat /var/run/reboot-required.pkgs

Tip

Bu ikki faylni monitoringingizga ulang — kunlik cron tekshiruvi yoki mavjud monitoring vositasi orqali. Bu production server qayta yuklashga muhtojligini qo'lda unutib qo'ymaslikning oddiy va ishonchli usuli.

Qayta yuklash talab qilinganda uni darhol bajarish o'rniga rejalashtirish standart amaliyot:

sudo shutdown -r +5 "Scheduled reboot: security patch"

+5 qayta yuklash 5 daqiqadan keyin bo'lishini bildiradi va ulangan foydalanuvchilarga ogohlantirish xabari yuboriladi. Uni bekor qilish uchun:

sudo shutdown -c

Qaysi xizmatlarni qayta ishga tushirish kerak: needrestart

Kerneldan tashqari, ko'p paket yangilanishlari (masalan, openssl ning yangi versiyasi) faqat shu kutubxonadan foydalanayotgan ishlab turgan jarayon qayta ishga tushirilgandan keyin to'liq kuchga kiradi — aks holda jarayon kutubxonaning eski nusxasini xotirada saqlab turaveradi. Buni qo'lda kuzatish amalda qiyin, shuning uchun needrestart dan foydalaning:

sudo apt install needrestart
sudo needrestart

Namunaviy chiqish:

Services to be restarted:
 systemctl restart nginx.service
 systemctl restart ssh.service

Bu /proc fayl tizimi maqolasida ko'rilgan g'oyaning to'g'ridan-to'g'ri amaliy qo'llanishi: needrestart /proc/*/maps dan eski, o'chirilgan, lekin hali murojaat qilinayotgan kutubxona nusxalarini qidiradi va qaysi jarayon hali ham ularga bog'liq ekanini aniqlaydi.

Warning

Ko'p .deb paketlarining o'rnatish skriptlari yangilanish paytida tegishli xizmatni avtomatik qayta ishga tushiradi, lekin bu har doim ham kafolatlanmagan — ayniqsa yangilangan paket qaysi xizmat unga bog'liqligini bevosita bilmaydigan oddiy kutubxona bo'lsa. Har qanday yangilanishdan keyin muntazam ravishda needrestart ni ishga tushirish eskirgan kutubxona bilan hali ham ishlayotgan xizmatni aniqlashning ishonchli usuli.

apt-mark hold: yangilanishni ataylab o'tkazib yuborish

apt va repozitoriylar maqolasida ko'rilgan apt-mark hold production’da alohida ahamiyat kasb etadi: agar ilovangiz muayyan versiyaga (masalan, ma’lumotlar bazasi drayveriga) bog'liqligi tasdiqlangan bo'lsa, o'sha paketni ataylab joriy versiyasida saqlab qolishingiz mumkin:

sudo apt-mark hold postgresql-16

Bu sozlama unattended-upgrades bilan birga ham hurmat qilinadi — hold qilingan paketni avtomatik yangilanishlar ham o'tkazib yuboradi. Lekin uni cheksiz muddatga unutib qoldirish xavfli: hold qilingan paket xavfsizlik patch’larini ham olmay qo'yadi, shuning uchun hold qilingan paketlar ro'yxatini vaqti-vaqti bilan ko'rib chiqing:

apt-mark showhold

Asosiy versiyani yangilash: do-release-upgrade

Bir Ubuntu LTS versiyasidan keyingisiga o'tish (masalan, 22.04 dan 24.04 ga) apt upgrade/full-upgrade bilan bajarilmaydi — buning uchun maxsus vosita, do-release-upgrade ishlatiladi, chunki bu amal yuzlab paketlarni almashtiradi va konfiguratsiya formati o'zgarishlarini ham o'z ichiga olishi mumkin.

sudo do-release-upgrade

Danger

do-release-upgrade — bu modulda ko'rib chiqilgan eng og'ir va eng keng ta’sirli amal. Uni hech qachon production serverda tayyorgarliksiz to'g'ridan-to'g'ri ishga tushirmang:

  1. avval snapshot yoki to'liq zaxira nusxa oling (disk darajasida yoki bulut provayderingizning VM snapshot vositasi orqali);
  2. avval uni bir xil konfiguratsiyali staging serverda to'liq sinab ko'ring;
  3. jarayon davomida SSH ulanishi uzilib qolsa, zaxira kirish yo'lini (masalan, konsolga kirish) tayyorlab qo'ying — do-release-upgrade odatda buni o'zi so'raydi;
  4. jarayonni faqat rejalashtirilgan, yetarlicha uzun texnik xizmat oynasida boshlang — u bir necha soat davom etishi mumkin;
  5. biror narsa noto'g'ri ketsa, tayyorlangan zaxira nusxadan tiklash eng ishonchli "rollback" strategiyasi, chunki qisman yangilangan tizimni ortga qaytarishga urinish ko'pincha ishonchsiz.

Amaliy vaziyat: haftalik yangilanish tekshiruvi

Muammo. Siz kichik production serverni boshqarasiz va har hafta uning xavfsizlik holatini qo'lda ko'rib chiqib, kerak bo'lganda yangilanishlarni rejalashtirilgan oynada qo'llaysiz.

1-qadam. Qanday yangilanishlar mavjudligini ko'ring (hali hech narsa o'zgarmaydi).

sudo apt update
apt list --upgradable
Listing... Done
nginx/noble-security 1.24.0-2ubuntu7.1 amd64 [upgradable from: 1.24.0-2ubuntu7]
openssl/noble-security 3.0.13-0ubuntu3.4 amd64 [upgradable from: 3.0.13-0ubuntu3.3]

Ikkala paket ham noble-security dan keladi — ya’ni bular kechiktirilmasligi kerak bo'lgan xavfsizlik patch’lari.

2-qadam. O'zgarishni simulyatsiya qiling.

apt-get upgrade -s

3-qadam. Yangilanishni qo'llang.

sudo apt upgrade -y

4-qadam. Qayta yuklash kerakmi-yo'qmi, tekshiring.

cat /var/run/reboot-required 2>/dev/null || echo "reboot not required"

5-qadam. Qaysi xizmatlarni qayta ishga tushirish kerakligini tekshiring.

sudo needrestart

Tekshiring:

apt list --upgradable

Bo'sh natija har bir mavjud yangilanish muvaffaqiyatli qo'llanganini tasdiqlaydi.

Xulosa. Haftalik tekshiruv beshta qisqa buyruqdan iborat, lekin ularning tartibi muhim: nima o'zgarishini ko'ring, uni qo'llang, so'ng qayta yuklash yoki xizmatni qayta ishga tushirish kerakmi, tekshiring — hech qachon "yangiladim va unutdim" emas.

Keng tarqalgan xatolar

Yangilanishdan keyin xizmatni qayta ishga tushirishni unutish

Paket yangilangan, lekin ishlab turgan jarayon kutubxonaning eski nusxasidan foydalanishda davom etmoqda — tashqaridan hammasi joyida ko'rinishi mumkin, aslida esa xizmat hali ham eski, ehtimol zaif kod bilan ishlayapti. Har bir yangilanishdan keyin needrestart ni muntazam odatga aylantiring.

unattended-upgrades ni yoqib, keyin uni boshqa hech qachon tekshirmaslik

Avtomatik yangilanishlar sozlangandan keyin ular aslida nimani qo'llayotganini hech qachon ko'rib chiqmaslik — jumladan /var/log/unattended-upgrades/unattended-upgrades.log ni hech qachon tekshirmaslik — muammoni kerak bo'lganidan ancha kech aniqlashga olib keladi.

Asosiy versiyani zaxira nusxasiz yangilash

do-release-upgrade ni oldindan snapshot olmasdan ishga tushirish, agar jarayon uzilib qolsa yoki konfiguratsiya nomuvofiqligiga duch kelsa, tizimni ishlamaydigan holatda qoldirish xavfini tug'diradi va tayyorlangan zaxira nusxasiz ishonchli qaytish yo'li bo'lmaydi.

Hold qilingan paketni butunlay unutib qo'yish

Hold qilingan paket xavfsizlik patch’larini olmaydi. apt-mark showhold ni vaqti-vaqti bilan tekshirmaslik tizimni asta-sekin ma’lum zaifliklar oldida ochiq qoldiradi.

Mashqlar

  1. Tizimingizda nechta yangilanish kutib turganini apt list --upgradable bilan ko'ring, so'ng har bir paketning kelib chiqishini apt-cache policy <package> bilan aniqlab, xavfsizlik yangilanishlarini oddiylaridan ajrating.
  2. Tizimingizda avtomatik yangilanishlar yoqilgan-yoqilmaganini systemctl status unattended-upgrades.service va cat /etc/apt/apt.conf.d/20auto-upgrades bilan tekshiring.
  3. cat /var/run/reboot-required 2>/dev/null va (agar o'rnatilgan bo'lsa) sudo needrestart ni ishga tushiring va tizimingiz hozir qayta yuklash yoki xizmatni qayta ishga tushirishni talab qiladimi, aniqlang — bu buyruqlar faqat tekshiradi, hech narsani o'zgartirmaydi.

Mashqni bajardim deyish uchun: har bir mashq uchun xavfsizlik yangilanishini oddiysidan aniq ajrata olishingiz, tizimingiz hozir qayta yuklashni talab qiladimi-yo'qmi, aniq ayta olishingiz va har qanday asosiy versiya yangilanishidan oldin zaxira nusxa nega zarurligini asoslab bera olishingiz kerak.

Xulosa

Production serverni yangilash boshqa joylardagi kabi aynan o'sha apt upgrade buyrug'idan foydalanadi, lekin uning atrofidagi yondashuv butunlay boshqacha: xavfsizlik yangilanishlarini oddiylaridan ajratish, avtomatlashtirishni (unattended-upgrades) ataylab sozlash, qayta yuklash yoki xizmatni qayta ishga tushirish kerakligini tekshirish, hold qilingan paketlarni boshqarish va asosiy versiyaga o'tishdan oldin doim zaxira nusxa olish. Bularning hammasi bitta maqsadga xizmat qiladi: yangilanishlarni kutilmagan uzilishlar manbai emas, oldindan aytib bo'ladigan jarayonga aylantirish.

Bu modul Debian/Ubuntu ekotizimida paketning butun hayot siklini qamrab oldi — asosiy tushunchalardan apt/dpkg juftligiga, Snap’ga va nihoyat production yangilanish siyosatigacha. Keyingi maqola — RPM, YUM va DNF xuddi shu g'oyalarni RHEL oilasida (Rocky Linux, AlmaLinux, Fedora) qanday ko'rinishini ko'rib chiqadi. Bu aralash muhitda ishlaydigan har bir kishi uchun zarur bilim.

Manbalar

  • Ubuntu Server hujjatlari: avtomatik yangilanishlar (unattended-upgrades): https://ubuntu.com/server/docs/automatic-updates
  • Ubuntu Server hujjatlari: paketlarni boshqarish: https://ubuntu.com/server/docs/package-management
  • Debian Wiki: UnattendedUpgrades: https://wiki.debian.org/UnattendedUpgrades
  • Ubuntu qo'llanma sahifasi: do-release-upgrade(8): https://manpages.ubuntu.com/manpages/noble/man8/do-release-upgrade.8.html
  • Ubuntu Launchpad: needrestart: https://launchpad.net/ubuntu/+source/needrestart
  • Linux man-pages: apt-get(8): https://man7.org/linux/man-pages/man8/apt-get.8.html