Yerleşik Linux güvenlik özelliklerini kullanarak kaynaklara güvenlik kapsayıcısı erişimi
Bu makalede, Azure Kubernetes Service (AKS) iş yükleriniz için kaynaklara kapsayıcı erişiminin güvenliğini sağlamayı öğreneceksiniz.
Genel bakış
Kullanıcılara veya gruplara gereken en düşük ayrıcalıkları vermeniz gerektiği gibi, kapsayıcıları yalnızca gerekli eylem ve işlemlerle de sınırlamanız gerekir. Saldırı riskini en aza indirmek için, yükseltilmiş ayrıcalıklar veya kök erişim gerektiren uygulamaları ve kapsayıcıları yapılandırmaktan kaçının.
Yerleşik Kubernetes pod güvenlik bağlamlarını kullanarak farklı çalıştırılacak kullanıcı veya grup, kullanıma sunma linux özellikleri veya pod bildiriminde ayarlama allowPrivilegeEscalation: false
gibi daha fazla izin tanımlayabilirsiniz. Daha fazla en iyi yöntem için bkz . Kaynaklara pod erişiminin güvenliğini sağlama.
Kapsayıcı eylemlerinin daha ayrıntılı denetimi için AppArmor ve seccomp gibi yerleşik Linux güvenlik özelliklerini kullanabilirsiniz.
- Linux güvenlik özelliklerini düğüm düzeyinde tanımlayın.
- Pod bildirimi aracılığıyla özellikleri uygulama.
Yerleşik Linux güvenlik özellikleri yalnızca Linux düğümlerinde ve podlarda kullanılabilir.
Not
Şu anda Kubernetes ortamları düşman çok kiracılı kullanım için tamamen güvenli değildir. Kapsayıcılar için Microsoft Defender, AppArmor, seccomp, Pod Güvenlik Erişimi veya düğümler için Kubernetes RBAC gibi ek güvenlik özellikleri, açıklardan yararlanmaları etkili bir şekilde engeller.
Saldırgan çok kiracılı iş yüklerini çalıştırırken gerçek güvenlik için yalnızca bir hiper yöneticiye güvenin. Kubernetes için güvenlik etki alanı tek bir düğüm değil tüm kümeye dönüşür.
Bu tür saldırgan çok kiracılı iş yükleri için fiziksel olarak yalıtılmış kümeler kullanmanız gerekir.
Uygulama Koruması
Kapsayıcı eylemlerini sınırlamak için AppArmor Linux çekirdek güvenlik modülünü kullanabilirsiniz. AppArmor, temel alınan AKS düğümü işletim sisteminin bir parçası olarak kullanılabilir ve varsayılan olarak etkindir. Okuma, yazma veya yürütme eylemlerini veya dosya sistemlerini bağlama gibi sistem işlevlerini kısıtlayan AppArmor profilleri oluşturursunuz. Varsayılan AppArmor profilleri, çeşitli /proc
ve konumlara erişimi kısıtlar ve /sys
kapsayıcıları temel düğümden mantıksal olarak yalıtmak için bir araç sağlar. AppArmor yalnızca Kubernetes podları için değil Linux üzerinde çalışan tüm uygulamalar için çalışır.
AppArmor'un nasıl çalıştığını görmek için aşağıdaki örnekte dosyalara yazılmayı engelleyen bir profil oluşturulur.
deny-write.profile adlı bir dosya oluşturun.
Aşağıdaki içeriği kopyalayıp yapıştırın:
#include <tunables/global> profile k8s-apparmor-example-deny-write flags=(attach_disconnected) { #include <abstractions/base> file, # Deny all file writes. deny /** w, }
AppArmor profilleri komutu kullanılarak apparmor_parser
eklenir.
Profili AppArmor'a ekleyin.
Önceki adımda oluşturulan profilin adını belirtin:
sudo apparmor_parser deny-write.profile
Profil doğru şekilde ayrıştırılır ve AppArmor'a uygulanırsa herhangi bir çıkış görmezsiniz ve komut istemine dönersiniz.
Yerel makinenizden aks-apparmor.yaml adlı bir pod bildirimi oluşturun. Bu bildirim:
- için
container.apparmor.security.beta.kubernetes
bir ek açıklama tanımlar. - Önceki adımlarda oluşturulan deny-write profiline başvurur.
apiVersion: v1 kind: Pod metadata: name: hello-apparmor annotations: container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-deny-write spec: containers: - name: hello image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]
- için
Pod dağıtıldığında aşağıdaki komutu çalıştırın ve hello-apparmor podunun Çalışıyor durumunu gösterdiğini doğrulayın:
kubectl get pods NAME READY STATUS RESTARTS AGE aks-ssh 1/1 Running 0 4m2s hello-apparmor 0/1 Running 0 50s
AppArmor hakkında daha fazla bilgi için bkz . Kubernetes'te AppArmor profilleri.
Güvenli bilgi işlem (seccomp)
AppArmor herhangi bir Linux uygulaması için çalışırken, seccomp (secure comping) işlem düzeyinde çalışır. Seccomp aynı zamanda bir Linux çekirdek güvenlik modülüdür ve AKS düğümleri tarafından kullanılan çalışma zamanı tarafından containerd
yerel olarak desteklenir. Seccomp ile kapsayıcının sistem çağrılarını sınırlayabilirsiniz. Seccomp, kötü amaçlı aktörler tarafından kötüye kullanılan yaygın sistem çağrısı güvenlik açıklarına karşı ek bir koruma katmanı oluşturur ve düğümdeki tüm iş yükleri için varsayılan bir profil belirtmenize olanak tanır.
Varsayılan bir sekcomp profili yapılandırma (önizleme)
Yeni bir Linux düğüm havuzu oluştururken özel düğüm yapılandırmalarını kullanarak varsayılan seccomp profillerini uygulayabilirsiniz. AKS'de desteklenen iki değer vardır: RuntimeDefault
ve Unconfined
. Bazı iş yükleri diğerlerinden daha az sayıda syscall kısıtlaması gerektirebilir. Bu, çalışma zamanı sırasında 'RuntimeDefault' profiliyle başarısız olabilecekleri anlamına gelir. Böyle bir hatayı azaltmak için profili belirtebilirsiniz Unconfined
. İş yükünüz özel bir profil gerektiriyorsa bkz . Özel bir sekcomp profili yapılandırma.
Sınırlamalar
- SeccompDefault, Windows düğüm havuzları için desteklenen bir parametre değildir.
- SeccompDefault, 2024-09-02-preview API'sinde kullanıma sunulmuştur.
Önemli
AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "kullanılabilir" olarak sağlanır ve hizmet düzeyi sözleşmelerinin ve sınırlı garantinin dışında tutulur. AKS önizlemeleri, müşteri desteği tarafından kısmen en iyi çaba temelinde ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:
Özellik bayrağını KubeletDefaultSeccompProfilePreview
kaydetme
KubeletDefaultSeccompProfilePreview
komutunu kullanarak özellik bayrağınıaz feature register
kaydedin.az feature register --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
Durumun Kayıtlı olarak gösterilmesi birkaç dakika sürer.
komutunu kullanarak
az feature show
kayıt durumunu doğrulayın.az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
Durum Kayıtlı olarak yansıtıldığında, komutunu kullanarak Microsoft.ContainerService kaynak sağlayıcısının kaydını yenileyin
az provider register
.az provider register --namespace Microsoft.ContainerService
Kapsayıcınızın sistem çağrılarını seccomp ile kısıtlama
1. kubelet yapılandırmanızda belirterek bir seccomp profili uygulama adımlarını "seccompDefault": "RuntimeDefault"
izleyin.
RuntimeDefault
, güvenliği artırmak için belirli sistem çağrılarını kısıtlayarak containerd'ın varsayılan seccomp profilini kullanır. Kısıtlı syscall'lar başarısız olur. Daha fazla bilgi için bkz . containerD varsayılan seccomp profili.
2. Yapılandırmanın uygulandığını denetleyin.
Ana bilgisayara bağlanarak ve dosya sisteminde yapılandırma değişiklikleri yapıldığını doğrulayarak ayarların düğümlere uygulandığını onaylayabilirsiniz.
3. İş yükü hatalarını giderme.
SeccompDefault etkinleştirildiğinde, düğümde zamanlanan tüm iş yükleri için varsayılan olarak kapsayıcı çalışma zamanı varsayılan seccomp profili kullanılır. Bu, engellenen syscall'lar nedeniyle iş yüklerinin başarısız olmasına neden olabilir. bir iş yükü hatası oluştuysa aşağıdaki gibi hatalar görebilirsiniz:
- Özellik etkinleştirildikten sonra "izin reddedildi" hatasıyla iş yükü beklenmedik bir şekilde mevcut olur.
- Seccomp hata iletileri, SCMP_ACT_ERRNO varsayılan profildeki SCMP_ACT_LOG değiştirilerek denetlenen veya syslog'da da görülebilir.
Yukarıdaki hatalarda karşılaşırsanız, sekcomp profilinizi olarak Unconfined
değiştirmenizi öneririz. Unconfined
syscalls üzerinde hiçbir kısıtlamaya neden olmaz ve tüm sistem çağrılarına izin verir ve bu da güvenliği azaltır.
Özel bir seccomp profili yapılandırma
Özel bir seccomp profiliyle, kısıtlı syscall'lar üzerinde daha ayrıntılı denetime sahip olabilirsiniz. Kapsayıcıya yalnızca çalıştırması için en az izin vermenin en iyi uygulamasına hizalayın:
- ile tanımlama, hangi eylemlerin izin verilip reddedilirse filtrelenir.
- Bir pod YAML bildiriminde, seccomp filtresiyle ilişkilendirmek için ek açıklama ekleme.
Seccomp'ın çalıştığını görmek için, dosya üzerindeki izinlerin değiştirilmesini engelleyen bir filtre oluşturun.
/var/lib/kubelet/seccomp/prevent-chmod adlı bir seccomp filtresi oluşturun.
Aşağıdaki içeriği kopyalayıp yapıştırın:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "name": "chmod", "action": "SCMP_ACT_ERRNO" }, { "name": "fchmodat", "action": "SCMP_ACT_ERRNO" }, { "name": "chmodat", "action": "SCMP_ACT_ERRNO" } ] }
Sürüm 1.19 ve sonraki sürümlerde şunları yapılandırmanız gerekir:
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["chmod","fchmodat","chmodat"], "action": "SCMP_ACT_ERRNO" } ] }
Yerel makinenizden aks-seccomp.yaml adlı bir pod bildirimi oluşturun ve aşağıdaki içeriği yapıştırın. Bu bildirim:
- için
seccomp.security.alpha.kubernetes.io
bir ek açıklama tanımlar. - Önceki adımda oluşturulan prevent-chmod filtresine başvurur.
apiVersion: v1 kind: Pod metadata: name: chmod-prevented annotations: seccomp.security.alpha.kubernetes.io/pod: localhost/prevent-chmod spec: containers: - name: chmod image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: - "chmod" args: - "777" - /etc/hostname restartPolicy: Never
Sürüm 1.19 ve sonraki sürümlerde şunları yapılandırmanız gerekir:
apiVersion: v1 kind: Pod metadata: name: chmod-prevented spec: securityContext: seccompProfile: type: Localhost localhostProfile: prevent-chmod containers: - name: chmod image: mcr.microsoft.com/dotnet/runtime-deps:6.0 command: - "chmod" args: - "777" - /etc/hostname restartPolicy: Never
- için
kubectl apply komutunu kullanarak örnek podu dağıtın:
kubectl apply -f ./aks-seccomp.yaml
kubectl get pods komutunu kullanarak pod durumunu görüntüleyin.
- Pod bir hata bildirir.
- Komutun
chmod
örnek çıktıda gösterildiği gibi seccomp filtresi tarafından çalıştırılması engellenir:
kubectl get pods NAME READY STATUS RESTARTS AGE chmod-prevented 0/1 Error 0 7s
Seccomp güvenlik profili seçenekleri
Seccomp güvenlik profilleri, izin verilen veya kısıtlanan tanımlı bir syscall kümesidir. Çoğu kapsayıcı çalışma zamanı, Docker'ın kullandığı profille aynı değilse benzer bir varsayılan seccomp profiline sahiptir. Kullanılabilir profiller hakkında daha fazla bilgi için bkz . Docker veya containerD varsayılan seccomp profilleri.
Özel düğüm yapılandırmasını kullanarak sekcomp'ı yapılandırırken AKS RuntimeDefault için containerD varsayılan seccomp profilini kullanır.
Varsayılan profil tarafından engellenen önemli syscall'lar
Hem Docker hem de containerD, güvenli syscall'ların izin verilenler listesini tutar. Bu tabloda, izin verilenler listesinde olmadıkları için etkili bir şekilde engellenen önemli (ancak tümü değil) syscall'lar listelenmiştir. engellenen syscall'lardan herhangi biri iş yükünüz için gerekliyse, seccomp profilini kullanmayın RuntimeDefault
.
Docker ve containerD'de değişiklik yapıldığında AKS, varsayılan yapılandırmalarını eşleşecek şekilde güncelleştirir. Bu listede yapılan güncelleştirmeler iş yükü hatasına neden olabilir. Sürüm güncelleştirmeleri için bkz . AKS sürüm notları.
Engellenen syscall | Açıklama |
---|---|
acct |
Kapsayıcıların kendi kaynak sınırlarını veya işlem hesaplamasını devre dışı bırakmasına olanak tanıyan accounting syscall. Ayrıca tarafından CAP_SYS_PACCT geçitli. |
add_key |
Kapsayıcıların ad alanı olmayan çekirdek anahtarlamasını kullanmasını engelleyin. |
bpf |
Tarafından zaten geçitli CAP_SYS_ADMIN , kalıcı olabilecek bpf programlarının çekirdeğine yüklenmesini reddeder. |
clock_adjtime |
Saat/tarih ad alanı değil. Ayrıca tarafından CAP_SYS_TIME geçitli. |
clock_settime |
Saat/tarih ad alanı değil. Ayrıca tarafından CAP_SYS_TIME geçitli. |
clone |
Yeni ad alanlarının kopyalanmaması. Ayrıca, dışında CLONE_NEWUSER bayraklarla da geçitliCAP_SYS_ADMIN for CLONE_* . |
create_module |
Çekirdek modüllerinde düzenlemeyi ve işlevleri reddedin. Kullanımdan kalktı. Ayrıca tarafından CAP_SYS_MODULE geçitli. |
delete_module |
Çekirdek modüllerinde düzenlemeyi ve işlevleri reddedin. Ayrıca tarafından CAP_SYS_MODULE geçitli. |
finit_module |
Çekirdek modüllerinde düzenlemeyi ve işlevleri reddedin. Ayrıca tarafından CAP_SYS_MODULE geçitli. |
get_kernel_syms |
Dışarı aktarılan çekirdek ve modül simgelerinin alınmasını reddet. Kullanımdan kalktı. |
get_mempolicy |
Çekirdek belleğini ve NUMA ayarlarını değiştiren syscall. tarafından zaten geçitli CAP_SYS_NICE . |
init_module |
Çekirdek modüllerinde düzenlemeyi ve işlevleri reddedin. Ayrıca tarafından CAP_SYS_MODULE geçitli. |
ioperm |
Kapsayıcıların çekirdek G/Ç ayrıcalık düzeylerini değiştirmesini engelleyin. tarafından zaten geçitli CAP_SYS_RAWIO . |
iopl |
Kapsayıcıların çekirdek G/Ç ayrıcalık düzeylerini değiştirmesini engelleyin. tarafından zaten geçitli CAP_SYS_RAWIO . |
kcmp |
bırakılarak CAP_SYS_PTRACE zaten engellenmiş olan işlem inceleme özelliklerini kısıtlayın. |
kexec_file_load |
Sister syscall of kexec_load aynı şeyi yapıyor, biraz farklı bağımsız değişkenler. Ayrıca tarafından CAP_SYS_BOOT geçitli. |
kexec_load |
Yeni çekirdeğin daha sonra yürütülmesi için yüklenmesini reddeder. Ayrıca tarafından CAP_SYS_BOOT geçitli. |
keyctl |
Kapsayıcıların ad alanı olmayan çekirdek anahtarlamasını kullanmasını engelleyin. |
lookup_dcookie |
Ana bilgisayara bilgi sızdırabilecek syscall'ı izleme/profil oluşturma. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
mbind |
Çekirdek belleğini ve NUMA ayarlarını değiştiren syscall. tarafından zaten geçitli CAP_SYS_NICE . |
mount |
Bağlamayı reddet, zaten tarafından CAP_SYS_ADMIN geçitli. |
move_pages |
Çekirdek belleğini ve NUMA ayarlarını değiştiren syscall. |
nfsservctl |
Çekirdek nfs daemon'u ile etkileşimi reddedin. Linux 3.1'den bu yana kullanımdan kaldırıldı. |
open_by_handle_at |
Eski bir kapsayıcı tartışmasının nedeni. Ayrıca tarafından CAP_DAC_READ_SEARCH geçitli. |
perf_event_open |
Ana bilgisayara bilgi sızdırabilecek syscall'ı izleme/profil oluşturma. |
personality |
Kapsayıcının BSD öykünmesini etkinleştirmesini engelleyin. Doğası gereği tehlikeli değil, ancak zayıf test edilmiş, çekirdek sanal makineleri için potansiyel. |
pivot_root |
pivot_root reddet, ayrıcalıklı işlem olmalıdır. |
process_vm_readv |
bırakılarak CAP_SYS_PTRACE zaten engellenmiş olan işlem inceleme özelliklerini kısıtlayın. |
process_vm_writev |
bırakılarak CAP_SYS_PTRACE zaten engellenmiş olan işlem inceleme özelliklerini kısıtlayın. |
ptrace |
Syscall'da izleme/profil oluşturma. Sekcomp atlamasını önlemek için 4.8'ten önceki Linux çekirdek sürümlerinde engellendi. rastgele işlemleri izleme/profil oluşturma, konakta bilgi sızdırabileceğinden CAP_SYS_PTRACE bırakılarak zaten engellenir. |
query_module |
Çekirdek modüllerinde düzenlemeyi ve işlevleri reddedin. Kullanımdan kalktı. |
quotactl |
Kapsayıcıların kendi kaynak sınırlarını veya işlem hesaplamalarını devre dışı bırakmasına olanak tanıyan syscall kotası. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
reboot |
Kapsayıcıların konağı yeniden başlatmasına izin vermeyin. Ayrıca tarafından CAP_SYS_BOOT geçitli. |
request_key |
Kapsayıcıların ad alanı olmayan çekirdek anahtarlamasını kullanmasını engelleyin. |
set_mempolicy |
Çekirdek belleğini ve NUMA ayarlarını değiştiren syscall. tarafından zaten geçitli CAP_SYS_NICE . |
setns |
bir iş parçacığını ad alanıyla ilişkilendirmeyi reddeder. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
settimeofday |
Saat/tarih ad alanı değil. Ayrıca tarafından CAP_SYS_TIME geçitli. |
stime |
Saat/tarih ad alanı değil. Ayrıca tarafından CAP_SYS_TIME geçitli. |
swapon |
Dosya/cihaz değiştirme işleminin başlatılmasını/durdurulmasını reddedin. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
swapoff |
Dosya/cihaz değiştirme işleminin başlatılmasını/durdurulmasını reddedin. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
sysfs |
Eski syscall. |
_sysctl |
Eski, /proc/sys ile değiştirildi. |
umount |
Ayrıcalıklı bir işlem olmalıdır. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
umount2 |
Ayrıcalıklı bir işlem olmalıdır. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
unshare |
İşlemler için yeni ad alanlarının kopyalanmaması. Ayrıca paylaşımını kaldırma --user dışında tarafından CAP_SYS_ADMIN geçitli. |
uselib |
Paylaşılan kitaplıklar ile ilgili eski syscall, uzun süre kullanılmadı. |
userfaultfd |
İşlem geçişi için büyük ölçüde gerekli olan kullanıcı alanı sayfası hata işleme. |
ustat |
Eski syscall. |
vm86 |
Çekirdek x86 gerçek mod sanal makinesinde. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
vm86old |
Çekirdek x86 gerçek mod sanal makinesinde. Ayrıca tarafından CAP_SYS_ADMIN geçitli. |
Sonraki adımlar
İlişkili en iyi yöntemler için bkz. AKS'de küme güvenliği ve yükseltmeleri için en iyi yöntemler ve AKS'de pod güvenliği için en iyi yöntemler.
Azure Kubernetes Service