Azure DevOps Service Connection ile PAT’siz Kimlik Doğrulama
Azure DevOps, pipeline’lardan organizasyona erişim için Personal Access Token (PAT) veya build session token yerine Microsoft Entra iş yükü kimliğini kullanmaya olanak tanıyan yeni bir bağlantı türü sundu: Azure DevOps service connection. Bu bağlantı, servis sorumlusu (service principal) veya yönetilen kimlik (managed identity) ile pipeline’ların Azure DevOps kaynaklarına federasyon tabanlı kimlik doğrulamayla ulaşmasını sağlıyor. Yazının devamında bağlantının ne işe yaradığına, nasıl yapılandırıldığına ve hangi görevlerde kullanılabileceğine bakıyoruz.
Neden Azure DevOps service connection?
Bu bağlantı türü pipeline güvenliğini birkaç yönden iyileştiriyor:
- PAT’siz kimlik doğrulama: Personal Access Token üretme, saklama ve rotasyon ihtiyacını ortadan kaldırır.
- En az ayrıcalık: Paylaşımlı build service account izinleri yerine pipeline veya görev bazında izin tanımlama imkanı sunar.
- Kalıcı sır yok: Parola yerine Microsoft Entra federated credential kullanılır.
- Denetim izi: Tüm kimlik doğrulama denemeleri Azure DevOps audit log’una yazılır.
Bağlantı Microsoft Entra kimliği üzerinden çalıştığı için aynı Entra ID kiracısına bağlı başka bir Azure DevOps organizasyonundaki kaynaklara erişmek için de kullanılabilir.
Bağlantıyı yapılandırmadan önce
Önemli bir ön koşul var: Service connection oluşturma deneyimi, Entra tarafında kimlik veya Azure DevOps tarafında kullanıcı oluşturmaz. Her ikisinin de önceden hazır olması gerekir. Bu nedenle bağlantıyı kurmadan önce bir servis sorumlusu veya yönetilen kimliği organizasyona kullanıcı olarak ekleyip gerekli izinleri atamak gerekir.
Kimlik hazır olduktan sonra yeni service connection oluştururken Azure DevOps (preview) seçeneği belirlenir ve önceden tanımlanmış servis sorumlusu veya yönetilen kimlik seçilir. Kimliğin organizasyon içinde ihtiyaç duyduğu izinleri (örneğin ilgili projenin Readers grubuna eklenmesi) atamak gerekiyor; yapılandırma arayüzündeki View access in the current organization bağlantısı bu adımda yönlendirici oluyor.
Manuel yapılandırma alternatifi
Bazı durumlarda oturum açan kullanıcı, federated identity credential (FIC) kaydını otomatik oluşturamaz. Örneğin kullanıcının Microsoft Graph izinleri yetersizse arayüz manuel yönlendirmeye düşer. Bu senaryoda ekranda gösterilen issuer ve subject değerleri, gerekli yetkiye sahip bir yöneticiye iletilir, federated credential elle eklenir ve ardından bağlantı tamamlanır.
Kullanım senaryoları
Başka bir organizasyondan repository çekmek
resources:
repositories:
- repository: external-repo
type: git
endpoint: my-azdo-connection
name: 'external-project/external-repo'
ref: 'refs/heads/main'
steps:
- checkout: self
- checkout: external-repo
Başka bir organizasyondan YAML template kullanmak
resources:
repositories:
- repository: templates
type: git
endpoint: my-azdo-connection
name: 'external-project/external-repo'
ref: "refs/heads/main"
steps:
- template: azdosc-template.yml@templates
Artık runtime parameter kullanarak repository resource için hangi service connection’ın kullanılacağı dışarıdan da verilebiliyor. Böylece aynı template farklı organizasyon ve ortamlarda yeniden kullanılabilir hale geliyor:
parameters:
- name: serviceConnectionName
type: string
default: my-azdo-connection
resources:
repositories:
- repository: templates
type: git
endpoint: ${{ parameters.serviceConnectionName }}
name: 'external-project/external-repo'
ref: "refs/heads/main"
Artifacts feed’e erişim
- task: NuGetAuthenticate@1
inputs:
nuGetServiceConnections: 'my-azdo-connection'
- task: DotNetCoreCLI@2
inputs:
command: 'restore'
projects: '**/*.csproj'
Invoke REST API görevi ile Azure DevOps REST API’lerine çağrı
Invoke REST API görevi (InvokeRESTAPI@1) artık Azure DevOps service connection’ı doğrudan kabul ediyor. Böylece özel bir “generic” bağlantı tanımlayıp token’ı elle yönetmek gerekmiyor. connectionType alanına connectedServiceNameAzureDevOps verilir:
- task: InvokeRESTAPI@1
inputs:
connectionType: 'connectedServiceNameAzureDevOps'
serviceConnection: 'my-azdo-connection'
method: 'GET'
urlSuffix: 'external-project/_apis/build/builds?api-version=7.1'
Script içinde kullanım
Yeni AzureCLI@3 görevi, Microsoft Entra kimlik doğrulaması ile Azure DevOps’a birkaç farklı şekilde erişebiliyor. Her senaryoda connectionType: 'azureDevOps' belirtilir ve azureDevOpsServiceConnection alanına tanımlı service connection adı yazılır:
- task: AzureCLI@3
inputs:
connectionType: 'azureDevOps'
azureDevOpsServiceConnection: 'my-azdo-connection'
Bu yapı, Azure DevOps CLI ile Entra kimliği üzerinden oturum açılmış bir bağlam oluşturuyor:
- task: AzureCLI@3
displayName: Secret-less
inputs:
connectionType: 'azureDevOps'
azureDevOpsServiceConnection: 'my-azdo-connection'
scriptType: 'pscore'
scriptLocation: 'inlineScript'
inlineScript: |
az devops configure -l
az devops project list --query "value[].{Name:name, Id:id}" `
-o table
az pipelines pool list --query "[].{Id:id, Name:name}" `
-o table
az rest --method get `
--url "https://status.dev.azure.com/_apis/status/health?api-version=7.1-preview.1" `
--resource 499b84ac-1321-427f-aa17-267ca6975798 `
--query "sort_by(services[?id=='Pipelines'].geographies | [], &name)" `
-o table
Halihazırda inline biçimde PAT veya System.AccessToken kullanan bir script varsa, onun yerine Azure DevOps’a erişmek için Entra access token alınabiliyor:
- task: AzureCLI@3
displayName: Use Entra access token
inputs:
connectionType: 'azureDevOps'
azureDevOpsServiceConnection: 'my-azdo-connection'
scriptType: 'pscore'
scriptLocation: 'inlineScript'
inlineScript: |
# Get access token for Azure DevOps
$token = az account get-access-token --resource "499b84ac-1321-427f-aa17-267ca6975798" `
--query "accessToken" `
--output tsv
# Use token in REST API call
$headers = @{
Authorization = "Bearer $token"
"Content-Type" = "application/json"
}
$body = @{
name = "Test Build"
} | ConvertTo-Json
Invoke-RestMethod -Uri "$(System.CollectionUri)$(System.TeamProject)/_apis/build/definitions?api-version=7.1" `
-Method POST `
-Headers $headers `
-Body $body
Değerlendirme
PAT ömrünü uzatmak, rotasyon süreçlerini kurgulamak ve paylaşımlı build servis hesabı izinlerini yönetmek uzun süredir Azure DevOps kullanıcılarının en çok konuştuğu güvenlik başlıklarındandı. Federated credential temelli bu bağlantı, sırların kalıcı olarak depolanmasını ortadan kaldırıyor, her pipeline veya görev için ayrı ayrı yetkilendirme yapmayı da kolaylaştırıyor. Çoklu organizasyon senaryolarında ortak Entra ID kiracısı üzerinden kimlik doğrulamak, template ve repository paylaşımını daha temiz bir güvenlik modeline taşıyor.
Kaynaklar ve İleri Okuma
- Orijinal duyuru: You can now use the Azure DevOps Service Connection instead of a PAT or Build Session token
- Azure DevOps service connection dokümantasyonu
- Service principal ve managed identity kullanımı
- Pipeline access token’ları
- Invoke REST API görev referansı
- Azure DevOps CLI
- Azure DevOps Developer Community • Azure DevOps Support
İlgili yazılar:
- Azure DevOps Issuer Emekliye Ayrılıyor: WIF Geçişi Şart
- Azure DevOps’ta Güvenlik Krizi: Build Kimlikleri







Yorum gönder