Wie behebe ich Fehler bei einem OIDC-Anbieter und IRSA in Amazon EKS?

Lesedauer: 8 Minute
0

Meine Pods können die AWS-Identity-and-Access-Management-Rollenberechtigungen (IAM) mit dem Amazon-Elastic-Kubernetes-Service-Kontotoken (Amazon EKS) nicht verwenden.

Kurzbeschreibung

Um Probleme mit dem OpenID Connect (OIDC)-Anbieter und den IAM-Rollen für Dienstkonten (IRSA) in Amazon EKS zu beheben, führen Sie die Schritte in einem der folgenden Abschnitte aus:

  • Prüfen Sie, ob Sie einen vorhandenen IAM-OIDC-Anbieter für Ihren Cluster haben
  • Prüfen Sie, ob Ihre IAM-Rolle über eine angehängte erforderliche IAM-Richtlinie mit erforderlichen Berechtigungen verfügt
  • Stellen Sie sicher, dass die Vertrauensbeziehungen der IAM-Rolle korrekt eingestellt sind
  • Prüfen Sie, ob Sie ein Dienstkonto erstellt haben
  • Stellen Sie sicher, dass das Servicekonto über die richtigen IAM-Rollenanmerkungen verfügt
  • Stellen Sie sicher, dass Sie den serviceAccountName in Ihrem Pod korrekt angegeben haben
  • Überprüfen Sie die Umgebungsvariablen und Berechtigungen
  • Stellen Sie sicher, dass die Anwendung ein unterstütztes AWS-SDK verwendet
  • Prüfen Sie den Pod-Benutzer und die Gruppe
  • Bauen Sie Pods nach
  • Stellen Sie sicher, dass das Publikum richtig ist
  • Stellen Sie sicher, dass Sie den richtigen Fingerabdruck konfiguriert haben
  • Überprüfen Sie für die AWS-Region China die Umgebungsvariable AWS_DEFAULT_REGION

Lösung

Prüfen Sie, ob Sie einen vorhandenen IAM-OIDC-Anbieter für Ihren Cluster haben

Wenn bereits ein Anbieter existiert, erhalten Sie eine Fehlermeldung, die der folgenden Meldung ähnelt:

„WebIdentityErr: Fehler beim Abrufen der Anmeldeinformationen\nverursacht durch: InvalidIdentityToken: In Ihrem Konto wurde kein OpenIDConnect-Anbieter für https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus Code: 400 gefunden“

1.    Prüfen Sie die OIDC-Anbieter-URL Ihres Clusters:

$ aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

2.    Listen Sie die IAM-OIDC-Anbieter in Ihrem Konto auf. Ersetzen Sie EXAMPLED539D4633E53DE1B716D3041E (schließen Sie **< >**ein) durch den vom vorherigen Befehl zurückgegebenen Wert:

aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

"Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"

Wenn der vorhergehende Befehl eine Ausgabe zurückgibt, haben Sie bereits einen Anbieter für Ihren Cluster. Wenn der Befehl keine Ausgabe zurückgibt, müssen Sie einen IAM-OIDC-Anbieter erstellen.

Prüfen Sie, ob Ihre IAM-Rolle über eine angehängte erforderliche IAM-Richtlinie mit erforderlichen Berechtigungen verfügt

1.    Öffnen Sie die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Rollen aus.

3.    Wählen Sie die Rolle aus, die Sie überprüfen möchten.

4.    Überprüfen Sie auf der Registerkarte Berechtigungen, ob dieser Rolle die erforderliche Richtlinie beigefügt ist.

Stellen Sie sicher, dass die Vertrauensbeziehungen der IAM-Rolle korrekt eingestellt sind

Mit der AWS-Managementkonsole:

1.    Öffnen Sie die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Rollen aus.

3.    Wählen Sie die Rolle aus, die Sie prüfen möchten.

4.    Wählen Sie die Registerkarte Vertrauensbeziehungen, um zu überprüfen, ob das Format Ihrer Richtlinie dem Format der folgenden JSON-Richtlinie entspricht:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME",
          "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

Um die Vertrauensbeziehungen zu überprüfen, führen Sie den folgenden Befehl mit Ihrem Rollennamen in der AWS Command Line Interface (AWS CLI) aus:

$ aws iam get-role --role-name EKS-IRSA

Hinweis: Ersetzen Sie EKS-IRSA durch Ihren IAM-Rollennamen.

Suchen Sie im Ausgabe-JSON nach dem Abschnitt AssumeRolePolicyDocument.

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

{
  "Role": {
    "Path": "/",
    "RoleName": "EKS-IRSA",
    "RoleId": "AROAQ55NEXAMPLELOEISVX",
    "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA",
    "CreateDate": "2021-04-22T06:39:21+00:00",
    "AssumeRolePolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com",
              "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME"
            }
          }
        }
      ]
    },
    "MaxSessionDuration": 3600,
    "RoleLastUsed": {
      "LastUsedDate": "2021-04-22T07:01:15+00:00",
      "Region": "AWS_REGION"
    }
  }
}

Hinweis: Stellen Sie sicher, dass Sie die richtige AWS-Region, den Namen des Kubernetes-Servicekontos und den richtigen Kubernetes-Namespace angegeben haben.

Prüfen Sie, ob Sie ein Dienstkonto erstellt haben

Verwenden Sie den folgenden Befehl:

$ kubectl get sa -n YOUR_NAMESPACE

Hinweis: Ersetzen Sie YOUR_NAMESPACE durch Ihren Kubernetes-Namespace.

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

NAME      SECRETS   AGE
default   1         28d
irsa      1         66m

Wenn Sie kein Servicekonto haben, lesen Sie Konfigurieren von Servicekonten für Pods (von der Kubernetes-Website).

Stellen Sie sicher, dass das Servicekonto über die richtigen IAM-Rollenanmerkungen verfügt

Verwenden Sie den folgenden Befehl:

$ kubectl describe sa irsa -n YOUR_NAMESPACE

Hinweis: Ersetzen Sie irsa durch Ihren Kubernetes-Dienstkontonamen. Ersetzen Sie YOUR_NAMESPACE durch Ihren Kubernetes-Namespace.

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

Name:                irsa
Namespace:           default
Labels:              none
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
Image pull secrets:  none
Mountable secrets:   irsa-token-v5rtc
Tokens:              irsa-token-v5rtc
Events:              none

Stellen Sie sicher, dass Sie den serviceAccountName in Ihrem Pod korrekt angegeben haben

Verwenden Sie den folgenden Befehl:

$ kubectl get pod POD_NAME  -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:

Hinweis: Ersetzen Sie POD_NAME und YOUR_NAMESPACE durch Ihren Kubernetes-Pod und -Namespace.

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

serviceAccountName: irsa

Überprüfen Sie die Umgebungsvariablen und Berechtigungen

Suchen Sie in den Umgebungsvariablen des Pods nach AWS_ROLE_ARN und AWS_WEB_IDENTITY_TOKEN_FILE:

$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

AWS_REGION=ap-southeast-2
AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_DEFAULT_REGION=ap-southeast-2

Stellen Sie sicher, dass die Anwendung ein unterstütztes AWS-SDK verwendet

Die SDK-Version muss größer oder gleich den folgenden Werten sein:

Java (Version 2) — 2.10.11
Java — 1.11.704
Go — 1.23.13
Python (Boto3) — 1.9.220
Python (botocore) — 1.12.200
AWS CLI — 1.16.232
Node — 3.15.0
Ruby — 2.11.345
C++ — 1.7.174
.NET — 3.3.659.1
PHP — 3.110.7

Informationen zur neuesten unterstützten SDK-Version sehen Sie unter Verwenden eines unterstützten AWS-SDK.

Prüfen Sie den Pod-Benutzer und die Gruppe

Verwenden Sie den folgenden Befehl:

$ kubectl exec -it POD_NAME -- id
uid=0(root) gid=0(root) groups=0(root)

Hinweis: Standardmäßig verfügen nur Container, die als root ausgeführt werden, über die richtigen Dateisystemberechtigungen zum Lesen der Webidentitätstokendatei.

Wenn Ihre Container nicht als root ausgeführt werden, können Sie die folgenden Fehler erhalten:

Error: PermissionError: [Errno 13] Permission denied: '/var/run/secrets/eks.amazonaws.com/serviceaccount/token

-oder-

WebIdentityErr: failed fetching WebIdentity token: \ncaused by: WebIdentityErr: unable to read file at /var/run/secrets/eks.amazonaws.com/serviceaccount/token\ncaused by: open /var/run/secrets/eks.amazonaws.com/serviceaccount/token: permission denied

Um die richtigen Dateisystemberechtigungen bereitzustellen, stellen Sie sicher, dass Ihre Container als root ausgeführt werden. Stellen Sie für Cluster 1.18 oder niedriger den folgenden Sicherheitskontext für die Container in Ihrem Manifest bereit:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app
      containers:
      - name: my-app
        image: my-app:latest
      securityContext:
        fsGroup: 1337
...

Hinweis: Die fsGroup-ID ist frei wählbar. Sie können eine beliebige gültige Gruppen-ID auswählen. Die vorhergehende Sicherheitskontext-Einstellung ist für Cluster 1.19 oder höher nicht erforderlich.

Bauen Sie Pods nach

Wenn Sie Pods erstellt haben, bevor Sie IRSA angewendet haben, erstellen Sie die Pods neu.

Ein Beispiel für einen Befehl finden Sie im Folgenden:

$ kubectl rollout restart deploy nginx

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

deployment.apps/nginx restarted

Für daemonsets- oder statefulsets-Bereitstellungen können Sie den folgenden Befehl verwenden:

$ kubectl rollout restart deploy DEPLOYMENT_NAME

Wenn Sie nur einen Pod erstellt haben, müssen Sie den Pod löschen und neu erstellen.

Sehen Sie sich den folgenden Beispielbefehl zum Löschen des Pods an:

$ kubectl delete pod POD_NAME

Sehen Sie sich den folgenden Beispielbefehl an, um den Pod neu zu erstellen:

$ kubectl apply -f SPEC_FILE

Hinweis: Ersetzen Sie SPEC_FILE durch den Pfad und den Namen Ihrer Kubernetes-Manifestdatei.

Stellen Sie sicher, dass das Publikum richtig ist

Wenn Sie den OIDC-Anbieter mit der falschen Zielgruppe erstellt haben, wird der folgende Fehler angezeigt:

Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience

Prüfen Sie den IAM-Identitätsanbieter für Ihren Cluster. Ihre ClientIDList ist sts.amazonaws.com:

$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

Ein Beispiel für eine Ausgabe finden Sie im Folgenden:

{
  "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E",
  "ClientIDList": [
    "sts.amazonaws.com"
  ],
  "ThumbprintList": [
    "9e99a48a9960b14926bb7f3b02e22da2b0ab7280"
  ],
  "CreateDate": "2021-01-21T04:29:09.788000+00:00",
  "Tags": []
}

Stellen Sie sicher, dass Sie den richtigen Fingerabdruck konfiguriert haben

Wenn der im IAM OIDC konfigurierte Fingerabdruck nicht korrekt ist, kann der folgende Fehler angezeigt werden:

failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint

Um den richtigen Fingerabdruck automatisch zu konfigurieren, verwenden Sie eksctl oder die AWS-Managementkonsole, um den IAM-Identitätsanbieter zu erstellen. Weitere Möglichkeiten, einen Fingerabdruck zu erhalten, finden Sie unter Abrufen des Fingerabdrucks für einen OpenID Connect-Identitätsanbieter.

Überprüfen Sie für die AWS-Region China die Umgebungsvariable AWS_DEFAULT_REGION

Wenn Sie IRSA für einen Pod oder Daemonset verwenden, der in einem Cluster in der AWS-Region China bereitgestellt wird, legen Sie die Umgebungsvariable AWS_DEFAULT_REGION in der Pod-Spezifikation fest. Wenn Sie dies nicht tun, kann der Pod oder Daemonset den folgenden Fehler erhalten:

An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid

Verwenden Sie das folgende Beispiel, um die Umgebungsvariable AWS_DEFAULT_REGION zu Ihrer Pod- oder Daemonset-Spezifikation hinzuzufügen:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app
      containers:
      - name: my-app
        image: my-app:latest
        env:
        - name: AWS_DEFAULT_REGION
          value: "AWS_REGION"
...

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren