Linux bulutda (cloud)
Bulut instansiyasi — AWS EC2 instansiyasi, Google Compute Engine VM’i, Azure VM’i, DigitalOcean droplet’i — provayderning dashboard’i va API’si ostida baribir SSH orqali ulanish mumkin bo'lgan, systemd ni ishga tushiradigan, journald ga yozadigan va block qurilmalarni aynan shu kurs davomida ko'rib chiqilganidek mount qiladigan Linux mashinasi. Haqiqatan farq qiladigan narsa — bu mashina qanday paydo bo'lishi va u o'zining kimligini qanday bilib olishi: hech kim konsol oldida o'tirib o'rnatuvchini ishga tushirmaydi. Bu maqola buni mumkin qiladigan ikki mexanizmni — metadata service va cloud-init ni — hamda instansiya to'xtatilgan (terminate qilingan) zahoti diski yo'qolishi mumkin bo'lgan serverdan kelib chiqadigan kichik amaliyotlar to'plamini ko'rib chiqadi.
Nimalarni o'rganasiz
Bu maqola oxirida siz quyidagilarni qila olasiz:
- instance metadata service nima ekanini tushuntirish va unga ishlab turgan instansiya ichidan so'rov yuborish;
- yangi instansiyani birinchi yuklanishda sozlaydigan
cloud-inituser-data skriptini o'qish va yozish; - bir martalik (ephemeral) instansiya xotirasini doimiy block xotiradan farqlash va ular orasidan to'g'ri tanlash;
- SSH kalitlarini tayyorlash va IAM rollari haqida shu kursda allaqachon ko'rib chiqilgan autentifikatsiya va avtorizatsiya tushunchalarining bulutga xos kengaytmalari sifatida mulohaza yuritish;
- to'g'ri yuklanmayotgan bulut instansiyasini
cloud-initning o'z log'lari yordamida diagnostika qilish.
Metadata service: instansiya o'zi haqida qanday bilib oladi
Har bir yirik bulut provayderi faqat ishlab turgan instansiya ichidan ulanish mumkin bo'lgan HTTP endpoint’ni taqdim etadi. U instansiyaning o'zi haqidagi savollariga javob beradi: mening ommaviy IP’im qanday, qaysi SSH kalitlariga ishonish kerak, ishga tushirishda menga qanday user-data skripti berilgan. AWS, GCP va boshqa ko'pchilik provayderlarda u hammaga ma’lum link-local manzil — 169.254.169.254 da joylashgan:
Bulut konsolida tanlagan SSH kalitingiz hech kim ~/.ssh/authorized_keys ni qo'lda tahrirlamasdan yangi instansiyada qanday ruxsat etilgan bo'lib qolishi aynan shu bilan izohlanadi. Birinchi yuklanish skripti (keyingi bo'limda ko'rib chiqiladi) aynan shu qiymatni metadata service’dan oladi va uni tegishli foydalanuvchining authorized_keys fayliga yozadi. Bu SSH kalit autentifikatsiyasi maqolasida klient tomonidan ko'rib chiqilgan o'sha mexanizm.
Warning
Metadata service qat’iy, hammaga ma’lum manzilda joylashgani va standart holatda o'zining hech qanday autentifikatsiyasi bo'lmagani uchun u haqiqiy, katta shov-shuvga sabab bo'lgan buzib kirishlarning nishoni bo'lgan. Eng mashhuri 2019-yilgi hodisa bo'lib, unda web ilovadagi server-side request forgery (SSRF) zaifligidan foydalanib, ilovaning o'zini o'z instansiyasining metadata service’idan vaqtinchalik IAM credential’larini olishga majbur qilingan. AWS’ning IMDSv2 versiyasi va boshqa provayderlardagi shunga o'xshash mustahkamlangan metadata service versiyalari avval PUT so'rovi bilan olinadigan sessiya token’ini talab qiladi. Bu aynan shu turdagi SSRF hujumidan foydalanishni ancha qiyinlashtirish uchun qilingan. Ishonchsiz kirish ma’lumotlarini qayta ishlaydigan har qanday instansiyada IMDSv2 (yoki uning ekvivalenti) shunchaki mavjud emas, majburiy ekanini tasdiqlang.
cloud-init: yangi instansiyani birinchi yuklanishda sozlash
cloud-init — amalda standart vosita bo'lib, deyarli har bir bulut provayderi beradigan Ubuntu, Debian va RHEL oilasi image’larida standart holatda mavjud. U foydalanuvchi ishga tushirish paytida bergan konfiguratsiyani qo'llash uchun instansiyaning eng birinchi yuklanishida bir marta ishlaydi. Foydalanuvchi bergan bu konfiguratsiya user-data deb ataladi va u yuqorida tasvirlangan metadata service’dan olinadi.
#cloud-config
hostname: web-01
package_update: true
packages:
- nginx
- fail2ban
users:
- name: deploy
groups: sudo
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... deploy@laptop
runcmd:
- systemctl enable --now nginx
- systemctl enable --now fail2ban
Har bir maydon shu kursning boshqa joylarida allaqachon ko'rib chiqilgan administratsiya vazifalariga bevosita mos keladi, faqat ular qo'lda emas, avtomatik qo'llaniladi:
hostnamemashina nomini o'rnatadi — shu kursning boshqa joylaridahostnamectlbilan qo'lda o'rnatilgan o'sha qiymat;usersvassh_authorized_keysakkaunt va uning ishonchli kalitini Foydalanuvchi va guruh hisoblari hamda SSH kalit autentifikatsiyasi maqolalarida qo'lda qilish ko'rsatilgandek tayyorlaydi;packagesvaruncmdservislarni interaktivapt installvasystemctl enable --nowqilgandek o'rnatadi va ishga tushiradi.
Amaliy qiymat bu yerdagi biror qadam yangi ekanida emas. Qiymat shundaki, bir xil sozlangan serverlarning butun parkini bitta fayldan, hech qanday qo'lda aralashuvsiz ishga tushirish mumkin. Bu keyingi maqola quradigan Infrastructure as Code amaliyotlarining bevosita zaruriy sharti.
cloud-init’ning o'z log'larini o'qish
Yangi ishga tushirilgan instansiya uning user-data’sida tasvirlanganidek ko'tarilmasa, ilova yoki systemd ning o'zi aybdor deb taxmin qilishdan ancha oldin birinchi va eng bevosita tekshiriladigan joy — cloud-init’ning o'z log'lari:
/var/log/cloud-init-output.log cloud-init bajargan har bir qadamning birlashtirilgan stdout/stderr’ini tartib bilan yozib oladi. User-data’dagi noto'g'ri YAML chekinishi (juda keng tarqalgan xato), o'rnatilmagan paket yoki xato bergan runcmd qadami — hammasi shu yerda, odatda aynan muvaffaqiyatsiz bo'lgan qator raqami yoki buyruq bilan ko'rinadi.
cloud-init’ning ikkita log'i bor va qaysi biri nima ekanini bilish haqiqiy debug vaqtini tejaydi. /var/log/cloud-init-output.log (yuqorida) — cloud-init bajargan buyruqlarning stdout/stderr’i, ya’ni paket o'rnatish yoki runcmd aslida nima chiqargani. /var/log/cloud-init.log esa cloud-init’ning u o'tgan har bir bosqich haqidagi o'z ichki, vaqt belgili debug log'i bo'lib, ancha nozikroq darajada yoziladi. cloud-init-output.log qadam muvaffaqiyatsiz bo'lganini ko'rsatsa-yu, nega ekanini aniq ko'rsatmasa, ichki tafsilotlar — qaysi datasource ishlatilgani, qaysi modul xato bergani va aynan qaysi bosqichda — /var/log/cloud-init.log da yozilgan bo'ladi.
User-data’ning YAML sxemasini undan instansiya ishga tushirishdan oldin tekshirish ko'pchilik sintaksis xatolarini ishga tushirish yarim yo'lda jimgina muvaffaqiyatsiz bo'lgandan keyin emas, darhol ushlaydi.
Bir martalik va doimiy xotira: haqiqiy oqibatlari bor qaror
Bulut instansiyalari odatda xotiraning ikkita aniq toifasini taklif qiladi va ularni chalkashtirish yangi bulut administratori qilishi mumkin bo'lgan eng og'ir oqibatli xatolardan biri:
| Instansiya (bir martalik) xotirasi | Doimiy block xotira | |
|---|---|---|
| Misollar | AWS instance store, GCP local SSD | AWS EBS, GCP Persistent Disk, Azure Managed Disks |
| To'xtatish/ishga tushirishdan keyin saqlanadimi | Yo'q (instance store) | Ha |
| Instansiya terminate qilingandan keyin saqlanadimi | Yo'q | Ha, agar instansiya bilan birga aniq o'chirilmasa |
| Odatiy qo'llanilishi | Kesh, vaqtinchalik ish joyi, vaqtinchalik build artefaktlari | Ma’lumotlar bazalari, ilova holati, instansiyadan uzoq yashashi kerak bo'lgan har qanday narsa |
| Unumdorlik | Ko'pincha tezroq (jismonan ulangan) | Biroz yuqoriroq kechikish (tarmoq orqali ulangan), lekin hajmini o'zgartirish va snapshot olish mumkin |
Danger
Production ma’lumotlar bazasining ma’lumotlar katalogini bir martalik instansiya xotirasiga joylashtirish halokatli, tiklab bo'lmaydigan ma’lumotlar yo'qotilishining haqiqiy va takrorlanadigan sababi. Ma’lumotlar shunchaki buzilish xavfi ostida qolmaydi — instansiya to'xtagan yoki terminate qilingan zahoti ular butunlay yo'qoladi va tiklash yo'li bo'lmaydi. Biror holatni saqlaydigan narsani mount nuqtasiga joylashtirishdan oldin u qaysi xotira toifasiga tegishli ekanini tasdiqlang (lsblk, provayder hujjatlaridagi qurilma nomlanishi bilan solishtirib). Instansiya almashtirilgandan keyin ham saqlanishi kerak bo'lgan har qanday ma’lumot uchun doimiy block xotirani — muntazam, sinab ko'rilgan snapshot’lar bilan birga — afzal ko'ring.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 50G 0 disk
AWS’da xvda/nvme0n1 (root qurilma) odatda boot volume bo'lib, standart holatda EBS’ga asoslangan va doimiy bo'ladi. Alohida ulangan qo'shimcha volume’larni (bu yerda xvdf) esa ishga tushirish paytida aslida nima so'ralganiga qarab alohida tekshirish kerak. Provayder konsoli yoki CLI’si (aws ec2 describe-volumes, gcloud compute disks list) — ishonchli manba, chunki qurilma nomining o'zi uning saqlanish kafolatlarini ochib bermaydi.
IAM rollari: ichiga joylangan credential’larsiz avtorizatsiya
Bulut platformalari Eng kam imtiyoz (least privilege) maqolasidagi avtorizatsiya tushunchalarini instansiya darajasiga IAM rollari orqali kengaytiradi (AWS/GCP atamasi; Azure ekvivalentini "managed identity" deb ataydi). Ilovaning konfiguratsiya fayli ichiga uzoq muddatli API kalitini joylash o'rniga instansiyaga rol biriktiriladi va shu instansiyada ishlayotgan har qanday jarayon metadata service’dan — yuqorida SSH kalitlari uchun so'rov yuborilgan o'sha endpoint’dan — qisqa muddatli, avtomatik almashinadigan credential’larni so'rashi mumkin.
{
"AccessKeyId": "ASIA...",
"SecretAccessKey": "...",
"Token": "...",
"Expiration": "2026-07-29T18:00:00Z"
}
Bu yerda qaytarilgan credential’larning muddati tugaydi (Expiration maydoni), odatda bir necha soat ichida. Bu konfiguratsiya fayliga qattiq yozilgan statik, uzoq muddatli API kalitiga nisbatan bevosita yaxshilanish. Chunki bunday kalitning muddati o'z-o'zidan hech qachon tugamaydi va oshkor bo'lsa, kimdir payqab, uni qo'lda bekor qilmaguncha amal qilib turaveradi. Bu shu kursda allaqachon ko'rib chiqilgan eng kam imtiyoz tamoyilining bulutga xos ekvivalenti: instansiyaga biriktirilgan IAM rolini uning ish yukiga aynan kerak bo'lgan ruxsatlar bilan cheklang, undan kengroq emas. Eng kam imtiyoz (least privilege) maqolasi xuddi shu g'oyani Linux foydalanuvchi akkauntining sudo qoidalari uchun aynan shunday bayon qiladi.
Keng tarqalgan xatolar
- IAM roli o'rniga bulut credential’larini ilovaga qattiq yozish. Bu IAM rollari yo'q qilish uchun mavjud bo'lgan aynan o'sha uzoq muddatli, almashtirilmaydigan secret xavfini qaytaradi va bulutga deploy qilingan ilovalarning haqiqiy xavfsizlik auditlarida odatiy topilma.
- Holatni saqlaydigan ma’lumotlarni "vaqtincha" bir martalik xotiraga joylashtirib, birinchi to'xtatish/terminate hodisasidan oldin ko'chirishni unutish. Yuqorida ko'rib chiqilganidek, bu keyinchalik tuzatib bo'ladigan xato emas.
- Birinchi yuklanish konfiguratsiyasi muvaffaqiyatsiz bo'lganini avval
/var/log/cloud-init-output.logni o'qish o'rniga SSH orqali kirib, taxmin qilib debug qilish. Log deyarli har doim muvaffaqiyatsiz bo'lgan aniq qadamni to'g'ridan-to'g'ri nomlab beradi. - Ishonchsiz kirish ma’lumotlarini qabul qiladigan biror ilova ishlayotgan instansiyada IMDSv1 (yoki mustahkamlanmagan ekvivalent)ni maqbul deb hisoblash. Yuqorida ko'rib chiqilganidek, bu nazariy tashvish emas, hujjatlashtirilgan va amalda foydalanilgan attack surface.
Mashqlar
- Lab instansiyasida (yoki sinov uchun
cloud-localdsorqalicloud-inito'rnatilgan mahalliy VM’da) instansiyaning o'z hostname’i va ommaviy kaliti uchun metadata service’ga so'rov yuboring va bu ikki qiymat u yerga qanday kelib qolganini tushuntiring. - root bo'lmagan sudo foydalanuvchisini yaratadigan,
nginxni o'rnatadigan va ishga tushiradigancloud-inituser-data faylini yozing. Keyin ataylab YAML chekinish xatosini kiriting va natijada yuzaga kelgan muvaffaqiyatsizlikni topish uchuncloud-init-output.logdan foydalaning. - Haqiqiy yoki lab bulut instansiyasida
lsblkni ishga tushiring va provayder hujjatlaridan foydalanib, ro'yxatdagi qaysi qurilmalar bir martalik, qaysilari doimiy ekanini aniqlang. Hech qachon ishlatmagan provayderda buni qanday aniqlagan bo'lardingiz, tushuntiring. - IAM rolining vaqtinchalik credential’lari muhit o'zgaruvchisida saqlangan statik API kalitidan nega yaxshiroq xavfsizlik holati ekanini oldingi moduldagi eng kam imtiyoz tamoyili bilan bog'lab, ikki-uch jumlada tushuntiring.
Xulosa
Bulut instansiyasi — o'z kimligi va konfiguratsiyasini metadata service orqali bilib oladigan va birinchi yuklanishda shu service’ning user-data’sini o'qiydigan cloud-init orqali o'zini sozlaydigan oddiy Linux mashinasi. Bu shu kurs davomida ko'rib chiqilgan o'sha administratsiya vazifalari (foydalanuvchilar, SSH kalitlari, paketlarni o'rnatish, servislarni ishga tushirish), faqat qo'lda emas, avtomatlashtirilgan va ishga tushirish paytida qo'llanilgan holda. Bir martalik instansiya xotirasi va doimiy block xotira juda boshqa-boshqa saqlanish kafolatlariga ega va ular ongli ravishda tanlanishi kerak. IAM rollari esa statik, uzoq muddatli credential’larni qisqa muddatli, avtomatik almashinadiganlariga almashtirib, eng kam imtiyoz tamoyilini bulut API’siga kirishga kengaytiradi. Infrastructure as Code asoslari xuddi shu cloud-init user-data tushunchasini olib, uni butun infratuzilma parkini versiyalangan, takrorlanadigan konfiguratsiya sifatida e’lon qilishgacha umumlashtiradi.