Wie behebe ich den Fehler „Sie müssen beim Server angemeldet sein (nicht autorisiert)“, wenn ich eine Verbindung zum Amazon-EKS-API-Server herstelle?

Lesedauer: 9 Minute
0

Ich verwende kubectl-Befehle, um eine Verbindung zum Amazon-Elastic-Kubernetes-Service-Anwendungsprogrammierschnittstellen-Server (Amazon EKS) herzustellen. Ich habe die Meldung „Fehler: Sie müssen beim Server angemeldet sein (nicht autorisiert)“ erhalten.

Kurzbeschreibung

Sie erhalten diesen Fehler, wenn die in kubectl konfigurierte AWS-Identity-and-Access-Management-Entität (IAM) nicht von Amazon EKS authentifiziert wird.

Sie sind authentifiziert und autorisiert, auf Ihren Amazon-EKS-Cluster zuzugreifen, basierend auf der von Ihnen verwendeten IAM-Entität (Benutzer oder Rolle). Achten Sie daher auf Folgendes:

  • Sie haben das kubectl-Tool so konfiguriert, dass es Ihren IAM-Benutzer oder Ihre IAM-Rolle verwendet.
  • Ihre IAM-Entität ist der aws-auth ConfigMap zugeordnet.

Um dieses Problem zu lösen, müssen Sie je nach Anwendungsfall die Schritte in einem der folgenden Abschnitte ausführen:

  • Sie sind der Ersteller des Clusters
  • Sie sind nicht der Ersteller des Clusters

Lösung

Wenn Sie beim Ausführen von AWS-Command-Line-Interface-Befehlen Fehler erhalten, vergewissern Sie sich, dass Sie eine aktuelle Version der AWS-CLI ausführen.

Sie sind der Ersteller des Clusters

Sie sind der Ersteller des Clusters, wenn Ihre IAM-Entität zum Erstellen des Amazon-EKS-Clusters verwendet wurde.

1.    Führen Sie die folgende Abfrage in Amazon CloudWatch Log Insights aus, um den ARN des Erstellers des Clusters zu ermitteln:

Wählen Sie zunächst die Protokollgruppe für Ihren Amazon-EKS-Cluster aus (Beispiel: /aws/eks/my-cluster/cluster). Führen Sie dann die folgende Abfrage aus:

fields @logstream, @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "username=kubernetes-admin"
| limit 50

Hinweis: Stellen Sie sicher, dass Sie die Amazon-EKS-Authentifizierungsprotokolle aktiviert haben.

Diese Abfrage gibt die IAM-Entität zurück, die als Ersteller des Clusters zugeordnet ist:

@message
time="2022-05-26T18:55:30Z" level=info msg="access granted" arn="arn:aws:iam::123456789000:user/testuser" client="127.0.0.1:57586" groups="[system:masters]" method=POST path=/authenticate uid="aws-iam-authenticator:123456789000:AROAFFXXXXXXXXXX" username=kubernetes-admin

2.    Stellen Sie sicher, dass Sie die AWS-CLI mit der IAM-Entität des Erstellers des Clusters konfiguriert haben. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die IAM-Entität für AWS CLI in Ihrer Shell-Umgebung konfiguriert ist:

$ aws sts get-caller-identity

Sie können diesen Befehl auch mit einem bestimmten Profil ausführen:

$ aws sts get-caller-identity --profile MY-PROFILE

Die Ausgabe gibt den Amazon-Ressourcenname (ARN) der IAM-Entität zurück, die für AWS CLI konfiguriert ist.

Beispiel:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

Stellen Sie sicher, dass die zurückgegebene IAM-Entität mit der IAM-Entität des Erstellers des Clusters übereinstimmt. Wenn die zurückgegebene IAM-Entität nicht der Ersteller des Clusters ist, aktualisieren Sie die AWS-CLI-Konfiguration, um die IAM-Entität des Erstellers des Clusters zu verwenden.

3.    Aktualisieren oder generieren Sie die Datei kubeconfig mit dem folgenden Befehl:

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

Hinweis:

  • Ersetzen Sie eks-cluster-name durch den Namen Ihres Clusters.
  • Ersetzen Sie aws-region durch den Namen Ihrer AWS-Region.

Führen Sie den folgenden Befehl aus, um ein AWS-CLI-Profil anzugeben:

$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile

Hinweis:

  • Ersetzen Sie eks-cluster-name durch den Namen Ihres Clusters.
  • Ersetzen Sie aws-region durch den Namen Ihrer Region.
  • Ersetzen Sie my-profile durch den Namen Ihres Profils.

4.    Führen Sie den folgenden Befehl aus, um zu bestätigen, dass die Datei kubeconfig aktualisiert wurde:

$ kubectl config view --minify

5.    Führen Sie den folgenden Befehl aus, um zu bestätigen, dass Ihre IAM-Entität authentifiziert ist und dass Sie auf Ihren EKS-Cluster zugreifen können:

$ kubectl get svc

Beispielausgabe:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

Sie sind nicht der Ersteller des Clusters

Sie sind nicht der Ersteller des Clusters, wenn Ihre IAM-Entität nicht zum Erstellen des Clusters verwendet wurde. In diesem Fall müssen Sie Ihre IAM-Entität der aws-auth ConfigMap zuordnen, um den Zugriff auf den Cluster zu ermöglichen.

1.    Stellen Sie sicher, dass Sie die AWS-CLI mit Ihrer IAM-Entität konfiguriert haben. Führen Sie den folgenden Befehl aus, um die IAM-Entität zu sehen, die für AWS CLI in Ihrer Shell-Umgebung konfiguriert ist:

$ aws sts get-caller-identity

Sie können diesen Befehl auch mit einem bestimmten Profil ausführen:

$ aws sts get-caller-identity --profile my-profile

Die Ausgabe gibt den ARN der IAM-Entität zurück, die für AWS CLI konfiguriert ist.

Beispiel:

{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
}

Vergewissern Sie sich, dass die zurückgegebene IAM-Entität Ihre IAM-Entität ist. Wenn die zurückgegebene IAM-Entität nicht die ist, die für die Interaktion mit Ihrem Cluster verwendet wird, aktualisieren Sie zuerst die AWS-CLI-Konfiguration, um die richtige IAM-Entität zu verwenden. Versuchen Sie dann erneut, mit kubectl auf Ihren Cluster zuzugreifen. Wenn das Problem weiterhin besteht, fahren Sie mit Schritt 2 fort.

2.    Wenn die zurückgegebene IAM-Entität nicht der Ersteller des Clusters ist, fügen Sie Ihre IAM-Entität zur aws-auth ConfigMap hinzu. Dadurch kann die IAM-Entität auf den Cluster zugreifen.

Nur der Cluster-Administrator kann aws-auth ConfigMap ändern. Führen Sie daher einen der folgenden Schritte aus:

  • Folgen Sie den Anweisungen im Abschnitt Sie sind Ersteller des Clusters, um mithilfe der IAM-Entität des Erstellers des Clusters auf den Cluster zuzugreifen.
  • Bitten Sie den Cluster-Administrator, diese Aktion auszuführen.

Überprüfen Sie, ob sich Ihre IAM-Entität in der aws-auth ConfigMap befindet, indem Sie den folgenden Befehl ausführen:

eksctl get iamidentitymapping --cluster cluster-name

-oder-

kubectl describe configmap aws-auth -n kube-system

Wenn sich Ihre IAM-Entität in der aws-auth ConfigMap befindet, können Sie mit Schritt 3 fortfahren.

Ordnen Sie Ihre IAM-Entität automatisch zu, indem Sie den folgenden Befehl ausführen:

eksctl create iamidentitymapping \
    --cluster $CLUSTER-NAME \
    --region $REGION \
    --arn arn:aws:iam::XXXXXXXXXXXX:user/testuser \
    --group system:masters \
    --no-duplicate-arns \
    --username admin-user1

Sie können Ihre IAM-Entität auch manuell zuordnen, indem Sie die aws-auth ConfigMap bearbeiten:

$ kubectl edit configmap aws-auth --namespace kube-system

Um einen IAM-Benutzer hinzuzufügen, fügen Sie den IAM-Benutzer-ARN zu mapUsers hinzu.

Beispiel:

mapUsers: |
  - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
      - system:masters

Um eine IAM-Rolle hinzuzufügen, fügen Sie die IAM-Rollen-ARN zu mapRoles hinzu.

Beispiel:

mapRoles: |
  - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole
    groups:
      - system:masters

Wichtig:

  • Die IAM-Rolle muss ohne den Pfad zugeordnet werden. Um mehr über die Anforderungen an den rolearn-Pfad zu erfahren, erweitern Sie den Abschnitt aws-auth ConfigMap gewährt keinen Zugriff auf den Cluster unter Fehlerbehebung in IAM.
  • Um rolearn für eine IAM-Rolle im AWS IAM Identity Center (Nachfolger von AWS Single Sign-On) anzugeben, entfernen Sie den Pfad '/aws-reserved/sso.amazonaws.com/region' aus dem Rollen-ARN. Andernfalls kann der Eintrag in der ConfigMap Sie nicht als gültigen Benutzer autorisieren.
  • Hinweis: Die Gruppe system:masters ermöglicht Superuser-Zugriff zur Ausführung jeder Aktion für jede Ressource. Weitere Informationen finden Sie unter Standardrollen und Rollenbindungen. Um den Zugriff für diesen Benutzer einzuschränken, können Sie eine Amazon-EKS-Rolle und eine Rollenbindungsressource erstellen. Ein Beispiel für eingeschränkten Zugriff für Benutzer, die Ressourcen in der Amazon-EKS-Konsole anzeigen, finden Sie in den Schritten 2 und 3 unter Erforderliche Berechtigungen.

3.    Aktualisieren oder generieren Sie die Datei kubeconfig, indem Sie den folgenden Befehln ausführen. Stellen Sie sicher, dass die AWS-CLI mit Ihrer IAM-Entität konfiguriert ist, die in Schritt 1 zurückgegeben wurde.

$ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

Hinweis:

  • Ersetzen Sie eks-cluster-name durch den Namen Ihres Clusters.
  • Ersetzen Sie aws-region durch den Namen Ihrer AWS-Region.

Sie können diesen Befehl auch mit einem bestimmten Profil ausführen:

$ aws eks update-kubeconfig --name eks-cluster-name —region aws-region —profile my-profile

Hinweis:

  • Ersetzen Sie eks-cluster-name durch den Namen Ihres Clusters.
  • Ersetzen Sie aws-region durch den Namen Ihrer AWS-Region.
  • Ersetzen Sie my-profile durch den Namen Ihres Profils.

4.    Führen Sie den folgenden Befehl aus, um zu bestätigen, dass die Datei kubeconfig aktualisiert wurde:

$ kubectl config view --minify

5.    Um zu bestätigen, dass Ihr IAM-Benutzer oder Ihre IAM-Rolle authentifiziert ist, versuchen Sie erneut, auf den Cluster zuzugreifen. Sie können beispielsweise den folgenden Befehl ausführen, um zu bestätigen, dass der Fehler behoben ist:

$ kubectl get svc

Beispielausgabe:

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.100.0.1     <none>        443/TCP   77d

Zusätzliche Tipps zur Fehlerbehebung

Wenn der Fehler weiterhin besteht, verwenden Sie die folgenden Tipps zur Fehlerbehebung, um das Problem zu identifizieren.

Wenn Sie einen kubectl-Befehl ausführen, wird eine Anfrage an den Amazon-EKS-Cluster-API-Server gesendet. Dann versucht der Amazon EKS-Authentifikator, diese Anfrage zu authentifizieren. Überprüfen Sie daher die EKS-Authentifikatorprotokolle in CloudWatch, um das Problem zu identifizieren.

1.    Vergewissern Sie sich, dass Sie die Protokollierung für Ihren Amazon-EKS-Cluster aktiviert haben.

2.    Öffnen Sie CloudWatch Log Insights.

3.    Wählen Sie die Protokollgruppe für Ihren Cluster aus. Beispiel: „/aws/eks/example-cluster/cluster“.

4.    Führen Sie die folgende Abfrage aus:

fields @timestamp, @message
| filter @logStream like /authenticator/
| sort @timestamp desc
| limit 1000

Identifizieren Sie Protokollzeilen für dasselbe Zeitintervall, in dem Sie den Fehler erhalten haben, indem Sie kubectl-Befehle ausführen. Weitere Informationen zur Ursache des Fehlers finden Sie in den Amazon-EKS-Authentifikator-Protokollen.

  • Wenn das Problem durch die Verwendung der falschen IAM-Entität für kubectl verursacht wird, überprüfen Sie die kubectl kubeconfig- und AWS-CLI-Konfiguration. Stellen Sie sicher, dass Sie die richtige IAM-Entität verwenden. Nehmen wir zum Beispiel an, dass die Protokolle in etwa wie folgt aussehen. Diese Ausgabe bedeutet, dass die von kubectl verwendete IAM-Entität nicht validiert werden kann. Stellen Sie sicher, dass die von kubectl verwendete IAM-Entität in IAM existiert und der programmatische Zugriff der Entität aktiviert ist.
time="2022-12-26T20:46:48Z" level=warning msg="access denied" client="127.0.0.1:43440" error="sts getCallerIdentity failed: error from AWS (expected 200, got 403). Body: {\"Error\":{\"Code\":\"InvalidClientTokenId\",\"Message\":\"The security token included in the request is invalid.\",\"Type\":\"Sender\"},\"RequestId\":\"a9068247-f1ab-47ef-b1b1-cda46a27be0e\"}" method=POST path=/authenticate
  • Wenn das Problem darauf zurückzuführen ist, dass Ihre IAM-Entität in aws-auth ConfigMap nicht oder falsch zugeordnet ist, überprüfen Sie die aws-auth ConfigMap. Stellen Sie sicher, dass die IAM-Entität korrekt zugeordnet ist und die Anforderungen erfüllt, die im Abschnitt Sie sind kein Ersteller des Clusters aufgeführt sind. In diesem Fall sehen die EKS-Authentifikatorprotokolle wie folgt aus:
time="2022-12-28T15:37:19Z" level=warning msg="access denied" arn="arn:aws:iam::XXXXXXXXXX:role/admin-test-role" client="127.0.0.1:33384" error="ARN is not mapped" method=POST path=/authenticate
  • Wenn die aws-auth ConfigMap aktualisiert wurde und Sie den Zugriff auf den Cluster verloren haben, können Sie über die IAM-Entität des Erstellers des Clusters auf den Cluster zugreifen. Dies liegt daran, dass der Ersteller des Clusters nicht in der aws-auth ConfigMap zugeordnet werden muss.
  • Wenn die IAM-Entität des Erstellers des Clusters gelöscht wurde, erstellen Sie zunächst erneut denselben IAM-Benutzer oder dieselbe IAM-Rolle. Greifen Sie dann mit dieser IAM-Entität auf den Cluster zu, indem Sie den Schritten im Abschnitt Sie sind der Ersteller des Clusters folgen.
  • Wenn der Ersteller des Clusters eine IAM-Rolle ist, die für einen SSO-Benutzer erstellt wurde, der entfernt wurde, können Sie diese IAM-Rolle nicht erneut erstellen. In diesem Fall wenden Sie sich an den AWS-Support, um Unterstützung zu erhalten.

Ähnliche Informationen

Einschalten des IAM-Benutzer- und Rollenzugriffs auf Ihren Cluster

Wie gewähre ich anderen IAM-Benutzern und -Rollen nach der Cluster-Erstellung in Amazon EKS Zugriff?

Amazon-EKS-Fehlerbehebung

Kubernetes-Dokumentation zur Verwendung der RBAC-Autorisierung

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 4 Monaten