لینوکس ۳۰۵؛ شب ۳۱: namespaceها، unshare و nsenter
فهرست نوشته
namespace تنها چیزی را جدا میکند که برای آن ساخته شده است. امشب PID، UTS و mount را مشاهده میکنیم و نشان میدهیم یک shell جدا الزاماً filesystem امن ندارد.
این جلسه بخشی از دورهٔ لینوکس ۳۰۵ در ۶۰ شب است.
جایگاه در دوره: هدفهای 352.1 آزمون 305-300.
محیط: VM containers، util-linux نصبشده؛ shell آزمایشی root فقط داخل VM دورریختنی است و هیچ فایل host را ویرایش نمیکند.
lsns
readlink /proc/self/ns/pid
readlink /proc/self/ns/mnt
readlink /proc/self/ns/user
sudo unshare --mount --uts --pid --fork --mount-proc bash
پس از unshare داخل shell تازه:
echo $$
hostname ns-lab305
hostname
ps -ef
readlink /proc/self/ns/pid
exit
PID namespace شماره و دید فرایندها، و UTS namespace نام میزبان را جدا کردهاند؛ UTS نام فضای شناسههای سیستم است. mount-proc به دید /proc مناسب این PID namespace کمک میکند. root در این مثال user namespace محدود ندارد؛ بسیاری از فایلهای host هنوز مشترکاند و نوشتن روی آنها مجاز و خطرناک است.
ورود به namespace موجود#
nsenter با PID هدف میتواند namespaceهای انتخابشده را وارد شود؛ target PID host با PID نمایشدادهشده در guest تفاوت دارد. برای یک process آزمایشی فعال، sudo nsenter --target "$LAB_PID" --uts hostname فقط UTS را میسنجد. PID را از مشاهدهٔ واقعی بگیر، نه عدد نمونهٔ متن.
user namespace نگاشت UID/GID و capability scope را تغییر میدهد. Ubuntu ممکن است unprivileged user namespace را با AppArmor/policy محدود کند؛ خطای آن را با خاموش کردن سراسری محافظت رفع نکن. net، IPC، cgroup و time namespace هم وظایف مستقل دارند.
آزمون: hostname بیرون shell تغییر نکرده باشد و PID/process visibility داخل و بیرون فرق کند؛ همان فایل host میتواند هنوز قابل دیدن باشد. همین شاهد محدودیت isolation است.
بازگشت: exit همهٔ processهای داخل آزمایش را پایان دهد؛ mount یا namespace persist شده را فقط با نام/handle دقیق پاک کن.
منبع: unshare ، nsenter ، namespaceها .