Bu codelab hakkında
1. Giriş
Yazılım güvenlik açıkları, kazara sistem hatasına neden olabilecek veya kötü niyetli kişilere yazılımınızın güvenliğini ihlal edecek bir yol sunabilecek zayıf noktalardır. Container Analizi, kapsayıcılardaki güvenlik açıklarını bulmak için iki tür işletim sistemi taraması sağlar:
- İsteğe Bağlı Tarama API'si, container görüntülerini bilgisayarınızda yerel olarak veya Container Registry ya da Artifact Registry'de işletim sistemi güvenlik açıklarına karşı manuel olarak taramanıza olanak tanır.
- Container Scanning API'si, Container Registry veya Artifact Registry'ye her görüntü aktarışınızda tarama yaparak işletim sistemi güvenlik açığı algılamasını otomatikleştirmenizi sağlar. Bu API'nin etkinleştirilmesi, Go ve Java güvenlik açıkları için dil paketi taramalarını da etkinleştirir.
İsteğe Bağlı Tarama API'si, bilgisayarınızda yerel olarak veya Container Registry ya da Artifact Registry'de depolanan görüntüleri taramanıza olanak tanır. Bu sayede, güvenlik açıklarına karşı taramak istediğiniz container'ları ayrıntılı olarak kontrol edebilirsiniz. Görüntüleri bir kayıt defterinde depolayıp depolamayacağınıza karar vermeden önce CI/CD ardışık düzeninizdeki görüntüleri taramak için İsteğe Bağlı Tarama'yı kullanabilirsiniz.
Neler öğreneceksiniz?
Bu laboratuvarda şunları öğreneceksiniz:
- Cloud Build ile Görüntü Derleme
- Container'lar için Artifact Registry kullanma
- Otomatik güvenlik açığı taramasını kullanma
- İsteğe Bağlı Taramayı Yapılandırma
- Cloud Build'de CICD'ye görüntü tarama ekleme
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ş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
3. Cloud Build ile Görüntü 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"
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
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: ['-']
EOF
CI ardışık düzenini çalıştırma
Derlemeyi işlenmek üzere gönderme
gcloud builds submit
Derleme Ayrıntılarını İnceleme
Derleme işlemi Başladıktan sonra, Cloud Build kontrol panelinde ilerleme durumunu inceleyin.
- Cloud Console'da Cloud Build'i açın
- İçindekileri görmek için derlemeyi tıklayın
4. Container'lar için Artifact Registry
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
Cloud Build ardışık düzenini güncelleme
Elde edilen görüntüyü Artifact Registry'ye aktarmak için derleme ardışık düzeninizi değiştirin
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: ['-']
# push 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']
images:
- us-central1-docker.pkg.dev/${PROJECT_ID}/artifact-scanning-repo/sample-image
EOF
CI ardışık düzenini çalıştırma
Derlemeyi işlenmek üzere gönderme
gcloud builds submit
5. Otomatik güvenlik açığı taraması
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, yeni derleyip Artifact Registry'ye aktardığınız görüntüyü ve güvenlik açığı sonuçlarını inceleyeceksiniz.
Resim Ayrıntılarını İnceleyin
Önceki 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.
6. İsteğe Bağlı Tarama
Görüntüyü bir 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
7. Cloud Build ile CICD'de Tarama
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 güncelleme
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
8. Tebrikler!
Tebrikler, codelab'i tamamladınız.
İşlediğimiz konular:
- Cloud Build ile Görüntü Derleme
- Container'lar için Artifact Registry
- Otomatik güvenlik açığı taraması
- İsteğe Bağlı Tarama
- Cloud Build ile CICD'de Tarama
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