Azure Kubernetes Service (AKS) kümenizde güvenlik açığı bulunan eski görüntüleri temizlemek için Görüntü Temizleyici'yi kullanma

Azure Kubernetes Service (AKS) kümelerinde görüntü oluşturmak ve dağıtmak için işlem hatlarını kullanmak yaygın bir durumdır. Görüntü oluşturmak için harika olsa da, bu işlem genellikle geride kalan eski görüntüleri hesaba katıp küme düğümlerinde görüntü şişirmesine yol açabilir. Bu görüntüler güvenlik açıkları içerebilir ve bu da güvenlik sorunları oluşturabilir. Kümelerinizdeki güvenlik risklerini kaldırmak için bu başvurulmayan görüntüleri temizleyebilirsiniz. Görüntüleri el ile temizlemek zaman alabilir. Görüntü Temizleyici, eski görüntü riskini azaltan ve bunları temizlemek için gereken süreyi azaltan otomatik görüntü tanımlama ve kaldırma işlemlerini gerçekleştirir.

Not

Görüntü Temizleyici, Silgiyi temel alan bir özelliktir. AKS kümesinde özellik adı ve özellik adı olurken Image Cleaner, ilgili Görüntü Temizleyici podlarının adları içerir Eraser.

Önkoşullar

  • Azure aboneliği. Azure aboneliğiniz yoksa ücretsiz hesap oluşturabilirsiniz.
  • Azure CLI sürüm 2.49.0 veya üzeri. Sürümünüzü bulmak için komutunu çalıştırın az --version . Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

Sınırlamalar

Görüntü Temizleyici henüz Windows düğüm havuzlarını veya AKS sanal düğümlerini desteklemez.

Görüntü Temizleyici nasıl çalışır?

Görüntü Temizleyici'yi etkinleştirdikten sonra kümenize dağıtılan adlı eraser-controller-manager bir denetleyici yöneticisi podu olacaktır.

ImageCleaner'ın iş akışını gösteren diyagramın ekran görüntüsü. Kümede çalışan ImageCleaner podları bir ImageList oluşturabilir veya el ile giriş sağlanabilir.

Görüntü Temizleyici ile el ile ve otomatik mod ile aşağıdaki yapılandırma seçenekleri arasında seçim yapabilirsiniz:

Yapılandırma seçenekleri

Veri Akışı Adı Açıklama Gerekli
--enable-image-cleaner AKS kümesi için Görüntü Temizleyici özelliğini etkinleştirme Evet, devre dışı bırak belirtilmediği sürece
--disable-image-cleaner AKS kümesi için Görüntü Temizleyici özelliğini devre dışı bırakma Evet, etkinleştirme belirtilmediği sürece
--image-cleaner-interval-hours Bu parametre, Görüntü Temizleyici'nin çalıştırmak için kullandığı aralık süresini (saat cinsinden) belirler. Azure CLI için varsayılan değer bir hafta, en düşük değer 24 saat ve en fazla üç aydır. Azure CLI için gerekli değildir, ARM şablonu veya diğer istemciler için gereklidir

Otomatik mod

Dağıtıldıktan sonra eraser-controller-manager aşağıdaki adımlar otomatik olarak izlenir:

  • Temizleme işlemini hemen başlatır ve her düğüm için çalışan podları oluşturur eraser-aks-xxxxx .
  • Her çalışan podunda üç kapsayıcı vardır:
    • Kullanılmayan görüntüleri toplayan bir toplayıcı.
    • Görüntü güvenlik açıklarını taramak için trivy tarayıcı.
    • Güvenlik açıkları olan kullanılmayan görüntüleri kaldıran bir kaldırıcı.
  • Temizleme işlemi tamamlandıktan sonra çalışan podu silinir ve bir sonraki zamanlanmış temizleme sizin tanımladığınıza --image-cleaner-interval-hours göre gerçekleşir.

El ile mod

Bir CRD nesnesi tanımlayarak temizlemeyi el ile tetikleyebilirsiniz.ImageList Bu, her düğüm için çalışan podları oluşturmak eraser-aks-xxxxx ve el ile kaldırma işlemini tamamlamak için öğesini tetiklereraser-contoller-manager.

Not

Görüntü Temizleyici devre dışı bırakıldıktan sonra eski yapılandırma hala var olur. Bu, yapılandırmayı açıkça geçirmeden özelliği yeniden etkinleştirirseniz varsayılan değer yerine mevcut değerin kullanıldığı anlamına gelir.

AKS kümenizde Görüntü Temizleyici'yi etkinleştirme

Yeni bir kümede Görüntü Temizleyici'yi etkinleştirme

  • parametresiyle komutunu kullanarak yeni bir AKS kümesinde az aks create Görüntü Temizleyici'yi --enable-image-cleaner etkinleştirin.

    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-image-cleaner \
        --generate-ssh-keys
    

Mevcut bir kümede Görüntü Temizleyici'yi etkinleştirme

  • komutunu kullanarak mevcut aks kümesinde Görüntü Temizleyici'yi az aks update etkinleştirin.

    az aks update \
      --resource-group myResourceGroup \
      --name myManagedCluster \
      --enable-image-cleaner
    

Yeni veya mevcut bir kümede Görüntü Temizleyici aralığını güncelleştirme

  • parametresini kullanarak yeni veya mevcut bir AKS kümesinde Görüntü Temizleyici aralığını güncelleştirin --image-cleaner-interval-hours .

    # Create a new cluster with specifying the interval
    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-image-cleaner \
        --image-cleaner-interval-hours 48 \
        --generate-ssh-keys
    
    # Update the interval on an existing cluster
    az aks update \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-image-cleaner \
        --image-cleaner-interval-hours 48
    

Görüntü Temizleyici'yi kullanarak görüntüleri el ile kaldırma

Önemli

name, imagelist olarak ayarlanmalıdır.

  • Aşağıdaki kubectl apply komutu kullanarak görüntüyü el ile kaldırın. Bu örnek, kullanılmayan görüntüyü kaldırır docker.io/library/alpine:3.7.3 .

    cat <<EOF | kubectl apply -f -
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
        - docker.io/library/alpine:3.7.3
    EOF
    

El ile temizleme tek seferlik bir işlemdir ve yalnızca yeni imagelist bir oluşturulduğunda veya var olan imagelistiçinde değişiklik yapıldığında tetiklenir. Görüntü silindikten sonra otomatik imagelist olarak silinmez.

Başka bir el ile temizleme tetiklemeniz gerekiyorsa, yeni imagelist bir tane oluşturmanız veya var olan bir temizlemede değişiklik yapmanız gerekir. Aynı görüntüyü yeniden kaldırmak istiyorsanız, yeni imagelistbir oluşturmanız gerekir.

Mevcut ImageList'i silme ve yeni bir tane oluşturma

  1. komutunu kullanarak eskisini imagelist kubectl delete silin.

    kubectl delete ImageList imagelist
    
  2. Aynı resim adına sahip yeni imagelist bir oluşturun. Aşağıdaki örnek, önceki örnekle aynı görüntüyü kullanır.

    cat <<EOF | kubectl apply -f -
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
        - docker.io/library/alpine:3.7.3
    EOF
    

Mevcut ImageList'i değiştirme

  • komutunu kullanarak mevcut imagelist olanı kubectl edit değiştirin.

    kubectl edit ImageList imagelist
    
    # Add a new image to the list
    apiVersion: eraser.sh/v1
    kind: ImageList
    metadata:
      name: imagelist
    spec:
      images:
          docker.io/library/python:alpine3.18
    

El ile modu kullanırken pod, eraser-aks-xxxxx çalışma tamamlandıktan sonra 10 dakika içinde silinir.

Görüntü dışlama listesi

Dışlama listesinde belirtilen görüntüler kümeden kaldırılmaz. Görüntü Temizleyici, sistem ve kullanıcı tanımlı dışlama listelerini destekler. Sistem dışlama listesini düzenlemek desteklenmez.

Sistem dışlama listesini denetleyin

  • Aşağıdaki kubectl get komutu kullanarak sistem dışlama listesini denetleyin.

    kubectl get -n kube-system configmap eraser-system-exclusion -o yaml
    

Kullanıcı tanımlı dışlama listesi oluşturma

  1. Dışlanan görüntüleri içerecek örnek bir JSON dosyası oluşturun.

    cat > sample.json <<EOF
    {"excluded": ["excluded-image-name"]}
    EOF
    
  2. Aşağıdaki kubectl create ve kubectl label komutunu kullanarak örnek JSON dosyasını kullanarak bir configmap oluşturun.

    kubectl create configmap excluded --from-file=sample.json --namespace=kube-system
    kubectl label configmap excluded eraser.sh/exclude.list=true -n kube-system
    

Görüntü Temizleyiciyi Devre Dışı Bırak

  • parametresiyle komutunu kullanarak kümenizde Görüntü Temizleyici'yi az aks update --disable-image-cleaner devre dışı bırakın.

    az aks update \
      --resource-group myResourceGroup \
      --name myManagedCluster \
      --disable-image-cleaner
    

SSS

Görüntü Temizleyici'nin hangi sürümü kullandığını nasıl denetleyebilirim?

kubectl describe configmap -n kube-system eraser-manager-config | grep tag -C 3

Görüntü Temizleyici, trivy-scanner dışında diğer güvenlik açığı tarayıcılarını destekliyor mu?

Hayır

Görüntülerin temizlenmesi için güvenlik açığı düzeylerini belirtebilir miyim?

Hayır Güvenlik açığı düzeyleri için varsayılan ayarlar şunlardır:

  • LOW,
  • MEDIUM,
  • HIGH ve
  • CRITICAL

Varsayılan ayarları özelleştiremezsiniz.

Görüntü Temizleyicisi tarafından temizlenen görüntüleri gözden geçirme

Görüntü günlükleri çalışan podunda eraser-aks-xxxxx depolanır. Etkin olduğunda eraser-aks-xxxxx , silme günlüklerini görüntülemek için aşağıdaki komutları çalıştırabilirsiniz:

kubectl logs -n kube-system <worker-pod-name> -c collector
kubectl logs -n kube-system <worker-pod-name> -c trivy-scanner
kubectl logs -n kube-system <worker-pod-name> -c remover

Pod, eraser-aks-xxxxx çalışma tamamlandıktan sonra 10 dakika içinde silinir. Azure İzleyici eklentisini etkinleştirmek ve Container Insights pod günlük tablosunu kullanmak için bu adımları izleyebilirsiniz. Bundan sonra, geçmiş günlükler depolanır ve bunları gözden geçirebilirsiniz hatta eraser-aks-xxxxx silinir.

  1. Kümenizde Azure İzleme'nin etkinleştirildiğinden emin olun. Ayrıntılı adımlar için bkz . AKS kümelerinde Container Insights'ı etkinleştirme.

  2. komutunu kullanarak az aks show Log Analytics kaynak kimliğini alın.

      az aks show --resource-group myResourceGroup --name myManagedCluster
    

    Birkaç dakika sonra komut, çalışma alanı kaynak kimliği de dahil olmak üzere çözümle ilgili JSON biçimli bilgileri döndürür:

    "addonProfiles": {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/<WorkspaceSubscription>/resourceGroups/<DefaultWorkspaceRG>/providers/Microsoft.OperationalInsights/workspaces/<defaultWorkspaceName>"
        },
        "enabled": true
      }
    }
    
  3. Azure portalında çalışma alanı kaynak kimliğini arayın ve Günlükler'i seçin.

  4. Aşağıdaki sorguyu (çalışan pod adı) ile eraser-aks-xxxxx değiştirerek name tabloya kopyalayın:

    let startTimestamp = ago(1h);
    KubePodInventory
    | where TimeGenerated > startTimestamp
    | project ContainerID, PodName=Name, Namespace
    | where PodName contains "name" and Namespace startswith "kube-system"
    | distinct ContainerID, PodName
    | join
    (
        ContainerLog
        | where TimeGenerated > startTimestamp
    )
    on ContainerID
    // at this point before the next pipe, columns from both tables are available to be "projected". Due to both
    // tables having a "Name" column, we assign an alias as PodName to one column which we actually want
    | project TimeGenerated, PodName, LogEntry, LogEntrySource
    | summarize by TimeGenerated, LogEntry
    | order by TimeGenerated desc
    
  5. Çalıştır seçin. Silinen görüntü günlükleri Sonuçlar alanında görünür.