Logo Logo
GitHub Designed by Logto

Che cos’è la comunicazione machine-to-machine?

La comunicazione machine-to-machine (M2M) si riferisce allo scambio automatizzato di dati tra dispositivi senza intervento umano. Nel contesto di autenticazione (authentication) e autorizzazione (authorization), la comunicazione M2M spesso coinvolge un’applicazione client che necessita di accedere a risorse, dove l’applicazione client è una macchina (servizio) o una macchina che agisce per conto di un utente.

Perché dobbiamo gestire la comunicazione machine-to-machine?

Quando hai solo un servizio senza alcuna dipendenza, probabilmente non ha bisogno di comunicare con altri servizi. Man mano che il tuo sistema cresce, o vuoi integrarti con un sistema di gestione delle identità e degli accessi (IAM), devi gestire la comunicazione machine-to-machine.

Tuttavia, sembra ancora semplice: tutto ciò che devi fare è identificare il servizio e autenticarlo. Ma in realtà, ci sono diverse sfide che devi affrontare:

1. Autenticazione (Authentication)

Come autentichi il servizio? Non puoi usare un nome utente e una password, poiché non c’è un umano per inserirli. Devi usare un meccanismo diverso, come API key, certificati client o OAuth client credentials.

2. Autorizzazione (Authorization)

Una volta autenticato il servizio, come determini cosa può fare il servizio? Devi definire i permessi e i ruoli per il servizio, simile a come li definisci per gli utenti. L’ultima cosa che vuoi è codificare i permessi nel tuo codice.

3. Sicurezza

Come garantisci che la comunicazione tra i servizi sia sicura? Le credenziali verranno aggiornate regolarmente? Come monitori e controlli la comunicazione?

4. Scalabilità

Man mano che il numero di servizi cresce, come gestisci l’autenticazione (authentication) e l’autorizzazione (authorization) per ciascun servizio?

Gli approcci comuni alla comunicazione machine-to-machine

Tenendo a mente le sfide, ci sono diversi approcci comuni nel settore:

1. API keys

API keys sono un modo semplice per autenticare i servizi. Ogni servizio può avere una o più API key, che vengono utilizzate per l’autenticazione (e talvolta l’autorizzazione). Potresti vedere alcuni servizi che ti chiedono di fornire un’API key nell’intestazione della richiesta, come X-API-Key: your-api-key.

Un esempio non normativo di come funzionano le API key:

Vantaggi:

  • Semplice da implementare e utilizzare.
  • Con generazione casuale sicura e abbastanza lunga, le API key sono difficili da indovinare.
  • La validazione è dinamica, il che significa che puoi revocare un’API key in qualsiasi momento.

Svantaggi:

  • Richiede comunicazione di rete per validare l’API key.
  • Non è autonoma, il che significa che è richiesto un servizio per l’introspezione.
  • L’altro servizio ha lo stesso livello di accesso del servizio che possiede l’API key (potrebbe essere parzialmente mitigato utilizzando un API gateway).
  • È difficile gestire un gran numero di API key tra i servizi.

2. OAuth client credentials

OAuth (o OIDC, poiché OpenID Connect si basa su OAuth 2.0) Flusso delle credenziali del client (Client credentials flow) è un modo più avanzato per autenticare i servizi. Si basa sul framework OAuth 2.0, ampiamente utilizzato per l’autenticazione (authentication) e l’autorizzazione (authorization) degli utenti. Con OAuth client credentials, un servizio può ottenere un access token presentando il suo client ID e client secret al authorization server.

Un esempio non normativo di come funzionano le OAuth client credentials:

Di solito, l’access token è un JSON Web Token (JWT), che contiene informazioni sul servizio e i suoi permessi. Quindi l’altro servizio può validare l’access token senza comunicare con il authorization server (purché abbia la chiave pubblica per verificare la firma JWT). Il flusso di lavoro diventa:

Per ulteriori informazioni sui JSON Web Token, vedi JSON Web Token (JWT) .

Vantaggi (con JWT):

  • Autonomo, il che significa che l’altro servizio può immediatamente conoscere le informazioni necessarie come i permessi senza ulteriore comunicazione di rete.
  • L’access token può essere di breve durata, riducendo il rischio di uso improprio.
  • L’altro servizio non ha bisogno di conoscere il client secret, solo la chiave pubblica per verificare la firma JWT.
  • L’access token può essere utilizzato per controllare le azioni del servizio (ad esempio, quale servizio ha accesso a quale risorsa).
  • È più facile gestire un gran numero di servizi, poiché stabilisce un chiaro confine tra servizi e permessi.

Svantaggi:

  • Un po’ più complesso da implementare e utilizzare rispetto alle API key.
  • Se l’altro servizio esegue solo la validazione offline, potrebbe non sapere se l’access token è stato revocato.

3. Mutual TLS

Mutual TLS (mTLS) è un modo per autenticare i servizi utilizzando certificati client. Con mTLS, ogni servizio possiede un certificato client con una chiave privata, e l’altro servizio verifica il certificato utilizzando la chiave pubblica. Tuttavia, mTLS si concentra sul livello TLS, il che significa che da solo di solito non si adatta all’autenticazione (authentication) e autorizzazione (authorization) a livello applicativo.

Per casi d’uso avanzati, mTLS può essere combinato con access token vincolati a certificato per proteggere ulteriormente la comunicazione. Vedi RFC 8705: OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens per ulteriori informazioni.

Vantaggi:

  • Autenticazione forte, poiché si basa sulla crittografia a chiave pubblica.
  • La comunicazione è crittografata e sicura per impostazione predefinita.
  • Il certificato client può essere utilizzato per identificare il servizio, simile a come funziona un JWT.

Svantaggi:

  • Più complesso da implementare e gestire rispetto alle API key e OAuth client credentials.
  • Il certificato client deve essere aggiornato regolarmente.
  • È richiesta una maggiore conoscenza tecnica per gestire correttamente i certificati client.
  • L’altro servizio potrebbe non supportare mTLS, il che significa che devi avere un meccanismo di fallback.

Vedi anche