İkili Program Yetkilendirmesi ile Dağıtımları Sınırlama

1. Giriş

İkili Program Yetkilendirmesi, Google Kubernetes Engine (GKE) veya Cloud Run'da yalnızca güvenilir container görüntülerinin dağıtılmasını sağlayan ve dağıtım zamanında gerçekleştirilen güvenlik kontrolüdür. İkili Program Yetkilendirmesi ile geliştirme sürecinde görüntülerin güvenilir yetkililer tarafından imzalanmasını isteyebilir ve ardından dağıtım sırasında imza doğrulamasını zorunlu kılabilirsiniz. Doğrulamayı zorunlu kılarak yalnızca doğrulanan görüntülerin derleme ve sürüm sürecine entegre edilmesini sağlayıp container'ınız üzerinde daha fazla kontrole sahip olabilirsiniz.

Aşağıdaki şemada İkili Program Yetkilendirmesi/Cloud Build kurulumundaki bileşenler gösterilmektedir:

Cloud Build İkili Program Yetkilendirmesi onay ardışık düzeni.**Şekil 1.**İkili Program Yetkilendirmesi onayı oluşturan Cloud Build ardışık düzeni.

Bu ardışık düzende:

  1. Container görüntüsünü derleme kodu, Cloud Source Repositories gibi bir kaynak depoya aktarılır.
  2. Sürekli entegrasyon (CI) aracı olan Cloud Build, container'ı oluşturur ve test eder.
  3. Derleme, container görüntüsünü Container Registry'ye veya derlenen görüntülerinizi depolayan başka bir kayıt defterine aktarır.
  4. Şifreleme anahtar çifti için anahtar yönetimi sağlayan Cloud Key Management Service, container görüntüsünü imzalar. Ortaya çıkan imza, daha sonra yeni oluşturulan onayda saklanır.
  5. Dağıtım sırasında onaylayan, anahtar çiftinin ortak anahtarını kullanarak onayı doğrular. İkili Program Yetkilendirmesi, container görüntüsünün dağıtımı için imzalı onaylar gerektirerek politikayı uygular.

Bu laboratuvarda, dağıtılan yapıların güvenliğini sağlamaya yönelik araç ve tekniklere odaklanacaksınız. Bu laboratuvarda, oluşturulan ancak belirli bir ortama dağıtılmayan yapılara (container'lara) odaklanır.

Neler öğreneceksiniz?

  • Resim İmzalama
  • Giriş Denetim Politikaları
  • Taranan Görüntüleri İmzalama
  • İmzalanmış Görüntüleri Yetkilendirme
  • İmzalanmamış Engellenmiş Resimler

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.

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 

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

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

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.

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

3. Resim İmzalama

Onaylayan nedir?

Onaylayan

  • Bu kişi/süreç, sistemin güven zincirindeki bir bağlantıdan sorumludur.
  • Şifreleme anahtarının sahibidirler ve onay sürecinden geçerse bir resmi imzalarlar.
  • Politika Oluşturucu politikayı üst düzey ve soyut bir şekilde belirlerken Onaylayan, politikanın bazı yönlerinin somut bir şekilde uygulanmasından sorumludur.
  • Kalite güvencesi test uzmanı veya yönetici gibi gerçek bir kişi olabilir veya CI sisteminde bot olabilir.
  • Sistemin güvenliği güvenilirliklerine bağlıdır. Bu nedenle, özel anahtarların güvenli bir şekilde tutulması önemlidir.

Bu rollerin her biri, kuruluşunuzdaki bir kişiyi veya bir ekibi temsil edebilir. Üretim ortamında, bu roller muhtemelen ayrı Google Cloud Platform (GCP) projeleri tarafından yönetilir ve kaynaklara erişim, Cloud IAM kullanılarak sınırlı şekilde ikisi arasında paylaşılır.

a37eb2ed54b9c2eb.png

İkili Program Yetkilendirmesi'ndeki tasdik edenler Cloud Container Analysis API'nin üzerinde uygulanır. Bu nedenle, ilerlemeden önce bunun nasıl işlediğini açıklamak önemlidir. Container Analysis API, meta verileri belirli container görüntüleriyle ilişkilendirmenize olanak tanıyacak şekilde tasarlanmıştır.

Örneğin, Heartbleed güvenlik açığını takip etmek için not oluşturulabilir. Daha sonra güvenlik tedarikçileri, container görüntülerini güvenlik açığına karşı test etmek üzere tarayıcılar oluşturur ve güvenliği ihlal edilen her container ile ilişkili bir Olay oluşturur.

208aa5ebc53ff2b3.png

Container Analizi, güvenlik açıklarını izlemenin yanı sıra genel bir meta veri API'si olacak şekilde tasarlandı. İkili Program Yetkilendirmesi, imzaları doğruladıkları container görüntüleriyle ilişkilendirmek için Container Analizi'ni kullanır**.** Tek bir onaylayanı temsil etmek için Container Analizi Notu kullanılır. Olaylar oluşturulur ve onaylayanın onayladığı her bir container'la ilişkilendirilir.

İkili Program Yetkilendirmesi API'si "onaylayanlar" kavramlarını kullanır "onaylar", ancak bunlar Container Analysis API'deki ilgili Notlar ve Olaylar kullanılarak uygulanır.

63a701bd0057ea17.png

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.

919f997db0ffb881.png

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}"

Notunuz artık Container Analysis API'ye kaydedildi.

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. Onaylayandan yararlanmak için notu İkili Program Yetkilendirmesine de kaydetmeniz gerekir:

ed05d438c79b654d.png

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

1e3af7c177f7a311.png

Bu onaylayanı kullanabilmeniz için yetkilinizin, kapsayıcı görüntülerini imzalamak için kullanılabilecek bir şifreleme anahtar çifti oluşturması gerekir. Bu işlem, Google Cloud Key Management Service (KMS) aracılığıyla yapılabilir.

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

858d7e6feeb6f159.png

Onay, onaylayanın belirli bir container görüntüsünü doğruladığını ve kümenizde güvenle çalıştırılabileceğini belirten kriptografik bir imza içermelidir. Hangi container görüntüsünün onaylanacağını belirtmek için özetini belirlemeniz gerekir.

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}

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

İkili program yetkilendirmesi etkin halde 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

Bu politika nispeten basittir. globalPolicyEvaluationMode satırı, bu politikanın Google tarafından tanımlanan genel politikayı genişlettiğini beyan eder. Bu sayede tüm resmi GKE container'ları varsayılan olarak çalışabilir. Ayrıca politika, diğer tüm kapsüllerin reddedileceğini belirten bir defaultAdmissionRule bildirir. Kabul kuralı, bu kurala uygun olmayan tüm kapsüllerin kümede çalışmasının engellenmesi gerektiğini belirten bir enforcementMode satırı içerir.

Daha karmaşık politikaların nasıl oluşturulacağıyla ilgili talimatlar için İkili Program Yetkilendirmesi dokümanlarına bakın.

657752497e59378c.png

  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

5. Taranan Görüntüleri İmzalama

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 Şifreleme Anahtarı İ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

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"

Ö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, onay adımını Cloud Build ardışık düzeninize ekleyeceksiniz.

  1. Aşağıdaki imzalama adımını 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. Aşağıdaki ardışık düzenin tamamını kullanarak cloudbuild.yaml dosyası 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.

6. İmzalanmış Görüntüleri Yetkilendirme

Bu bölümde, görüntünün çalıştırılmasına izin vermeden önce görüntünün Güvenlik Açığı taramasından bir imzaya sahip olduğunu doğrulamak için GKE'yi İkili Program Yetkilendirmesi'ni kullanacak şekilde güncelleyeceksiniz.

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

Kümeniz şu anda tek bir kuralla politika çalıştırıyor: resmi depolardan container'lara izin ver ve diğerlerini reddediyor.

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

Diskte, updated_policy.yaml adlı yeni bir dosyanız olur. Artık varsayılan kural tüm görüntüleri reddetmek yerine önce onaylayanınızı doğrulamalar için kontrol ediyor.

822240fc0b02408e.png

Yeni politikayı İkili Program Yetkilendirmesine yükleyin:

gcloud beta container binauthz policy import binauth_policy.yaml

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

İyi bir görsel 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.

7. İmzalanmamış Engellenmiş Resimler

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:bad .

İmzasız görüntüyü depoya aktarma

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

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

8. Tebrikler!

Tebrikler, codelab'i tamamladınız.

İşlediğimiz konular:

  • Resim İmzalama
  • Giriş Denetim Politikaları
  • Taranan Görüntüleri İmzalama
  • İmzalanmış Görüntüleri Yetkilendirme
  • İmzalanmamış Engellenmiş Resimler

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.

Son güncelleme: 21.03.2023