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:
**Şekil 1.**İkili Program Yetkilendirmesi onayı oluşturan Cloud Build ardışık düzeni.
Bu ardışık düzende:
- Container görüntüsünü derleme kodu, Cloud Source Repositories gibi bir kaynak depoya aktarılır.
- Sürekli entegrasyon (CI) aracı olan Cloud Build, container'ı oluşturur ve test eder.
- 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.
- Ş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.
- 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
- 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.
- 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.
- 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ş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
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.
İ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.
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.
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}"
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:
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
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.
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
- Mevcut politikayı inceleyin
gcloud container binauthz policy export
- Yaptırım politikasının
ALWAYS_ALLOW
olarak ayarlandığına dikkat edin
evaluationMode: ALWAYS_ALLOW
- İ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
- Dağıtımın çalıştığını doğrulama
kubectl get pods
Aşağıdaki çıkışı görürsünüz
- Dağıtımı silin
kubectl delete pod hello-server
Tüm Politikaları Reddet
Şimdi politikayı hiçbir resme izin vermeyecek şekilde güncelleyin.
- Geçerli politikayı düzenlenebilir bir dosyaya aktarın
gcloud container binauthz policy export > policy.yaml
- 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.
- 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
- Örnek iş yükü dağıtımını deneme
kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080
- 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
- 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
- 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 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
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.
- 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'
- 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.
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.
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 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:
- Cloud Run ve Google Kubernetes Engine'e görüntü dağıtımlarını güvenli hâle getirme | Cloud Build Belgeleri
- Hızlı Başlangıç: GKE ile İkili Program Yetkilendirmesi politikası yapılandırın | Google Cloud
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