Azure DevOps Service Connection ile PAT’siz Kimlik Doğrulama

Azure DevOps, pipeline’lardan organizasyona erişimde PAT yerine Microsoft Entra iş yükü kimliğiyle çalışan yeni bir service connection türü sunuyor. Servis sorumlusu veya yönetilen kimlikle federasyon tabanlı doğrulama sağlar.

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

İlgili yazılar:

Bu yazı yapay zeka (büyük dil modelleri) ile hazırlanmış, insan editör tarafından incelenmiştir. İçerik üretim sürecimiz.
Aşkın KILIÇ

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için YouTube ve GitHub hesaplarımı takip edin.

Haftalık Bülten

Her pazar özenle seçilmiş teknoloji yazıları doğrudan e-postanıza gelsin.

4 Yorum

  1. PAT’lerin sürekli expire olup pipeline’ları patlatması gerçekten baş ağrısıydı, bu geçiş çok yerinde olmuş. Peki mevcut PAT tabanlı service connection’ları migrate etmek için özel bir yol var mı, yoksa sıfırdan mı kurmak gerekiyor?

  2. PAT’lerin süresi dolunca her seferinde yenilemek gerçekten can sıkıcıydı, bu yöntem işleri epey kolaylaştıracak gibi görünüyor. Yönetilen kimlikle federasyon kısmını biraz daha açar mısınız, tam olarak nasıl kurgulanıyor merak ettim.

  3. PAT’lerin süresi dolunca her seferinde yenilemek gerçekten can sıkıcıydı, bu yaklaşım işleri çok kolaylaştıracak. Yönetilen kimlikle federasyonu deneyen var mı, production ortamında sorunsuz çalışıyor mu?

Yoruma kapalı.

✉

Haftalık Bülten

Azure, DevOps ve Yapay Zeka dünyasındaki en güncel içerikleri her hafta doğrudan e-postanıza alın.

Spam yok. İstediğiniz zaman iptal edebilirsiniz.
📱
Uygulamayı Yükle Ana ekrana ekle, çevrimdışı oku
Kategoriler
Ara
Paylaş
WhatsApp
İçindekiler
← Gateway API’yi kind ile ...
Azure Boards: Kartlarda Pull R... →
📩

Gitmeden önce!

Her pazar özenle seçilmiş teknoloji yazıları ve AI haberleri doğrudan e-postanıza gelsin. Ücretsiz, spam yok.

🔒 Bilgileriniz güvende. İstediğiniz zaman ayrılabilirsiniz.

📬 Haftalık bülten: Teknoloji + AI haberleri
Beni Takip Et Yeni Azure / AI / DevOps yazılarını GitHub ve RSS üzerinden takip edin.