CodeMender ile CI/CD Ardışık Düzeninizi Güvenceye Alma

1. Başlamadan önce

CodeMender ile CI/CD Ardışık Düzeninizin Güvenliğini Sağlama konulu uygulamalı codelab'e hoş geldiniz.

Modern yazılım dağıtımında, bilinen söz dizimi kalıplarını yakalamak için statik analiz araçları (ör. CodeQL) çok önemlidir. Ancak bu araçlar genellikle iş mantığının derinliklerinde gizlenen küçük güvenlik açıklarını gözden kaçırır ve gürültülü, doğrulanmamış uyarılar oluşturur.

CodeMender (KSA yürütülebilir dosyası: cm), Google'ın Gemini destekli güvenlik akıl yürütme aracılarını dağıtarak mevcut SAST araçlarıyla birlikte çalışan CI/CD ardışık düzeninizi geliştirir:

Karmaşık iş mantığı kusurlarını ortaya çıkarma: Katı statik kalıp kurallarının ötesinde uygulama bağlamı ve mimari veri akışları hakkında akıl yürütme.

Kendi kendine güvenlik açığı doğrulama özelliğiyle yanlış pozitifleri önemli ölçüde azaltma: Geliştiricileri uyarmadan önce korumalı alan ortamlarında güvenlik açıklarından yararlanma olasılığını dinamik olarak kanıtlayın.

Doğrulanmış bulguları otonom olarak düzeltme: Kod yamalarını sentezleyin, gerilemeleri önlemek için test paketlerine göre doğrulayın ve incelemeye hazır pull istekleri gönderin.

Bu codelab'de, GitHub Actions ve anahtarsız Google Cloud Workload Identity Federation (WIF) kullanarak CodeMender'ı OWASP Juice Shop deposuna entegre edeceksiniz.

Ön koşullar

  • Önerilen: CodeMender kavramları hakkında temel düzeyde bilgi sahibi olmak (Uygulamanızı CodeMender ile Güvenceye Alma bölümünde ele alınmıştır)
  • GitHub Actions iş akışları, tetikleyicileri ve YAML söz dizimi hakkında temel bilgi
  • Git komutları ve pull isteği inceleme iş akışları hakkında temel düzeyde bilgi sahibi olma
  • Google Cloud IAM kavramları (hizmet hesapları, roller ve API'ler) hakkında temel bilgi
  • Yaygın web uygulaması güvenlik açıkları (ör. SQL yerleştirme ve XSS) hakkında bilgi sahibi olma

Neler öğreneceksiniz?

  • Workload Identity Federasyonu (WIF) aracılığıyla GitHub Actions ve Google Cloud arasında sıfır güven anahtarsız kimlik doğrulamasını yapılandırma
  • CodeMender ve gemini-3.8-flash kullanarak otomatik güvenlik açığı tarama iş akışı oluşturma
  • OASIS SARIF v2.1.0 ve yerel GitHub Actions İş Özetleri'ni kullanarak uygulanabilir güvenlik raporları yayınlama
  • Testlerle doğrulanmış kod yamaları oluşturan ve uzman incelemesi için pull istekleri açan otonom bir düzeltme iş akışı oluşturma
  • Yüksek hızlı sürekli güvenlik için otomatik kalite kontrolü (--fail-on) ve ardışık düzen önbelleğe alma nasıl uygulanır?

Gerekenler

  • Faturalandırmanın etkin olduğu ve Proje Sahibi/Düzenleyici izinlerine sahip bir Google Cloud projesi
  • Depo oluşturma, gizli anahtarları yapılandırma ve işlemleri yönetme izinlerine sahip bir GitHub hesabı (3. adımda GitHub CLI'yi kullanarak OWASP Juice Shop GitHub deposunu çatallarsınız).

2. CodeMender CI/CD mimarisini anlama

Modern kurumsal DevSecOps'ta, yapay zeka destekli güvenlik yalnızca manuel bir masaüstü aracı olamaz. Otomatik bir bekçi (güvenli olmayan pull isteklerini engelleme) ve otonom bir ortak geliştirici (doğrulanmış yamaları doğrudan Git'e önerme) olarak çalışmalıdır.

Bunun için Google Cloud Workload Identity Federasyonu (WIF) ve Gemini Enterprise akıl yürütme modelleriyle desteklenen bir çift iş akışı mimarisi uygulayacaksınız.

İkili iş akışı mimarisi

CodeMender Otonom CI/CD Ardışık Düzen Mimarisi

Algılama ve düzeltme işlemlerini tek bir monolitik komut dosyasına sıkıştırmak yerine, ardışık düzen güvenliği iki ayrı, amaca yönelik iş akışına ayırır:

İş akışı

Birincil Tetikleyici

Temel Sorumluluk

Kaliteyle İlgili Katı Sınır

1. Güvenlik Açığı Tarayıcısı(codemender-scan.yml)

Pull istekleri, ana push'lar, haftalık cron, manuel dağıtım

• PR'lerde hızlı diferansiyel AST taramaları (~15 sn), push'larda hızlı temel taramalar (–quick) ve planlamalarda eşzamanlı derin denetimler çalıştırır• cm health –strict aracılığıyla hazırlık durumunu önceden doğrular• Yerel Actions İş Özetleri oluşturur ve OASIS SARIF'i GitHub Güvenlik sekmesine yükler

Yeni ortaya çıkan Yüksek veya Kritik güvenlik açıkları tespit edilirse PR birleştirmesini engeller (–fail-on)

2. Otonom Çözümleyici(codemender-remediate.yml)

Manuel Tetikleyici (workflow_dispatch), Gece Cron'u

• Tarama yapılarından (cm report import) durumu devam ettirir ve state.db• Gemini'ın akıl yürütme özelliğini kullanarak yamaları sentezler• Temiz çalışma alanı sınırlarını korur ve incelemeye hazır pull istekleri gönderir

PR açmadan önce temiz üretim farkları sağlar.

Üç temel kurumsal tasarım ilkesi

İlerleyen bölümlerde bu iş akışlarını oluştururken şu üç temel mimari unsuru göz önünde bulundurun:

🔑 Sıfır Güven Anahtarsız Kimlik Doğrulama ve Ön Kontrol Doğrulaması:

GitHub Secrets'ta uzun ömürlü Google Cloud hizmet hesabı JSON anahtarları depolanmaz. Çalıştırıcı, Google Cloud STS aracılığıyla 1 saatlik geçici bir kimlik bilgisiyle değiştirilen kısa süreli bir OIDC jetonu oluşturur, Git kontrollerinde persist-credentials: false değerini ayarlar ve model kotasını kullanmadan önce kimlik bilgilerini, Network Reachability'yi ve IAM izinlerini doğrulamak için cm health --strict komutunu çalıştırır.

⚡ Uyarlanabilir Tarama Yönlendirme ve Eski Gürültü Bastırma:

CodeMender, her pull isteğinde yavaş tam depo denetimleri çalıştırmak yerine her CI etkinliğini en uygun tarama moduna yönlendirir: Pull istekleri, değiştirilen dosyalarda ve 1 atlamalı çağrılarda 15 saniyeden kısa sürede diferansiyel AST analizini (--diff="origin/$BASE_REF") tetikler; ana dal push'ları tek oturumlu hızlı temel taramalar (--quick) çalıştırır; haftalık planlar ise eşzamanlı dosya dosya derin denetimler (varsayılan cm find .) çalıştırır. Pull isteğinden etkilenmeyen önceden mevcut kod tabanı güvenlik açıkları [LEGACY / UNTOUCHED] olarak etiketlenir; görünürlük için SARIF raporlarında görünürler ancak pull isteği birleştirme kapısını engellemezler ve otomatik düzeltmeyi tetiklemezler.

Esnek ve Engelleme Yapmayan Güvenlik Gözlemlenebilirliği:

--fail-on, güvenli olmayan bir PR'yi engellemek için 1 koduyla kapansa bile rapor dışa aktarma ve SARIF yükleme adımlarını steps.scan.outputs.completed == 'true' ve hashFiles('results.sarif') != '' ile korumak, OASIS SARIF uyarılarının ve iş özetlerinin yayınlanmaya devam etmesini sağlar. Bir çalıştırma iptal edilirse veya kurulum ya da kapasite hatası (10-60) nedeniyle iptal edilirse dışa aktarma ve yükleme işlemleri sorunsuz bir şekilde atlanır.

3. Cloud Shell'de hedef depoda kimlik doğrulama ve hazırlık yapma

Anahtarsız kimlik doğrulama oluşturmak ve otomatik güvenlik ardışık düzenlerini çalıştırmak için sahip olduğunuz erişilebilir bir hedef GitHub deposu gerekir. Bu codelab'de, anahtar teslim güvenlik oyun alanı olarak kasıtlı şekilde güvenlik açığı bulunan bir Node.js web uygulaması olan OWASP Juice Shop'u kullanacaksınız.

Google Cloud Shell'de önceden yüklenmiş olan GitHub CLI'yı (gh) kullanarak GitHub'da kimlik doğrulama yapacak, kullanıcı bilgilerinizi otomatik olarak alacak ve deponuzu tek bir akışta hazırlayacaksınız.

1. adım: Cloud Shell'i açın ve GitHub CLI'nin kimliğini doğrulayın

Google Cloud Console'u açın ve Cloud Shell'i (üst gezinme çubuğundaki >_ simgesi) etkinleştirin.

Git kimlik bilgisi yönetimini yapılandırmak için GitHub CLI'nın (gh) kimliğini doğrulayın:

gh auth login --hostname github.com --git-protocol https --web

Ekrandaki talimatları uygulayın:

Cloud Shell'de yazdırılan 8 karakterli tek kullanımlık kodu (ör. 1234-ABCD) kopyalayın.

https://github.com/login/device uygulamasını tarayıcınızda açmak için Enter tuşuna basın.

Kodu yapıştırın ve Authorize github'ı (GitHub'ı yetkilendir) tıklayın.

2. adım: Değişkenleri dinamik olarak dışa aktarın ve OWASP Juice Shop'u çatallayın

GitHub kullanıcı adınızı otomatik olarak yakalamak ve depoyu hazırlamak için Cloud Shell'de aşağıdaki komutları çalıştırın:

# 1. Automatically capture your GitHub username (customize GITHUB_REPO if desired)
export GITHUB_ORG=$(gh api user -q .login)
export GITHUB_REPO="${GITHUB_REPO:-juice-shop}"
export GITHUB_REPOSITORY="${GITHUB_ORG:+${GITHUB_ORG}/${GITHUB_REPO}}"
echo "Authenticated as: ${GITHUB_REPOSITORY}"

# 2. Fork on GitHub server using GITHUB_REPO as the fork name
gh repo fork juice-shop/juice-shop --fork-name "${GITHUB_REPO}" --default-branch-only --clone=false 2>/dev/null || true

# 3. Shallow clone your fork (downloads only ~15 MB in 3-5 seconds, skipping heavy upstream git history)
[ -d ~/"${GITHUB_REPO}" ] || git clone --depth=1 "https://github.com/${GITHUB_REPOSITORY}.git" ~/"${GITHUB_REPO}" || \
 (sleep 2 && git clone --depth=1 "https://github.com/${GITHUB_REPOSITORY}.git" ~/"${GITHUB_REPO}")
cd ~/"${GITHUB_REPO}"

# 4. Confirm you are in the repository directory
git status

4. gcloud üzerinden Google Cloud Workload Identity Federasyonu'nu yapılandırma

Bu adımda, gerekli API'leri etkinleştirmek, özel bir CI/CD hizmet hesabı oluşturmak, Workload Identity havuzunu ayarlamak ve GitHub deponuzla (${GITHUB_REPOSITORY}) OIDC güveni oluşturmak için Google Cloud Shell'de gcloud CLI'yı kullanacaksınız.

1. adım: Google Cloud ortam değişkenlerini ayarlayın

Cloud Shell terminalinizde (klonlanmış depo çalışma alanınızda) etkin Google Cloud proje kimliğinizi yakalayın, GitHub depo değişkeninizi doğrulayın ve WIF kaynak adlarını tanımlayın:

# Capture active Google Cloud Project ID and verify GitHub repository
export PROJECT_ID=$(gcloud config get-value project)
export GITHUB_USER=$(gh api user -q ".login")
export GITHUB_REPO="${GITHUB_REPO:-$(git remote get-url origin 2>/dev/null | sed -E 's#^.*/##; s#\.git$##')}"
export GITHUB_REPO="${GITHUB_REPO:-juice-shop}"
export GITHUB_REPOSITORY="${GITHUB_USER:+${GITHUB_USER}/${GITHUB_REPO}}"

# Define WIF and Service Account resource names
export WORKLOAD_IDENTITY_POOL="codemender-github-pool"
export WORKLOAD_IDENTITY_PROVIDER="codemender-github-provider"
export SERVICE_ACCOUNT_NAME="codemender-ci-runner"

if [ -z "${PROJECT_ID}" ] || [ -z "${GITHUB_REPOSITORY}" ]; then
 echo "ERROR: PROJECT_ID ('${PROJECT_ID}') or GITHUB_REPOSITORY ('${GITHUB_REPOSITORY}') is empty. Check 'gcloud config get-value project' and 'gh auth status'."
else
 echo "Project ID:        ${PROJECT_ID}"
 echo "GitHub Repository: ${GITHUB_REPOSITORY}"
fi

2. adım: Gerekli Google Cloud API'lerini etkinleştirin

IAM API, Security Token Service API, IAM Credentials API, Agent Platform API ve Resource Manager API'yi etkinleştirin:

gcloud services enable \
 iam.googleapis.com \
 iamcredentials.googleapis.com \
 sts.googleapis.com \
 aiplatform.googleapis.com \
 cloudresourcemanager.googleapis.com \
 --project=${PROJECT_ID}

3. adım: Özel bir CI/CD hizmet hesabı oluşturun

CI/CD ardışık düzeninin yürütülmesine ayrılmış, en az ayrıcalık ilkesine uygun bir Google Cloud hizmet hesabı oluşturun (Zaten varsa güvenli bir şekilde yeniden kullanın):

export SERVICE_ACCOUNT_EMAIL="${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"

gcloud iam service-accounts describe "${SERVICE_ACCOUNT_EMAIL}" \
 --project="${PROJECT_ID}" >/dev/null 2>&1 || \
gcloud iam service-accounts create "${SERVICE_ACCOUNT_NAME}" \
 --display-name="CodeMender CI/CD Pipeline Runner" \
 --project="${PROJECT_ID}"

echo "Service Account Email: ${SERVICE_ACCOUNT_EMAIL}"

4. adım: Agent Platform'a IAM izinleri verin

Gemini Enterprise Agent Platform ile iletişim kurabilmesi için hizmet hesabına roles/aiplatform.user (Agent Platform Kullanıcısı) rolünü verin:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="serviceAccount:${SERVICE_ACCOUNT_EMAIL}" \
 --role="roles/aiplatform.user"

5. adım: Workload Identity havuzunu oluşturun

GitHub Actions kimlik onaylarını yönetmek için Workload Identity Pool oluşturun (veya projenizde zaten varsa otomatik olarak geri yükleyip etkinleştirin):

POOL_STATE=$(gcloud iam workload-identity-pools list \
 --location="global" \
 --show-deleted \
 --project="${PROJECT_ID}" \
 --filter="name ~ /${WORKLOAD_IDENTITY_POOL}$" \
 --format="value(state)")

if [ -z "${POOL_STATE}" ]; then
 gcloud iam workload-identity-pools create "${WORKLOAD_IDENTITY_POOL}" \
   --location="global" \
   --display-name="CodeMender GitHub Pool" \
   --project="${PROJECT_ID}"
else
 [ "${POOL_STATE}" = "DELETED" ] && gcloud iam workload-identity-pools undelete "${WORKLOAD_IDENTITY_POOL}" \
   --location="global" \
   --project="${PROJECT_ID}"
 gcloud iam workload-identity-pools update "${WORKLOAD_IDENTITY_POOL}" \
   --location="global" \
   --no-disabled \
   --project="${PROJECT_ID}"
fi

6. adım: GitHub OIDC ile Workload Identity sağlayıcısını oluşturun

Havuzda OIDC sağlayıcısını oluşturun (veya güncelleyin), veren kuruluş URL'sini (https://token.actions.githubusercontent.com) bağlayın ve GitHub jeton onaylarını Google STS özellikleriyle eşleyin:

PROVIDER_STATE=$(gcloud iam workload-identity-pools providers list \
 --workload-identity-pool="${WORKLOAD_IDENTITY_POOL}" \
 --location="global" \
 --show-deleted \
 --project="${PROJECT_ID}" \
 --filter="name ~ /${WORKLOAD_IDENTITY_PROVIDER}$" \
 --format="value(state)")

if [ -z "${GITHUB_REPOSITORY}" ]; then
 echo "ERROR: GITHUB_REPOSITORY is empty. Re-run Step 1 before configuring the OIDC provider."
elif [ -z "${PROVIDER_STATE}" ]; then
 gcloud iam workload-identity-pools providers create-oidc "${WORKLOAD_IDENTITY_PROVIDER}" \
   --workload-identity-pool="${WORKLOAD_IDENTITY_POOL}" \
   --location="global" \
   --display-name="CodeMender GitHub Provider" \
   --issuer-uri="https://token.actions.githubusercontent.com" \
   --attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.repository=assertion.repository,attribute.repository_owner=assertion.repository_owner" \
   --attribute-condition="assertion.repository == '${GITHUB_REPOSITORY}'" \
   --project="${PROJECT_ID}"
else
 [ "${PROVIDER_STATE}" = "DELETED" ] && gcloud iam workload-identity-pools providers undelete "${WORKLOAD_IDENTITY_PROVIDER}" \
   --workload-identity-pool="${WORKLOAD_IDENTITY_POOL}" \
   --location="global" \
   --project="${PROJECT_ID}"
 gcloud iam workload-identity-pools providers update-oidc "${WORKLOAD_IDENTITY_PROVIDER}" \
   --workload-identity-pool="${WORKLOAD_IDENTITY_POOL}" \
   --location="global" \
   --issuer-uri="https://token.actions.githubusercontent.com" \
   --attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.repository=assertion.repository,attribute.repository_owner=assertion.repository_owner" \
   --attribute-condition="assertion.repository == '${GITHUB_REPOSITORY}'" \
   --no-disabled \
   --project="${PROJECT_ID}"
fi

7. adım: GitHub deposunun hizmet hesabının kimliğine bürünmesine izin verin

Deponuzdan gelen jetonların CI çalıştırıcı hizmet hesabının kimliğine bürünmesine izin vermek için roles/iam.workloadIdentityUser rolünü bağlayın ve politika bağlamayı doğrulayın:

# Retrieve the canonical Workload Identity Pool resource ID
export POOL_ID=$(gcloud iam workload-identity-pools describe "${WORKLOAD_IDENTITY_POOL}" \
 --project="${PROJECT_ID}" \
 --location="global" \
 --format="value(name)")

if [ -z "${POOL_ID}" ] || [ -z "${GITHUB_REPOSITORY}" ]; then
 echo "ERROR: POOL_ID ('${POOL_ID}') or GITHUB_REPOSITORY ('${GITHUB_REPOSITORY}') is empty. Re-run Step 1 and Step 5."
else
 # Bind Workload Identity User role to the principalSet of your repository
 gcloud iam service-accounts add-iam-policy-binding "${SERVICE_ACCOUNT_EMAIL}" \
   --project="${PROJECT_ID}" \
   --role="roles/iam.workloadIdentityUser" \
   --member="principalSet://iam.googleapis.com/${POOL_ID}/attribute.repository/${GITHUB_REPOSITORY}"

 # Verify the principalSet binding on the Service Account
 gcloud iam service-accounts get-iam-policy "${SERVICE_ACCOUNT_EMAIL}" \
   --project="${PROJECT_ID}"
fi

8. adım: GitHub gizli anahtarları için yapılandırma değerlerini alma

Workload Identity sağlayıcınızın tam kaynak adını alın ve bir sonraki adımda otomatik kayıt için bir ortam değişkeninde saklayın:

# Retrieve full Workload Identity Provider name
export WORKLOAD_PROVIDER_NAME=$(gcloud iam workload-identity-pools providers describe ${WORKLOAD_IDENTITY_PROVIDER} \
 --workload-identity-pool=${WORKLOAD_IDENTITY_POOL} \
 --location="global" \
 --project=${PROJECT_ID} \
 --format="value(name)")

echo "=========================================================="
echo "WIF CONFIGURATION READY:"
echo "=========================================================="
echo "GCP_WORKLOAD_IDENTITY_PROVIDER: ${WORKLOAD_PROVIDER_NAME}"
echo "GCP_SERVICE_ACCOUNT:            ${SERVICE_ACCOUNT_EMAIL}"
echo "=========================================================="

5. GitHub deposu gizli anahtarlarını ve iş akışı izinlerini yapılandırma

Google Cloud WIF temel hazırlığı tamamlandığına göre GitHub deposu gizli anahtarlarını yapılandıracak ve otomatik güvenlik taraması ile otomatik düzeltme pull istekleri için gerekli iş akışı izinlerini vereceksiniz.

Bu ayarları GitHub CLI'yı (gh) kullanarak doğrudan Cloud Shell'den yapılandırabilir, uzun kaynak adlarını manuel olarak kopyalayıp yapıştırma ihtiyacını tamamen ortadan kaldırabilirsiniz.

1. adım: GitHub KSA'yı kullanarak depo gizli anahtarlarını ayarlayın

Cloud Shell terminalinizde, etkin ortam değişkenlerini kullanarak gerekli iki depo gizli anahtarını güvenli bir şekilde ayarlamak için aşağıdaki komutları çalıştırın:

# 1. Set the Workload Identity Provider resource name
gh secret set GCP_WORKLOAD_IDENTITY_PROVIDER \
 --body "${WORKLOAD_PROVIDER_NAME}" \
 --repo "${GITHUB_REPOSITORY}"

# 2. Set the CI/CD Service Account email
gh secret set GCP_SERVICE_ACCOUNT \
 --body "${SERVICE_ACCOUNT_EMAIL}" \
 --repo "${GITHUB_REPOSITORY}"

# 3. Verify the secrets are registered
gh secret list --repo "${GITHUB_REPOSITORY}"

2. adım: Otomatik PR'ler için iş akışı izinleri verin

Varsayılan olarak, GitHub Actions iş akışları salt okuma izinleriyle çalışır ve pull istekleri oluşturamaz. 9. adımda CodeMender, doğrulanmış düzeltme pull isteklerini otonom olarak oluşturup gönderir.

Doğrudan GitHub API üzerinden yazma izinleri verin ve pull isteği oluşturmayı etkinleştirin:

[ -d .git ] || cd ~/"${GITHUB_REPO:-juice-shop}"
export GITHUB_REPOSITORY="${GITHUB_REPOSITORY:-$(git remote get-url origin 2>/dev/null | sed -E 's#^.*github\.com[:/]##; s#\.git$##')}"

gh api \
 --method PUT \
 -H "Accept: application/vnd.github+json" \
 /repos/${GITHUB_REPOSITORY}/actions/permissions/workflow \
 -f default_workflow_permissions="write" \
 -F can_approve_pull_request_reviews=true

3. adım: Devralınan üst akış Juice Shop iş akışlarını devre dışı bırakın

OWASP Juice Shop'u çatallamak, 16'dan fazla yukarı akış CI iş akışını (ör. PR Compliance Check, CI/CD Pipeline ve CodeQL Scan) ve master'yi hedefleyen PR'leri otomatik olarak kapatan bir yukarı akış katkıda bulunan PR şablonunu taşır. GitHub CLI aracılığıyla CodeMender dışındaki tüm iş akışlarını devre dışı bırakın ve üst akış dosyalarını yerel olarak kaldırın. Böylece, çatallamanız yalnızca CodeMender iş akışlarını çalıştırır:

[ -d .git ] || cd ~/"${GITHUB_REPO:-juice-shop}"
export GITHUB_REPOSITORY="${GITHUB_REPOSITORY:-$(git remote get-url origin 2>/dev/null | sed -E 's#^.*github\.com[:/]##; s#\.git$##')}"

# 1. Disable all inherited non-CodeMender workflows in GitHub Actions (and CodeQL default setup if active)
for WF_ID in $(gh workflow list --all --limit 100 --repo "${GITHUB_REPOSITORY}" --json id,path \
 -q '.[] | select((.path | startswith(".github/workflows/")) and (.path | test("codemender-") | not)) | .id'); do
 gh workflow disable "${WF_ID}" --repo "${GITHUB_REPOSITORY}" 2>/dev/null || true
done
gh api -X PATCH "/repos/${GITHUB_REPOSITORY}/code-scanning/default-setup" \
 -f state=not-configured >/dev/null 2>&1 || true

# 2. Remove upstream workflow files and PR template from the local workspace
for f in .github/workflows/*; do
 case "$f" in *codemender-*) ;; *) rm -f "$f" ;; esac
done
rm -f .github/PULL_REQUEST_TEMPLATE.md

6. SARIF ile otomatik güvenlik açığı taraması iş akışını oluşturma

Bu adımda, dal push'larında temel taramaları, pull isteklerinde diferansiyel kapıları ve GitHub kod taramasına SARIF dışa aktarmalarını çalıştıran birincil sürekli güvenlik taraması iş akışını (.github/workflows/codemender-scan.yml) yazacaksınız.

1. adım: CodeMender tarama iş akışını indirin

Başlangıç deposundan codemender-scan.yml dosyasını .github/workflows/ dizinine indirin:

[ -d .git ] || cd ~/"${GITHUB_REPO:-juice-shop}"
mkdir -p .github/workflows
curl -fsSL https://raw.githubusercontent.com/edwardc-gcp/codemender-github-actions/main/.github/workflows/codemender-scan.yml \
 -o .github/workflows/codemender-scan.yml

2. adım: CI taramasını onaylayın, aktarın ve tetikleyin

İş akışı değişikliklerini kaydedin ve doğrudan deponuzun birincil dalına (Juice Shop için master veya main) aktarın:

# Stage workflow changes, commit, and push to primary branch
git add -A .github
git commit -m "ci: add CodeMender SARIF security scanning workflow"
git push origin $(git branch --show-current)

Tarayıcınızda:

Çatallanmış GitHub deponuza gidin: https://github.com/YOUR_GITHUB_USER/juice-shop (ör. https://github.com/octocat/juice-shop).

Üst gezinme çubuğunda İşlemler sekmesini tıklayın.

Sol kenar çubuğundaki Workflows (İş akışları) bölümünde CodeMender Security Scan & SARIF Export'u (CodeMender Güvenlik Taraması ve SARIF Dışa Aktarma) seçin.

İş akışının yürütülmesini tetikleyin veya görüntüleyin:

Otomatik Tetikleyici: Push işleminiz tarafından tetiklenen otomatik bir çalıştırma listeleniyorsa canlı yürütmeyi izlemek için doğrudan bu çalıştırmayı tıklayın.

Manuel İstek Üzerine Tetikleyici (workflow_dispatch): Henüz bir çalıştırma başlatılmadıysa sağdaki İş akışını çalıştır ▾ düğmesini tıklayın, Branch: master seçeneğinin belirlendiğinden emin olun (hızlı --quick temel taramanın çalışması için deep_scan onay kutusunun işaretini kaldırın) ve yeşil İş akışını çalıştır düğmesini tıklayın.

Yürütülen çalıştırmayı tıklayın ve iş akışının gerçek zamanlı olarak çalışmasını izlemek için Autonomous Code Vulnerability Scan'i (Otonom Kod Güvenlik Açığı Taraması) seçin.

codemender-scan.yml dosyasının içinde: Etkinliğe duyarlı tarama yönlendirmesi

--quick temel taraması bulutta çalışırken (~3-5 dakika) codemender-scan.yml (118-155. satırlar) dosyasının her bir GitHub etkinliğini çalıştırıcıdaki özel tarama moduna nasıl yönlendirdiğini inceleyin:

# Excerpt from .github/workflows/codemender-scan.yml
if [ "${{ github.event_name }}" = "pull_request" ]; then
 cm find . \
   --diff="origin/${{ github.base_ref }}" \
   --diff-workers=16 \
   --fail-on="CRITICAL,HIGH" \
   --sandbox=false --yes --bypass-warning || status=$?
elif [ "${{ github.event_name }}" = "schedule" ] || [ "${{ github.event.inputs.deep_scan }}" = "true" ]; then
 cm find . \
   --deep-workers=8 \
   --sandbox=false --yes --bypass-warning || status=$?
else
 cm find . \
   --quick \
   --sandbox=false --yes --bypass-warning || status=$?
fi

Hardened Runner Kurulumu ( 27-117. satırlar): Güvenilmeyen harici çatalları ve dependabot[bot] PR'lerini atlar, persist-credentials: false ile kontrol eder, ~/.local/bin/cm ve ~/.codemender/state.db'yi önbelleğe alır ve model kotasını kullanmadan önce cm health --strict'yi çalıştırır.

Headless Sandbox Boundaries (--sandbox=false --yes --bypass-warning): Çalışma alanı yolu sınırlarını (project_paths) ve command_policy.yaml'yi zorunlu tutmaya devam ederken Linux kullanıcı ad alanı izolasyonunu (ayrıcalıklı olmayan GitHub Actions kapsayıcıları içinde kısıtlanmış) devre dışı bırakır.

Exit-Code Guarded SARIF & Artifact Export ( 147-194. satırlar): cm find, 0 (temiz) veya 1 (--fail-on eşiği karşılandı) ile çıktığında steps.scan.outputs.completed=true değerini kesin olarak ayarlar. Bu sayede, --fail-on bir PR'yi engellediğinde SARIF raporları (CVSS önem derecesi puanlarıyla cm report -f sarif), $GITHUB_STEP_SUMMARY tabloları (cm report -f md) ve codemender-findings.json yapıları yayınlanmaya devam eder. Kurulum veya kapasite hatalarında (10-60) dışa aktarma işlemi atlanır. Böylece boş SARIF dosyaları mevcut uyarıları hiçbir zaman kapatmaz.

7. GitHub kod tarama uyarılarını ve güvenlik kontrol panelini inceleme

Temel push iş akışı tamamlandıktan sonra GitHub, yüklenen SARIF dosyasını işler ve hem Actions çalıştırma özetini hem de depo Güvenlik sekmesini doldurur.

1. adım: GitHub Actions'da yerel iş özetini inceleyin

Her iş akışı çalıştırması, doğrudan GitHub Actions çalıştırma genel bakışına bir Markdown özet tablosu (cm report -f md) ekler:

GitHub deponuzda Actions (İşlemler) sekmesini tıklayın.

Tamamlanan CodeMender Security Scan & SARIF Export (CodeMender Güvenlik Taraması ve SARIF Dışa Aktarma) çalıştırmasını seçin (temel dal push denetimleri, SARIF bulguları yayınlandıktan sonra yeşil bir ✅ onay işaretiyle tamamlanır).

Bulguların dökümünü incelemek için 🛡️ CodeMender Security Scan Summary (CodeMender Güvenlik Taraması Özeti) bölümüne gidin:

🔒 CodeMender Güvenlik Raporu

Özet

Toplam bulgu sayısı: 28

Önem Düzeyi

Sayı

🔴 KRİTİK

6

🟠 YÜKSEK

16

🟡 ORTA

6

Durum

Sayı

🔴 AÇIK

28

Bulgular

No

Önem Düzeyi

Güven

Durum

Düzelt

Dosya

Title

c1b96b9a

🔴 KRİTİK

%100

AÇ

—

routes/userProfile.ts

Kullanıcı Profilinde Sunucu Tarafı Kod Yerleştirme Yoluyla Uzaktan Kod Yürütme

cd47b38a

🔴 KRİTİK

%100

AÇ

—

routes/login.ts

Kullanıcı Kimlik Doğrulama Rotasında SQL Yerleştirme

a47a9e45

🔴 KRİTİK

%100

AÇ

—

routes/b2bOrder.ts

B2B Sipariş İşleme'de Korumalı Alandan Kaçış Yoluyla Uzaktan Kod Yürütme

2. adım: Merkezi kod tarama kontrol panelini keşfedin

GitHub deponuzun üst gezinme çubuğunda Security and quality (Güvenlik ve kalite) veya Security (Güvenlik) sekmesini tıklayın.

Sol kenar çubuğundaki Bulgular bölümünde Kod tarama'yı seçin.

Birden fazla araç etkinse yerel CVSS önem derecesi rozetleriyle eşlenen uyarıları incelemek için Araç'ı CodeMender (is:open branch:master tool:CodeMender) olarak filtreleyin:

Önem Derecesi Rozeti

Vulnerability Headline

Algılanan Konum

Branch

🔴 Kritik

Kullanıcı Profilinde Sunucu Tarafı Kod Yerleştirme Yoluyla Uzaktan Kod Yürütme

routes/userProfile.ts:58

master

🔴 Kritik

Kullanıcı Kimlik Doğrulama Rotasında SQL Yerleştirme

routes/login.ts:34

master

🔴 Kritik

B2B Sipariş İşleme'de Korumalı Alandan Kaçış Yoluyla Uzaktan Kod Yürütme

routes/b2bOrder.ts:21

master

Gemini tarafından sentezlenen bozuk veri akışını ve temel neden analizini incelemek için SQL Injection in User Authentication Route'u (routes/login.ts:34) tıklayın.

8. Diferansiyel tarama ile güvenli olmayan bir pull isteğini engelleme

Temel taramanız, OWASP Juice Shop'ta 28 adet önceden var olan güvenlik açığı tespit etti. Geleneksel statik analiz araçları kullanıldığında, bu 28 eski bulgu, tüm birikmiş işler düzeltilene kadar gelecekteki her pull isteğinin başarısız olmasına neden olur. Bu da ekipleri birleştirme engellemeyi devre dışı bırakmaya zorlar.

Şimdi CodeMender'ın PR Differential AST Gate (--diff + --fail-on="CRITICAL,HIGH") özelliğini test edeceksiniz: Yeni bir güvenlik açığı içeren bir pull isteği açacak ve CodeMender'ın deltayı izole etmesini, birleştirmeyi yaklaşık 15-25 saniye içinde engellemesini ve sorunlu satırları tam olarak işaretlemesini izleyeceksiniz.

1. adım: Komut yerleştirme kusuru içeren bir pull isteği açın

Cloud Shell'de (klonlanmış depo çalışma alanınızda) bir özellik dalı oluşturun, işletim sistemi komut yerleştirme güvenlik açığı içeren yeni bir Express rotası ekleyin ve çatallamanız için bir pull isteği açın:

[ -d .git ] || cd ~/"${GITHUB_REPO:-juice-shop}"
export GITHUB_REPOSITORY="${GITHUB_REPOSITORY:-$(git remote get-url origin 2>/dev/null | sed -E 's#^.*github\.com[:/]##; s#\.git$##')}"
PRIMARY_BRANCH=$(git symbolic-ref --short refs/remotes/origin/HEAD | sed 's@^origin/@@')

# Reset any previous demo PR/branch so this step can be re-run cleanly
gh pr close feat/diagnostics --repo "${GITHUB_REPOSITORY}" --delete-branch 2>/dev/null || true
git checkout "${PRIMARY_BRANCH}"
git checkout -B feat/diagnostics

# Introduce an Express endpoint vulnerable to OS Command Injection (CWE-78)
cat << 'EOF' > routes/diagnostics.ts
import { execSync } from 'node:child_process'
import { type Request, type Response } from 'express'

export function systemDiagnostics () {
 return (req: Request, res: Response) => {
   const host = String(req.query.host ?? '127.0.0.1')
   const output = execSync(`ping -c 1 ${host}`).toString()
   res.status(200).json({ status: 'ok', output })
 }
}
EOF

git add routes/diagnostics.ts
git commit -m "feat: add network diagnostics endpoint"
git push -f -u origin feat/diagnostics

gh pr create \
 --repo "${GITHUB_REPOSITORY}" \
 --base "${PRIMARY_BRANCH}" \
 --head feat/diagnostics \
 --title "feat: add network diagnostics endpoint" \
 --body "Adds a ping diagnostics handler."

2. adım: Farklı birleştirme kapısını ve satır içi PR ek açıklamasını doğrulayın

Terminal çıkışının sonunda yazdırılan pull isteği URL'sini açın.

Pull isteği ileti dizisi sayfasının alt kısmındaki Checks (Kontroller) kutusuna gidin ve Autonomous Code Vulnerability Scan'i (Otonom Kod Güvenlik Açığı Taraması) izleyin:

Delta Hızı: cm find . --diff="origin/${PRIMARY_BRANCH}", depodaki 680'den fazla dosyanın tamamını taramak (~3-5 dakika) yerine analizi yalnızca routes/diagnostics.ts (ve 1 atlamalı çağrılar) ile sınırlandırarak taramayı ~15-25 saniyede tamamlar.

Eski Borç İzolasyonu ve Birleştirme Engelleme: Juice Shop'un dokunulmamış 28 eski güvenlik açığından hiçbiri kontrolü geçemez. Yalnızca yeni eklenen CRITICAL Komut Ekleme --fail-on="CRITICAL,HIGH" tetiklenir ve PR birleştirmesini engellemek için 1 durum koduyla (kırmızı ❌) çıkar.

Pull isteğinin üst kısmındaki Files changed (Değiştirilen dosyalar) sekmesini tıklayın:

İş akışının çıkış kodu koruması (steps.scan.outputs.completed == 'true'), --fail-on 1 koduyla çıktığında results.sarif dosyasını dışa aktarıp yüklemeye devam ettiği için GitHub kod tarama, routes/diagnostics.ts dosyasındaki execSync satırının hemen altında satır içi bir CodeMender — Kritik güvenlik ek açıklaması oluşturur.

3. adım: Test PR'sini temizleyin ve birincil dala dönün

Otonom düzeltmeye geçmeden önce Cloud Shell çalışma alanınızı tekrar birincil dala geçirin ve güvenli olmayan test pull isteğini kapatın:

[ -d .git ] || cd ~/"${GITHUB_REPO:-juice-shop}"
export GITHUB_REPOSITORY="${GITHUB_REPOSITORY:-$(git remote get-url origin 2>/dev/null | sed -E 's#^.*github\.com[:/]##; s#\.git$##')}"
PRIMARY_BRANCH=$(git symbolic-ref --short refs/remotes/origin/HEAD | sed 's@^origin/@@')
git checkout "${PRIMARY_BRANCH}"
gh pr close feat/diagnostics --repo "${GITHUB_REPOSITORY}" --delete-branch
git branch -D feat/diagnostics 2>/dev/null || true

9. Otonom düzeltme ve otomatik PR iş akışını oluşturma

Pull isteği kapınız yeni güvenlik açıklarının kod tabanına girmesini engellediğine göre, mevcut güvenlik açıklarını aktif olarak düzeltmek ve incelemeye hazır pull istekleri açmak için Autonomous Remediation'ı (.github/workflows/codemender-remediate.yml) dağıtacaksınız.

1. adım: Çözüm iş akışı dosyasını indirin

CodeMender, depo görünürlüğüne bağlı olarak iki düzeltme şablonu sunar:

Herkese Açık/Açık Kaynak Depolar (codemender-remediate.yml): Sorumlu Açıklama Modu: Ham açık vektörlerini herkese açık olarak ifşa etmeden GitHub Kod Tarama SARIF uyarılarına bağlantı verir.

Özel/Kurumsal Depolar (codemender-remediate-private-repo.yml): Dahili Denetim Kanıt Modu, doğrulama yapılarını (PLAN.md, REPORT.md, exploit.sh) daraltılabilir PR bölümlerine yerleştirir ve Git commit'lerinden hariç tutar.

Herkese açık güvenli düzeltme iş akışını deponuza indirin:

mkdir -p .github/workflows
curl -fsSL https://raw.githubusercontent.com/edwardc-gcp/codemender-github-actions/main/.github/workflows/codemender-remediate.yml \
 -o .github/workflows/codemender-remediate.yml

2. adım: Otonom çözüm iş akışını uygulayın ve tetikleyin

Düzeltme iş akışını kaydedip birincil dalınıza aktarın:

git add .github/workflows/codemender-remediate.yml
git commit -m "ci: add CodeMender autonomous remediation workflow"
git push origin $(git branch --show-current)

Tarayıcınızda GitHub deponuzun Actions (İşlemler) sekmesine gidin.

Sol kenar çubuğundaki Workflows (İş akışları) bölümünde CodeMender Autonomous Security Remediation & Auto-PR'ı (CodeMender Otonom Güvenlik Çözümü ve Otomatik PR) seçin.

Sağ taraftaki yeşil renkli Run workflow (İş akışını çalıştır) açılır menüsünü tıklayın:

Use workflow from (İş akışının kullanılacağı yer): Varsayılan dalın (master) seçildiğinden emin olun.

Specific Finding ID or prefix to fix (Düzeltilecek belirli bulgu kimliği veya ön eki): 7. adımda belirtilen routes/login.ts için 8 karakterlik ön eki girin (ör. cd47b38a). Bu alanı boş bırakırsanız tüm açık kritik ve yüksek bulgular için toplu düzeltme çalıştırılır (~10-15 dakika). Tek bir kimliği hedeflemek ~45-60 saniyede tamamlanır.

Pop-up'taki yeşil renkli Run workflow (İş akışını çalıştır) düğmesini tıklayın ve yürütülen çalıştırmayı açın.

&quot;Run workflow&quot; (İş akışını çalıştır) açılır listesinden CodeMender Autonomous Security Remediation iş akışını tetikleyin.

codemender-remediate.yml dosyasının içinde: Otonom yama sentezi

CodeMender, yamayı bulutta sentezlerken (~30-45 saniye) codemender-remediate.yml (111-184. satırlar) dosyasının, çalıştırıcıda düzeltme işlemini nasıl yönettiğini inceleyin:

Zero-Scan Resume (cm report import): Tarama iş akışından codemender-findings.json yapısını indirir ve çalışma alanına (cm report import -f codemender-findings.json) aktarır. Yalnızca önceden yapılmış bir yapı yoksa cm find . --quick'e geri döner.

Headless Patch Synthesis (cm fix): project_paths'i $GITHUB_WORKSPACE'e sabitler, etkileşimli askıda kalmaları önlemek için < /dev/null'i yönlendirir ve toplu döngüler sırasında --no-reset'i iletir. Böylece kümülatif düzeltmeler bulgular arasında korunur:

# Executed inside the GitHub Actions runner (codemender-remediate.yml)
cm fix "${SPECIFIC_TARGET}" --sandbox=false --yes --bypass-warning < /dev/null

Clean Production Commits ( 155-252. satırlar): peter-evans/create-pull-request@v8 dalı (codemender/auto-remediation-${{ github.run_id }}) açmadan önce .git/info/exclude aracılığıyla .cm_project, .exploit/ ve geçici dosyaları temizleyerek yalnızca üretim kodu değişikliklerini kaydeder:

--- a/routes/login.ts
+++ b/routes/login.ts
@@ -28,8 +28,8 @@ module.exports = function login () {
-    models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: models.User })
+    models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+      replacements: { email: req.body.email || '', password: security.hash(req.body.password || '') },
+      model: models.User
+    })

3. adım: GitHub'da yeni açılan pull isteğini inceleyin

Deponuzdaki Pull requests (Pull istekleri) sekmesine gidin ve yeni pull isteğini (ör. 🛡️ [CodeMender] Fix: SQL Injection in User Authentication Route) açın.

Tüm dahili çalışma zamanı meta verileri hariç tutularak yalnızca routes/login.ts dosyasının değiştirildiğini onaylamak için Files changed'i (Değiştirilen dosyalar) tıklayın.

Bakım sorumlusunun onayı için doğrudan GitHub Kod Tarama (SARIF) uyarısına bağlantı veren PR açıklamasını inceleyin.

10. Uç durumlar ve özel depolarla ilgili sorunları giderme

GitHub Advanced Security (GHAS) içermeyen özel depolar

Herkese açık GitHub depoları, ücretsiz ve sınırsız GitHub Kod Tarama SARIF beslemesi alır. Ancak bu iş akışını etkin bir GitHub Advanced Security (GHAS) lisansı olmayan özel bir kurumsal depoya dağıtırsanız upload-sarif adımı şu hatayla başarısız olur:

HTTP 403: Advanced Security must be enabled for this repository to use code scanning.

Çözüm: Bağımsız Etkileşimli HTML Raporu Yedeklemesi

CodeMender'ın yerleşik HTML rapor oluşturucusu (cm report -f html), önem derecesi metrik kartları, satır numaralarıyla söz dizimi vurgulanmış kod snippet'leri ve satır içi yama farkı görüntüleyici içeren bağımsız, etkileşimli bir güvenlik kontrol paneli oluşturur. Bu kontrol paneli, harici web bağımlılıkları olmadan çalışır.

GHAS lisansı olmayan özel depoları desteklemek için .github/workflows/codemender-scan.yml dosyasını güncelleyerek SARIF yüklemek yerine bir HTML raporu yapısını arşivleyin:

Bağımsız HTML raporu oluşturun: Export Security Reports & Publish Job Summary adımında, cm report -f html > codemender-audit-report.html kullanarak Markdown özetinizle birlikte bir HTML kontrol paneli dışa aktarın.

Raporu iş akışı yapısı olarak arşivleyin: Upload SARIF Report to GitHub Code Scanning (github/codeql-action/upload-sarif@v4) adımını, codemender-audit-report.html dosyasını yükleyecek şekilde yapılandırılmış actions/upload-artifact@v4 ile değiştirin (örneğin, yapı adı codemender-security-report altında).

Herhangi bir tarayıcıda yerel olarak inceleme: codemender-security-report.zip dosyasını doğrudan GitHub Actions iş akışı çalıştırma özeti sayfasından indirin, dosyayı ayıklayın ve görsel önceliklendirme için codemender-audit-report.html dosyasını herhangi bir web tarayıcısında açın.

Yerleşik denetim kanıtı içeren özel depo otonom düzeltmesi

Özel kurumsal depolarda mühendislik ve güvenlik ekiplerinin, harici araç kontrol panellerine ihtiyaç duymadan temel neden analizi, istismar kavram kanıtlama ve düzeltme planı hakkında tam görünürlüğe ihtiyacı vardır. Ancak güvenlik açığından yararlanma komut dosyalarını (exploit.sh) veya dahili Markdown dosyalarını (PLAN.md, LOG.md) depo dalına kaydetmek, Git geçmişini kirletir ve diğer güvenlik tarayıcılarından yanlış uyarılar tetikleyebilir.

Bu sorunu çözmek için özel Özel Depo Çözüm İş Akışı'nı (codemender-remediate-private-repo.yml) dağıtın:

curl -fsSL https://raw.githubusercontent.com/edwardc-gcp/codemender-github-actions/main/.github/workflows/codemender-remediate-private-repo.yml \
 -o .github/workflows/codemender-remediate.yml
git add .github/workflows/codemender-remediate.yml
git commit -m "ci: switch to private repository remediation workflow with embedded audit evidence"
git push origin $(git branch --show-current)

Özel depo düzeltme özelliğinin işleyiş şekli

Dinamik PoC Doğrulaması (cm verify): Düzeltmeyi oluşturmadan önce çalışan bir istismarı sentezler ve test eder. Böylece istismar edilebilirliği doğrular. Doğrulama, istismar edilemeyen bir bulguyu DISMISSED olarak işaretlerse cm fix otomatik olarak atlanır.

Embedded PR Audit Collapsibles: REPORT.md, PLAN.md ve exploit.sh öğelerini /tmp/codemender-evidence/ içine çıkarır ve bunları doğrudan <details open> daraltılabilir bloklar içindeki pull isteği açıklamasına biçimlendirerek tek tıklamayla inceleme yapılmasını sağlar.

Artifact Archiving: actions/upload-artifact@v4 aracılığıyla kanıt klasörünün tamamını arşivler.

Pristine Git Commits: Tüm çalışma zamanı meta verilerini ve .exploit dizinlerini temizler. Böylece, pull isteği git commit'i yalnızca üretim kodu değişikliklerini içerir.

Workload Identity Federasyonu (WIF) sorun giderme yapılacaklar listesi

Varsayılan olarak google-github-actions/auth@v2, kurulum sırasında yerel bir birleşik kimlik bilgisi yapılandırma dosyası yazar ve gerçek OAuth 2.0 jeton değişimi, cm health --strict veya cm find başladığında gerçekleşir. HTTP 400 veya HTTP 403 kimlik doğrulama hatalarını teşhis etmek için aşağıdaki yapılacaklar listesini kullanın:

Hata Belirtisi

Yaygın Temel Neden

Doğrulama ve Düzeltme

HTTP 403 (iam.serviceAccounts.getAccessToken reddedildi)

Hizmet hesabında roles/iam.workloadIdentityUser bağlaması eksik, GCP_SERVICE_ACCOUNT gizli anahtarı yanlış veya iamcredentials.googleapis.com etkinleştirilmemiş.

GCP_SERVICE_ACCOUNT değerinin codemender-ci-runner@.iam.gserviceaccount.com ile eşleştiğini onaylayın ve principalSet bağlamasını doğrulamak için aşağıdaki IAM politika kontrolünü çalıştırın.

HTTP 400 (unauthorized_client veya özellik koşulu reddedildi)

OIDC –attribute-condition depo adı (veya büyük/küçük harf kullanımı), iş akışını tetikleyen GitHub deposuyla eşleşmiyor veya WIF sağlayıcısı devre dışı.

${GITHUB_REPOSITORY} değerinin GitHub'daki owner/repo büyük/küçük harf kullanımınızla tam olarak eşleştiğinden ve –no-disabled değerinin uygulandığından emin olarak 4. adımı (1. ve 6. adımlar) yeniden çalıştırın.

HTTP 400 (jeton değişimi sırasında invalid_grant)

OIDC sağlayıcısında hatalı biçimlendirilmiş –issuer-uri veya eksik attribute.repository=assertion.repository eşlemesi.

–issuer-uri değerinin tam olarak https://token.actions.githubusercontent.com şeklinde ayarlandığını (sonda eğik çizgi olmadan) onaylayın.

Kurulumdan hemen sonra geçici HTTP 403 hatası

Yeni oluşturulan bağlamalarda global IAM ve Workload Identity Federasyonu'nun yayılması 1-5 dakika sürebilir.

1-2 dakika bekleyin ve GitHub Actions'da Re-run failed jobs'ı (Başarısız olan işleri yeniden çalıştır) tıklayın.

Cloud Shell'de CI/CD hizmet hesabınızdaki canlı Workload Identity bağlamasını incelemek için şu komutu çalıştırın:

gcloud iam service-accounts get-iam-policy "${SERVICE_ACCOUNT_EMAIL}" \
 --project="${PROJECT_ID}" \
 --flatten="bindings[].members" \
 --filter="bindings.role=roles/iam.workloadIdentityUser"

Çıktının roles/iam.workloadIdentityUser ile principalSet://iam.googleapis.com/<POOL_ID>/attribute.repository/<GITHUB_USER>/<GITHUB_REPO> arasında bağ oluşturduğunu onaylayın:

---
bindings:
 members: principalSet://iam.googleapis.com/.../attribute.repository/<OWNER>/<REPO>
 role: roles/iam.workloadIdentityUser

CI/CD ön kontrolü ve KSA çıkış koduyla ilgili sorunları giderme

CodeMender komutları (cm health --strict, cm find, cm verify ve cm fix), deterministik çıkış kodları döndürür. Böylece CI/CD ardışık düzenleri, güvenlik bulgularını kurulum veya hizmet hatalarından hemen ayırt edebilir:

Çıkış Kodu

Kategori

Yaygın Temel Neden ve Çözüm

0

Başarılı

Durum kontrolleri başarılı oldu veya tarama, engelleyici bulgular olmadan tamamlandı.

1

Bulgular / Genel

Bir PR'de CRITICAL veya HIGH güvenlik açıklarını engelleyen –fail-on algılandı (beklenen birleştirme kapısı hatası).

10

credentials

WIF OAuth/ADC jeton değişimi başarısız oldu (400/401). GCP_WORKLOAD_IDENTITY_PROVIDER, GCP_SERVICE_ACCOUNT ve yukarıdaki roles/iam.workloadIdentityUser bağlamasını doğrulayın.

20

config

.codemender/config.yaml veya ~/.codemender/config.yaml söz dizimi hatalı biçimlendirilmiş.

30

reachability

Çalıştırıcı, aiplatform.googleapis.com adresine erişemiyor (DNS, proxy, hizmet kesintisi veya VPC Hizmet Kontrolleri).

40

authorization

Hizmet hesabında hedef projede roles/aiplatform.user eksik veya cloudresourcemanager.googleapis.com / aiplatform.googleapis.com devre dışı bırakılmış.

50

timeout

Ön kontrol cm health kontrolü 30 saniyelik son tarihi aştı.

60

capacity

Temsilci, eşzamanlı etkin görev sınırına ulaştı. Kısa bir süre bekledikten sonra iş akışını yeniden çalıştırın.

Git diff temel dal çözünürlüğü (fetch-depth: 0), kaynak yayma gecikmeleri veya GitHub Actions pull isteği oluşturma izinleri gibi diğer çalışma zamanı hataları için resmi CodeMender CI/CD Sorun Giderme Kılavuzu'na bakın.

11. Kaynakları temizleme

Google Cloud ve GitHub ortamlarınızda devam eden kaynak tüketimini önlemek veya test yapılandırmalarını temizlemek için aşağıdaki temizleme adımlarını uygulayın.

1. adım: GitHub deposu gizli anahtarlarını kaldırın ve gh CLI üzerinden iş akışlarını devre dışı bırakın

Depo Actions gizli anahtarlarını tamamen silmek ve CodeMender iş akışlarını devre dışı bırakmak için GitHub CLI'yı (gh) kullanın:

# Delete the repository Actions secrets
gh secret delete GCP_WORKLOAD_IDENTITY_PROVIDER --repo "${GITHUB_REPOSITORY}" 2>/dev/null || true
gh secret delete GCP_SERVICE_ACCOUNT --repo "${GITHUB_REPOSITORY}" 2>/dev/null || true

# Disable the CodeMender workflows to prevent unwanted automatic triggers
gh workflow disable codemender-scan.yml --repo "${GITHUB_REPOSITORY}" 2>/dev/null || true
gh workflow disable codemender-remediate.yml --repo "${GITHUB_REPOSITORY}" 2>/dev/null || true

2. adım: Google Cloud Workload Identity Federation kaynaklarını devre dışı bırakın veya silin

Workload Identity havuzları, sağlayıcıları ve hizmet hesapları, jeton alışverişi yapmadığında boşta kalma maliyeti sıfır olur. İş akışınıza uygun temizleme modunu seçin:

A seçeneği: Erişimi duraklatma (Bu projede yeniden çalıştırmayı planlıyorsanız önerilir): Google Cloud IAM'nin 30 günlük geçici silme saklama süresini veya hizmet hesabı uniqueId yayılma gecikmelerini tetiklemeden OIDC jeton değişimini hemen devre dışı bırakır:

gcloud iam workload-identity-pools providers update-oidc "${WORKLOAD_IDENTITY_PROVIDER}" \
 --workload-identity-pool="${WORKLOAD_IDENTITY_POOL}" \
 --location="global" \
 --disabled \
 --project="${PROJECT_ID}"

B seçeneği - Tamamen kaldırma: WIF sağlayıcısını, havuzu (30 gün boyunca DELETED durumunda tutulur) ve özel hizmet hesabını siler:

# Delete Workload Identity Provider
gcloud iam workload-identity-pools providers delete "${WORKLOAD_IDENTITY_PROVIDER}" \
 --workload-identity-pool="${WORKLOAD_IDENTITY_POOL}" \
 --location="global" \
 --project="${PROJECT_ID}" \
 --quiet

# Delete Workload Identity Pool
gcloud iam workload-identity-pools delete "${WORKLOAD_IDENTITY_POOL}" \
 --location="global" \
 --project="${PROJECT_ID}" \
 --quiet

# Delete CI/CD Service Account
gcloud iam service-accounts delete "${SERVICE_ACCOUNT_EMAIL}" \
 --project="${PROJECT_ID}" \
 --quiet

12. Tebrikler

Tebrikler! CodeMender ile CI/CD Ardışık Düzeninizin Güvenliğini Sağlama codelab'ini tamamladınız.

Google Cloud Workload Identity Federation, CodeMender ve GitHub Actions'ı kullanarak üretim düzeyinde, sıfır güvene dayalı bir DevSecOps ardışık düzenini başarıyla tasarladınız, oluşturdunuz ve otomatikleştirdiniz.

İşlediğiniz konular

Sıfır Güven Anahtarsız Kimlik Doğrulama: Kısa süreli GitHub OIDC jetonlarını Workload Identity Federation (WIF) aracılığıyla Google Cloud IAM'ye bağlayarak riskli, uzun ömürlü hizmet hesabı JSON anahtarlarını ortadan kaldırdık.

PR Differential AST Scanning and Legacy Noise Suppression: Değiştirilen dosyalar ve bağımlı öğeler (--diff="origin/$BASE_REF") için kapsamlı sürekli tarama, eski teknik borçları ([LEGACY / UNTOUCHED]) izole ederek geliştirici geri bildirim döngülerini 15 saniyenin altında tutar.

Çok Formatlı Raporlama ve Yerel İş Özetleri: Merkezi GitHub kod taraması için birleştirilmiş OASIS SARIF v2.1.0 ve doğrudan CI iş akışı çalıştırma sayfalarında anında yönetici görünürlüğü için yerel Markdown (cm report -f md >> $GITHUB_STEP_SUMMARY).

İnsan müdahalesi gerektiren inceleme ile otonom düzeltme: Pasif uyarı bildirimlerinden, önerilen kod yamalarını otonom olarak sentezleyen, regresyon testi paketlerine göre doğrulayan ve mühendis onayı için denetim yapılarıyla inceleme pull istekleri açan etkin düzeltme ardışık düzenlerine geçildi.

Otomatik Kalite Kontrolü: Tehlikeli güvenlik açıklarının üretime ulaşmasını engellemek için katı dal koruması ve birleştirme denetimi (--fail-on) uygulandı.

Yapı temelli durum aktarımı ve çalışma alanı izolasyonu: cm report import kullanarak bulguları CI işleri arasında sorunsuz bir şekilde aktarırken .git/info/exclude kullanarak orijinal Git geçmişini koruyun ve kimlik bilgilerinin sızdırılmasını önleyin.

Geliştirici zihniyetinde değişim

Geleneksel DevSecOps Uygulaması

CodeMender Otonom CI/CD Ardışık Düzeni

Pasif uyarı dökümü: Tarayıcılar, ham terminal günlüklerini veya statik hata listelerini yazdırarak önceliklendirme yükünü tamamen geliştiricilere yükler.

Active Co-developer: Doğrulanmış kod yamalarını sentezler ve mühendis onayı için birleştirmeye hazır pull istekleri açar.

Yüksek Yanlış Pozitif Oranı: Statik AST sezgisel yöntemleri, kullanılabilirlik kanıtı olmadan binlerce teorik güvenlik açığını işaretler.

2 Kademeli Güvenlik Açığı Doğrulaması: Dinamik korumalı alan test oluşturma (cm verify), gerçek güvenlik açığını doğrulayarak yanlış pozitifleri ortadan kaldırır.

Riskli gizli anahtar depolama: CI gizli anahtarlarında depolanan uzun ömürlü hizmet hesabı JSON anahtarları, yanlışlıkla sızıntı ve kimlik bilgisi yayılması riski taşır.

Sıfır güven WIF: İstek üzerine Google Cloud STS ile değiştirilen geçici OIDC jetonları aracılığıyla anahtarsız kimlik doğrulama.

Monolitik yeniden taramalar: Her commit, tam depo denetimlerini tetikler. Bu da CI iş akışlarını geciktirir ve pahalı jetonların boşa harcanmasına neden olur.

Etkinliğe Duyarlı AST Yönlendirme: Pull istekleri 15 saniyelik diferansiyel AST taramaları (–diff) yürütürken cron işleri derin denetimler gerçekleştirir.

Kirlenmiş depo geçmişi: Doğrudan depo dallarına kaydedilen geçici istismar komut dosyaları ve saldırı günlükleri.

Kurumsal Workspace Hijyeni: Saldırı kanıtları, PR açıklamalarına ve iş akışı yapılarına temiz bir şekilde yerleştirilir ve kod commit'leri temiz tutulur.

Sonraki adımlar

🚀 CodeMender öğrenme yolculuğuna devam edin:

1. Bölüm: CodeMender ile Uygulamanızın Güvenliğini Sağlama: Otonom depo güvenlik açığı keşfi, PoC istismar doğrulaması ve yerel yama sentezi konularında uzmanlaşın.

Shift Left Locally & Serverless Cloud Native CI/CD: Google Cloud Build (cloudbuild.yaml) ve Local Git Pre-commit Hooks (cm find . --diff --staged) için resmi CI/CD kılavuzunun referans uygulamalarını inceleyin.

📖 Belgeleri ve kaynakları inceleyin:

Resmi Google Cloud CodeMender CI/CD Entegrasyon Kılavuzu

Resmi Google Cloud CodeMender Belgeleri

CodeMender GitHub Actions Başlangıç Şablonu Deposu

Google Cloud Workload Identity Federasyonu Belgeleri

💡 Kendi depolarınıza uygulama:

Başlangıç iş akışını çatallayın ve CodeMender ile kuruluşunuzun Python, Go, Java, Rust ve Node.js depolarını güvence altına alın.