Container Derlemelerinin Güvenliğini Sağlama

1. Giriş

ead1609267034bf7.png

Yazılım güvenlik açıkları, sistemin kazara arızalanmasına neden olabilecek veya kötü niyetli kişilere yazılımınızın güvenliğini tehlikeye atma imkanı verebilecek zayıf noktalardır. Container Analysis, container'lardaki güvenlik açıklarını bulmak için iki tür işletim sistemi taraması sağlar:

  • On-Demand Scanning API, container görüntülerini işletim sistemi güvenlik açıkları için bilgisayarınızda yerel olarak veya Container Registry ya da Artifact Registry'de uzaktan manuel olarak taramanıza olanak tanır.
  • Container Scanning API, bir görüntüyü Container Registry veya Artifact Registry'ye her aktardığınızda işletim sistemi güvenlik açığı tespitini ve taramayı otomatikleştirmenize olanak tanır. Bu API'nin etkinleştirilmesi, Go ve Java güvenlik açıkları için dil paketi taramalarını da etkinleştirir.

On-Demand Scanning API, bilgisayarınızda yerel olarak veya Container Registry ya da Artifact Registry'de uzaktan depolanan görüntüleri taramanıza olanak tanır. Bu sayede, güvenlik açığı taraması yapmak istediğiniz kapsayıcılar üzerinde ayrıntılı kontrol sahibi olursunuz. 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 isteğe bağlı taramayı kullanabilirsiniz.

Neler öğreneceksiniz?

Bu laboratuvarda şunları yapacaksınız:

  • Cloud Build ile görüntü oluşturma
  • Kapsayıcılar için Artifact Registry'yi kullanma
  • Otomatik güvenlik açığı taramasından yararlanma
  • İsteğe bağlı taramayı yapılandırma
  • Cloud Build'de CICD'ye görüntü tarama ekleme

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

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

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. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Ortam Kurulumu

Cloud Shell'de projenizin proje 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 

3. Cloud Build ile görüntü oluşturma

Bu bölümde, kapsayıcı görüntünüzü oluşturacak, tarayacak ve ardından sonuçları değerlendirecek otomatik bir derleme ardışık düzeni oluşturacaksınız. CRITICAL (Kritik) düzeyde güvenlik açığı bulunmazsa görüntü depoya gönderilir. CRITICAL (Kritik) güvenlik açıkları bulunursa derleme başarısız olur ve çıkılır.

Cloud Build hizmet hesabına erişim sağlama

Cloud Build'in, isteğe bağlı tarama API'sine erişim haklarına sahip olması gerekir. Aşağıdaki komutlarla erişim sağlayın.

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 değiştirme

mkdir vuln-scan && cd vuln-scan

Örnek resim tanımlama

Aşağıdaki içeriklere sahip Dockerfile adlı 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çeriklere 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ı derleme işlemiyle sınırlıdır. Ancak uygulamada, kapsayıcı adımlarına ek olarak uygulamaya özel talimatlar ve testler de 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ı inceleme

Derleme süreci başladıktan sonra Cloud Build kontrol panelinde inceleme ilerleme durumunu görüntüleyin.

  1. Cloud Console'da Cloud Build'u açın.
  2. İçerikleri görüntülemek için derlemeyi tıklayın.

4. Container'lar için Artifact Registry

Artifact Registry deposu oluşturma

Bu laboratuvarda, resimlerinizi 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"

Artifact Registry'ye erişirken gcloud kimlik bilgilerinizi kullanmak için Docker'ı yapılandırın.

gcloud auth configure-docker us-central1-docker.pkg.dev

Cloud Build ardışık düzenini güncelleme

Oluşan görüntüyü 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ı

Yeni bir görüntüyü Artifact Registry veya Container Registry'ye her aktardığınızda yapay ürün taraması otomatik olarak tetiklenir. Yeni güvenlik açıkları keşfedildikçe güvenlik açığı bilgileri sürekli olarak güncellenir. Bu bölümde, yeni oluşturduğunuz ve Artifact Registry'ye aktardığınız görüntüyü inceleyip güvenlik açığı sonuçlarını keşfedeceksiniz.

Resim ayrıntılarını inceleme

Önceki derleme işlemi tamamlandıktan sonra Artifact Registry kontrol panelinde görüntü ve güvenlik açığı sonuçlarını inceleyin.

  1. Cloud Console'da Artifact Registry'yi açın.
  2. İçerikleri görüntülemek için artifact-scanning-repo'yu tıklayın.
  3. Görsel ayrıntılarını tıklayın.
  4. Resminizin en son özetini tıklayın.
  5. Tarama tamamlandıktan sonra, resimle ilgili güvenlik açıkları sekmesini tıklayın.

Güvenlik açıkları sekmesinde, yeni oluşturduğunuz görüntü için otomatik tarama sonuçlarını görürsünüz.

361be7b3bf293fca.png

Otomatik tarama varsayılan olarak etkindir. Otomatik taramayı nasıl devre dışı bırakabileceğinizi/etkinleştirebileceğinizi görmek için Artifact Registry ayarlarını inceleyin.

6. İsteğe Bağlı Tarama

Görüntüyü depoya aktarmadan önce tarama yapmanız gerekebileceği çeşitli senaryolar vardır. Örneğin, bir kapsayıcı geliştiricisi, kodu kaynak denetimine göndermeden önce bir görüntüyü tarayıp sorunları düzeltebilir. Aşağıdaki örnekte, sonuçlara göre işlem yapmadan önce görüntüyü yerel olarak oluşturup analiz edeceksiniz.

Görsel oluşturma

Bu adımda, görüntüyü yerel önbelleğinize 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. Tarama sonuçları bir meta veri sunucusunda saklanı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 saklanan önceki adımın çıktısını inceleyin. Meta veri sunucusundaki 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 çıktı 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çeriyor.

Kritik sorunları işaretleme

İnsanlar, raporda saklanan verileri nadiren doğrudan 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çığı bulunup bulunmadığını 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 çıkışı şu şekilde olur:

Failed vulnerability check for CRITICAL level

7. Cloud Build ile CICD'de tarama

Cloud Build hizmet hesabına erişim sağlama

Cloud Build'in, isteğe bağlı tarama API'sine erişim haklarına sahip olması gerekir. Aşağıdaki komutlarla erişim sağlayın.

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ı derleme işlemiyle sınırlıdır. Ancak uygulamada, kapsayıcı adımlarına ek olarak uygulamaya özel talimatlar ve testler de 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

CRITICAL (Kritik) önem derecesinde bir güvenlik açığı bulunduğunda derlemenin bozulduğunu doğrulamak için derlemeyi işlenmek üzere gönderin.

gcloud builds submit

Derleme hatasını inceleme

Yeni gönderdiğiniz derleme, resimde KRİTİK güvenlik açıkları olduğundan başarısız olacak.

Cloud Build 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 resim kullanacak şekilde güncelleyin.

Aşağıdaki komutla Dockerfile'ı Debian 10 görüntüsünü kullanacak şekilde ü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ırın

CRITICAL (Kritik) önem derecesinde güvenlik açığı bulunmadığında derlemenin başarılı olacağını doğrulamak için derlemeyi işlenmek üzere gönderin.

gcloud builds submit

Build'in başarısını inceleme

Güncellenen resimde KRİTİK güvenlik açığı bulunmadığından, az önce 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 Registry'deki iyi görüntüyü inceleyin.

  1. Cloud Console'da Artifact Registry'yi açın.
  2. İçerikleri görüntülemek için artifact-scanning-repo'yu tıklayın.
  3. Görsel 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ü oluşturma
  • 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ğitimde kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini önlemek amacıyla kaynakları içeren projeyi silin veya projeyi koruyup 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.03.2023