Che cosa sono i segreti e come gestirli in Java

Completato

I segreti sono stringhe di caratteri che non devono essere condivise con il mondo esterno: potrebbero essere password di database, chiavi di crittografia private, token di accesso personali e così via. Per maggiore sicurezza, molti utenti considerano anche che tutto ciò che può aiutare un utente malintenzionato deve essere considerato un segreto: ad esempio, l'URL del database di produzione potrebbe essere visto come segreto. Il database non deve essere accessibile pubblicamente. La logica è che questa tipologia di informazioni è sensibile per natura e meno sono le informazioni disponibili nel codice, meglio è.

Informazioni su Zero Trust e Zero Secrets

Il concetto di Zero Trust è che nessuno deve essere ciecamente considerato attendibile e che a nessuno deve essere consentito l'accesso alle risorse aziendali senza essere convalidato e autorizzato.

Questo concetto si applica anche alle applicazioni Web: non devono contenere segreti archiviati nel codice o nei file binari finali. Si tratta dell'approccio chiamato Zero Secrets.

I segreti devono essere gestiti da un sistema esterno, con regole di accesso e convalida rigorose, per ridurre il rischio di attacco.

Non includere i segreti nei repository Git

Anche se il repository Git è privato, non è consigliabile includere alcun segreto nel codice sorgente:

  • Chiunque abbia accesso al repository conoscerà i dati sensibili
  • Chiunque abbia accesso al file binario dell'applicazione potrà estrarre segreti da esso

Inoltre, una volta archiviato un segreto in un repository Git, gli utenti malintenzionati possono sempre trovarlo esaminando la cronologia del repository, dove può essere rimasto dimenticato per molto tempo.

Anche se sembra una soluzione pratica, non è mai consigliabile archiviare segreti nel repository del codice sorgente. Per evitare questo problema, è possibile usare strumenti automatici che controllano regolarmente il repository e inviano avvisi se trovano una password o un URL del database archiviato per errore.

Uso delle variabili di ambiente

La soluzione più semplice per la gestione dei segreti consiste nell'usare le variabili di ambiente. Offrono numerosi vantaggi:

  • Sono facili da usare
  • Funzionano su tutti i sistemi (anche i sistemi non in locale).
  • Tutti li conoscono e capiscono come funzionano

Tuttavia, non sono sufficientemente sicure: tutti i processi nel sistema possono leggerle e saranno facilmente esposte usando JMX in un sistema Java.

Di conseguenza, le variabili di ambiente sono spesso considerate un primo passo verso Zero Trust: sono più sicure rispetto all'archiviazione dei segreti direttamente nel codice sorgente, ma non dispongono di funzionalità di gestione e gli utenti malintenzionati possono accedervi facilmente.

Utilizzo dei segreti di Kubernetes

Kubernetes ha una nozione di secrets, che è un'altra soluzione valida. Questi segreti possono essere caricati come file nel file system dell'applicazione: un programma Java può quindi leggere il file in fase di avvio, per accedere a tali segreti. Gli strumenti come Spring Framework offrono anche il supporto standard per questo meccanismo, per consentire l'uso dei segreti in modo semplice ed efficiente.

Questo meccanismo è più sicuro delle variabili di ambiente, poiché questi file possono essere letti solo dal processo che li richiede. Possono usufruire delle funzionalità avanzate offerte dall'ecosistema Kubernetes e possono essere gestiti con vari strumenti, inclusi gli strumenti forniti dal provider di servizi cloud.

Sebbene i segreti di Kubernetes siano un'ottima soluzione per Kubernetes, sono limitati a Kubernetes e non dispongono di funzionalità di gestione avanzate, a seconda degli strumenti usati per gestire l'infrastruttura Kubernetes.

Utilizzo di un archivio segreti

Un archivio segreti, ad esempio Hashicorp Vault o Azure Key Vault, è un software specializzato per la gestione dei segreti. Offre un sistema di gestione avanzato per autorizzare gli utenti, ruotare le chiavi di sicurezza e convalidare quale applicazione può accedere a quale segreto.

Fornisce anche un'API esterna, affinché possano essere usati in qualsiasi sistema. Ad esempio, è possibile usare Azure Key Vault in tutti i servizi di Azure, tra cui Macchine virtuali, Servizi app Azure, Servizi Azure Kubernetes o Azure Spring Apps.

Un archivio segreti è la soluzione più sicura e avanzata per la gestione dei segreti, che richiedono tuttavia l'uso di uno strumento dedicato.