Condividi tramite


Configurare la sicurezza per un'app Tomcat, JBoss o Java SE nel Servizio app di Azure

Questo articolo illustra come configurare le impostazioni di sicurezza specifiche Java nel servizio app. Le applicazioni Java in esecuzione nel servizio app hanno lo stesso set di procedure consigliate per la sicurezza delle altre applicazioni.

Il servizio app di Azure esegue applicazioni Web Java in un servizio completamente gestito in tre varianti:

  • Java SE: può eseguire un'app distribuita come pacchetto JAR che contiene un server incorporato (ad esempio Spring Boot, Dropwizard, Quarkus o uno con un server Tomcat o Jetty incorporato).
  • Tomcat: il server Tomcat predefinito può eseguire un'app distribuita come pacchetto WAR.
  • JBoss EAP: supportato per le app Linux solo nei piani tariffari Premium v3 e Isolato v2. Il server JBoss EAP predefinito può eseguire un'app distribuita come pacchetto WAR o EAR.

Nota

Per le applicazioni Spring, è consigliabile usare Azure Spring Apps. Tuttavia, è comunque possibile usare il Servizio app di Azure come destinazione. Per consigli, vedere Indicazioni sulla destinazione del carico di lavoro Java.

Autenticare gli utenti (Easy Auth)

Configurare l'autenticazione dell'app nel portale di Azure con l'opzione Autenticazione e autorizzazione, Da qui è possibile abilitare l'autenticazione usando Microsoft Entra ID o gli accessi di social networking, ad esempio Facebook, Google o GitHub. La configurazione nel portale di Azure funziona solo quando si configura un singolo provider di autenticazione. Per altre informazioni, vedere Configurare un'applicazione dei servizi app per usare l'account di accesso di Microsoft Entra e gli articoli correlati per gli altri provider di identità. Se è necessario abilitare più provider di accesso, seguire le istruzioni in Personalizzare gli accessi e le disconnessioni.

Gli sviluppatori Spring Boot possono usare l'utilità di avvio Spring Boot per Microsoft Entra per proteggere le applicazioni usando le familiari annotazioni e API di Spring Security. Assicurarsi di aumentare le dimensioni massime dell'intestazione nel file application.properties. È consigliabile il valore 16384.

L'applicazione Tomcat può accedere alle attestazioni dell'utente direttamente dalla servlet eseguendo il cast dell'oggetto Principal a un oggetto Map. L'oggetto Map esegue il mapping di ogni tipo di attestazione a una raccolta di attestazioni per quel tipo. Nell'esempio di codice seguente request è un'istanza di HttpServletRequest.

Map<String, Collection<String>> map = (Map<String, Collection<String>>) request.getUserPrincipal();

A questo punto è possibile esaminare l'oggetto Map per qualsiasi attestazione specifica. Il frammento di codice seguente, ad esempio, esegue l'iterazione di tutti i tipi di attestazione e stampa il contenuto di ogni raccolta.

for (Object key : map.keySet()) {
        Object value = map.get(key);
        if (value != null && value instanceof Collection {
            Collection claims = (Collection) value;
            for (Object claim : claims) {
                System.out.println(claims);
            }
        }
    }

Per disconnettere gli utenti, usare il percorso /.auth/ext/logout. Per eseguire altre azioni, vedere la documentazione su Personalizzare gli accessi e le disconnessioni. Sono inoltre disponibili documenti ufficiali sull'interfaccia HttpServletRequest di Tomcat e sui relativi metodi. Anche i seguenti metodi servlet vengono idratati in base alla configurazione del Servizio app di Azure:

public boolean isSecure()
public String getRemoteAddr()
public String getRemoteHost()
public String getScheme()
public int getServerPort()

Per disabilitare questa funzionalità, creare un'impostazione dell'applicazione denominata WEBSITE_AUTH_SKIP_PRINCIPAL con un valore di 1. Per disabilitare tutti i filtri servlet aggiunti dal Servizio app di Azure, creare un'impostazione denominata WEBSITE_SKIP_FILTERS con un valore di 1.

Per JBoss EAP, vedere la scheda Tomcat.

Configurare TLS/SSL

Per caricare un certificato TLS/SSL esistente e associarlo al nome di dominio dell'applicazione, seguire le istruzioni illustrate in Proteggere un nome DNS personalizzato con un'associazione TLS/SSL nel Servizio app di Azure. È anche possibile configurare l'app per applicare TLS/SSL.

Usare i riferimenti di KeyVault

Azure KeyVault fornisce la gestione centralizzata dei segreti con i criteri di accesso e la cronologia controlli. È possibile archiviare segreti (ad esempio password o stringhe di connessione) in KeyVault e accedere a questi segreti nell'applicazione tramite le variabili di ambiente.

Per prima cosa, seguire le istruzioni per concedere all'app l'accesso a un insieme di credenziali delle chiavi e creare un riferimento KeyVault al segreto in un'impostazione dell'applicazione. È possibile verificare che il riferimento venga risolto nel segreto stampando la variabile di ambiente durante l'accesso remoto al terminale del Servizio app di Azure.

Per i file di configurazione di Spring, vedere la documentazione relativa alle configurazioni esternalizzate.

Per inserire questi segreti nel file di configurazione di Spring, usare la sintassi di inserimento delle variabili di ambiente (${MY_ENV_VAR}).

Per inserire questi segreti nel file di configurazione di Tomcat, usare la sintassi di inserimento delle variabili di ambiente (${MY_ENV_VAR}).

Usare l'archivio chiavi Java in Linux

Per impostazione predefinita, tutti i certificati pubblici o privati caricati nel servizio app in Linux vengono caricati nei rispettivi archivi chiavi Java quando il contenitore viene avviato. Dopo aver caricato il certificato, sarà necessario riavviare il servizio app affinché venga caricato nell'archivio chiavi Java. I certificati pubblici vengono caricati nell'archivio chiavi in $JRE_HOME/lib/security/cacerts, mentre i certificati privati vengono archiviati in $JRE_HOME/lib/security/client.jks.

Potrebbe essere necessaria una configurazione aggiuntiva per la crittografia della connessione JDBC con i certificati nell'archivio chiavi Java. Fare riferimento alla documentazione per il driver JDBC selezionato.

Inizializzare l'archivio chiavi Java in Linux

Per inizializzare l'oggetto import java.security.KeyStore, caricare il file dell'archivio chiavi con la password. La password predefinita per entrambi gli archivi chiavi è changeit.

KeyStore keyStore = KeyStore.getInstance("jks");
keyStore.load(
    new FileInputStream(System.getenv("JRE_HOME")+"/lib/security/cacerts"),
    "changeit".toCharArray());

KeyStore keyStore = KeyStore.getInstance("pkcs12");
keyStore.load(
    new FileInputStream(System.getenv("JRE_HOME")+"/lib/security/client.jks"),
    "changeit".toCharArray());

Caricare manualmente l'archivio chiavi in Linux

È possibile caricare manualmente i certificati nell'archivio chiavi. Creare un'impostazione dell'app, SKIP_JAVA_KEYSTORE_LOAD, con un valore 1 per disabilitare il caricamento automatico dei certificati nell'archivio chiavi da parte del Servizio app di Azure. Tutti i certificati pubblici caricati nel Servizio app di Azure tramite il portale di Azure vengono archiviati in /var/ssl/certs/. Tutti i certificati privati sono archiviati in /var/ssl/private/.

È possibile interagire o eseguire il debug dello strumento chiave Java aprendo una connessione SSH al Servizio app di Azure ed eseguendo il comando keytool. Per un elenco di comandi, vedere la documentazione dello strumento chiave. Per altre informazioni sull'API dell'archivio chiavi, vedere la documentazione ufficiale.

Passaggi successivi

Per trovare guide introduttive di Azure, esercitazioni e documentazione di riferimento su Java, visitare la pagina Azure per sviluppatori Java.