bwrap - kapsayıcı kurulum yardımcı programı
bwrap [OPTION...] [COMMAND]
bwrap, kapsayıcı kurulumu için ayrıcalıklı bir yardımcıdır. Mümkün olsa da, doğrudan komut satırından kullanmanız pek olası değildir.
Kökün ana bilgisayardan görünmeyen bir tmpfs üzerinde olduğu ve son işlemden çıkıldığında otomatik olarak temizlenecek olan yeni, tamamen boş bir dosya sistemi ad alanı oluşturarak çalışır. Daha sonra, komutun ad alanında çalıştırılması için kök dosya sistemini ve işlem ortamını oluşturmak üzere komut satırı seçeneklerini kullanabilirsiniz.
Varsayılan olarak bwrap, korumalı alan için yeni bir bağlama ad alanı oluşturur. İsteğe bağlı olarak yeni kullanıcı, ipc, pid, ağ ve uts ad alanlarını da ayarlar (ancak bwrap setuid root kurulu değilse kullanıcı ad alanının gerekli olduğunu unutmayın). Sandbox'taki uygulama farklı bir UID ve GID ile çalıştırılabilir.
Gerekirse (örneğin, bir PID ad alanı kullanırken) bwrap, sanal alanda zombi toplamaktan sorumlu minimum bir pid 1 işlemi çalıştırıyor. Ayrıca, ilk uygulama sürecinin (pid 2) ne zaman öldüğünü algılar ve çıkış durumunu orijinal oluşturucuya geri bildirir. Korumalı alanda başka işlem kalmadığında, korumalı alanı temizlemek için pid 1 işlemi çıkar.
Seçenekler birden çok kez kullanıldığında, aksi belirtilmedikçe son seçenek kazanır.
Yardımı yazdır ve çık
Baskı versiyonu
Verilen dosya tanıtıcısından null ile ayrılmış bağımsız değişkenleri ayrıştırın. Bu seçenek, birden çok kaynaktan seçenekleri ayrıştırmak için birden çok kez kullanılabilir.
Yeni bir kullanıcı ad alanı oluştur
Mümkünse yeni bir kullanıcı ad alanı oluşturun, aksi takdirde atlayın
Yeni bir ipc ad alanı oluşturun
Yeni bir pid ad alanı oluştur
Yeni bir ağ ad alanı oluştur
Yeni bir uts ad alanı oluşturun
Yeni bir grup ad alanı oluştur
Mümkünse yeni bir grup ad alanı oluşturun, aksi takdirde atlayın
Tüm olası ad alanlarının paylaşımını kaldırın. Şu anda eşdeğerdir: --unshare-user-try --unshare-ipc --unshare-pid --unshare-net --unshare-uts --unshare-cgroup-try
Daha önceki bir --unshare-all veya --unshare-net'i geçersiz kılarak ağ ad alanını koruyun
Yeni bir tane oluşturmak yerine mevcut bir kullanıcı ad alanını kullanın. Ad alanı, setns() için izin gereksinimlerini karşılamalıdır; bu, genellikle, aynı kullanıcının sahip olduğu, o anda etkin olan kullanıcı ad alanının soyundan gelmesi gerektiği anlamına gelir.
Bu, --unshare-user ile uyumsuzdur ve bubblewrap'in setuid sürümünde çalışmaz.
Yeni ad alanını ayarladıktan sonra belirtilen ad alanına geçin. Bunun çalışması için, belirtilen ad alanının kurulum için kullanılan kullanıcı ad alanının soyundan gelmesi gerekir, bu nedenle bu yalnızca --userns ile birlikte kullanışlıdır.
Bu yararlıdır, çünkü bazen bubblewrap'in kendisi iç içe geçmiş kullanıcı ad alanları oluşturur (bazı çekirdek sorunlarına çözüm bulmak için) ve --userns2 bunları girmek için kullanılabilir.
Korumalı alandaki işlemin, dosya sistemi ad alanını yeniden düzenleyememesi veya diğer daha karmaşık ad alanı değişikliklerini yapamaması için daha fazla kullanıcı ad alanı oluşturmasını önleyin. Bu, şu anda user.max_user_namespaces sysctl'yi 1 olarak ayarlayarak ve ardından dış ad alanında bu sınırı yükseltemeyen iç içe geçmiş bir kullanıcı ad alanı girerek uygulanmaktadır. Bu seçenek --unshare-user gerektirir ve bubblewrap'in setuid sürümünde çalışmaz.
Korumalı alandaki işlemin daha fazla kullanıcı ad alanı oluşturmasının engellendiğini, ancak bunu önlemek için herhangi bir özel işlem yapmadan onaylayın. Örneğin, bu, verilen kullanıcı ad alanının başka kullanıcı ad alanlarının oluşturulmasını önleyecek şekilde ayarlanıp ayarlanmadığını kontrol etmek için --userns ile birleştirilebilir.
Oluşturmak yerine mevcut bir pid ad alanı kullanın. Bu genellikle --userns ile birlikte kullanılır, çünkü pid ad alanı, bwrap'in kullandığı kullanıcı ad alanının aynısına ait olmalıdır.
Bunun --unshare-pid ile birleştirilebileceğini ve bu durumda sandbox'ın, pass in one'ın alt öğesi olan kendi pid ad alanında olacağı anlamına geldiğini unutmayın.
Korumalı alanda özel bir kullanıcı kimliği kullanın (--unshare-user gerektirir)
Korumalı alanda özel bir grup kimliği kullanın (--unshare-user gerektirir)
Korumalı alanda özel bir ana bilgisayar adı kullanın (--unshare-uts gerektirir)
Dizini DIR olarak değiştir
Bir ortam değişkeni ayarlayın
Bir ortam değişkeninin ayarını kaldırın
PWD ve daha sonra --setenv tarafından ayarlananlar dışında tüm ortam değişkenlerinin ayarını kaldırın
Korumalı alan çalışırken DEST'i kilitleyin. Bu seçenek, birden çok dosyada kilit almak için birden çok kez kullanılabilir.
Korumalı alan çalışırken bu dosya tanıtıcıyı açık tutun
Bunların tümü, dosya sistemini doğrudan değiştiren veya dosya sistemine bir şeyler bağlayan işlemlerdir. Bunlar argüman olarak verildikleri sırayla uygulanır.
Belirli bir hedef oluşturmak için gerekli olan tüm eksik üst dizinler, gerektiğinde otomatik olarak oluşturulur. İzinleri normalde 0755 (rwxr-xr-x) olarak ayarlanmıştır. Ancak, bir --perms seçeneği etkinse ve bu, group veya other için izinleri sıfıra ayarlarsa, yeni oluşturulan üst dizinlerin de karşılık gelen izinleri sıfıra ayarlanır. --size, bir --tmpfs eyleminden önce oluşturulurken oluşturulan bağlamanın boyutunu değiştirir; --perms ve --size birleştirilebilir.
Bu seçenek kendi başına hiçbir şey yapmaz ve etkilediği seçeneklerden biri tarafından takip edilmelidir. Bir sonraki işlem için izinleri OCTAL olarak ayarlar. Sonraki işlemler etkilenmez: örneğin,
--perms 0700 --tmpfs /a --tmpfs /b
Note that --perms and --size can be combined:
--perms 0700 --size 10485760 --tmpfs /s
will apply permissions as well as a maximum size to the created tmpfs.
Bu seçenek kendi başına hiçbir şey yapmaz ve ardından --tmpfs gelmelidir. Sonraki tmpf'ler için boyutu bayt cinsinden ayarlar. Örneğin,
--size 10485760 --tmpfs /tmp
/tmp boyutunda 10MiB boyutunda bir tmpfs oluşturacaktır. Sonraki işlemler etkilenmez: örneğin,
--size 10485760 --tmpfs /a --tmpfs /b
/a'yı 10MiB boyutunda bağlayacak, ardından /b için varsayılan boyuta geri dönecektir.
--perms ve --size öğelerinin birleştirilebileceğini unutmayın:
--size 10485760 --perms 0700 --tmpfs /s
oluşturulan tmpf'lere izinlerin yanı sıra maksimum boyutu da uygulayacaktır.
Bağlama ana bilgisayar yolu SRC'yi DEST'e bağlar
--bind değerine eşittir ancak var olmayan SRC'yi yok sayar
Cihaz erişimine izin vererek ana bilgisayar yolu SRC'yi DEST'e bağlayın
--dev-bind değerine eşittir ancak var olmayan SRC'yi yok sayar
Bağlama ana bilgisayar yolu SRC'yi DEST'te salt okunur olarak bağlar
--ro-bind değerine eşittir ancak var olmayan SRC'yi yok sayar
DEST yolunu salt okunur olarak yeniden bağlayın. Belirtilen yol altındaki diğer bağlama noktalarını değiştirmeden yalnızca belirtilen bağlama noktasında çalışır.
procfs'i DEST'e bağla
DEST'e yeni devtmpf'ler ekleyin
DEST'e yeni tmpf'ler ekleyin. Önceki seçenek --perms ise, tmpfs modunu ayarlar. Aksi takdirde, tmpfs modu 0755'e sahiptir. Önceki seçenek --size ise, boyutu tmpfs'nin bayt cinsinden ayarlar. Aksi takdirde, tmpfs varsayılan boyuta sahiptir.
DEST'e yeni mqueue ekle
DEST'te bir dizin oluşturun. Dizin zaten varsa, izinleri değiştirilmez, --perms yoksayılır (mevcut bir dizinin izinlerinin değiştirilmesi gerekiyorsa --chmod kullanın). Dizin yeni oluşturulmuşsa ve önceki seçenek --perms ise, dizinin kipini ayarlar. Aksi takdirde, yeni oluşturulan dizinlerin modu 0755'tir.
FD dosya tanıtıcısından DEST'e kopyalayın. Önceki seçenek --perms ise, yeni dosyanın modunu ayarlar. Aksi takdirde, dosyanın modu 0666'dır (bunun --bind-data ile aynı olmadığına dikkat edin).
Dosya tanıtıcı FD'den DEST'e bağlanan bir dosyaya kopyalayın. Önceki seçenek --perms ise, yeni dosyanın modunu ayarlar. Aksi takdirde, dosyanın modu 0600'dür (bunun --file ile aynı olmadığına dikkat edin).
Dosya tanıtıcı FD'den DEST'te bağlama bağlantılı salt okunur olan bir dosyaya kopyalayın. Önceki seçenek --perms ise, yeni dosyanın modunu ayarlar. Aksi takdirde, dosyanın modu 0600'dür (bunun --file ile aynı olmadığına dikkat edin).
Hedef SRC ile DEST'te bir sembolik bağlantı oluşturun
Zaten olması gereken PATH izinlerini OCTAL olarak ayarlayın.
FD'den seccomp kurallarını yükleyin ve kullanın. Kuralların seccomp_export_bpf tarafından oluşturulan derlenmiş bir cBPF programı biçiminde olması gerekir. Bu seçenek birden fazla verilirse sadece sonuncusu kullanılır. Birden fazla seccomp programı gerekiyorsa --add-seccomp-fd kullanın.
FD'den seccomp kurallarını yükleyin ve kullanın. Kuralların seccomp_export_bpf tarafından oluşturulan derlenmiş bir cBPF programı biçiminde olması gerekir. Bu seçenek tekrarlanabilir, bu durumda tüm seccomp programları verilen sırada yüklenir (çekirdeğin bunları ters sırada değerlendireceğini unutmayın, bu nedenle bwrap komut satırındaki son program önce değerlendirilir). Muhtemelen sonuncusu hariç tümü, PR_SET_SECCOMP prctl'nin kullanımına izin vermelidir. Bu seçenek --seccomp ile birleştirilemez.
Korumalı alandan Yürütme Etiketi. Bir SELinux sisteminde, sanal alan işlemleri için SELinux bağlamını belirleyebilirsiniz.
Geçici korumalı alan içeriği için dosya etiketi. Bir SELinux sisteminde, sanal alan içeriği için SELinux bağlamını belirleyebilirsiniz.
Bazı veriler mevcut olana kadar FD'den okuma sırasında korumalı alanı engelleyin.
Kullanıcı ad alanını başlatmayın, ancak hazır olana kadar FD'de bekleyin. Bu, harici süreçlerin (newuidmap/newgidmap gibi) kullanıcı ad alanını sanal alan işlemi tarafından kullanılmadan önce ayarlamasına izin verir.
Korumalı alanla ilgili bilgileri JSON formatında FD'ye yazın.
Birden çok JSON belgesi, her satıra bir tane olmak üzere FD'ye yazılır ("JSON satırları" biçimi[1]). Her satır tek bir JSON nesnesidir. bwrap, korumalı alan içinde alt süreci başlattıktan sonra, alt-pid üyeli bir nesneyi --json-status-fd'ye yazar (bu, eski < güçlü>--bilgi-fd). Karşılık gelen değer, bwrap'ın çalıştırıldığı pid ad alanındaki alt sürecin işlem kimliğidir. Varsa, ad alanı kimlikleri de alt öğe-pid ile nesneye dahil edilir; yine, bu eski --info-fd'yi kopyalar. Korumalı alan içindeki alt süreç çıktığında, bwrap çıkış kodu üyesi olan bir nesne yazar ve ardından --json-status-fd'yi kapatır. Çıkış koduna karşılık gelen değer, olağan kabuk kodlamasında çocuğun çıkış durumudur (n durumuyla normal olarak çıktıysa n veya n sinyali tarafından öldürüldüyse 128+n). bwrap'in gelecekteki sürümlerinde bu nesnelere başka üyeler eklenebilir ve diğer JSON nesneleri mevcut nesnelerden önce veya sonra eklenebilir, bu nedenle okuyucular anlamadıkları üyeleri ve nesneleri göz ardı etmelidir.
Korumalı alan için yeni bir terminal oturumu oluşturun (setid() öğesini çağırır). Bu, sanal alanın kontrol terminalinden bağlantısını keser; bu, örneğin sanal alanın terminale girdi enjekte edemediği anlamına gelir.
Not: Genel bir sanal alanda, --new-session kullanmıyorsanız, TIOCSTI ioctl'ye izin vermemek için seccomp kullanmanız önerilir, aksi takdirde uygulama klavye girişini terminale besleyebilir.
bwraps ebeveyni öldüğünde alt sürecin (COMMAND) ölmesini sağlar. bwrap veya bwraps ebeveyni öldüğünde COMMAND işlemi dahil olmak üzere ebeveynden çocuğa sırayla tüm bwrap sanal alan işlemlerini öldürür (SIGKILL). Bkz. prctl, PR_SET_PDEATHSIG.
Alt süreçleri toplamak için sanal alanda PID=1 olan bir süreç oluşturmayın.
Ayrıcalıklı kullanıcı olarak çalışırken belirtilen yeteneği ekleyin. İzin verilen tüm büyük harfleri eklemek için ALL özel değerini kabul eder.
Ayrıcalıklı kullanıcı olarak çalışırken belirtilen yeteneği bırakın. Tüm büyük harflerin atılması için ALL özel değerini kabul eder. Varsayılan olarak, korumalı alan işleminde hiçbir büyük harf bırakılmaz. --cap-add ve --cap-drop seçenekleri, komut satırında belirtilen sırayla işlenir. Lütfen belirtilen sıraya dikkat edin.
--chdir açıkça belirtilmemişse ve geçerli cwd sanal alanda yoksa, sanal alanda cwd olarak kullanılır. Burada kullanılan değeri geçersiz kılmak için --setenv seçeneği kullanılabilir.
bwrap komutu, ilk uygulama işleminin çıkış durumunu döndürür (korumalı alanda pid 2).
1. "JSON satırları" formatı: https://jsonlines.org/