İ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ü oluşturacak kod, Cloud Source Repositories gibi bir kaynak deposuna aktarılır.
  2. Sürekli entegrasyon (CI) aracı olan Cloud Build, kapsayıcıyı oluşturur ve test eder.
  3. Derleme, kapsayıcı görüntüsünü Container Registry'ye veya derlenen görüntülerinizi depolayan başka bir kayıt defterine gönderir.
  4. Cloud Key Management Service, şifreleme anahtarı çifti için anahtar yönetimi sağlar ve kapsayıcı görüntüsünü imzalar. Elde edilen imza, yeni oluşturulan bir onayda saklanır.
  5. Onaylayıcı, dağıtım sırasında anahtar çiftindeki ortak anahtarı kullanarak onayı doğrular. İkili Program Yetkilendirmesi, container görüntüsünü dağıtmak için imzalı onaylar gerektirerek politikayı zorunlu kılar.

Bu laboratuvarda, dağıtılan yapıların güvenliğini sağlama araçlarına ve tekniklerine odaklanacaksınız. Bu laboratuvarda, oluşturulduktan sonra belirli bir ortama dağıtılmamış yapay nesneler (kapsayıcılar) üzerinde durulmaktadır.

Neler öğreneceksiniz?

  • Resim İmzalama
  • Kabul Denetimi Politikaları
  • Taranmış Görüntüleri İmzalama
  • İmzalı görüntüleri yetkilendirme
  • Engellenen imzasız resimler

2. Kurulum ve Gereksinimler

Yönlendirmesiz 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. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Ortam Kurulumu

Cloud Shell'de projenizin proje 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, resimlerinizi 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"

Artifact Registry'ye erişirken gcloud kimlik bilgilerinizi kullanmak için Docker'ı yapılandırın.

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

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

mkdir vuln-scan && cd vuln-scan

Örnek resim tanımlama

Aşağıdaki içeriklere sahip Dockerfile adlı 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çeriklere 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

Görüntüyü oluşturma ve AR'ye gönderme

Container'ınızı oluşturmak 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/işlem, sistemin güven zincirindeki bir bağlantıdan sorumludur.
  • Şifreleme anahtarı bulundurur ve onay sürecinden geçen resimleri imzalar.
  • Politika Oluşturucu, politikayı üst düzey ve soyut bir şekilde belirlerken Onaylayıcı, politikanın belirli bir yönünü somut olarak uygulamaktan sorumludur.
  • Kalite güvencesi test kullanıcısı veya yönetici gibi gerçek bir kişi ya da bir CI sistemindeki bot olabilir.
  • Sistemin güvenliği, bu kişilerin güvenilirliğine bağlıdır. Bu nedenle, özel anahtarlarının güvenli bir şekilde saklanması önemlidir.

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

a37eb2ed54b9c2eb.png

İkili Program Yetkilendirmesi'ndeki onaylayanlar Cloud Container Analysis API'nin üzerinde uygulanır. Bu nedenle, devam etmeden önce bu API'nin nasıl çalıştığını açıklamak önemlidir. Container Analysis API, meta verileri belirli container görüntüleriyle ilişkilendirmenize olanak tanımak için tasarlanmıştır.

Örneğin, Heartbleed güvenlik açığını izlemek için bir not oluşturulabilir. Güvenlik sağlayıcılar daha sonra container görüntülerini güvenlik açığına karşı test etmek için tarayıcılar oluşturur ve her saldırıya uğramış container ile ilişkili bir Occurrence oluşturur.

208aa5ebc53ff2b3.png

Container Analysis, güvenlik açıklarını izlemenin yanı sıra genel bir meta veri API'si olarak tasarlanmıştır. İkili Program Yetkilendirmesi, doğrulamakta olduğu container görüntüleriyle imzaları ilişkilendirmek için Container Analizi'ni kullanır**.** Container Analysis Note, tek bir onaylayıcıyı temsil etmek için kullanılır. Olaylar, onaylayıcının onayladığı her kapsayıcı için oluşturulur ve bu kapsayıcılarla ilişkilendirilir.

İkili Program Yetkilendirme API'si "onaylayıcı" ve "onay" kavramlarını kullanır ancak bunlar Container Analysis API'de ilgili Notlar ve Olaylar kullanılarak uygulanır.

63a701bd0057ea17.png

Onaylayan Notu Oluşturma

Onaylayıcı Notu, uygulanan imza türü için etiket görevi gören küçük bir veri parçasıdır. Örneğin, bir not güvenlik açığı taramasını belirtirken diğeri kalite güvencesi onayı için kullanılabilir. Not, imzalama sürecinde referans olarak kullanılır.

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

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

Onaylayıcılar, gerçek görüntü imzalama sürecini gerçekleştirmek için kullanılır ve daha sonra doğrulamak üzere notun bir örneğini görüntüye ekler. Onaylayıcınızı kullanmak için notu İkili Program Yetkilendirmesi ile 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ğrulama

gcloud container binauthz attestors list

Son satırda NUM_PUBLIC_KEYS: 0 anahtarları daha sonraki bir adımda sağlayacağınız belirtilir.

Ayrıca, Cloud Build'ün, görüntü oluşturan bir derleme çalıştırdığınızda projenizde built-by-cloud-build onaylayıcısını otomatik olarak oluşturduğunu da unutmayın. Bu nedenle, yukarıdaki komut vulnz-attestor ve built-by-cloud-build olmak üzere iki onaylayıcı döndürür. Görüntüler başarıyla oluşturulduktan sonra Cloud Build bunları otomatik olarak imzalar ve onaylar oluşturur.

IAM rolü ekleme

İkili Program Yetkilendirmesi hizmet hesabının, onay notlarını görüntüleme haklarına sahip olması gerekir. Aşağıdaki API çağrısıyla 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 onaylayıcıyı kullanabilmeniz için yetkilinizin, kapsayıcı görüntülerini imzalamak üzere 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ı açıklayan bazı ortam değişkenleri ekleyin.

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

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

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

Onaylayıcı için yeni bir asimetrik imzalama anahtarı çifti oluşturun.

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

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

Şimdi gcloud binauthz komutuyla anahtarı onaylayıcı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}"

Yetkililer listesini tekrar yazdırırsanız artık kayıtlı bir anahtar görmeniz gerekir:

gcloud container binauthz attestors list

İmzalı onay oluşturma

Bu noktada, resimleri imzalamanızı sağlayan özellikler yapılandırılmış olur. Daha önce oluşturduğunuz onaylayıcıyı kullanarak üzerinde çalıştığınız kapsayıcı görüntüsünü imzalayın.

858d7e6feeb6f159.png

Bir onay, onaylayanın belirli bir container görüntüsünü doğruladığını ve kümenizde güvenli bir şekilde çalıştırılabileceğini belirten bir kriptografik imza içermelidir. Hangi kapsayıcı 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 gcloud'u kullanarak onayınızı oluşturabilirsiniz. Komut, yalnızca imzalama 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}"

Kapsayıcı Analizi terimleriyle ifade edersek bu işlem, yeni bir oluşum oluşturur ve bunu onaylayıcınızı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. Kabul Denetimi Politikaları

İkili Program Yetkilendirmesi, GKE ve Cloud Run'da bulunan ve bir container görüntüsünün çalışmasına izin verilmeden önce kuralların doğrulanmasını sağlayan bir özelliktir. Doğrulama, güvenilir bir CI/CD ardışık düzeninden veya bir kullanıcının manuel olarak dağıtmaya çalıştığı bir resimden gelen resim çalıştırma isteği üzerine gerçekleştirilir. Bu özellik, çalışma zamanı ortamlarınızı yalnızca CI/CD ardışık düzen kontrollerine kıyasla daha etkili bir şekilde güvenceye almanıza olanak tanır.

Bu özelliği anlamak için varsayılan GKE politikasını değiştirerek katı bir yetkilendirme kuralı uygulayacaksınız.

GKE kümesini oluşturma

İkili program yetkilendirmesi etkin olarak 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üne İzin Ver Politikası

Öncelikle varsayılan politika durumunu ve herhangi bir resmi dağıtma olanağınızı doğrulayın.

  1. Mevcut politikayı inceleme
gcloud container binauthz policy export
  1. Yaptırım politikasının ALWAYS_ALLOW olarak ayarlandığını unutmayın.

evaluationMode: ALWAYS_ALLOW

  1. Her şeyi dağıtabildiğinizi doğrulamak için örneği dağıtın.
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ünü Reddetme Politikası

Şimdi politikayı tüm resimlere izin vermeyecek şekilde güncelleyin.

  1. Mevcut politikayı düzenlenebilir bir dosyaya aktarma
gcloud container binauthz policy export  > policy.yaml
  1. Politikayı değiştir

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

edit policy.yaml

Politika YAML dosyası şu şekilde 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 belirtir. Bu, tüm resmi GKE kapsayıcılarının varsayılan olarak çalışmasına olanak tanır. Ayrıca politika, defaultAdmissionRule adlı bir kural tanımlar. Bu kural, diğer tüm pod'ların reddedileceğini belirtir. 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 oluşturma talimatları için İkili Program Yetkilendirmesi belgelerini inceleyin.

657752497e59378c.png

  1. Terminal'i açıp yeni politikayı uygulayın ve değişikliğin yayılması için birkaç saniye bekleyin.
gcloud container binauthz policy import policy.yaml
  1. Örnek iş yükü dağıtımı deneme
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
  1. Dağıtım, aşağıdaki mesajla 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

Politikayı tümüne izin verecek şekilde geri döndürme

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 evaluationMode'u ALWAYS_DENY'dan ALWAYS_ALLOW olarak değiştirin.

edit policy.yaml

Politika YAML dosyası şu şekilde görünmelidir:

globalPolicyEvaluationMode: ENABLE
defaultAdmissionRule:
  evaluationMode: ALWAYS_ALLOW
  enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
name: projects/PROJECT_ID/policy
  1. Geri döndürülen politikayı uygulama
gcloud container binauthz policy import policy.yaml

5. Taranmış Görüntüleri İmzalama

Resim imzalamayı etkinleştirdiniz ve örnek resminizi imzalamak için Onaylayan'ı manuel olarak kullandınız. Uygulamada, CI/CD ardışık düzenleri gibi otomatik işlemler sırasında onayları uygulamak isteyeceksiniz.

Bu bölümde, görüntüleri otomatik olarak onaylamak için Cloud Build'i 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 Cloud KMS CryptoKey İmzalayıcı/Doğrulayıcı rolünü ekleyin (KMS tabanlı imzalama):

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 Analysis Notes Attacher 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ına erişim sağlama

Cloud Build'in, isteğe bağlı tarama API'sine erişim haklarına sahip olması gerekir. Aşağıdaki komutlarla erişim sağlayın.

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 özel derleme adımı kullanacaksınız. Google, süreci kolaylaştırmak için yardımcı işlevler içeren bu Özel Derleme adımını sağlar. Kullanımdan önce özel derleme adımının kodu bir container'a derlenmeli ve Cloud Build'e aktarılmalıdır. Bunu yapmak için aşağıdaki 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 imzalama adımı ekleme

Bu adımda, onay adımını Cloud Build işlem hattınıza ekleyeceksiniz.

  1. Aşağıdaki imzalama adımını inceleyin.

Yalnızca inceleme Kopyalamayın

#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ı içeren bir 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'u açarak Cloud Build Geçmişi sayfasını görüntüleyin ve en son derlemeyi ve derleme adımlarının başarılı şekilde yürütülmesini inceleyin.

6. İmzalı görüntüleri yetkilendirme

Bu bölümde, görüntünün çalışmasına izin vermeden önce güvenlik açığı taramasından bir imza aldığını 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 clusterAdmissionRules ekleyerek, resimlerin Onaylayanınız tarafından imzalanmasını zorunlu kılın.

Şu anda kümeniz, bir kural içeren bir politika çalıştırıyor: Resmi depolardaki kapsayıcılara izin verilir ve diğer tüm kapsayıcılar reddedilir.

Aşağıdaki komutu kullanarak politikayı güncellenmiş yapılandırmayla ü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

Artık diskte updated_policy.yaml adlı yeni bir dosyanız olmalıdır. Artık varsayılan kural tüm resimleri reddetmek yerine önce doğrulama için onaylayıcınızı kontrol eder.

822240fc0b02408e.png

Yeni politikayı İkili Program Yetkilendirmesi'ne yükleyin:

gcloud beta container binauthz policy import binauth_policy.yaml

İmzalı bir görüntüyü dağıtma

İyi 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)')

Kubernetes yapılandırmasında özet 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 görüntünün başarılı bir şekilde dağıtıldığını not edin.

7. Engellenen imzasız resimler

Görsel oluşturma

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

İmzalanmamış görüntüyü depoya aktarın.

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

Kötü resmin özetini alma

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

Kubernetes yapılandırmasında özet 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ğıtmaya çalışın.

kubectl apply -f deploy.yaml

Konsoldaki iş yükünü inceleyin ve dağıtımın reddedildiğini belirten hatayı not 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
  • Kabul Denetimi Politikaları
  • Taranmış Görüntüleri İmzalama
  • İmzalı görüntüleri yetkilendirme
  • Engellenen imzasız resimler

Sıradaki adım:

Temizleme

Bu eğitimde kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini önlemek amacıyla kaynakları içeren projeyi silin veya projeyi koruyup 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.03.2023