Bu codelab hakkında
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
- 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.
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
- https://console.cloud.google.com adresinden Google projenize erişin.
- Sağ üst köşedeki Cloud Shell düzenleyici simgesini tıklayın.
- 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.
- Cloud Console'da Artifact Registry'yi açın
- İçeriği görüntülemek için yapı tarama deposunu tıklayın
- Resim ayrıntılarını tıklayın.
- Resminizin en son özetini tıklayın
- 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.
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
- Cloud Console'da Artifact Registry'yi açın
- İçeriği görüntülemek için yapı tarama deposunu tıklayın
- Resim ayrıntılarını tıklayın.
- Resminizin en son özetini tıklayın
- 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.
- 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'
- 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
- 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
- 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
9. GKE'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.
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:
- 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.