Aracılığıyla paylaş


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.

  1. Linux güvenlik özelliklerini düğüm düzeyinde tanımlayın.
  2. 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.

Kapsayıcı eylemlerini sınırlamak için AKS kümesinde kullanılan AppArmor profilleri

AppArmor'un nasıl çalıştığını görmek için aşağıdaki örnekte dosyalara yazılmayı engelleyen bir profil oluşturulur.

  1. AKS düğümüne SSH .

  2. deny-write.profile adlı bir dosya oluşturun.

  3. 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.

  1. Profili AppArmor'a ekleyin.

  2. Ö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.

  3. Yerel makinenizden aks-apparmor.yaml adlı bir pod bildirimi oluşturun. Bu bildirim:

    • için container.apparmor.security.beta.kubernetesbir 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" ]
    
  4. 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

  1. 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.

  2. komutunu kullanarak az feature show kayıt durumunu doğrulayın.

    az feature show --namespace "Microsoft.ContainerService" --name "KubeletDefaultSeccompProfilePreview"
    
  3. Durum Kayıtlı olarak yansıtıldığında, komutunu kullanarak Microsoft.ContainerService kaynak sağlayıcısının kaydını yenileyinaz 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 Unconfineddeğ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.

  1. AKS düğümüne SSH .

  2. /var/lib/kubelet/seccomp/prevent-chmod adlı bir seccomp filtresi oluşturun.

  3. 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"
        }
      ]
    }
    
  4. 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.iobir 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
    
  5. kubectl apply komutunu kullanarak örnek podu dağıtın:

    kubectl apply -f ./aks-seccomp.yaml
    
  6. 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_PACCTgeç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_TIMEgeçitli.
clock_settime Saat/tarih ad alanı değil. Ayrıca tarafından CAP_SYS_TIMEgeçitli.
clone Yeni ad alanlarının kopyalanmaması. Ayrıca, dışında CLONE_NEWUSERbayraklarla 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_MODULEgeçitli.
delete_module Çekirdek modüllerinde düzenlemeyi ve işlevleri reddedin. Ayrıca tarafından CAP_SYS_MODULEgeçitli.
finit_module Çekirdek modüllerinde düzenlemeyi ve işlevleri reddedin. Ayrıca tarafından CAP_SYS_MODULEgeç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_MODULEgeç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_PTRACEzaten 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_BOOTgeçitli.
kexec_load Yeni çekirdeğin daha sonra yürütülmesi için yüklenmesini reddeder. Ayrıca tarafından CAP_SYS_BOOTgeç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_ADMINgeç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_ADMINgeç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_SEARCHgeç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_PTRACEzaten engellenmiş olan işlem inceleme özelliklerini kısıtlayın.
process_vm_writev bırakılarak CAP_SYS_PTRACEzaten 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_ADMINgeçitli.
reboot Kapsayıcıların konağı yeniden başlatmasına izin vermeyin. Ayrıca tarafından CAP_SYS_BOOTgeç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_ADMINgeçitli.
settimeofday Saat/tarih ad alanı değil. Ayrıca tarafından CAP_SYS_TIMEgeçitli.
stime Saat/tarih ad alanı değil. Ayrıca tarafından CAP_SYS_TIMEgeçitli.
swapon Dosya/cihaz değiştirme işleminin başlatılmasını/durdurulmasını reddedin. Ayrıca tarafından CAP_SYS_ADMINgeçitli.
swapoff Dosya/cihaz değiştirme işleminin başlatılmasını/durdurulmasını reddedin. Ayrıca tarafından CAP_SYS_ADMINgeç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_ADMINgeçitli.
umount2 Ayrıcalıklı bir işlem olmalıdır. Ayrıca tarafından CAP_SYS_ADMINgeç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_ADMINgeç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_ADMINgeçitli.
vm86old Çekirdek x86 gerçek mod sanal makinesinde. Ayrıca tarafından CAP_SYS_ADMINgeç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.