Bosh sahifa Wiki Process Namespace

Process Namespace

Process Namespace — processlar ko‘radigan global tizim resurslari yoki identifikatorlar to‘plamini alohida ko‘rinishga ajratish konsepsiyasi. Linuxda “process namespace” yagona rasmiy namespace turi emas; process clone, unshare va setns orqali PID, mount, user, network, IPC, UTS, cgroup va time namespace’lar kombinatsiyasiga a’zo bo‘ladi. Container izolatsiyasi aynan shu bir nechta ko‘rinishlarning yig‘indisidan hosil bo‘ladi.

Namespace to‘plami

Har processning kernel task strukturasida tegishli namespace obyektlariga reference mavjud. Ikki process ayrim namespace’larni ulashib, boshqalarida ajralgan bo‘lishi mumkin. Masalan, ular bir network stackni ko‘rib, turli mount daraxtiga ega bo‘ladi.

Namespace obyektining umri unga a’zo process yoki ochiq namespace file descriptor mavjudligiga bog‘liq. Oxirgi reference yo‘qolganda kernel resursni bo‘shatadi. /proc orqali namespace descriptorini ochiq saqlash processlar tugagach ham obyektni yashatishi mumkin.

Yaratish va qo‘shilish

clone yangi process bilan birga tanlangan namespace’larni yaratadi. unshare mavjud processni yangi namespace nusxasiga ajratadi. setns file descriptor ko‘rsatgan mavjud namespace’ga qo‘shadi; buning uchun capability va user namespace qoidalari tekshiriladi.

Multi-thread processda ayrim namespace’ni almashtirish cheklangan, chunki threadlar filesystem yoki signal state’ni ulashadi. Container runtime namespace’larni child process yaratilishidan oldin aniq tartibda o‘rnatadi.

Izolatsiya chegarasi

Namespace ko‘rinishni ajratadi, resource limit yoki permissionni avtomatik bermaydi. PID namespace process ro‘yxatini yashiradi, ammo CPU va memory sarfini cgroup cheklaydi. Mount namespace pathlarni ajratadi, lekin kernel zaifligidan himoya qilmaydi.

Containerlar host kernelini ulashgani uchun namespace virtual machine’ga teng boundary emas. Capability, seccomp, mandatory access control, read-only mapping va cgroup bilan defense-in-depth yaratiladi.

Identifikatorlar

Bir process turli namespace nuqtalaridan boshqa PID bilan ko‘rinishi mumkin. Host monitoringi container PID 1ni hostdagi kattaroq PID sifatida ko‘radi. Log faqat raqamni yozsa process identity chalg‘ishi mumkin; namespace inode, container ID va start time qo‘shiladi.

User namespace UID/GID mapping orqali ichki rootni tashqi cheklangan userga bog‘laydi. Bu boshqa namespace yaratish privilege’iga ta’sir qilgani uchun setup tartibining markaziy qismidir.

Amaliy boshqaruv

Container runtime namespace file descriptorlarini ochadi, childni kerakli ko‘rinishga o‘tkazadi, root filesystem va credentialni sozlaydi, so‘ng applicationni exec qiladi. Yarmi bajarilgan setupda child tashqi resursni ko‘rib qolmasligi uchun synchronization pipe ishlatiladi.

Tashxis processning barcha namespace symlinklarini solishtiradi. Bir xil namespace inode’i ular obyektni ulashishini ko‘rsatadi. Namespace’ga kirib test qilish privilege va side effectga ega; read-only inspection afzal.

Namespace va file descriptor

Process namespace’ga setns bilan kirgach oldin ochilgan socket, file va device descriptorlari eski muhit resursiga reference bo‘lib qoladi. Network namespace almashtirilsa yangi socket yangi stackda yaratiladi, mavjud socket esa avvalgi stack bilan bog‘langan. Xuddi shunday root yoki mount ko‘rinishi o‘zgarsa ochiq descriptor path restrictionni chetlab o‘tuvchi capabilityga aylanishi mumkin. Runtime kirishdan oldin descriptor allow-list tuzadi.

Tizim chaqiruvlari

Namespace ko‘p system call natijasini virtualizatsiya qiladi, ammo CPU instruction va kernel versiyasini ajratmaydi. unamening ayrim maydoni UTS orqali o‘zgaradi, kernel release esa hostdan umumiy qolishi mumkin. Device ioctl va filesystem parserlari bir xil host kernel kodini ishlatadi. Shuning uchun container ichidagi attack surface faqat ko‘rinadigan pathlar soni bilan baholanmaydi.

Bog‘liq tushunchalar

Linux namespaces, clone, unshare, setns, container, process isolation