GitHub Actions ile Vercel Container Registry (VCR) Entegrasyonu: Parolasız ve Güvenli OIDC Mimarisi
GitHub Actions ve OIDC protokolüyle Vercel Container Registry'ye (VCR) uzun ömürlü token olmadan güvenli Docker imajı dağıtımı rehberi ve teknik analizi.
Modern bulut mimarilerinde ve sürekli entegrasyon / sürekli dağıtım (CI/CD) süreçlerinde güvenlik, artık opsiyonel bir katman değil, altyapının temel direğidir. Geleneksel CI/CD süreçlerinde harici bir kayıt defterine (container registry) imaj göndermek için aylarca, hatta yıllarca geçerliliğini koruyan statik API anahtarları veya servis hesabı parolaları kullanılırdı. Ancak bu yaklaşım, sızdırılan kimlik bilgileri nedeniyle ciddi güvenlik zafiyetlerine yol açıyordu.
Vercel, modern mikroservis ve sunucusuz (serverless/sandbox) iş yüklerini güçlendirmek amacıyla duyurduğu Vercel Container Registry (VCR) ekosistemine GitHub Actions üzerinden parolasız (secretless) kimlik doğrulama desteği getirdi. vercel/vcr-action/login eylemi sayesinde, uzun ömürlü gizli anahtarlar saklama zorunluluğu tamamen ortadan kalkıyor. OpenID Connect (OIDC) tabanlı bu yeni mimari, GitHub iş akışının kimliğini anlık olarak doğrulayarak yalnızca işlem süresince geçerli kısa ömürlü (ephemeral) erişim belirteçleri üretiyor.
Bu teknik makalede, Vercel Container Registry mimarisini, GitHub OIDC token takasının arka planını ve sıfır güven (Zero Trust) prensiplerine dayalı bir CI/CD pipeline'ının uçtan uca nasıl kurulacağını derinlemesine inceliyoruz.
OIDC Tabanlı Kimlik Doğrulamanın Çalışma Mantığı
OpenID Connect (OIDC), harici bir sistemin (örneğin GitHub Actions), hedef sağlayıcıya (Vercel) kalıcı bir şifre paylaşmadan kendi kimliğini kriptografik olarak imzalanmış bir JSON Web Token (JWT) ile kanıtlamasını sağlar.
İşlem adımları arka planda şu sırayla gerçekleşir:
- OIDC Belirteci Talebi: GitHub Actions işi çalıştığında, GitHub'ın dahili OIDC sağlayıcısından bir
id-tokentalep edilir. - Belirteç Değişimi (Token Exchange):
vercel/vcr-action/logineylemi bu imzalı JWT'yi alır ve Vercel API'sine iletir. - Doğrulama ve Kapsam Denetimi: Vercel, gelen JWT'nin imzasını, GitHub organizasyonunu, deposunu ve branch kriterlerini önceden tanımlanmış OIDC politikası ile eşleştirir.
- Kısa Ömürlü Erişim: Eşleşme başarılıysa Vercel, yalnızca ilgili depoya ve işe özel, dakikalar içinde geçerliliğini yitirecek bir VCR erişim belirteci döner.
- Otomatik Temizleme (Revocation): İş akışı tamamlandığında veya başarısız olduğunda, eylem Docker oturumunu kapatır ve Vercel belirtecini derhal iptal eder.
Güvenlik Notu: Bu yaklaşım sayesinde CI/CD sırları (secrets) yönetimi yükü ortadan kalkar. Çalınabilecek veya unutulabilecek statik bir şifre olmadığı için tedarik zinciri saldırılarına (supply chain attacks) karşı en üst düzey savunma sağlanır.
Kimlik Doğrulama Yöntemlerinin Karşılaştırması
Bulut sağlayıcıları arasında konteyner imajı aktarırken kullanılan yöntemlerin operasyonel ve güvenlik farklılıkları aşağıdaki tabloda özetlenmiştir:
| Kriter / Yöntem | Statik API Anahtarları / Registry Secret | Vercel OIDC (vercel/vcr-action/login) |
|---|---|---|
| Kimlik Ömrü | Uzun ömürlü (Aylar/Yıllar) | Çok kısa ömürlü (Sadece iş süresince) |
| Sızıntı Riski | Yüksek (Loglar, sızan değişkenler) | Yok (Bellekte tutulur, anında iptal edilir) |
| Rotasyon Gereksinimi | Düzenli manuel veya scriptli rotasyon | Sıfır operasyonel yük (Otomatik) |
| Yetki Granülaritesi | Genellikle geniş kapsamlı (Team-wide) | Repo, branch ve workflow bazlı kısıtlama |
| Bakım Maliyeti | Değişen anahtarları güncelleme zahmeti | Sıfır bakım, merkezi politika yönetimi |
Adım Adım Kurulum: GitHub Actions'tan VCR'a İmaj Dağıtımı
GitHub Actions üzerinden Vercel Container Registry'ye güvenli şekilde imaj gönderebilmek için belirli ön yapılandırmaların tamamlanması gerekir.
1. Vercel Ekip Politikasının (OIDC Policy) Tanımlanması
İlk olarak Vercel kontrol paneli üzerinden ekibinizin ayarlarına gidin ve GitHub deponuzu hedefleyen bir OIDC kuralı oluşturun. Bu kural; GitHub organizasyonunuzu, repo adınızı, izin verilen branch'leri (örneğin yalnızca main) ve VCR üzerindeki read-write yetkisini tanımlamalıdır.
2. GitHub Değişkenlerinin (Variables) Tanımlanması
GitHub reponuzun Settings > Secrets and variables > Actions > Variables sekmesinde aşağıdaki değerleri tanımlayın. Bunlar hassas şifreler değil, genel kimlik tanımlayıcılardır:
VERCEL_TEAM_ID: Vercel ekip kimliğiniz (Team ID).VERCEL_TEAM_SLUG: Vercel ekip kısa adı.VERCEL_PROJECT_SLUG: Projenizin Vercel üzerindeki slug adı.VCR_REPOSITORY: VCR içerisinde oluşturulacak veya kullanılacak konteyner deposu adı.
3. Pipeline Dosyasının Yapılandırılması
GitHub reponuzda .github/workflows/push-to-vcr.yml dosyasını oluşturun. Buradaki en kritik nokta, id-token: write izninin verilmesidir; aksi takdirde GitHub OIDC sağlayıcısı belirteç üretmeyecektir.
name: Push to VCR
on:
push:
branches: [ main ]
permissions:
contents: read
id-token: write
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Kodu Klonla
uses: actions/checkout@v4
- name: Docker Buildx Kurulumu
uses: docker/setup-buildx-action@v3
- name: Vercel Container Registry Oturumu Aç
uses: vercel/vcr-action/login@v1
with:
team: ${{ vars.VERCEL_TEAM_ID }}
- name: Docker İmajını Derle ve VCR'a Gönder
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64
provenance: false
tags: vcr.vercel.com/${{ vars.VERCEL_TEAM_SLUG }}/${{ vars.VERCEL_PROJECT_SLUG }}/${{ vars.VCR_REPOSITORY }}:latest
outputs: type=image,push=true,oci-mediatypes=true,compression=zstd,compression-level=3,force-compression=true
Performans Optimizasyonu: Zstandard (zstd) ve OCI Mediatypes
Yukarıdaki iş akışında dikkat çeken en önemli optimizasyon parametresi outputs bloğundaki sıkıştırma ayarlarıdır:
oci-mediatypes=true, compression=zstd, compression-level=3, force-compression=true
- Zstandard (zstd) Sıkıştırması: Geleneksel
gzipalgoritmasına kıyasla çok daha yüksek açılma (decompression) hızlarına sahiptir. Vercel Sandbox ortamları yeni bir konteyneri ayağa kaldırırken (cold start) imaj katmanlarını zstd sayesinde saniyeler içinde indirip açabilir. - OCI Mediatypes: Docker'ın eski formatları yerine modern Open Container Initiative (OCI) spesifikasyonlarını kullanarak kayıt defteriyle standart bir iletişim kurulmasını sağlar.
- Platform Kısıtı: Vercel Sandbox altyapısı şu an için
linux/amd64mimarisini temel alır. Bu nedenle çoklu mimari (multi-arch) derlemeleri yerine doğrudan hedeflenen platforma özgü derleme yapmak CI/CD sürelerini yarı yarıya kısaltacaktır.
Konteyner Alternatifleri: Podman ve Buildah Desteği
vercel/vcr-action/login varsayılan olarak Docker istemcisini yapılandırır. Ancak köksüz (rootless) veya kurumsal güvenlik standartları gereği Podman ya da Buildah tercih eden ekipler için engines parametresi sunulmaktadır:
- name: Podman ile VCR Girişi
uses: vercel/vcr-action/login@v1
with:
team: ${{ vars.VERCEL_TEAM_ID }}
engines: |
podman
buildah
Bu esneklik, CI ajanlarında Docker Daemon çalıştırmak istemeyen mühendislik ekiplerine geniş bir mimari bağımsızlık kazandırır.
Vercel Sandbox Entegrasyonu ve Üretime Dağıtım
VCR'a başarıyla gönderilen bir imaj, aynı Vercel projesi içinde doğrudan özel bir çalışma ortamı (custom sandbox) olarak kullanılabilir. Yapılandırma dosyalarınızda veya fonksiyon tanımlarınızda harici URL'ler yerine doğrudan <repository>:<tag> şeklinde referans verilmesi yeterlidir.
Bu özellik; yapay zeka çıkarım modelleri (AI inference), yoğun veri işleme scriptleri, Puppeteer/Playwright gibi headless tarayıcı otomasyonları ve özel sistem kütüphanelerine (FFmpeg, ImageMagick vb.) ihtiyaç duyan modern web uygulamaları için benzersiz bir hız ve izolasyon avantajı sağlar.
Kaynak: Vercel Blog - https://vercel.com/changelog/vcr-login-github-action
Sıkça Sorulan Sorular
Bu konu hakkında geliştiricilerin ve site sahiplerinin en çok merak ettiği soruların yanıtları.
Statik token'lar çalındığında iptal edilene kadar geçerlidir ve genellikle geniş yetkilere sahiptir. OIDC mimarisinde ise sistemde saklanan hiçbir şifre yoktur. GitHub ve Vercel arasında anlık kriptografik doğrulama yapılır; üretilen token yalnızca ilgili CI/CD işi boyunca (dakikalar mertebesinde) geçerlidir ve işlem bittiğinde otomatik olarak geçersiz kılınır.