Die Automatisierung in Azure DevOps steigert die Effizienz von Unternehmen – von der Verwaltung von Work Items bis zu komplexen CI/CD-Prozessen. Doch diese Vorteile bringen auch Sicherheitsherausforderungen mit sich, insbesondere im Zugriffsmanagement, wo es wichtig ist, höchste Sicherheitsstandards zu wahren und Compliance-Vorgaben einzuhalten. Während viele Unternehmen noch Personal Access Tokens (PATs) verwenden, bieten Service Principals eine sichere und zuverlässige Alternative.
In diesem Beitrag erfahren Sie, warum die Automatisierung in Azure DevOps mit Service Principals die bevorzugte Lösung ist, um Sicherheitsrisiken zu minimieren und den Verwaltungsaufwand zu reduzieren. Am Ende präsentieren wir Ihnen ein Azure DevOps Pipeline Template, das Ihnen die Implementierung erleichtert.
Die Verwendung von Personal Access Tokens (PATs) für automatisierte Prozesse bringt diverse Herausforderungen in Bezug auf Sicherheit, Verwaltung und Compliance mit sich.
Ein PAT ist an ein bestimmtes Benutzerkonto gebunden. Kompromittiert jemand diesen Token, erhält er Zugriff auf alle Ressourcen, für die der Benutzer berechtigt ist. Diese Kontobindung macht PATs anfällig für Missbrauch, insbesondere in automatisierten Umgebungen, wo eine bessere Kontrolle und Trennung von Benutzer- und Systemrechten erforderlich sind.
PATs haben eine begrenzte Gültigkeitsdauer und müssen regelmässig manuell erneuert werden. Läuft ein Token ab, kann dies zu unerwarteten Unterbrechungen automatisierter Prozesse führen. In Teams mit mehreren Tokens wird das Nachverfolgen und rechtzeitige Erneuern schnell zur komplexen Aufgabe, die zusätzliche Ressourcen beansprucht. Hier könnte eine effiziente IT-Strategie helfen, um die Verwaltung zu optimieren.
Bei Personalwechsel bleiben persönliche PATs bestehen, bis sie manuell widerrufen werden. Wenn die Verwaltung unzureichend ist, könnten ehemalige Mitarbeiter oder Partner weiterhin Zugriff auf geschützte Ressourcen haben. Diese zentrale Verwaltung der Zugriffsrechte ist bei PATs problematisch und birgt Sicherheitslücken.
Die Implementierung von Service Principals in Azure DevOps eröffnet eine Vielzahl von Vorteilen, die über die reine Automatisierung hinausgehen.
Service Principals sind speziell für Automatisierungen und Anwendungen konzipiert, wodurch sie weniger anfällig für Missbrauch sind. Da sie unabhängig von Benutzerkonten operieren und keine persönlichen Anmeldeinformationen benötigen, wird das Risiko von Sicherheitsvorfällen erheblich reduziert. Zudem ermöglichen sie eine granularere Steuerung der Zugriffsrechte, sodass nur die erforderlichen Berechtigungen für spezifische Aufgaben vergeben werden.
Die Verwaltung von Zugriffsrechten in DevOps-Pipelines kann eine Herausforderung sein. Mit Service Principals wird der Zugriff auf die absolut notwendigen Ressourcen beschränkt, was überflüssige Berechtigungen minimiert und die Übersichtlichkeit erhöht. Das Prinzip des minimalen Zugriffs (Principle of Least Privilege) ermöglicht es, spezifische Rollen und Berechtigungen für jede Pipeline festzulegen und Sicherheitslücken zu vermeiden. Dies ist besonders wichtig für die digitale Transformation, wo klare Zugriffsstrukturen gefordert sind.
Für Unternehmen mit strengen Compliance-Vorgaben bieten Service Principals die erforderlichen Kontrollmechanismen und Transparenz. Diese Lösung entspricht den Best Practices zur Einhaltung von Datenschutz- und Sicherheitsanforderungen und erleichtert die Nachverfolgbarkeit von Zugriffen – ein zentraler Aspekt bei Audits. In Kombination mit modernen Cloud-Lösungen können Unternehmen ihre Sicherheitsstandards weiter erhöhen.
Insgesamt bieten Service Principals eine robuste Lösung für die Automatisierung in Azure DevOps und adressieren die häufigsten Herausforderungen, die mit der Verwendung von Personal Access Tokens verbunden sind. Die Implementierung dieser Lösung ist nicht nur ein Schritt in Richtung einer sicheren Infrastruktur, sondern auch ein Beitrag zu einer effizienten und skalierbaren DevOps-Praxis.
Um den Prozess der Verwendung von Service Principals zu erleichtern, haben wir eine Azure DevOps Pipeline Template entwickelt, welches Service Principals nutzt, um zeitlich begrenzte PATs zu generieren. So können Entwickler sicherstellen, dass sie Compliance-Vorgaben erfüllen, ohne sich um die Details kümmern zu müssen.
Fügen Sie die Vorlage und das Skript zu Ihrem bestehenden CI/CD-Repo hinzu oder erstellen Sie ein neues. Dies stellt sicher, dass alle erforderlichen Komponenten bei der Ausführung der Pipeline verfügbar sind.
Erstellen Sie den Service Principal und speichern Sie die Anmeldedaten. Nutzen Sie dafür entweder den Azure Key Vault oder die Azure DevOps Pipeline Library. Berechtigen Sie den Service Principal in Azure DevOps genauso wie einen Benutzer, der die Aufgaben ausführen soll.
Verwenden Sie die vordefinierte Aufgabe aus der Vorlage, um das CI/CD-Repository mit der Pipeline zu verknüpfen. Dies gewährleistet, dass die richtigen Ressourcen während der Ausführung der Pipeline zur Verfügung stehen.
Das Script im Template fragt automatisch einen temporären PAT ab und stellt diesen per Environment variable den folgenden Schritten in der Pipeline zur Verfügung.
Diese Lösung reduziert die Komplexität und sorgt gleichzeitig für die Einhaltung der Compliance-Richtlinien in Azure DevOps. Durch den Einsatz von Service Principals wird die Automatisierung nicht nur sicherer, sondern auch effizienter, da die Abhängigkeit von manuell verwalteten PATs entfällt.
#!/bin/bash
# Parse command-line arguments
while [[ "$#" -gt 0 ]]; do
case $1 in
--tenantId) tenant_id="$2"; shift ;;
--clientId) client_id="$2"; shift ;;
--clientSecret) client_secret="$2"; shift ;;
*) echo "Unknown parameter passed: $1"; exit 1 ;;
esac
shift
done
# Check if required parameters are provided
if [[ -z "$tenant_id" || -z "$client_id" || -z "$client_secret" ]]; then
echo "Error: Missing required parameters."
echo "Usage: $0 --tenantId --clientId --clientSecret "
exit 1
fi
# Get access token
response=$(curl -s -X POST -d "grant_type=client_credentials&client_id=$client_id&client_secret=$client_secret&resource=499b84ac-1321-427f-aa17-267ca6975798/.default" \
https://login.microsoftonline.com/"$tenant_id"/oauth2/token)
access_token=$(echo "$response" | jq -r '.access_token')
if [ "$access_token" == "null" ]; then
echo "Error: Unable to get access token."
echo "Response: $response"
exit 1
fi
export ADO_AT="$access_token"
echo "##vso[task.setvariable variable=ADO_AT]$access_token"
parameters:
- name: tenantId
type: string
- name: clientId
type: string
- name: clientSecret
type: string
steps:
- checkout: self # Check out the repository where the pipeline runs
- checkout: cicd-pipeline-library # Check out the pipeline library repository, to have the shell script available
- task: Bash@3
inputs:
filePath: './cicd-pipeline-library/ci-templates/utils/set-azdev-sp-at-env.sh'
arguments: '--tenantId ${{ parameters.tenantId }} --clientId ${{ parameters.clientId }} --clientSecret ${{ parameters.clientSecret }}'
displayName: "Get and set Azure DevOps Service Principal Access Token"
trigger:
- main
resources:
repositories:
- repository: cicd-pipeline-library
name: cicd-pipeline-library
type: git
ref: refs/tags/2024-10-final-2
pool:
vmImage: 'ubuntu-latest'
variables:
- group: 'app-python-azdogantt'
steps:
- checkout: self
# Use service principal to get a short time PAT
- template: ci-templates/utils/set-azdev-sp-at-env.yml@cicd-pipeline-library
parameters:
tenantId: $(TenantId)
clientId: $(ClientId)
clientSecret: $(ClientSecret)
# Run a Python script that requires the access token (AT)
- script: |
cd app-python-azdogantt
python src/generate_gantt.py
env:
ADO_ORG: $(ADO_ORG)
ADO_PROJECT: $(ADO_PROJECT)
ADO_TEAM: $(ADO_TEAM)
ADO_AT: $(ADO_AT)
displayName: 'Generate Gantt chart HTML file'
Unsere Experten stehen Ihnen gerne zur Verfügung!