Blog
So geht's: Bereitstellen von Terraform auf AWS mit GitHub-Aktionen, die mit OpenID Connect authentifiziert sind

In der Vergangenheit war es sehr üblich, AWS-Anmeldeinformationen (Zugriffstoken und Geheimnis) in Ihrer GitHub-Aktionspipeline zu verwenden. Dies stellt ein Sicherheitsrisiko dar, da es sich bei diesen AWS-Anmeldeinformationen in der Regel um langlebige Anmeldeinformationen mit vielen Berechtigungen handelt. Wenn diese Anmeldeinformationen nach außen dringen oder missbraucht werden, kann der Schaden enorm sein.
In meinem vorherigen Blog habe ich über das Lecken von Zugangsdaten und die Ereignisse nach dem Leck geschrieben, lesen Sie hier mehr darüber: Was passiert, wenn Sie AWS-Anmeldeinformationen preisgeben und wie AWS den Schaden minimiert
In diesem Blog zeige ich Ihnen, wie Sie die OpenID Connect-Rolle einrichten, die Berechtigungen festlegen, den Workflow für GitHub-Aktionen erstellen und den Terraform-Code in AWS bereitstellen.
OpenID Verbinden
OpenID Connect ist eine Identitätsschicht, die auf dem OAuth 2.0 Protokoll aufbaut. Sie ermöglicht es Anwendungen von Drittanbietern, die Identität von Endbenutzern oder in unserem Fall einer AWS-Rolle zu überprüfen.
AWS-Rolle
Innerhalb von AWS müssen Sie einen Identitätsprovider für GitHub und eine Rolle für Webidentität oder OIDC erstellen, die mit dem erstellten Identitätsprovider verbunden ist.
Erstellen Sie den GitHub Identitätsanbieter
Navigieren Sie zu IAM > Identitätsanbieter und erstellen Sie einen neuen Anbieter. Wählen Sie OpenID Connect und fügen Sie Folgendes hinzu:
- Anbieter-URL:
https://token.actions.githubusercontent.com - Publikum:
sts.amazonaws.com
Erstellen Sie die AWS-Rolle
Navigieren Sie zu IAM > Rollen und erstellen Sie eine neue Rolle. Wählen Sie ReadOnlyAccess.
Nachdem die Rolle erstellt wurde, fügen wir das GitHub-Repositorium zu den Vertrauensbeziehungen hinzu. Nach der Bearbeitung der vertrauenswürdigen Entitäten sollte JSON in etwa so aussehen:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::12345678:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:tiborhercz/terraform-openid-connect-example:*"
}
}
}
]
}
Wir müssen den Teil sub repo manuell hinzufügen, der der Rolle mitteilt, welche Repositories diese Rolle übernehmen dürfen. In diesem Beispiel erlauben wir dem Projektarchiv tiborhercz/terraform-openid-connect-example, die Rolle zu übernehmen, und wir haben den Platzhalter * hinzugefügt, um jeden Zweig zuzulassen.
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:tiborhercz/terraform-openid-connect-example:*"
}
Dies sollte ausreichen, um die erstellte Rolle aus unserer GitHub-Aktion zu übernehmen und den Terraform-Code bei AWS bereitzustellen.
GitHub Aktion
Für die GitHub-Aktion benötigen wir ein paar Dinge:
- Zuweisung der richtigen Berechtigungen für den Auftrag
- Die Aktion aws-actions/configure-aws-credentials
- Terraform
Zuweisung der richtigen Berechtigungen für den Auftrag
Damit die OpenID Connect-Integration funktioniert, müssen wir dem Auftrag die folgenden Berechtigungen hinzufügen:
permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout
Fügen Sie die Aktion configure-aws-credentials hinzu
Fügen Sie im GitHub-Job die Aktion configure-aws-credentials hinzu und konfigurieren Sie die role-to-assume und die AWS-Region.
- name: Configure aws credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: arn:aws:iam::12345678:role/github_action_readonly
aws-region: eu-west-1
Fügen Sie die Terraform-Schritte hinzu
Fügen Sie die Schritte zum Einrichten, Initiieren, Formatieren und Bereitstellen des Terraform-Codes zu Ihrer GitHub-Aktion hinzu.
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: 1.4.6
- name: Terraform Init
run: terraform init
- name: Terraform Format
run: terraform fmt -check
- name: Terraform Plan
run: terraform plan -input=false
# On push to "main", deploy the Terraform infrastructure
- name: Terraform Apply
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: terraform apply -auto-approve -input=false
GitHub Aktion abschließen
Hier finden Sie die vollständige GitHub-Aktion zur Bereitstellung des Terraform-Codes in AWS mit OpenID Connect:
Dateiname: .github/workflows/terraform.yml
name: 'Terraform'
on:
push:
branches: [ "main" ]
pull_request:
permissions:
id-token: write
contents: read
jobs:
terraform:
name: 'Terraform'
runs-on: ubuntu-latest
environment: production
defaults:
run:
shell: bash
steps:
- name: Configure aws credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: arn:aws:iam::12345678:role/github_action_readonly
aws-region: eu-west-1
- name: Checkout
uses: actions/checkout@v3
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: 1.4.6
- name: Terraform Init
run: terraform init
- name: Terraform Format
run: terraform fmt -check
- name: Terraform Plan
run: terraform plan -input=false
# On push to "main", deploy the Terraform infrastructure
- name: Terraform Apply
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: terraform apply -auto-approve -input=false
Fazit
Durch die Verwendung von OpenID Connect für die Authentifizierung bei AWS müssen Sie keine langlebigen AWS-Anmeldeinformationen mehr verwenden, so dass das Risiko, dass die Anmeldeinformationen durchsickern, entfällt.
Das vollständige GitHub-Beispiel finden Sie hier: GitHub - tiborhercz/terraform-openid-connect
Verfasst von

Tibor Hercz
Tibor is a Cloud Consultant specialized in AWS with a strong background in Software engineering and has a passion for Compute, Networking and Security. His goal is to create simple Cloud Solutions that increases the efficiency and overall happiness of the teams and business. Sharing knowledge is important to him, so you will see him blogging and sharing knowledge about solutions he has built.
Unsere Ideen
Weitere Blogs
Contact



