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-flashkullanarak 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

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ı( | 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 ( | Yeni ortaya çıkan Yüksek veya Kritik güvenlik açıkları tespit edilirse PR birleştirmesini engeller ( |
2. Otonom Çözümleyici( | Manuel Tetikleyici ( | • Tarama yapılarından ( | 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 |
| 🔴 KRİTİK | %100 | AÇ | — |
| Kullanıcı Profilinde Sunucu Tarafı Kod Yerleştirme Yoluyla Uzaktan Kod Yürütme |
| 🔴 KRİTİK | %100 | AÇ | — |
| Kullanıcı Kimlik Doğrulama Rotasında SQL Yerleştirme |
| 🔴 KRİTİK | %100 | AÇ | — |
| 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 |
|
|
🔴 Kritik | Kullanıcı Kimlik Doğrulama Rotasında SQL Yerleştirme |
|
|
🔴 Kritik | B2B Sipariş İşleme'de Korumalı Alandan Kaçış Yoluyla Uzaktan Kod Yürütme |
|
|
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.

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 ( | Hizmet hesabında |
|
HTTP 400 ( | OIDC |
|
HTTP 400 (jeton değişimi sırasında | OIDC sağlayıcısında hatalı biçimlendirilmiş |
|
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 |
| Başarılı | Durum kontrolleri başarılı oldu veya tarama, engelleyici bulgular olmadan tamamlandı. |
| Bulgular / Genel | Bir PR'de |
|
| WIF OAuth/ADC jeton değişimi başarısız oldu ( |
|
|
|
|
| Çalıştırıcı, |
|
| Hizmet hesabında hedef projede |
|
| Ön kontrol |
|
| 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 ( |
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ı ( |
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.