

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Autenticazione con l'API REST di Slurm in PCS AWS
<a name="slurm-rest-api-authenticate"></a>

L'API Slurm REST in AWS PCS utilizza l'autenticazione JSON Web Token (JWT) per garantire un accesso sicuro alle risorse del cluster. AWS PCS fornisce una chiave di firma gestita archiviata in AWS Secrets Manager, che viene utilizzata per generare token JWT contenenti dichiarazioni di identità utente specifiche.

## Prerequisiti
<a name="slurm-rest-api-authenticate-prerequisites"></a>

Prima di autenticarti con l'API REST di Slurm, assicurati di avere:
+ **Configurazione del cluster**: cluster AWS PCS con Slurm 25.05\$1 e API REST abilitate.
+ **Autorizzazioni AWS**: accesso a AWS Secrets Manager per la chiave di firma JWT.
+ **Informazioni utente**: nome utente, ID utente POSIX e uno o più gruppi POSIX IDs per l'account del cluster.
+ **Accesso alla rete**: connettività all'interno del VPC del cluster con gruppo di sicurezza che consente la porta 6820.

## Procedura
<a name="slurm-rest-api-authenticate-procedure"></a>

**Per recuperare l'indirizzo dell'endpoint dell'API REST di Slurm**

------
#### [ Console di gestione AWS ]

1. Apri la console PCS all'indirizzo. AWS [https://console.aws.amazon.com/pcs/](https://console.aws.amazon.com/pcs/)

1. Scegli il tuo cluster dall'elenco.

1. Nei dettagli della configurazione del cluster, individua la sezione **Endpoints**.

1. Annota l'indirizzo IP e la porta privati per l'**API REST di Slurm (slurmrestd)**.

1. È possibile effettuare chiamate API inviando richieste HTTP formattate correttamente a questo indirizzo.

------
#### [ AWS CLI ]

1. Interroga lo stato del cluster con`aws pcs get-cluster`. Cerca l'`SLURMRESTD`endpoint nel `endpoints` campo della risposta. Ecco un esempio:

   ```
   "endpoints": [
         {
             "type": "SLURMCTLD",
             "privateIpAddress": "192.0.2.1",
             "port": "6817"
         },
         {
             "type": "SLURMRESTD",
             "privateIpAddress": "192.0.2.1",
             "port": "6820"
         }
     ]
   ```

1. Puoi effettuare chiamate API inviando richieste HTTP formattate correttamente a `http://<privateIpAddress>:<port>/`

------

**Per recuperare la chiave di firma JWT**

1. Apri la console AWS PCS all'indirizzo. [https://console.aws.amazon.com/pcs/](https://console.aws.amazon.com/pcs/)

1. Scegli il tuo cluster dall'elenco.

1. Nei dettagli di configurazione del cluster, individua la sezione **Scheduler Authentication**.

1. Nota l'**ARN e la versione della chiave JSON Web Token (JWT)**.

1. Usa AWS CLI per recuperare la chiave di firma da Secrets Manager:

   ```
   aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:region:account:secret:name --version-id version
   ```

**Per generare un token JWT**

1. Crea un JWT con le seguenti attestazioni obbligatorie:
   + `exp`— Tempo di scadenza in secondi dal 1970 per il JWT
   + `iat`— Ora attuale in secondi dal 1970
   + `sun`— Il nome utente per l'autenticazione
   + `uid`— L'ID utente POSIX
   + `gid`— L'ID del gruppo POSIX
   + `id`— Proprietà di identità POSIX aggiuntive
     + `gecos`— Campo di commento dell'utente, spesso utilizzato per memorizzare un nome leggibile dall'uomo
     + `dir`— La home directory dell'utente
     + `shell`— shell predefinita dell'utente
     + `gids`— Elenco dei gruppi POSIX aggiuntivi in cui si trova IDs l'utente

1. Firma il JWT utilizzando la chiave di firma recuperata da Secrets Manager.

1. Imposta un orario di scadenza appropriato per il token.

**Nota**  
In alternativa al `sun` reclamo, puoi fornire una delle seguenti informazioni:  
`username`
Un nome di campo personalizzato che definisci tramite `userclaimfield` in `AuthAltParameters Slurm custom settings`
Un `name` campo all'interno del `id` claim

**Per autenticare le richieste API**

1. Includi il token JWT nelle tue richieste HTTP utilizzando uno di questi metodi:
   + **Token Bearer**: aggiungi un'intestazione `Authorization: Bearer <jwt>`
   + **Slurm** header: aggiunge un'intestazione `X-SLURM-USER-TOKEN: <jwt>`

1. Effettua richieste HTTP all'endpoint dell'API REST:

   Ecco un esempio di accesso all'`/ping`API utilizzando curl e l'`Authorized: Bearer`header.

   ```
   curl -X GET -H "Authorization: Bearer <jwt>" \
         http://<privateIpAddress>:6820/slurm/v0.0.43/ping
   ```

## Esempio di generazione JWT
<a name="slurm-rest-api-authenticate-example"></a>

Recupera la chiave di firma JWT del cluster AWS PCS e memorizzala come file locale. Sostituisci i valori per **aws-region****,** secret-arn **e secret** version con valori appropriati per il tuo cluster.

```
#!/bin/bash
SECRET_KEY=$(aws secretsmanager get-secret-value \
  --region aws-region \
  --secret-id secret-arn \
  --version-stage secret-version \
  --query 'SecretString' \
  --output text)
echo "$SECRET_KEY" | base64 --decode > jwt.key
```

Questo esempio in Python illustra come utilizzare la chiave di firma per generare un token JWT:

```
#!/usr/bin/env python3

import sys
import os
import pprint
import json
import time
from datetime import datetime, timedelta, timezone
from jwt import JWT
from jwt.jwa import HS256
from jwt.jwk import jwk_from_dict
from jwt.utils import b64decode,b64encode
if len(sys.argv) != 3:
    sys.exit("Usage: gen_jwt.py [jwt_key_file] [expiration_time_seconds]")
SIGNING_KEY = sys.argv[1]
EXPIRATION_TIME = int(sys.argv[2])
with open(SIGNING_KEY, "rb") as f:
    priv_key = f.read()
signing_key = jwk_from_dict({
    'kty': 'oct',
    'k': b64encode(priv_key)
})
message = {
    "exp": int(time.time() + EXPIRATION_TIME),
    "iat": int(time.time()),
    "sun": "ec2-user",
    "uid": 1000,
    "gid": 1000,
    "id": {
        "gecos": "EC2 User",
        "dir": "/home/ec2-user",
        "gids": [1000],
        "shell": "/bin/bash"
    }
}
a = JWT()
compact_jws = a.encode(message, signing_key, alg='HS256')
print(compact_jws)
```

Lo script stamperà un JWT sullo schermo.

```
abcdefgtjwttoken...
```