Come posso risolvere i problemi RBAC con Amazon EKS?

9 minuti di lettura
0

Desidero risolvere gli errori come Access Denied, Unauthorized e Forbidden quando utilizzo il mio cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrizione

AWS Identity and Access Management (IAM) fornisce l'autenticazione al cluster e si affida al controllo degli accessi basato sui ruoli (RBAC) nativo di Kubernetes per l'autorizzazione. Quando un utente o un ruolo IAM crea un cluster Amazon EKS, l'entità IAM viene aggiunta alla tabella di autorizzazione RBAC di Kubernetes con le autorizzazioni system:masters.

Per aggiungere utenti con accesso di amministratore a un cluster Amazon EKS, procedi come segue:

  1. Concedi le autorizzazioni necessarie della console IAM per gli utenti IAM associati, in modo che possano eseguire le necessarie operazioni del cluster.
  2. Aggiorna la ConfigMap aws-auth per assegnare agli utenti IAM aggiuntivi i ruoli e le associazioni di ruolo del cluster. Per ulteriori informazioni, consulta la sezione Add IAM users or roles to your Amazon EKS cluster (Aggiungere utenti o ruoli IAM al cluster Amazon EKS).

Nota: la ConfigMap aws-auth non supporta le wildcard. È consigliabile utilizzare eksctl per modificare la ConfigMap. Voci malformate possono causare un blocco all'accesso.

Esegui il seguente comando kubectl auth can-i per verificare che le autorizzazioni RBAC siano impostate correttamente:

kubectl auth can-i list secrets --namespace dev --as dave

Quando esegui il comando kubectl, il meccanismo di autenticazione completa i seguenti passaggi principali:

  • Kubectl legge la configurazione del contesto da ~/.kube/config.
  • Viene eseguito il comando aws eks get-token dell'interfaccia della linea di comando AWS (AWS CLI) per ottenere le credenziali, come definito in .kube/config.
  • La richiesta api k8s viene inviata e firmata con il token precedente.

Nota: non puoi modificare la scadenza di 15 minuti del token ottenuto tramite aws eks get-token.

Risoluzione

Nota: se ricevi messaggi di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare la versione più recente di AWS CLI.

Problemi di autenticazione

Errore: "The cluster is inaccessible due to the cluster creator IAM user being deleted" (Il cluster è inaccessibile perché l’utente IAM che ha creato il cluster è stato eliminato)

Se ricevi l'errore sopra indicato, devi ricreare l'utente IAM che ha creato il cluster utilizzando lo stesso nome del cluster. Per farlo ti servono informazioni sull'amministratore e sul creatore del cluster.

Se il cluster è stato creato negli ultimi 90 giorni, puoi fare una ricerca su AWS CloudTrail per le chiamate API CreateCluster. Le autorizzazioni di creazione del cluster sono identiche alle autorizzazioni system:masters. Se hai altri utenti con autorizzazioni system:masters, allora non dipendi dal creatore del cluster. Se in precedenza ti sei autenticato con il cluster Amazon EKS, puoi esaminare i precedenti log di autenticazione nel gruppo di log Amazon CloudWatch. Utilizza questa query degli approfondimenti sui file di log CloudWatch per verificare i dettagli dell'utente e del ruolo dell'amministratore del cluster:

fields @timestamp, @message
| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "system:masters"

Per ricreare l'utente IAM e il ruolo del creatore del cluster, esegui i seguenti comandi:

Importante: assicurati di controllare tutti i comandi AWS CLI e di sostituire tutte le istanze di stringhe example con i tuoi valori. Ad esempio, sostituisci EXAMPLE-USER con il tuo nome utente.

aws iam create-user --user-name <EXAMPLE-USER>
aws iam create-role --role-name <EXAMPLE-ROLE>

Errore: "Could not be assumed because it does not exist or the trusted entity is not correct or an error occurred when calling the AssumeRole operation" (Non si può presumere perché non esiste o l'entità attendibile non è corretta o si è verificato un errore durante la chiamata dell'operazione AssumeRole)

Se ricevi questo errore, verifica che la policy di attendibilità assegni correttamente le autorizzazioni presunte all'utente. Per ulteriori informazioni, guarda il Tutorial IAM: Delega dell'accesso tra account AWS tramite i ruoli IAM.

Per identificare gli utenti locali che implementano il cluster Amazon EKS per impostazione predefinita, esegui il seguente comando:

kubectl get clusterroles -l kubernetes.io/bootstrapping=rbac-defaults

Disattiva l'accesso anonimo per le operazioni API. Gli utenti anonimi hanno l'oggetto impostato su name: system:unauthenticated. Per identificare gli utenti anonimi, esegui il seguente comando:

kubectl get clusterrolebindings.rbac.authorization.k8s.io -o json | jq '.items[] | select(.subjects[]?.name=="system:unauthenticated")'

Per ulteriori informazioni, consulta le guide alle best practice di Amazon EKS.

Problemi di autorizzazione

Errore: "Couldn't get current server API group list" (Impossibile ottenere l'elenco corrente dei gruppi API del server)

Per risolvere questo errore, consulta Accesso negato o non autorizzato (kubectl).

Errore: "You must be logged in to the server (Unauthorized)" (Devi essere connesso al server (Non autorizzato)

Per risolvere questo errore, guarda How do I resolve the error "You must be logged in to the server (Unauthorized)"? [Come posso risolvere l'errore "Devi essere connesso al server (Non autorizzato)]"?

Errore: "You must be logged in to the server (the server has asked for the client to provide credentials)" [(Devi essere connesso al server (il server ha chiesto al client di fornire le credenziali)]

Questo errore si verifica quando si utilizza un'entità IAM per effettuare chiamate API e l'entità IAM non è stata mappata correttamente. È necessario mappare l'entità IAM a un ruolo Amazon EKS nella ConfigMap aws-auth del cluster. Per ulteriori informazioni, consulta Abilitazione dell'accesso di utenti e ruoli IAM al cluster.

Errore: "Can't describe cluster control plane: AccessDeniedException" (Impossibile descrivere il piano di controllo (control-plane) del cluster: AccessDeniedException)

Questo errore si verifica quando si aggiorna kubeconfig con un utente e un ruolo che non hanno l'autorizzazione per eseguire l'operazione eks:DescribeCluster.

Errore: "Current user or role does not have access to Kubernetes objects on this EKS cluster" (L'utente o il ruolo attuale non ha accesso agli oggetti Kubernetes su questo cluster EKS)

Per informazioni su questo errore, consulta Resolve the Kubernetes object access error in Amazon EKS (Risolvere l'errore di accesso agli oggetti Kubernetes in Amazon EKS).

Errore: "Changing the cluster creator IAM to another user/role" (Modifica dell'IAM del creatore del cluster con un altro utente/ruolo)

Dopo aver creato un cluster, non puoi cambiare l'IAM del creatore del cluster con un altro utente, perché non è possibile configurare un IAM per il creatore del cluster.

Problemi di rete

Errore: "Unable to connect to the server: dial tcp 172.xx.xx.xx.xx:443: i/o timeout" (Impossibile connettersi al server: digita tcp 172.xx.xx.xx.xx:443: i/o timeout)

Se ricevi questo errore, verifica che i gruppi di sicurezza consentano il traffico dall'indirizzo IP di origine del mittente.

Errore: "Unable to connect to the server: x509: certificate is valid for *.example.com , example.com , not https://xxx.gr7.us-east-1.eks.amazonaws.com" (Impossibile connettersi al server: x509: il certificato è valido per *.example.com, example.com, non per https://xxx.gr7.us-east-1.eks.amazonaws.com)

Se ricevi questo errore, verifica che le impostazioni del proxy siano corrette.

Problemi con KUBECONFIG

Errore: "The connection to the server localhost:8080 was refused" (La connessione al server localhost:8080 è stata rifiutata)

Questo errore si verifica quando il file kubeconfig non è presente. Il file kubeconfig si trova in ~/.kube/config; kubectl richiede il file. Questo file contiene le credenziali del cluster necessarie per connettersi al server API del cluster. Se kubectl non riesce a trovare questo file, tenta di connettersi all'indirizzo predefinito (localhost:8080).

Errore: "Kubernetes configuration file is group-readable" (Il file di configurazione Kubernetes è leggibile dal gruppo)

Questo errore si verifica quando le autorizzazioni per il file kubeconfig non sono corrette. Per risolvere questo problema, esegui il seguente comando:

chmod o-r ~/.kube/config
chmod g-r ~/.kube/config

Problemi di configurazione del Centro identità AWS IAM (aggiornamento di AWS Single Sign-On)

Importante: rimuovi /aws-reserved/sso.amazonaws.com/ dall'URL rolearn. Se non lo fai, non sarà possibile autorizzare un utente valido.

Assegna gruppi di utenti a una policy di autorizzazioni IAM

1.    Apri la console del Centro identità IAM.

2.    Scegli la scheda AWS Accounts (Account AWS), quindi seleziona l'account AWS al quale assegnare gli utenti.

3.    Seleziona Assign Users (Assegna utenti).

4.    Cerca i gruppi di utenti, quindi scegli Next: Permission sets (Avanti: set di autorizzazioni).

5.    Scegli Create new permission set (Crea nuovo set di autorizzazioni), quindi scegli Create a custom permission set (Crea un set di autorizzazioni personalizzato).

6.    Assegna un nome al set di autorizzazioni, quindi seleziona la casella Create a custom permissions policy (Crea una policy di autorizzazioni personalizzata).

7.    Copia la seguente policy di autorizzazione e incollala nella finestra:

{
"Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "*"
    }
  ]
}

8.    Scegli Create (Crea).

Configurare le autorizzazioni dei ruoli con RBAC di Kubernetes

Per configurare le autorizzazioni di ruolo con RBAC di Kubernetes, utilizza il seguente manifesto per creare un ruolo RBAC:

apiVersion: rbac.authorization.k8s.io/v1 
kind: Role
metadata:
    name: <example name of the RBAC group>
    namespace: <example name of namespace>
 rules:
 - apiGroups: [""]
    resources: ["services", "endpoints", "pods", "deployments", "ingress"]
    verbs: ["get", "list", "watch"]

Modifica la ConfigMap dell'autenticatore IAM

1.    Esegui il comando seguente per acquisire il ruolo IAM del gruppo di utenti del Centro identità IAM che contiene i dati dell'utente desiderato:

aws iam list-roles | grep Arn

2.    Esegui il comando h per modificare la ConfigMap dell'autenticatore:

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

3.    In MapRoles, aggiungi i seguenti attributi alla ConfigMap:

- rolearn: <example arn of the AWS SSO IAM role> 
username: <example preferred username> 
groups:
    - <example name of the RBAC group>

Importante: rimuovi /aws-reserved/sso.amazonaws.com/ dall'URL rolearn. Se non lo fai, non sarà possibile autorizzare un utente valido.

4.    Aggiorna il file kubeconfig utilizzando il comando seguente:

aws eks update-kubeconfig —-name <example eks cluster>  —-region <example region>

5.    Accedi con il nome utente del Centro identità IAM, quindi esegui i comandi kubectl.


Informazioni correlate

Default roles and role bindings (Ruoli e associazioni di ruolo predefiniti) Controlling access to EKS clusters (Controllo dell'accesso ai cluster EKS)

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa