Discover how to ditch secret keys and make your CI/CD pipeline both safer and easier!
Why OIDC authentication for CI/CD in Terraform? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine you have a CI/CD pipeline that needs to access cloud resources securely. Without automation, you manually create and manage long-lived credentials or keys for each pipeline run.
This manual approach is slow and risky. Keys can be leaked or forgotten to rotate, causing security holes. It's also a hassle to update credentials every time permissions change.
OIDC authentication lets your CI/CD pipeline prove its identity dynamically using short-lived tokens. This removes the need for stored secrets and automates secure access to cloud resources.
aws_access_key = "OLD_KEY" aws_secret_key = "OLD_SECRET"
provider "aws" { region = "us-east-1" }
It enables secure, automatic, and scalable access to cloud resources without managing static secrets.
A developer pushes code to GitHub. The GitHub Actions workflow uses OIDC to get a temporary token and deploys the app to AWS without storing any AWS keys in the repo.
Manual credential management is slow and risky.
OIDC provides short-lived, automatic authentication for CI/CD.
This improves security and simplifies pipeline setup.
Practice
Solution
Step 1: Understand OIDC purpose in CI/CD
OIDC provides a secure way for pipelines to prove identity without passwords.Step 2: Connect to Terraform usage
Terraform can create roles that trust OIDC tokens, avoiding password storage.Final Answer:
It allows secure authentication without storing passwords in the pipeline. -> Option DQuick Check:
OIDC = passwordless secure authentication [OK]
- Thinking OIDC automates deployment without approval
- Confusing OIDC with replacing Terraform
- Assuming OIDC disables access controls
Solution
Step 1: Identify correct OIDC provider ARN format
The OIDC provider ARN for GitHub Actions uses 'token.actions.githubusercontent.com'.Step 2: Check assume_role_policy structure
The policy must allow 'sts:AssumeRoleWithWebIdentity' with Principal as Federated and correct ARN.Final Answer:
The resource block with Federated principal using 'token.actions.githubusercontent.com' and 'sts:AssumeRoleWithWebIdentity' action. -> Option AQuick Check:
Correct OIDC ARN + sts:AssumeRoleWithWebIdentity = resource "aws_iam_role" "github_oidc_role" { assume_role_policy = jsonencode({ Version = "2012-10-17", Statement = [{ Effect = "Allow", Principal = { Federated = "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com" }, Action = "sts:AssumeRoleWithWebIdentity" }] }) } [OK]
- Using Service principal instead of Federated
- Wrong OIDC provider ARN format
- Using sts:AssumeRole instead of sts:AssumeRoleWithWebIdentity
condition = {
StringEquals = {
"token.actions.githubusercontent.com:sub" = "repo:myorg/myrepo:ref:refs/heads/main"
}
}Solution
Step 1: Understand the condition key
The condition uses 'token.actions.githubusercontent.com:sub' to specify the GitHub repo and branch.Step 2: Interpret the value
The value 'repo:myorg/myrepo:ref:refs/heads/main' restricts access to the main branch of that repo only.Final Answer:
Restricts role assumption to the main branch of myorg/myrepo only. -> Option BQuick Check:
Condition limits to specific repo and branch = Restricts role assumption to the main branch of myorg/myrepo only. [OK]
- Ignoring the branch restriction in condition
- Assuming condition allows all repos
- Confusing forks with original repo access
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "Federated": "arn:aws:iam::123456789012:oidc-provider/github.com" },
"Action": "sts:AssumeRoleWithWebIdentity"
}]
}
What is the most likely error?Solution
Step 1: Check the OIDC provider ARN
The ARN 'arn:aws:iam::123456789012:oidc-provider/github.com' is incorrect for GitHub Actions.Step 2: Identify correct ARN for GitHub Actions
The correct ARN uses 'token.actions.githubusercontent.com' as the OIDC provider host.Final Answer:
The OIDC provider ARN is incorrect; it should be 'token.actions.githubusercontent.com'. -> Option CQuick Check:
Wrong OIDC ARN causes auth failure = The OIDC provider ARN is incorrect; it should be 'token.actions.githubusercontent.com'. [OK]
- Using 'sts:AssumeRole' instead of 'sts:AssumeRoleWithWebIdentity'
- Confusing Federated with Service principal
- Ignoring ARN format for OIDC provider
Solution
Step 1: Understand the condition key and value
To restrict to the 'release' branch, the condition must match 'repo:myorg/myrepo:ref:refs/heads/release'.Step 2: Choose correct operator
'StringEquals' ensures exact match, so only 'release' branch is allowed.Final Answer:
The condition block with StringEquals matching 'repo:myorg/myrepo:ref:refs/heads/release'. -> Option AQuick Check:
Exact branch match uses StringEquals with correct ref [OK]
- Using StringLike with wildcard allowing all branches
- Checking audience (aud) instead of subject (sub)
- Using StringNotEquals which excludes main but allows others
