Güvenli Derleme & Cloud Build, Artifact Registry ve GKE ile dağıtın

Güvenli Derleme ve Cloud Build, Artifact Registry ve GKE ile dağıtın

Bu codelab hakkında

subjectSon güncelleme Mar 4, 2023
account_circleYazan: Christopher Grant

1. Giriş

Container Analizi, container'lar için güvenlik açığı taraması ve meta veri depolama sağlar. Tarama hizmeti, Artifact Registry ve Container Registry'deki görüntülerde güvenlik açığı taramaları gerçekleştirir, ardından elde edilen meta verileri depolar ve bir API aracılığıyla kullanıma hazır hale getirir. Meta veri depolama; güvenlik açığı taraması, Google Cloud hizmetleri ve üçüncü taraf sağlayıcılar gibi farklı kaynaklardan gelen bilgileri depolamanıza olanak tanır.

Güvenlik açığı taraması otomatik olarak veya isteğe bağlı olarak yapılabilir:

  • Otomatik tarama etkinleştirildiğinde, Artifact Registry veya Container Registry'ye yeni bir görüntü aktardığınızda tarama otomatik olarak tetiklenir. Yeni güvenlik açıkları tespit edildiğinde güvenlik açığı bilgileri sürekli olarak güncellenir.
  • İsteğe Bağlı Tarama etkinleştirildiğinde Artifact Registry ya da Container Registry'de yerel bir görüntüyü veya görüntüyü taramak için komut çalıştırmanız gerekir. İsteğe Bağlı Tarama, container'ları tararken size esneklik sağlar. Örneğin, yerel olarak oluşturulmuş bir görüntüyü tarayabilir ve kayıt defterinde saklamadan önce güvenlik açıklarını düzeltebilirsiniz. Tarama sonuçları, tarama tamamlandıktan sonra 48 saate kadar kullanılabilir hâle gelir ve taramadan sonra güvenlik açığı bilgileri güncellenmez.

CI/CD ardışık düzeninize entegre edilmiş Container Analizi sayesinde, söz konusu meta verilere dayanarak kararlar alabilirsiniz. Örneğin, yalnızca güvenilir kayıt defterlerinden uyumlu görüntülerin dağıtımına izin veren dağıtım politikaları oluşturmak için İkili Program Yetkilendirmesi'ni kullanabilirsiniz.

Neler öğreneceksiniz?

  • Otomatik tarama nasıl etkinleştirilir?
  • İsteğe Bağlı Tarama nasıl yapılır?
  • Derleme ardışık düzenine tarama entegre etme
  • Onaylanmış resimleri imzalama
  • Görüntüleri engellemek için GKE Giriş denetleyicilerini kullanma
  • GKE'yi yalnızca imzalı onaylanmış görüntülere izin verecek şekilde yapılandırma

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp 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 ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde 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. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloudshell Düzenleyiciyi Başlat

Bu laboratuvar, Google Cloud Shell Düzenleyici ile birlikte kullanılmak üzere tasarlanmış ve test edilmiştir. Düzenleyiciye erişmek için

  1. https://console.cloud.google.com adresinden Google projenize erişin.
  2. Sağ üst köşedeki Cloud Shell düzenleyici simgesini tıklayın.

8560cc8d45e8c112.png

  1. Pencerenizin alt kısmında yeni bir bölme açılır

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ştirme

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

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

3. Otomatik Tarama

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 Artifact Registry'ye bir görüntü aktaracak ve sonuçları keşfedeceksiniz.

Oluştur ve bir iş dizinine değiştir

mkdir vuln-scan && cd vuln-scan

Örnek resim tanımlayın

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 adında 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

Görüntüyü oluşturup AR'ye aktarın

Container'ınızı derlemek ve otomatik olarak Artifact Registry'ye aktarmak için Cloud Build'i kullanın. Resimdeki bad etiketine dikkat edin. Bu, sonraki adımlarda kartı tanımlamanıza yardımcı olur.

gcloud builds submit . -t us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:bad

Resim Ayrıntılarını İnceleyin

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 sona erdiğinde, görüntüye ait 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.

4. İsteğe Bağlı Tarama

Görüntüyü depoya aktarmadan önce tarama yapmanız gerekebilecek çeşitli senaryolar vardır. Örneğin, bir container geliştiricisi, kodu kaynak kontrolüne aktarmadan önce bir görüntüyü tarayıp sorunları düzeltebilir. Aşağıdaki örnekte, sonuçlara göre hareket etmeden önce görüntüyü yerel olarak derleyip analiz edeceksiniz.

Görüntü Oluşturun

Bu adımda, görüntüyü yerel önbelleğinizde 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 tarayın

Görsel oluşturulduktan sonra resmin 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

Scan_id.txt dosyasında depolanan önceki adımın sonucunu incelemek için biraz zaman ayırın. 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ış, görüntüdeki tüm güvenlik açıklarıyla ilgili önemli miktarda veri içerir.

Önemli sorunları işaretleyin

İnsanlar raporda depolanan verileri nadiren kullanır. Genelde sonuçlar 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ı şöyle olur:

Failed vulnerability check for CRITICAL level

5. Ardışık Düzen Taraması Derleme

Bu bölümde, container görüntünüzü derleyecek, tarayıp 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 komutları kullanarak 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 oluşturma

Aşağıdaki komut, dizininizde otomatik işlem için kullanılacak bir cloudbuild.yaml dosyası oluşturur. Bu örnekte adımlar, container derleme 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 komutla 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 Oluşturma Hatası

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

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

Güvenlik Açığı'nı düzeltme

Dockerfile'ı, CRITical güvenlik açıkları içermeyen bir temel görüntü kullanacak şekilde güncelleyin.

Aşağıdaki komutla Debian 10 görüntüsünü kullanmak için Dockerfile'ın ü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, kritik önemde bir güvenlik açığı 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ı inceleyin

Artifact Registry'deki iyi görüntüyü 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. Resmin güvenlik açıkları sekmesini tıklayın

6. Görüntüleri İmzalama

Onaylayan Notu Oluşturma

Onaylayan Notu, uygulanan imza türü için etiket işlevi gören küçük bir veri parçasıdır. Örneğin, bir not güvenlik açığı taramasını belirtirken başka bir not ise kalite güvencesi onayı için kullanılabilir. İmzalama işlemi sırasında nota atıfta bulunulur.

Not oluşturma

cat > ./vulnz_note.json << EOM
{
 
"attestation": {
   
"hint": {
     
"human_readable_name": "Container Vulnerabilities attestation authority"
   
}
 
}
}
EOM

Notu saklama

NOTE_ID=vulnz_note

curl
-vvv -X POST \
    -H "Content-Type: application/json"  \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    --data-binary @./vulnz_note.json  \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"

Notu doğrulayın

curl -vvv  \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}"

Onaylayan Oluşturma

Onaylayanlar, gerçek görüntü imzalama işlemini gerçekleştirmek için kullanılır ve daha sonra doğrulamak üzere notun bir tekrarını resme ekler. Daha sonra kullanmak üzere onaylayanı oluşturun.

Onaylayan Oluştur

ATTESTOR_ID=vulnz-attestor

gcloud
container binauthz attestors create $ATTESTOR_ID \
    --attestation-authority-note=$NOTE_ID \
    --attestation-authority-note-project=${PROJECT_ID}

Onaylayanı Doğrula

gcloud container binauthz attestors list

Son satırda, anahtarları sonraki bir adımda NUM_PUBLIC_KEYS: 0 sağlayacağınız anlamına gelir

Ayrıca, görüntüler oluşturan bir derleme çalıştırdığınızda Cloud Build'in projenizde built-by-cloud-build onaylayanını otomatik olarak oluşturduğunu da unutmayın. Dolayısıyla yukarıdaki komut vulnz-attestor ve built-by-cloud-build adlı iki onaylayan döndürür. Görüntüler başarıyla derlendikten sonra Cloud Build bu görüntüler için otomatik olarak imza ve onay oluşturur.

IAM Rolü Ekleme

İkili Program Yetkilendirmesi hizmet hesabının onay notlarını görüntülemek için haklara sahip olması gerekir. Aşağıdaki API çağrısını kullanarak erişim sağlayın

PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}"  --format="value(projectNumber)")

BINAUTHZ_SA_EMAIL
="service-${PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com"


cat
> ./iam_request.json << EOM
{
  'resource': 'projects/${PROJECT_ID}/notes/${NOTE_ID}',
  'policy': {
    'bindings': [
      {
        'role': 'roles/containeranalysis.notes.occurrences.viewer',
        'members': [
          'serviceAccount:${BINAUTHZ_SA_EMAIL}'
        ]
      }
    ]
  }
}
EOM

IAM Politikası oluşturmak için dosyayı kullanın

curl -X POST  \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    --data-binary @./iam_request.json \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"

KMS Anahtarı Ekleme

Onaylayanın notu eklemek ve doğrulanabilir imzalar sağlamak için şifreleme anahtarları kullanması gerekir. Bu adımda, daha sonra erişmek üzere Cloud Build için KMS'de anahtar oluşturacak ve bu anahtarları depolayacaksınız.

Öncelikle yeni anahtarı tanımlamak için bazı ortam değişkenleri ekleyin

KEY_LOCATION=global
KEYRING
=binauthz-keys
KEY_NAME
=codelab-key
KEY_VERSION
=1

Bir grup anahtarı tutmak için anahtarlık oluşturma

gcloud kms keyrings create "${KEYRING}" --location="${KEY_LOCATION}"

Onaylayan için yeni bir asimetrik imzalama anahtar çifti oluşturma

gcloud kms keys create "${KEY_NAME}" \
    --keyring="${KEYRING}" --location="${KEY_LOCATION}" \
    --purpose asymmetric-signing   \
    --default-algorithm="ec-sign-p256-sha256"

Anahtarınız, Google Cloud Console'un KMS sayfasında görünecektir.

Şimdi, gcloud binauthz komutunu kullanarak anahtarı onaylayanınızla ilişkilendirin:

gcloud beta container binauthz attestors public-keys add  \
    --attestor="${ATTESTOR_ID}"  \
    --keyversion-project="${PROJECT_ID}"  \
    --keyversion-location="${KEY_LOCATION}" \
    --keyversion-keyring="${KEYRING}" \
    --keyversion-key="${KEY_NAME}" \
    --keyversion="${KEY_VERSION}"

Yetkililerin listesini tekrar yazdırırsanız, bir anahtarın kaydedilmiş olduğunu görürsünüz:

gcloud container binauthz attestors list

İmzalı Onay Oluşturma

Bu noktada, görüntüleri imzalamanızı sağlayan yapılandırılmış özelliklere sahipsiniz. Üzerinde çalıştığınız Kapsayıcı Görüntüsünü imzalamak için daha önce oluşturduğunuz Tasdik Eden'i kullanın

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

DIGEST
=$(gcloud container images describe ${CONTAINER_PATH}:latest \
    --format='get(image_summary.digest)')

Artık onayınızı oluşturmak için gcloud'u kullanabilirsiniz. Komut, imzalamak için kullanmak istediğiniz anahtarın ayrıntılarını ve onaylamak istediğiniz belirli kapsayıcı görüntüsünü alır.

gcloud beta container binauthz attestations sign-and-create  \
    --artifact-url="${CONTAINER_PATH}@${DIGEST}" \
    --attestor="${ATTESTOR_ID}" \
    --attestor-project="${PROJECT_ID}" \
    --keyversion-project="${PROJECT_ID}" \
    --keyversion-location="${KEY_LOCATION}" \
    --keyversion-keyring="${KEYRING}" \
    --keyversion-key="${KEY_NAME}" \
    --keyversion="${KEY_VERSION}"

Container Analizi terimlerine göre bu, yeni bir olay oluşturur ve bunu onaylayanın notuna ekler. Her şeyin beklendiği gibi çalıştığından emin olmak için onaylarınızı listeleyebilirsiniz.

gcloud container binauthz attestations list \
   --attestor=$ATTESTOR_ID --attestor-project=${PROJECT_ID}

7. Cloud Build ile imzalama

Görüntü imzalamayı etkinleştirdiniz ve örnek görüntünüzü imzalamak için Onaylayanı manuel olarak kullandınız. Pratikte CI/CD ardışık düzenleri gibi otomatik işlemler sırasında onayları uygulamanız gerekir.

Bu bölümde Cloud Build'i görüntüleri otomatik olarak onaylamak için yapılandıracaksınız

Roller

Cloud Build Hizmet Hesabına İkili Program Yetkilendirmesi Onaylayan Görüntüleyici rolünü ekleyin:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
  --role roles/binaryauthorization.attestorsViewer

Cloud Build Hizmet Hesabına (KMS Tabanlı İmzalama) Cloud KMS CryptoKey İmzalayıcı/Doğrulayıcı rolünü ekleyin:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
  --role roles/cloudkms.signerVerifier

Cloud Build Hizmet Hesabına Container Analizi Notları Ekleyici rolünü ekleyin:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
  --role roles/containeranalysis.notes.attacher

Özel Derleme Cloud Build Adımını Hazırlama

Onay sürecini basitleştirmek için Cloud Build'de bir Özel Derleme adımı kullanacaksınız. Süreci kolaylaştırmak için yardımcı işlevlerin yer aldığı bu Özel Derleme adımı Google tarafından sunulmaktadır. Özel derleme adımının kodu kullanılmadan önce bir container'da derlenmeli ve Cloud Build'e aktarılmalıdır. Bunun için şu komutları çalıştırın:

git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
cd cloud
-builders-community/binauthz-attestation
gcloud builds submit
. --config cloudbuild.yaml
cd
../..
rm
-rf cloud-builders-community

cloudbuild.yaml dosyanıza bir imzalama adımı ekleyin

Bu adımda, daha önce derlediğiniz Cloud Build ardışık düzeninize onay adımını ekleyeceksiniz.

  1. Ekleyeceğiniz yeni adımı inceleyin.

Yalnızca yorum. Kopyalama

#Sign the image only if the previous severity check passes
- id: 'create-attestation'
  name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
  args:
    - '--artifact-url'
    - 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image'
    - '--attestor'
    - 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
    - '--keyversion'
    - 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'
  1. Güncellenen ve eksiksiz ardışık düzeni kullanarak cloudbuild.yaml dosyanızın üzerine yazın.
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']


#Sign the image only if the previous severity check passes
- id: 'create-attestation'
  name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
  args:
    - '--artifact-url'
    - 'us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image:good'
    - '--attestor'
    - 'projects/${PROJECT_ID}/attestors/$ATTESTOR_ID'
    - '--keyversion'
    - 'projects/${PROJECT_ID}/locations/$KEY_LOCATION/keyRings/$KEYRING/cryptoKeys/$KEY_NAME/cryptoKeyVersions/$KEY_VERSION'



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

Derlemeyi Çalıştırma

gcloud builds submit

Cloud Build Geçmişi'nde derlemeyi inceleme

Cloud Console'da Cloud Derleme Geçmişi sayfasını açıp bu son derlemeyi ve derleme adımlarının başarıyla yürütüldüğünü inceleyin.

8. Giriş Denetim Politikaları

İkili Program Yetkilendirmesi, bir container görüntüsünün çalıştırılmasına izin verilmeden önce kuralları doğrulama olanağı sunan GKE ve Cloud Run'daki bir özelliktir. Doğrulama, güvenilir CI/CD ardışık düzeninden görüntü çalıştırma isteklerinde veya görüntüyü manuel olarak dağıtmaya çalışan kullanıcılarda yürütülür. Bu özellik, çalışma zamanı ortamlarınızı tek başına CI/CD ardışık düzen kontrollerinden daha etkili şekilde güvence altına almanıza olanak tanır.

Bu özelliği anlamak için varsayılan GKE politikasını sıkı bir yetkilendirme kuralını zorunlu kılacak şekilde değiştirmeniz gerekir.

GKE kümesini oluşturma

GKE kümesini oluşturun:

gcloud beta container clusters create binauthz \
   
--zone us-central1-a  \
   
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE

Cloud Build'in bu kümeye dağıtım yapmasına izin verin:

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

Tüm Politikalara İzin Ver

Öncelikle varsayılan politika durumunu ve herhangi bir görüntüyü dağıtabildiğinizi doğrulayın

  1. Mevcut politikayı inceleyin
gcloud container binauthz policy export
  1. Yaptırım politikasının ALWAYS_ALLOW olarak ayarlandığına dikkat edin

evaluationMode: ALWAYS_ALLOW

  1. İstediğiniz her şeyi dağıtabildiğinizi doğrulamak için Sample'ı dağıtma
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
  1. Dağıtımın çalıştığını doğrulama
kubectl get pods

Aşağıdaki çıkışı görürsünüz

161db370d99ffb13.png

  1. Dağıtımı silin
kubectl delete pod hello-server

Tüm Politikaları Reddet

Şimdi politikayı hiçbir resme izin vermeyecek şekilde güncelleyin.

  1. Geçerli politikayı düzenlenebilir bir dosyaya aktarın
gcloud container binauthz policy export  > policy.yaml
  1. Politikayı değiştir

Bir metin düzenleyicide, AssessMode'u ALWAYS_ALLOW yerine ALWAYS_DENY olarak değiştirin.

edit policy.yaml

Politika YAML dosyası aşağıdaki gibi görünmelidir:

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_DENY
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy
  1. Terminal'i açıp yeni politikayı uygulayın ve değişikliğin uygulanması için birkaç saniye bekleyin
gcloud container binauthz policy import policy.yaml
  1. Örnek iş yükü dağıtımını deneme
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
  1. Dağıtım aşağıdaki mesaj nedeniyle başarısız oluyor
Error from server (VIOLATES_POLICY): admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image gcr.io/google-samples/hello-app:1.0 denied by Binary Authorization default admission rule. Denied by always_deny admission rule

Tümüne izin vermek için politikayı geri alın

Bir sonraki bölüme geçmeden önce politika değişikliklerini geri aldığınızdan emin olun

  1. Politikayı değiştir

Bir metin düzenleyicide AssessMode'u ALWAYS_DENY yerine ALWAYS_ALLOW olarak değiştirin.

edit policy.yaml

Politika YAML dosyası aşağıdaki gibi görünmelidir:

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_ALLOW
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy
  1. Geri alınan politikayı uygula
gcloud container binauthz policy import policy.yaml

9. GKE&#39;de Güvenlik Açıklarını Engelle

Bu bölümde, görüntüleri tarayıp görüntüyü imzalayıp dağıtmaya çalışmadan önce güvenlik açıklarını kontrol eden Cloud Build ile bir CI/CD ardışık düzeni uygulayarak şu ana kadar öğrendiklerinizi birleştireceksiniz. GKE, görüntünün çalıştırılmasına izin vermeden önce güvenlik açığı taramasından bir imzaya sahip olduğunu doğrulamak için İkili Program Yetkilendirmesi'ni kullanır.

d5c41bb89e22fd61.png

GKE Politikasını Onay Gerektirecek Şekilde Güncelleme

GKE BinAuth Politikanıza kümenizAdmissionRules ekleyerek görüntülerin Onaylayan tarafından imzalanmasını zorunlu kılın

Aşağıdaki komutu kullanarak güncel yapılandırmayı politikanın üzerine yazın.

COMPUTE_ZONE=us-central1-a

cat
> binauth_policy.yaml << EOM
defaultAdmissionRule
:
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
  evaluationMode: ALWAYS_DENY
globalPolicyEvaluationMode
: ENABLE
clusterAdmissionRules
:
  ${COMPUTE_ZONE}.binauthz:
    evaluationMode: REQUIRE_ATTESTATION
    enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
    requireAttestationsBy:
    - projects/${PROJECT_ID}/attestors/vulnz-attestor
EOM

Politikayı uygula

gcloud beta container binauthz policy import binauth_policy.yaml

İmzasız görüntüyü dağıtmayı dene

Aşağıdaki komutu kullanarak daha önce oluşturduğunuz uygulama için bir dağıtım tanımlayıcısı oluşturun. Burada kullanılan görüntü, daha önce oluşturduğunuz, kritik güvenlik açıkları içeren ve imzalı onayı İÇERMEYEN görüntüdür.

GKE kabul denetleyicilerinin, imzayı tutarlı bir şekilde doğrulamak için dağıtılacak tam görüntüyü bilmesi gerekir. Bunun için, basit bir etiket yerine resim özetini kullanmanız gerekir.

Kötü görüntü için görüntü özetini alın

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


DIGEST
=$(gcloud container images describe ${CONTAINER_PATH}:bad \
    --format='get(image_summary.digest)')

Özeti Kubernetes yapılandırmasında kullanma

cat > deploy.yaml << EOM
apiVersion
: v1
kind
: Service
metadata
:
  name: deb-httpd
spec
:
  selector:
    app: deb-httpd
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
apiVersion
: apps/v1
kind
: Deployment
metadata
:
  name: deb-httpd
spec
:
  replicas: 1
  selector:
    matchLabels:
      app: deb-httpd
  template:
    metadata:
      labels:
        app: deb-httpd
    spec:
      containers:
      - name: deb-httpd
        image: ${CONTAINER_PATH}@${DIGEST}
        ports:
        - containerPort: 8080
        env:
          - name: PORT
            value: "8080"

EOM

Uygulamayı GKE'ye dağıtmayı dene

kubectl apply -f deploy.yaml

Konsoldaki iş yükünü inceleyin ve dağıtımın reddedildiğini belirten hataya dikkat edin:

No attestations found that were valid and signed by a key trusted by the attestor

İmzalanmış bir görüntü dağıtın

Kötü görüntü için görüntü özetini alın

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


DIGEST
=$(gcloud container images describe ${CONTAINER_PATH}:good \
    --format='get(image_summary.digest)')

Özeti Kubernetes yapılandırmasında kullanma

cat > deploy.yaml << EOM
apiVersion
: v1
kind
: Service
metadata
:
  name: deb-httpd
spec
:
  selector:
    app: deb-httpd
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
---
apiVersion
: apps/v1
kind
: Deployment
metadata
:
  name: deb-httpd
spec
:
  replicas: 1
  selector:
    matchLabels:
      app: deb-httpd
  template:
    metadata:
      labels:
        app: deb-httpd
    spec:
      containers:
      - name: deb-httpd
        image: ${CONTAINER_PATH}@${DIGEST}
        ports:
        - containerPort: 8080
        env:
          - name: PORT
            value: "8080"

EOM

Uygulamayı GKE'ye dağıtma

kubectl apply -f deploy.yaml

Konsoldaki iş yükünü inceleyin ve resmin başarılı bir şekilde dağıtıldığını not edin.

10. Tebrikler!

Tebrikler, codelab'i tamamladınız.

İşlediğimiz konular:

  • Otomatik tarama nasıl etkinleştirilir?
  • İsteğe Bağlı Tarama nasıl yapılır?
  • Derleme ardışık düzenine tarama entegre etme
  • Onaylanmış resimleri imzalama
  • Görüntüleri engellemek için GKE Giriş denetleyicilerini kullanma
  • GKE'yi yalnızca imzalı onaylanmış görüntülere izin verecek şekilde yapılandırma

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ırmayı ortadan kaldırmanın en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.