Linux ad alanları - Linux namespaces
| Orijinal yazar(lar) | Al Viro |
|---|---|
| Geliştirici(ler) | Eric W. Biederman, Pavel Emelyanov, Al Viro, Cyrill Gorcunov ve diğerleri. |
| İlk sürüm | 2002 |
| Yazılmış | C |
| İşletim sistemi | Linux |
| Tip | Sistem yazılımı |
| Lisans | GPL ve LGPL |
Ad alanları , çekirdek kaynaklarını, bir süreç kümesi bir kaynak kümesini görürken başka bir işlem kümesi farklı bir kaynak kümesi görecek şekilde bölümleyen Linux çekirdeğinin bir özelliğidir . Bu özellik, bir dizi kaynak ve süreç için aynı ad alanına sahip olarak çalışır, ancak bu ad alanları farklı kaynaklara atıfta bulunur. Kaynaklar birden fazla alanda bulunabilir. Bu tür kaynaklara örnek olarak işlem kimlikleri, ana bilgisayar adları, kullanıcı kimlikleri, dosya adları ve ağ erişimi ile ilişkili bazı adlar ve işlemler arası iletişim verilebilir .
Ad alanları, Linux'taki kapsayıcıların temel bir yönüdür .
"Ad alanı" terimi genellikle belirli bir ad alanı için olduğu kadar bir tür ad alanı (örneğin işlem kimliği) için de kullanılır.
Bir Linux sistemi, tüm işlemler tarafından kullanılan her türden tek bir ad alanıyla başlar. İşlemler ek ad alanları oluşturabilir ve farklı ad alanlarına katılabilir.
Tarih
Linux ad alanları , Bell Labs'in Plan 9'unda yoğun olarak kullanılan daha geniş ad alanı işlevinden esinlenmiştir .
Linux Ad Alanları, 2002 yılında, mount ad alanı türü üzerinde yapılan çalışmalarla 2.4.19 çekirdeğinde ortaya çıktı. 2006'dan başlayarak ve gelecekte de devam eden ek ad alanları eklendi.
Yeterli kapsayıcılar desteği işlevi, Kullanıcı ad alanlarının tanıtılmasıyla çekirdek sürümü 3.8'de tamamlandı.
Ad alanı türleri
Çekirdek sürümü 5.6'dan beri, 8 çeşit ad alanı vardır. Ad alanı işlevi her türde aynıdır: her işlem bir ad alanıyla ilişkilendirilir ve yalnızca bu ad alanıyla ilişkili kaynakları ve uygun olduğunda alt ad alanlarını görebilir veya kullanabilir. Bu şekilde, her bir süreç (veya bunun süreç grubu) kaynaklar üzerinde benzersiz bir görüşe sahip olabilir. Hangi kaynağın yalıtılacağı, belirli bir süreç grubu için oluşturulmuş ad alanının türüne bağlıdır.
Montaj (mnt)
Mount ad alanları, bağlama noktalarını denetler. Oluşturulduktan sonra, geçerli bağlama ad alanından bağlamalar yeni ad alanına kopyalanır, ancak daha sonra oluşturulan bağlama noktaları ad alanları arasında yayılmaz (paylaşılan alt ağaçları kullanarak, bağlama noktalarını ad alanları arasında yaymak mümkündür).
Bu türde yeni bir ad alanı oluşturmak için kullanılan klon bayrağı CLONE_NEWNS'dir - "NEW NameSpace"in kısaltmasıdır. Bu terim açıklayıcı değildir (hangi tür ad alanının oluşturulacağını söylemediği için) çünkü mount ad alanları ilk tür ad alanıydı ve tasarımcılar başka ad alanlarının olacağını tahmin etmediler.
İşlem kimliği (pid)
PID ad diğer ad gelen işlem kimliği (PID) bağımsız bir dizi işlemler de sağlar. PID ad alanları iç içedir, yani yeni bir işlem oluşturulduğunda mevcut ad alanından ilk PID ad alanına kadar her ad alanı için bir PID'ye sahip olacaktır. Bu nedenle, ilk PID ad alanı, diğer ad alanlarının göreceğinden farklı PID'lerle de olsa tüm işlemleri görebilir.
Bir PID ad alanında oluşturulan ilk sürece, işlem kimliği numarası 1 atanır ve normal başlatma işlemiyle aynı özel muamelenin çoğunu alır , en önemlisi , ad alanındaki artık işlemler buna eklenir. Bu aynı zamanda, bu PID 1 işleminin sonlandırılmasının, PID ad alanındaki ve tüm alt öğelerindeki tüm işlemleri derhal sonlandıracağı anlamına gelir.
Ağ (ağ)
Ağ ad alanları ağ yığınını sanallaştırır . Oluşturulduğunda bir ağ ad alanı yalnızca bir geri döngü arabirimi içerir .
Her ağ arabirimi (fiziksel veya sanal) tam olarak 1 ad alanında bulunur ve ad alanları arasında taşınabilir.
Her ad alanında özel bir IP adresi kümesi , kendi yönlendirme tablosu , soket listesi, bağlantı izleme tablosu, güvenlik duvarı ve ağla ilgili diğer kaynaklar bulunur.
Bir ağ ad alanının yok edilmesi, içindeki tüm sanal arabirimleri yok eder ve içindeki tüm fiziksel arabirimleri ilk ağ ad alanına geri taşır.
Süreçler Arası İletişim (ipc)
IPC ad alanları, süreçleri SysV tarzı süreçler arası iletişimden ayırır . Bu, farklı IPC ad alanlarındaki işlemlerin, örneğin iki işlem arasında bir dizi paylaşılan bellek oluşturmak için SHM işlev ailesini kullanmasını önler. Bunun yerine her işlem, paylaşılan bir bellek bölgesi için aynı tanımlayıcıları kullanabilecek ve bu tür iki farklı bölge üretebilecektir.
ÜTS
UTS (UNIX Zaman Paylaşımı ) ad alanları, tek bir sistemin farklı işlemler için farklı ana bilgisayar ve etki alanı adlarına sahip görünmesine izin verir . "Bir işlem yeni bir UTS ad alanı oluşturduğunda ... yeni UTS ad alanının ana bilgisayar adı ve etki alanı, arayanın UTS ad alanındaki karşılık gelen değerlerden kopyalanır."
Kullanıcı kimliği (kullanıcı)
Kullanıcı ad alanları, çekirdek 3.8'den bu yana kullanılabilen birden çok işlem kümesinde hem ayrıcalık yalıtımı hem de kullanıcı kimliği ayrımı sağlayan bir özelliktir. Yönetici yardımı ile, kullanıcı işlemlerine gerçekten yükseltilmiş ayrıcalıklar vermeden, görünüşte yönetici haklarına sahip bir kapsayıcı oluşturmak mümkündür. PID ad alanı gibi, kullanıcı ad alanları iç içedir ve her yeni kullanıcı ad alanı, onu oluşturan kullanıcı ad alanının alt öğesi olarak kabul edilir.
Bir kullanıcı ad alanı, kullanıcı kimliklerini kapsayıcının bakış açısından sistemin bakış açısına dönüştüren bir eşleme tablosu içerir. Bu, örneğin kök kullanıcının kapsayıcıda 0 kullanıcı kimliğine sahip olmasına izin verir, ancak gerçekte sistem tarafından sahiplik kontrolleri için kullanıcı kimliği 1.400.000 olarak kabul edilir. Grup kimliği eşlemeleri ve sahiplik kontrolleri için benzer bir tablo kullanılır.
Yönetim eylemlerinin ayrıcalık yalıtımını kolaylaştırmak için, her ad alanı türünün, oluşturma anında etkin kullanıcı ad alanına dayalı olarak bir kullanıcı ad alanına ait olduğu kabul edilir. Uygun kullanıcı ad alanında yönetici ayrıcalıklarına sahip bir kullanıcının, bu diğer ad alanı türü içinde yönetim eylemleri gerçekleştirmesine izin verilecektir. Örneğin, bir işlemin bir ağ arabiriminin IP adresini değiştirmek için yönetici izni varsa, kendi kullanıcı ad alanı, ağ ad alanının sahibi olan kullanıcı ad alanıyla aynı (veya onun atası) olduğu sürece bunu yapabilir. Bu nedenle, ilk kullanıcı ad alanı, sistemdeki tüm ad alanı türleri üzerinde yönetici denetimine sahiptir.
Kontrol grubu (grup) Ad alanı
CGroup ad tipi kimlik gizler kontrol grubu işlemi üye olduğu. Böyle bir ad alanındaki herhangi bir işlemin hangi kontrol grubunun parçası olduğunu kontrol eden bir işlem, oluşturma zamanında ayarlanan kontrol grubuna göreli bir yol görecek ve gerçek kontrol grubu konumunu ve kimliğini gizleyecektir. Bu ad alanı türü, Mart 2016'dan beri Linux 4.6'da mevcuttur.
Zaman Ad Alanı
Zaman ad alanı, süreçlerin UTS ad alanına benzer bir şekilde farklı sistem zamanlarını görmelerini sağlar. 2018'de önerildi ve Mart 2020'de piyasaya sürülen Linux 5.6'ya indi.
Önerilen ad alanları
sistem günlüğü ad alanı
Uygulama ayrıntıları
Çekirdek, her işleme, içindeki ad alanı türü başına bir sembolik bağlantı atar /proc/<pid>/ns/. Bu sembolik bağlantının işaret ettiği düğüm numarası, bu ad alanındaki her işlem için aynıdır. Bu, her bir ad alanını, sembolik bağlarından birinin işaret ettiği düğüm numarasıyla benzersiz bir şekilde tanımlar.
Sembolik bağlantıyı readlink yoluyla okumak, ad alanı tür adını ve ad alanının düğüm numarasını içeren bir dize döndürür.
sistem çağrıları
Üç sistem çağrısı, ad alanlarını doğrudan değiştirebilir:
- klon, yeni işlemin hangi yeni ad alanına taşınması gerektiğini belirtmek için bayraklar.
- paylaşımı kaldırma, bir işlemin (veya iş parçacığının), yürütme bağlamının şu anda diğer işlemlerle (veya iş parçacıklarıyla) paylaşılmakta olan bölümlerinin ilişkisini kesmesine izin verir.
- setns, bir dosya tanıtıcısı tarafından belirtilen ad alanını girer.
Yıkım
Bir ad alanına artık başvurulmuyorsa silinecektir, içerilen kaynağın işlenmesi ad alanı türüne bağlıdır. Ad alanlarına üç şekilde başvurulabilir:
- ad alanına ait bir işlemle
- açık bir dosya tanıtıcı tarafından ad alanının dosyasına (
/proc/<pid>/ns/<ns-kind>) - ad alanı dosyasının bir bağlama bağlaması (
/proc/<pid>/ns/<ns-kind>)
Benimseme
Çeşitli kapsayıcı yazılımları , süreçlerini izole etmek için Docker ve LXC dahil olmak üzere grup gruplarıyla birlikte Linux ad alanlarını kullanır .
Google Chrome gibi diğer uygulamalar, internete saldırı riski taşıyan kendi işlemlerini izole etmek için ad alanlarını kullanır.
Ayrıca util-linux içinde bir paylaşımsız sarmalayıcı da vardır . Kullanımına bir örnek:
SHELL=/bin/sh unshare --map-root-user --fork --pid chroot "${chrootdir}" "$@"
Referanslar
Dış bağlantılar
- ad alanları kılavuz sayfası
- Ad alanları — Linux Çekirdeği belgeleri
- Rami Rosen tarafından Linux çekirdeği Ad Alanları ve grup grupları
- Ad alanları ve gruplar, Linux kapsayıcılarının temeli (v2 grupları dahil) - Rami Rosen tarafından yapılan bir konuşmanın slaytları, Netdev 1.1, Sevilla, İspanya (2016)
- Linux Çekirdeğinde Konteynerler ve Ad Alanları, Kir Kolyshkin
- https://medium.com/@teddyking/linux-namespaces-850489d3ccf
- https://medium.com/@teddyking/namespaces-in-go-basics-e3f0fc1ff69a
- https://medium.com/@teddyking/namespaces-in-go-user-a54ef9476f2a
- https://medium.com/@teddyking/namespaces-in-go-reexec-3d1295b91af8
- https://medium.com/@teddyking/namespaces-in-go-mount-e4c04fe9fb29
- https://medium.com/@teddyking/namespaces-in-go-network-fdcf63e76100
- https://medium.com/@teddyking/namespaces-in-go-uts-d47aebcdf00e