Bezpieczne wdrażanie do Azure z GitHub Actions: Konfiguracja OIDC
Chcesz skonfigurować bezpieczny dostęp do Microsoft Azure z poziomu GitHub Actions dla wdrożeń infrastruktury i aplikacji? Jeśli tak, to ten przewodnik jest dla Ciebie. Pokażę Ci, jak to zrobić krok po kroku, wykorzystując Azure CLI.
Dlaczego OIDC?
Dlaczego to rozwiązanie jest bezpieczniejsze od tradycyjnego Service Principal z kluczem (secret)? Ponieważ nie tworzymy konta z hasłem, które trzeba rotować i chronić przed wyciekiem.
Mechanizm ten działa na zasadzie Workload Identity Federation. Polega on na powiązaniu obiektu Service Principal w Azure z konkretnym repozytorium GitHub. Dzięki protokołowi OIDC (OpenID Connect), GitHub wymienia swój token tożsamości na krótko żyjący token dostępu do Azure.
Więcej o tym mechanizmie przeczytasz w dokumentacji Microsoft.
Wymagania
Do wykonania poniższych kroków będziesz potrzebować Azure CLI.
- Co to jest Azure CLI?: Wprowadzenie
- Instalacja: Instrukcja instalacji
Konfiguracja krok po kroku
Po zalogowaniu się do Azure (az login), wykonaj poniższe polecenia w terminalu. Dla wygody możesz też użyć Cloud Shell dostępnego w Azure Portal.
1. Tworzenie aplikacji i Service Principal
Najpierw utworzymy App Registration oraz Service Principal.
# Tworzymy App Registration i pobieramy appId
az ad app create --display-name "gh-action-private" --query "appId" -o tsv
# UWAGA: Skopiuj wyświetlony appId. Będzie on używany w kolejnych komendach jako [appId].
# Tworzymy Service Principal dla aplikacji
az ad sp create --id [appId]
Pierwsza komenda utworzy nowy obiekt App Registration w Microsoft Entra ID.

Druga komenda utworzy obiekt Enterprise Application (Service Principal) o tej samej nazwie.

2. Nadawanie uprawnień
Po utworzeniu tożsamości, musimy nadać jej uprawnienia do subskrypcji. W tym przykładzie użyjemy roli Contributor.
Dobra praktyka: Jestem zwolennikiem nadawania najniższych możliwych uprawnień (Least Privilege). Jednak dla ogólnych wdrożeń infrastruktury, rola Contributor na poziomie subskrypcji jest często niezbędnym minimum.
# Podmień [appId] na ID z poprzedniego kroku oraz wpisz swoje ID subskrypcji
az role assignment create --assignee [appId] --role Contributor --scope /subscriptions/[TWOJE_SUBSCRIPTION_ID]
Nadane uprawnienia możesz sprawdzić w portalu Azure, wchodząc w Subskrypcję -> IAM -> Role Assignments.

3. Konfiguracja federacji (OIDC)
Teraz najważniejszy krok – powiązanie aplikacji Azure z repozytorium GitHub.
# Podmień [appId] oraz [NAZWA_TWOJEGO_REPO] (format: Użytkownik/Repozytorium)
az ad app federated-credential create --id [appId] --parameters '{"name": "gh-action-private", "issuer": "https://token.actions.githubusercontent.com", "subject": "repo:RogalaPiotr/[NAZWA_TWOJEGO_REPO]:ref:refs/heads/main", "description": "OIDC federacja dla GitHub Actions repo [NAZWA_TWOJEGO_REPO]", "audiences": ["api://AzureADTokenExchange"]}'

W sekcji App Registration możesz zweryfikować poprawność utworzonej federacji:

4. Pobranie danych App Registration
Aby skonfigurować GitHub Actions, potrzebujemy trzech wartości: Client ID, Tenant ID oraz Subscription ID.
# Pobierz Client ID (Application ID) - jeśli zgubiłeś
az ad app show --id [appId] --query "appId" -o tsv
# Pobierz Tenant ID
az account show --query tenantId -o tsv
# Subscription ID masz już z kroku 2.
5. Konfiguracja GitHub
Przejdź teraz do swojego repozytorium na GitHub. Wejdź w Settings -> Secrets and variables -> Actions i dodaj następujące sekrety (Repository secrets):
AZURE_CLIENT_ID– Twój Application IDAZURE_TENANT_ID– Twój Tenant IDAZURE_SUBSCRIPTION_ID– ID subskrypcji, do której nadałeś uprawnienia (w naszym przypadku Contributor)

6. Testowy Pipeline
Jeśli wszystko jest skonfigurowane, możemy utworzyć testowy workflow, aby sprawdzić połączenie.
Utwórz plik .github/workflows/github-actions-test-oidc-federation.yml:
name: 'github-actions-test-oidc-federation'
on:
pull_request:
paths:
- '.github/workflows/github-actions-test-oidc-federation.yml'
push:
branches:
- main
paths:
- '.github/workflows/github-actions-test-oidc-federation.yml'
workflow_dispatch:
permissions:
id-token: write # Wymagane do działania OIDC!
contents: read
jobs:
azure-login-test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Azure Login
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: Show Azure Account
run: az account show
- name: List Resource Groups
run: az group list --output table
Jeśli pipeline zakończy się sukcesem, zobaczysz listę grup zasobów w logach.

Jeśli pipeline nie działa, upewnij się, że:
- Sekrety w GitHub są poprawne.
- Rola na subskrypcji została poprawnie nadana.
- Subject w federacji (
repo:Użytkownik/Repo:ref:refs/heads/main) dokładnie odpowiada Twojemu repozytorium i gałęzi.
Przydatne linki
- Azure: Configure a federated identity credential
- GitHub: OIDC for Actions
- GitHub Action: Azure Login
- RBAC: Built-in roles (Contributor)
Jeśli interesuje Cię wdrożenie konkretnych usług lub masz pytania, daj znać w komentarzu!