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 eseguite nel servizio app hanno lo stesso set di procedure consigliate per la sicurezza di altre applicazioni.

Servizio app di Azure esegue applicazioni Web Java in tre tipi in un servizio completamente gestito:

  • Java Standard Edition (SE). Java SE può eseguire un'app distribuita come pacchetto di archivio Java (JAR) che contiene un server incorporato, ad esempio Spring Boot, Quarkus, Dropwizard o un'app con un server Tomcat o Jetty incorporato.
  • Tomcat. Il server Tomcat predefinito può eseguire un'app distribuita come pacchetto WAR (Web Application Archive).
  • JBoss Enterprise Application Platform (EAP): il server JBoss EAP predefinito può eseguire un'app distribuita come pacchetto EAR (WAR o enterprise archive). Questa opzione è supportata per le app Linux in un set di piani tariffari che includono Gratuito, Premium v3 e Isolato v2.

Annotazioni

JBoss EAP nel servizio app supporta ora la fatturazione BYOL (Bring Your Own License). BYOL consente ai clienti che hanno sottoscrizioni Red Hat esistenti di applicare tali licenze direttamente alle distribuzioni JBoss EAP nel servizio app di Azure. Per altre informazioni, vedere Supporto BYOL per JBoss EAP nel servizio app.

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'app di Servizio app per usare l'accesso di Microsoft Entra e gli articoli correlati per gli altri provider di identità. Se è necessario abilitare più provider di accesso, vedere Personalizzare gli accessi e le disconnessazioni.

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 dichiarazioni dell'utente direttamente dalla servlet trasformando l'oggetto Principal in un oggetto Map. L'oggetto Map esegue il mapping di ogni tipo di attestazione a una raccolta di attestazioni per tale 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 ispezionare l'oggetto Map per qualsiasi attestazione specifica. Ad esempio, il frammento di codice seguente effettua 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 Personalizzare gli accessi e le disconnessazioni. Sono inoltre disponibili documenti ufficiali sull'interfaccia HttpServletRequest di Tomcat e sui relativi metodi. Anche i seguenti metodi servlet sono idratati in base alla configurazione del tuo App Service.

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

Per caricare un certificato TLS esistente e associarlo al nome di dominio dell'applicazione, vedere Abilitare HTTPS per un dominio personalizzato nel servizio app di Azure. È anche possibile configurare l'app per applicare TLS.

Utilizzare i riferimenti di Azure Key Vault

Azure Key Vault offre una gestione centralizzata dei segreti con criteri di accesso e cronologia di controllo. È possibile archiviare segreti, come password o stringhe di connessione, in un Key Vault. È possibile accedere a questi segreti nell'applicazione tramite variabili di ambiente.

Prima di tutto, concedi all'app l'accesso a un Key Vault e crea un riferimento a Key Vault per il tuo 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.

Per i file di configurazione Spring, vedere Externalized Configuration.

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 delle chiavi Java in Linux

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

Potrebbero essere necessarie altre configurazioni per crittografare la connessione JDBC con i certificati nell'archivio chiavi Java:

Inizializzare l'archivio chiavi Java in Linux

Per inizializzare l'oggetto import java.security.KeyStore, caricare il file del keystore 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 il keystore su Linux

È possibile caricare manualmente i certificati nell'archivio chiavi. Per disabilitare App Service dal caricare automaticamente i certificati nell'archivio chiavi, creare un'impostazione dell'app, SKIP_JAVA_KEYSTORE_LOAD, con un valore di 1. Tutti i certificati pubblici caricati nel servizio app usando il portale di Azure vengono archiviati in /var/ssl/certs/. Tutti i certificati privati sono archiviati in /var/ssl/private/.

Per interagire o eseguire il debug dello strumento chiave Java, aprire una connessione SSH al servizio app ed eseguire il comando keytool. Per un elenco di comandi, vedere la documentazione dello strumento chiave. Per altre informazioni sull'API KeyStore, vedere Archivio chiavi di classe.

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