Container Derlemelerinin Güvenliğini Sağlama

Container Derlemelerinin Güvenliğini Sağlama

Bu codelab hakkında

subjectSon güncelleme Mar 23, 2023
account_circleYazan: Christopher Grant

1. Giriş

ead1609267034bf7.png

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

  1. 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.

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. İ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.
  1. 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.

  1. Cloud Console'da Cloud Build'i açın
  2. İçindekileri görmek için derlemeyi tıklayın

4. Container&#39;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.

  1. Cloud Console'da Artifact Registry'yi açın
  2. İçeriği görüntülemek için yapı tarama deposunu tıklayın
  3. Resim ayrıntılarını tıklayın.
  4. Resminizin en son özetini tıklayın
  5. 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.

361be7b3bf293fca.png

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&#39;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

  1. Cloud Console'da Artifact Registry'yi açın
  2. İçeriği görüntülemek için yapı tarama deposunu tıklayın
  3. Resim ayrıntılarını tıklayın.
  4. Resminizin en son özetini tıklayın
  5. 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:

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