Bosh sahifa Wiki User Namespace

User Namespace

User NamespaceLinux kernelida user va group identifikatorlari hamda capability’larni alohida ko‘rinishga ajratadigan namespace turi. Ichkaridagi UID 0 tashqi hostda imtiyozsiz UIDga xaritalanishi mumkin. Shu orqali process o‘z namespace’i doirasida ayrim administrative amallarni bajaradi, ammo parent namespace va host resurslari ustidan to‘liq root huquqiga ega bo‘lmaydi.

UID va GID mapping

Yangi user namespace yaratilganda process mapping yozmaguncha identifikatorlar cheklangan holatda bo‘ladi. /proc/PID/uid_map ichki UID diapazonini tashqi UID diapazoniga bog‘laydi. Har qator inside start, outside start va length qiymatlaridan iborat. Mapping ustma-ust tushmasligi va ruxsat qoidalariga mos bo‘lishi kerak.

GID mapping yozishdan oldin setgroupsni taqiqlash talab qilinishi mumkin. Bu process tashqi supplementary group huquqini saqlab qolib permission tekshiruvini chetlab o‘tishining oldini oladi.

Capability doirasi

Namespace yaratuvchi process odatda yangi user namespace ichida to‘liq capability set oladi. Bu capability parent namespace’dagi obyektlarga avtomatik tatbiq qilinmaydi. Masalan, ichki CAP_SYS_ADMIN faqat shu user namespace bilan bog‘langan mount yoki boshqa namespace amallariga ruxsat berishi mumkin.

Capability tekshiruvi obyekt qaysi user namespace’ga tegishli ekanini hisobga oladi. “Container ichida root” va “host root” farqi shu orqali amalga oshadi.

Rootless container

Rootless runtime hostdagi oddiy user nomidan user namespace yaratib, ichkarida UID 0 ko‘rsatadi. Mount, PID va network namespace’lar shu chegarada quriladi. Fayllar hostda mapped UID bilan yaratiladi; mapping diapazoni /etc/subuid va /etc/subgid orqali ajratilishi mumkin.

Bir xil host UIDni ko‘plab ichki UIDga xaritalash uchun yordamchi newuidmap kabi setuid vosita qat’iy policy bilan ishlaydi. Noto‘g‘ri subordinate diapazon boshqa user fayllariga access berishi mumkin.

Filesystem bilan aloqa

File inode owneri host UID sifatida saqlanadi, process esa uni mapping orqali ichki UID ko‘rinishida oladi. Mappingdan tashqaridagi ID overflow qiymat sifatida ko‘rinadi. Bind mount qilingan host katalogida permission kutilmaganda rad etilishi shundan keladi.

Idmapped mount alohida mount uchun UID/GID talqinini o‘zgartirib, fayllarni recursive chown qilmasdan containerga mos ko‘rsatishi mumkin. Uning mapping va filesystem qo‘llovi aniq tekshiriladi.

Xavfsizlik

User namespace kernel attack surface’ining ko‘proq qismini imtiyozsiz userga ochishi mumkin. Distributionlar uni o‘chirish, sonini limitlash yoki sandbox ehtiyoji bilan muvozanatlash siyosatini tanlaydi. Namespace isolation kernel xatosini bartaraf etmaydi.

Tashxisda effective UID bilan birga user namespace inode’i, uid_map, gid_map va capability set qayd etiladi. Faqat id natijasida UID 0 ko‘rinishiga qarab host privilege haqida xulosa chiqarilmaydi.

Nested mapping

User namespace’lar ierarxik bo‘lib, child mapping parentdagi ID diapazonidan tashqariga chiqa olmaydi. Ichki UID avval parent IDga, keyin undan yuqori namespace IDga tarjima qilinadi. Har qatlamdagi capability faqat descendant obyektlari doirasida kuchga ega. Tashxis nested mappingni bosqichma-bosqich yechadi; containerdagi 0ni bevosita hostdagi 0 deb yozish jiddiy xato.

Signal permissioni

Bir namespace’dagi UID tengligi boshqa namespace processiga signal yuborish uchun avtomatik yetarli emas. Kernel credentiallarni target user namespace ko‘rinishiga aylantirib permission va capability’ni tekshiradi. PID namespace targetni ko‘rish masalasini alohida belgilaydi. Rootless supervisor child container processini boshqarishi uchun pidfd va aniq mappingdan foydalanadi, keng host privilege bermaydi.

Bog‘liq tushunchalar

UID mapping, GID mapping, rootless container, Linux capability, subordinate ID, idmapped mount