पाठ 20 / 25
CI/CD with GitHub Actions and OIDC
Deploy to Azure from a pipeline without storing long-lived secrets.
Federated credentials instead of client secrets
A pipeline needs an Azure identity to deploy. The old approach stored a service principal's client secret in the CI system, which expires, leaks and is hard to rotate. The recommended approach is workload identity federation with OpenID Connect (OIDC): you create an Entra app registration (or a user-assigned managed identity), add a federated credential that trusts tokens from GitHub for a specific repository and branch or environment, and grant it a narrowly scoped role. At run time GitHub issues a short-lived token, Entra exchanges it for an Azure token, and no secret is stored anywhere. The same pattern works for Azure DevOps, GitLab and Kubernetes workloads.
A GitHub Actions job using OIDC
Only IDs are stored as repository variables; none of them is a secret.
name: deploy-infra
on:
push:
branches: [main]
permissions:
id-token: write # allow the job to request an OIDC token
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- uses: azure/login@v2
with:
client-id: ${{ vars.AZURE_CLIENT_ID }}
tenant-id: ${{ vars.AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
- run: az deployment group what-if -g rg-shop-prod-cin -f infra/main.bicep
- run: az deployment group create -g rg-shop-prod-cin -f infra/main.bicepA visitor badge instead of a house key
A stored client secret is a copied house key that works until someone changes the locks. OIDC is a visitor badge printed at reception for one visit, checked against the guest list, and useless the next day.
त्वरित जाँच: Why is OIDC federation preferred over storing a client secret in GitHub?
- It makes deployments run faster
- It removes the need for RBAC roles
- It only works with Bicep
- No long-lived secret is stored; each run gets a short-lived token scoped by a trust rule
Answer
No long-lived secret is stored; each run gets a short-lived token scoped by a trust rule — Federation exchanges a short-lived GitHub token for an Azure token, so there is nothing to leak or rotate.