Container Derlemelerinin Güvenliğini Sağlama

1. Giriş

ead1609267034bf7.png

Yazılım açıkları, yanlışlıkla sistem arızasına neden olabilecek veya kötü niyetli kişilere yazılımınızın güvenliğini ihlal etmeleri için bir yol sunabilecek zayıf noktalardır. Container Analizi, container'lardaki güvenlik açıklarını bulmak için iki tür işletim sistemi taraması sağlar:

  • İsteğe Bağlı Tarama API'si, container görüntülerini işletim sistemi güvenlik açıkları açısından bilgisayarınızda yerel olarak veya Container Registry ya da Artifact Registry'de uzaktan manuel olarak taramanıza olanak tanır.
  • Container Scanning API'si, Container Registry veya Artifact Registry'ye her görüntü aktarışınızda tarama yaparak işletim sistemi güvenlik açığı algılamasını otomatikleştirmenizi sağlar. Bu API'yi etkinleştirmek, Go ve Java güvenlik açıkları için dil paketi taramalarını da etkinleştirir.

İsteğe Bağlı Tarama API'si, bilgisayarınızda yerel olarak veya Container Registry ya da Artifact Registry'de depolanan görüntüleri taramanıza olanak tanır. Bu sayede, güvenlik açıklarına karşı taramak istediğiniz container'ları ayrıntılı olarak kontrol edebilirsiniz. Görüntüleri bir kayıt defterinde depolayıp depolamayacağınıza karar vermeden önce CI/CD ardışık düzeninizdeki görüntüleri taramak için İsteğe Bağlı Tarama'yı kullanabilirsiniz.

Neler öğreneceksiniz?

Bu laboratuvarda şunları öğreneceksiniz:

  • Cloud Build ile Görüntü Oluşturma
  • Container'lar için Artifact Registry kullanma
  • Otomatik güvenlik açığı taramasını kullanma
  • İsteğe Bağlı Taramayı Yapılandırma
  • Cloud Build'de CICD'ye resim taraması ekleme

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle PROJECT_ID olarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu değerlerin üçü hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.

Ortam Kurulumu

Cloud Shell'de projenizin kimliğini ve proje numarasını ayarlayın. Bunları PROJECT_ID ve PROJECT_ID değişkenleri olarak kaydedin.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
    --format='value(projectNumber)')

Hizmetleri etkinleştir

Gerekli tüm hizmetleri etkinleştirin:

gcloud services enable \
  cloudkms.googleapis.com \
  cloudbuild.googleapis.com \
  container.googleapis.com \
  containerregistry.googleapis.com \
  artifactregistry.googleapis.com \
  containerscanning.googleapis.com \
  ondemandscanning.googleapis.com \
  binaryauthorization.googleapis.com 

3. Cloud Build ile görüntü oluşturma

Bu bölümde, kapsayıcı görüntünüzü oluşturacak, tarayacak ve sonuçları değerlendirecek otomatik bir derleme ardışık düzeni oluşturacaksınız. Herhangi bir kritik güvenlik açığı bulunmazsa görüntü, depoya aktarılır. KRİTİK güvenlik açıkları bulunursa derleme başarısız olur ve derlemeden çıkılır.

Cloud Build hizmet hesabı için erişim sağlama

Cloud Build'in isteğe bağlı tarama API'sine erişmek için haklara sahip olması gerekir. Aşağıdaki komutlarla erişim izni verin.

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/iam.serviceAccountUser"
        
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/ondemandscanning.admin"

Çalışma dizini oluşturma ve çalışma dizini olarak değiştirme

mkdir vuln-scan && cd vuln-scan

Örnek resim tanımlama

Aşağıdaki içeriklerle Dockerfile adında bir dosya oluşturun.

cat > ./Dockerfile << EOF
FROM gcr.io/google-appengine/debian9@sha256:ebffcf0df9aa33f342c4e1d4c8428b784fc571cdf6fbab0b31330347ca8af97a

# System
RUN apt update && apt install python3-pip -y

# App
WORKDIR /app
COPY . ./

RUN pip3 install Flask==1.1.4
RUN pip3 install gunicorn==20.1.0

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

EOF

Aşağıdaki içeriğe sahip main.py adlı bir dosya oluşturun

cat > ./main.py << EOF
import os
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    name = os.environ.get("NAME", "Worlds")
    return "Hello {}!".format(name)

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
EOF

Cloud Build ardışık düzenini oluşturma

Aşağıdaki komut, dizininizde otomatik işlem için kullanılacak bir cloudbuild.yaml dosyası oluşturur. Bu örnekte adımlar, kapsayıcı oluşturma süreciyle sınırlıdır. Ancak pratikte, kapsayıcı adımlarına ek olarak uygulamaya özel talimatlar ve testler eklemeniz gerekir.

Aşağıdaki komutu kullanarak dosyayı oluşturun.

cat > ./cloudbuild.yaml << EOF
steps:

# build
- id: "build"
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
  waitFor: ['-']


EOF

CI ardışık düzenini çalıştırma

Derlemeyi işlenmek üzere gönderme

gcloud builds submit

Derleme Ayrıntılarını İnceleme

Derleme işlemi başladıktan sonra Cloud Build kontrol panelinde ilerlemeyi inceleyin.

  1. Cloud Console'da Cloud Build'i açın
  2. İçeriği görüntülemek için derlemeyi tıklayın

4. Container'lar için Artifact Registry

Artifact Registry Deposu Oluşturma

Bu laboratuvarda, görüntülerinizi depolamak ve taramak için Artifact Registry'yi kullanacaksınız. Aşağıdaki komutla depoyu oluşturun.

gcloud artifacts repositories create artifact-scanning-repo \
  --repository-format=docker \
  --location=us-central1 \
  --description="Docker repository"

Docker'ı, Artifact Registry'ye erişirken gcloud kimlik bilgilerinizi kullanacak şekilde yapılandırın.

gcloud auth configure-docker us-central1-docker.pkg.dev

Cloud Build ardışık düzenini güncelleme

Oluşturulan resmi Artifact Registry'ye göndermek için derleme ardışık düzeninizi değiştirin

cat > ./cloudbuild.yaml << EOF
steps:

# build
- id: "build"
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
  waitFor: ['-']

# push to artifact registry
- id: "push"
  name: 'gcr.io/cloud-builders/docker'
  args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image']

images:
  - us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF

CI ardışık düzenini çalıştırma

Derlemeyi işlenmek üzere gönderme

gcloud builds submit

5. Otomatik güvenlik açığı taraması

Yapı tarama, Artifact Registry veya Container Registry'ye yeni bir görüntü aktardığınızda otomatik olarak tetiklenir. Yeni güvenlik açıkları tespit edildiğinde güvenlik açığı bilgileri sürekli olarak güncellenir. Bu bölümde, yeni oluşturduğunuz ve Artifact Registry'ye yüklediğiniz görüntüyü inceleyip güvenlik açığı sonuçlarını keşfedeceksiniz.

Resim Ayrıntılarını İnceleyin

Önceki derleme işlemi tamamlandıktan sonra görüntüyü ve Artifact Registry kontrol panelindeki Güvenlik Açığı sonuçlarını inceleyin.

  1. Cloud Console'da Artifact Registry'yi açın
  2. İçeriği görüntülemek için yapı tarama deposunu tıklayın
  3. Resim ayrıntılarını tıklayın.
  4. Resminizin en son özetini tıklayın
  5. Tarama tamamlandıktan sonra resmin güvenlik açıkları sekmesini tıklayın.

Güvenlik açıkları sekmesinde, yeni oluşturduğunuz görüntü için yapılan otomatik taramanın sonuçlarını görürsünüz.

361be7b3bf293fca.png

Taramanın otomatikleştirilmesi varsayılan olarak etkindir. Otomatik taramayı nasıl kapatacağınızı/açacağınızı öğrenmek için Artifact Registry ayarlarını keşfedin.

6. İsteğe Bağlı Tarama

Görüntüyü bir depoya aktarmadan önce tarama yapmanız gerekebilecek çeşitli senaryolar vardır. Örneğin, bir kapsayıcı geliştiricisi, kodu kaynak denetimine aktarmadan önce bir görüntüyü tarayabilir ve sorunları düzeltebilir. Aşağıdaki örnekte, sonuçlara göre işlem yapmadan önce resmi yerel olarak oluşturup analiz edeceksiniz.

Görüntü oluşturma

Bu adımda, yerel önbelleğinize görüntü oluşturmak için yerel Docker'ı kullanacaksınız.

docker build -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image .

Resmi tarama

Görüntü oluşturulduktan sonra görüntünün taranmasını isteyin. Taramanın sonuçları bir meta veri sunucusunda depolanır. İş, sonuçların meta veri sunucusundaki konumuyla tamamlanır.

gcloud artifacts docker images scan \
    us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
    --format="value(response.scan)" > scan_id.txt

Çıkış Dosyasını İnceleme

Bir önceki adımın scan_id.txt dosyasında saklanan çıktısını inceleyin. Meta veri sunucusunda tarama sonuçlarının rapor konumuna dikkat edin.

cat scan_id.txt

Ayrıntılı tarama sonuçlarını inceleme

Taramanın gerçek sonuçlarını görüntülemek için çıkış dosyasında belirtilen rapor konumunda list-vulnerabilities komutunu kullanın.

gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) 

Çıkış, resimdeki tüm güvenlik açıklarıyla ilgili önemli miktarda veri içerir.

Önemli sorunları işaretleyin

İnsanlar raporda depolanan verileri nadiren kullanır. Sonuçlar genellikle otomatik bir işlem tarafından kullanılır. Rapor ayrıntılarını okumak ve KRİTİK güvenlik açıkları bulunursa günlüğe kaydetmek için aşağıdaki komutları kullanın

export SEVERITY=CRITICAL

gcloud artifacts docker images list-vulnerabilities $(cat scan_id.txt) --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq ${SEVERITY}; then echo "Failed vulnerability check for ${SEVERITY} level"; else echo "No ${SEVERITY} Vulnerabilities found"; fi

Bu komutun çıktısı şu şekilde olur:

Failed vulnerability check for CRITICAL level

7. Cloud Build ile CICD'de Tarama

Cloud Build Hizmet Hesabı için erişim sağlama

Cloud Build'in isteğe bağlı tarama API'sine erişmek için haklara sahip olması gerekir. Aşağıdaki komutlarla erişim izni verin.

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/iam.serviceAccountUser"
        
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" \
        --role="roles/ondemandscanning.admin"

Cloud Build ardışık düzenini güncelleme

Aşağıdaki komut, dizininizde otomatik işlem için kullanılacak bir cloudbuild.yaml dosyası oluşturur. Bu örnekte adımlar, kapsayıcı oluşturma süreciyle sınırlıdır. Ancak pratikte, kapsayıcı adımlarına ek olarak uygulamaya özel talimatlar ve testler eklemeniz gerekir.

Aşağıdaki komutu kullanarak dosyayı oluşturun.

cat > ./cloudbuild.yaml << EOF
steps:

# build
- id: "build"
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', '.']
  waitFor: ['-']

#Run a vulnerability scan at _SECURITY level
- id: scan
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    (gcloud artifacts docker images scan \
    us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image \
    --location us \
    --format="value(response.scan)") > /workspace/scan_id.txt

#Analyze the result of the scan
- id: severity check
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
      gcloud artifacts docker images list-vulnerabilities \$(cat /workspace/scan_id.txt) \
      --format="value(vulnerability.effectiveSeverity)" | if grep -Fxq CRITICAL; \
      then echo "Failed vulnerability check for CRITICAL level" && exit 1; else echo "No CRITICAL vulnerability found, congrats !" && exit 0; fi

#Retag
- id: "retag"
  name: 'gcr.io/cloud-builders/docker'
  args: ['tag',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image', 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']


#pushing to artifact registry
- id: "push"
  name: 'gcr.io/cloud-builders/docker'
  args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good']

images:
  - us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF

CI ardışık düzenini çalıştırma

KRİTİK önem derecesi güvenlik açığı bulunduğunda derleme sonlarını doğrulamak için derlemeyi işlenmek üzere gönderin.

gcloud builds submit

İnceleme Derleme Hatası

Görüntüde KRİTİK güvenlik açıkları bulunduğundan, gönderdiğiniz derleme başarısız olacak.

Cloud Build Geçmişi sayfasında derleme hatasını inceleyin.

Güvenlik açığını düzeltme

Dockerfile'i, kritik güvenlik açıkları içermeyen bir temel resim kullanacak şekilde güncelleyin.

Aşağıdaki komutu kullanarak Debian 10 görüntüsünü kullanmak için Dockerfile'in üzerine yazın

cat > ./Dockerfile << EOF
from python:3.8-slim  

# App
WORKDIR /app
COPY . ./

RUN pip3 install Flask==2.1.0
RUN pip3 install gunicorn==20.1.0

CMD exec gunicorn --bind :\$PORT --workers 1 --threads 8 main:app

EOF

CI sürecini iyi görüntüyle çalıştırma

Derlemenin, önem düzeyi yüksek, kritik güvenlik açıkları bulunamadığında derlemenin başarılı olacağını doğrulamak için derlemeyi işlenmek üzere gönderin.

gcloud builds submit

Derlemenin Başarısını İnceleme

Güncellenen görüntü hiçbir KRİTİK güvenlik açığı içermediğinden, gönderdiğiniz derleme başarılı olacak.

Cloud Build Geçmişi sayfasında derleme başarısını inceleyin

Tarama sonuçlarını inceleme

Artifact kaydındaki iyi görüntüyü inceleyin

  1. Cloud Console'da Artifact Registry'yi açın
  2. İçeriği görüntülemek için artifact-scanning-repo'yu tıklayın.
  3. Resim ayrıntılarını tıklayın.
  4. Resminizin en son özetini tıklayın
  5. Resmin güvenlik açıkları sekmesini tıklayın

8. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Ele aldığımız konular:

  • Cloud Build ile Görüntü Derleme
  • Container'lar için Artifact Registry
  • Otomatik güvenlik açığı taraması
  • İsteğe Bağlı Tarama
  • Cloud Build ile CICD'de tarama

Sıradaki adım:

Temizleme

Bu eğiticide kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız kaynakları içeren projeyi silin veya projeyi tutup tek tek kaynakları silin.

Projeyi silme

Faturalandırılmanın önüne geçmenin en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.

Son güncelleme: 21.3.23