Come posso risolvere i problemi durante la connessione ai cluster Amazon RDS per PostgreSQL o Aurora PostgreSQL utilizzando l'autenticazione IAM?

6 minuti di lettura
0

Desidero connettermi alla mia istanza Amazon Relational Database Service (Amazon RDS) per PostgreSQL o a un cluster compatibile con Amazon Aurora PostgreSQL. Quando provo a connettermi utilizzando l'autenticazione AWS Identity Access Management (IAM), ricevo un errore "PAM authentication failed for user" (Autenticazione PAM non riuscita per l'utente).

Breve descrizione

Potresti non riuscire a connetterti alla tua istanza di database Amazon RDS per PostgreSQL o Aurora utilizzando l'autenticazione IAM per uno dei seguenti motivi:

  • L'autenticazione IAM è disattivata
  • Le autorizzazioni per i ruoli IAM sono insufficienti o le policy sono errate
  • L'utente del database non è configurato correttamente
  • La stringa di connessione è errata
  • L'entità IAM è errata

Risoluzione

L'autenticazione IAM è disattivata

L'autenticazione IAM è disattivata per impostazione predefinita. Rivedi le impostazioni di configurazione per l'istanza RDS per PostgreSQL o per il cluster Aurora PostgreSQL. Assicurati che l'autenticazione IAM sia attivata. Dalla console di Amazon RDS puoi modificare il cluster Aurora o l'istanza RDS scegliendo Database Authentication (Autenticazione del database). Quindi, scegli IAM database authentication (Autenticazione del database IAM) e Continue (Continua) per aggiornare le impostazioni di configurazione.

Nota: se scegli Apply Immediately (Applica immediatamente) quando aggiorni le impostazioni di configurazione del cluster, tutte le modifiche in sospeso vengono applicate immediatamente. Questa azione non comporta tempi di inattività.

Le autorizzazioni per i ruoli IAM sono insufficienti

Per connettersi correttamente all'istanza di database utilizzando l'autenticazione del database IAM, è necessario disporre dell'accesso all'azione rds-db:connect. L'azione rds-db:connect permette le connessioni all'istanza di database.

Ad esempio:

{
    "Version": "2012-10-17",
    "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "rds-db:connect"
        ],
        "Resource": [
            " arn:aws:rds-db:region:account-id:dbuser:(DbiResourceId for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/db_user_name"
        ]
    }]

Nota: sostituisci db-user-name con l'utente dell'account del database associato all'autenticazione IAM.

Inoltre, assicurati di utilizzare l'ID risorsa corretto (invece di specificare solo l'ARN). Per trovare l'ID della risorsa di un'istanza di database, scegli l'istanza di database o il cluster nella console Amazon RDS. Quindi, scegli la scheda Configurazione per visualizzare l'ID risorsa.

Per ulteriori informazioni sugli elementi elencati nella policy IAM di esempio, consulta la pagina Creazione e utilizzo di una policy IAM per l'accesso al database IAM.

Nota: l'autenticazione IAM non supporta chiavi di contesto specifiche del servizio che possono essere utilizzate nell'elemento condizione delle istruzioni di policy. Inoltre, l'autenticazione IAM non supporta tutte le chiavi di contesto delle condizioni globali. Per ulteriori informazioni sulle chiavi di contesto delle condizioni globali, consulta la pagina Chiavi di contesto delle condizioni globali AWS nella Guida per l'utente IAM.

L'utente del database non è configurato correttamente

Per utilizzare l'autenticazione IAM con PostgreSQL, assegna all'utente del database il ruolo rds_iam. Per confermare che questo ruolo è associato all'utente, esegui questo comando:

Nota: questo comando viene eseguito solo nel client PostgreSQL.

\du

L’output sarà simile al seguente:

List of roles
   Role name    |                         Attributes                         |                          Member of                          
-----------------+------------------------------------------------------------+-------------------------------------------------------------
db_user_name    |                                                            | {rds_iam}                                
postgres        | Create role, Create DB                                    +| {rds_superuser}          
                | Password valid until infinity                              |

Puoi anche usare questa query, che viene eseguita su qualsiasi piattaforma:

SELECT r.rolname,
ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid) memberof
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;

Per creare un utente e assegnare il ruolo rds_iam, esegui questo comando:

CREATE USER db_user_name WITH LOGIN; 
GRANT rds_iam TO db_user_name;

La stringa di connessione è errata

I token di autenticazione sono composti da vari caratteri che possono essere scomodi da utilizzare nella riga di comando. Piuttosto, salva il token in una variabile di ambiente, quindi usa tale variabile quando ti connetti alla tua istanza di database PostgreSQL.

Ad esempio:

export RDSHOST='aurorapostgresql.cluster-abcdef12ghi.us-east-1.rds.amazonaws.com'
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username db_user_name)"
psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=global-bundle.pem dbname=postgres user=db_user_name password=$PGPASSWORD"

Per ulteriori informazioni su come connettersi a un'istanza database PostgreSQL utilizzando una variabile di ambiente, consulta la sezione Connessione a un cluster Aurora PostgreSQL.

Se ricevi un errore simile a quello in questo esempio, il client sta tentando di connettersi all'istanza di database senza SSL.

FATAL: no pg_hba.conf entry for host "host.ip", user "<username>", database "postgres", SSL off 
FATAL: password authentication failed for user "db_user_name"

L'autenticazione del database IAM richiede una connessione SSL e tutti i dati trasmessi da e verso l'istanza di database sono crittografati. Per evitare questo errore, assicurati che la connessione utilizzi SSL. È consigliabile utilizzare l'opzione sslmode come verify-full e fornire il certificato nell'opzione sslrootcert nella stringa di connessione.

Per scaricare il certificato CA più recente, consulta la pagina Utilizzo di SSL/TLS per crittografare una connessione a un cluster di database.

L'entità IAM è errata

Assicurati che il token di autenticazione venga generato dal ruolo IAM corretto. Per verificare il ruolo assunto dall'utente IAM corrente, esegui questo comando:

aws sts get-caller-identity

Se il ruolo assunto non è corretto, puoi passare all'utente/ruolo IAM corretto o assumere il ruolo corretto. Assicurati di utilizzare il ruolo IAM corretto per generare il token di autenticazione.

Se ricevi ancora un errore simile a "PAM authentication failed for your user" (Autenticazione PAM non riuscita per l'utente), controlla se l'account AWS fa parte di un'organizzazione AWS Organizations. Se l'account fa parte di un'organizzazione, aggiungi rds-db:* all'SCP dell'organizzazione. Per ulteriori informazioni, consulta la pagina Creazione, aggiornamento ed eliminazione delle policy di controllo dei servizi.

Se l'account fa parte di un'organizzazione, controlla se esiste una gerarchia di utenti IAM che non dispone dell'autorizzazione rds-db. Per ulteriori informazioni, consulta la pagina How to use service control policies to set permission guardrails across accounts in your AWS Organization (Come usare le policy di controllo dei servizi per impostare i limiti ammessi negli account della tua AWS Organization).

Se utilizzi i limiti delle autorizzazioni per le entità IAM, assicurati che l'azione rds-db:connect sia consentita per il tuo utente/ruolo IAM. Per ulteriori informazioni sui limiti delle autorizzazioni, consulta la pagina Limiti delle autorizzazioni per le entità IAM. Per modificare i limiti delle autorizzazioni per un utente, consulta la sezione Modifica del limite delle autorizzazioni per un utente.


AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa