Ένα namespace IPC (Inter-Process Communication) είναι μια δυνατότητα του πυρήνα Linux που παρέχει απομόνωση των αντικειμένων IPC System V, όπως οι ουρές μηνυμάτων, τα τμήματα κοινής μνήμης και οι σηματοδότες. Αυτή η απομόνωση διασφαλίζει ότι οι διαδικασίες σε διαφορετικά namespaces IPC δεν μπορούν να έχουν άμεση πρόσβαση ή να τροποποιήσουν τα αντικείμενα IPC των άλλων, παρέχοντας ένα επιπλέον επίπεδο ασφάλειας και ιδιωτικότητας μεταξύ των ομάδων διαδικασιών.
How it works:
Όταν δημιουργείται ένα νέο namespace IPC, ξεκινά με ένα εντελώς απομονωμένο σύνολο αντικειμένων IPC System V. Αυτό σημαίνει ότι οι διαδικασίες που εκτελούνται στο νέο namespace IPC δεν μπορούν να έχουν πρόσβαση ή να παρεμβαίνουν στα αντικείμενα IPC σε άλλα namespaces ή στο σύστημα υποδοχής από προεπιλογή.
Τα αντικείμενα IPC που δημιουργούνται εντός ενός namespace είναι ορατά και προσβάσιμα μόνο σε διαδικασίες εντός αυτού του namespace. Κάθε αντικείμενο IPC αναγνωρίζεται από ένα μοναδικό κλειδί εντός του namespace του. Αν και το κλειδί μπορεί να είναι ταυτόσημο σε διαφορετικά namespaces, τα ίδια τα αντικείμενα είναι απομονωμένα και δεν μπορούν να προσπελαστούν μεταξύ των namespaces.
Οι διαδικασίες μπορούν να μετακινούνται μεταξύ των namespaces χρησιμοποιώντας την κλήση συστήματος setns() ή να δημιουργούν νέα namespaces χρησιμοποιώντας τις κλήσεις συστήματος unshare() ή clone() με την σημαία CLONE_NEWIPC. Όταν μια διαδικασία μετακινείται σε ένα νέο namespace ή δημιουργεί ένα, θα αρχίσει να χρησιμοποιεί τα αντικείμενα IPC που σχετίζονται με αυτό το namespace.
Lab:
Create different Namespaces
CLI
sudounshare-i [--mount-proc] /bin/bash
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων /proc αν χρησιμοποιήσετε την παράμετρο --mount-proc, διασφαλίζετε ότι η νέα mount namespace έχει μια ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτή τη namespace.
Σφάλμα: bash: fork: Cannot allocate memory
Όταν εκτελείται το unshare χωρίς την επιλογή -f, προκύπτει ένα σφάλμα λόγω του τρόπου που διαχειρίζεται το Linux τις νέες PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
Εξήγηση Προβλήματος:
Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέες namespaces χρησιμοποιώντας την κλήση συστήματος unshare. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία μιας νέας PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στη νέα namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
Η εκτέλεση %unshare -p /bin/bash% ξεκινά το /bin/bash στην ίδια διαδικασία με το unshare. Ως εκ τούτου, το /bin/bash και οι παιδικές του διαδικασίες βρίσκονται στην αρχική PID namespace.
Η πρώτη παιδική διαδικασία του /bin/bash στη νέα namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα της namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτή τη namespace.
Συνέπεια:
Η έξοδος του PID 1 σε μια νέα namespace οδηγεί στον καθαρισμό της σημαίας PIDNS_HASH_ADDING. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης alloc_pid να κατανοήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
Λύση:
Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή -f με το unshare. Αυτή η επιλογή κάνει το unshare να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία της νέας PID namespace.
Η εκτέλεση %unshare -fp /bin/bash% διασφαλίζει ότι η εντολή unshare γίνεται PID 1 στη νέα namespace. Το /bin/bash και οι παιδικές του διαδικασίες είναι τότε ασφαλώς περιορισμένες μέσα σε αυτή τη νέα namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
Διασφαλίζοντας ότι το unshare εκτελείται με την επιλογή -f, η νέα PID namespace διατηρείται σωστά, επιτρέποντας στο /bin/bash και τις υπο-διαδικασίες του να λειτουργούν χωρίς να συναντούν το σφάλμα κατανομής μνήμης.
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>
Είσοδος σε ένα IPC namespace
nsenter-iTARGET_PID--pid/bin/bash
Επίσης, μπορείτε μόνο να εισέλθετε σε άλλο namespace διαδικασίας αν είστε root. Και δεν μπορείτενα εισέλθετε σε άλλο namespace χωρίς έναν περιγραφέα που να δείχνει σε αυτό (όπως το /proc/self/ns/net).
Δημιουργία αντικειμένου IPC
# Containersudounshare-i/bin/bashipcmk-M100Sharedmemoryid:0ipcs-m------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x2fba90210root6441000# From the hostipcs-m# Nothing is seen