1. Giriş
Yazılım açıkları, yanlışlıkla sistem arızasına neden olabilecek veya kötü niyetli kişilere yazılımınızın güvenliğini ihlal etmeleri için bir yol sunabilecek zayıf noktalardır. Container Analizi, container'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 işletim sistemi güvenlik açıkları açısından bilgisayarınızda yerel olarak veya Container Registry ya da Artifact Registry'de uzaktan 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'yi etkinleştirmek, 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ü Oluşturma
- 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 resim taraması ekleme
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- 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.
- 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 anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu değerlerin üçü hakkında daha fazla bilgiyi dokümanlar bölümünde 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. Google Cloud'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.
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ü oluşturma
Bu bölümde, kapsayıcı görüntünüzü oluşturacak, tarayacak ve 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 komutlarla 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"
Çalışma dizini oluşturma ve çalışma dizini olarak değiştirme
mkdir vuln-scan && cd vuln-scan
Örnek resim tanımlama
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 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
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, kapsayıcı oluşturma 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 komutu kullanarak 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 ilerlemeyi inceleyin.
- Cloud Console'da Cloud Build'i açın
- İçeriği görüntülemek 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
Oluşturulan resmi Artifact Registry'ye göndermek 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 oluşturduğunuz ve Artifact Registry'ye yüklediğiniz görüntüyü inceleyip güvenlik açığı sonuçlarını keşfedeceksiniz.
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 tamamlandıktan sonra resmin 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 kapsayıcı geliştiricisi, kodu kaynak denetimine aktarmadan önce bir görüntüyü tarayabilir ve sorunları düzeltebilir. Aşağıdaki örnekte, sonuçlara göre işlem yapmadan önce resmi yerel olarak oluşturup analiz edeceksiniz.
Görüntü oluşturma
Bu adımda, yerel önbelleğinize görüntü 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 tarama
Görüntü oluşturulduktan sonra görüntünün 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
Bir önceki adımın scan_id.txt dosyasında saklanan çıktısını inceleyin. 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ış, resimdeki tüm güvenlik açıklarıyla ilgili önemli miktarda veri içerir.
Önemli sorunları işaretleyin
İnsanlar raporda depolanan verileri nadiren kullanır. Sonuçlar genellikle 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ı şu şekilde 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 komutlarla 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, kapsayıcı oluşturma 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 komutu kullanarak 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 Derleme Hatası
Görüntüde KRİTİK güvenlik açıkları bulunduğundan, gönderdiğiniz derleme başarısız olacak.
Cloud Build Geçmişi sayfasında derleme hatasını inceleyin.
Güvenlik açığını düzeltme
Dockerfile'i, kritik güvenlik açıkları içermeyen bir temel resim kullanacak şekilde güncelleyin.
Aşağıdaki komutu kullanarak Debian 10 görüntüsünü kullanmak için Dockerfile'in ü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, önem düzeyi yüksek, kritik güvenlik açıkları 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ı inceleme
Artifact kaydındaki iyi görüntüyü inceleyin
- Cloud Console'da Artifact Registry'yi açın
- İçeriği görüntülemek için artifact-scanning-repo'yu 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.
Ele aldığımız 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'a görüntü dağıtımlarını güvenli hale getirme | Cloud Build Dokümanları
- 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ırılmanın önüne geçmenin en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.
—
Son güncelleme: 21.3.23