IPC (Inter-Process Communication) namespace je funkcionalnost Linux kernela koja pruža izolaciju System V IPC objekata, kao što su redovi poruka, segmenti deljene memorije i semafori. Ova izolacija obezbeđuje da procesi u različitim IPC namespace-ima ne mogu direktno pristupati ili menjati IPC objekte drugih namespace-ova, pružajući dodatni sloj sigurnosti i privatnosti između grupa procesa.
Kako funkcioniše:
Kada se kreira novi IPC namespace, on počinje sa potpuno izolovanim skupom System V IPC objekata. Ovo znači da procesi koji se izvršavaju u novom IPC namespace-u ne mogu pristupiti ili ometati IPC objekte u drugim namespace-ovima ili na host sistemu po default-u.
IPC objekti kreirani unutar namespace-a su vidljivi i pristupačni samo procesima unutar tog namespace-a. Svaki IPC objekat je identifikovan jedinstvenim ključem unutar svog namespace-a. Iako ključ može biti identičan u različitim namespace-ovima, sami objekti su izolovani i ne mogu se pristupiti preko namespace-ova.
Procesi mogu da se premeštaju između namespace-ova koristeći setns() sistemski poziv ili kreiraju nove namespace-ove koristeći unshare() ili clone() sistemski pozivi sa CLONE_NEWIPC zastavicom. Kada proces pređe u novi namespace ili ga kreira, počeće da koristi IPC objekte povezane sa tim namespace-om.
Laboratorija:
Kreiranje različitih Namespace-ova
CLI
sudounshare-i [--mount-proc] /bin/bash
Montiranjem nove instance /proc fajl sistema, korišćenjem parametra --mount-proc, obezbeđujete da nova montirana namespace ima tačan i izolovan prikaz informacija o procesima specifičnim za tu namespace.
Greška: bash: fork: Ne može se alocirati memorija
Kada se unshare izvršava bez opcije -f, javlja se greška zbog načina na koji Linux rukuje novim PID (Process ID) namespace-om. Ključni detalji i rešenje su opisani u nastavku:
Objašnjenje problema:
Linux kernel omogućava procesu da kreira nove namespace-ove koristeći unshare sistemski poziv. Međutim, proces koji pokreće kreiranje novog PID namespace-a (nazvan "unshare" proces) ne ulazi u novi namespace; samo njegovi podprocesi to čine.
Pokretanje %unshare -p /bin/bash% pokreće /bin/bash u istom procesu kao unshare. Kao rezultat, /bin/bash i njegovi podprocesi su u originalnom PID namespace-u.
Prvi podproces /bin/bash u novom namespace-u postaje PID 1. Kada ovaj proces završi, pokreće se čišćenje namespace-a ako nema drugih procesa, jer PID 1 ima posebnu ulogu usvajanja siročadi. Linux kernel tada onemogućava alokaciju PID-a u tom namespace-u.
Posledica:
Izlazak PID 1 iz novog namespace-a dovodi do čišćenja PIDNS_HASH_ADDING zastavice. To rezultira neuspehom funkcije alloc_pid pri alociranju novog PID-a prilikom kreiranja novog procesa, što dovodi do greške "Ne može se alocirati memorija".
Rešenje:
Problem se može rešiti korišćenjem opcije -f sa unshare. Ova opcija čini da unshare fork-uje novi proces nakon kreiranja novog PID namespace-a.
Izvršavanje %unshare -fp /bin/bash% osigurava da sam unshare komanda postane PID 1 u novom namespace-u. /bin/bash i njegovi podprocesi su tada sigurno smešteni unutar ovog novog namespace-a, sprečavajući prevremeni izlazak PID 1 i omogućavajući normalnu alokaciju PID-a.
Obezbeđivanjem da unshare radi sa opcijom -f, novi PID namespace se pravilno održava, omogućavajući /bin/bash i njegovim podprocesima da rade bez greške alociranja memorije.
sudofind/proc-maxdepth3-typel-nameipc-execreadlink{} \; 2>/dev/null|sort-u# Find the processes with an specific namespacesudofind/proc-maxdepth3-typel-nameipc-execls-l{} \; 2>/dev/null|grep<ns-number>
```bash nsenter -i TARGET_PID --pid /bin/bash ``` Takođe, možete **ući u drugi procesni namespace samo ako ste root**. I **ne možete** **ući** u drugi namespace **bez deskriptora** koji na njega ukazuje (poput `/proc/self/ns/net`).
Kreiranje IPC objekta
# Containersudounshare-i/bin/bashipcmk-M100Sharedmemoryid:0ipcs-m------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x2fba90210root6441000# From the hostipcs-m# Nothing is seen