Uso dell'autenticazione integrata Kerberos per la connessione a SQL Server

Scaricare il driver JDBC

A partire da Microsoft JDBC Driver 4.0 per SQL Server, un'applicazione può usare la proprietà di connessione authenticationScheme per specificare una connessione a un database tramite l'autenticazione integrata Kerberos di tipo 4. Per altre informazioni sulle proprietà di connessione, vedere Impostazione delle proprietà di connessione. Per altre informazioni su Kerberos, vedere Microsoft Kerberos.

Quando si usa l'autenticazione integrata con il modulo Java Krb5LoginModule, è possibile configurare il modulo usando la classe Krb5LoginModule.

Microsoft JDBC Driver per SQL Server imposta le proprietà seguenti per le macchine virtuali Java IBM:

  • useDefaultCcache = true
  • moduleBanner = false

Microsoft JDBC Driver per SQL Server imposta le proprietà seguenti per tutte le altre macchine virtuali Java:

  • useTicketCache = true
  • doNotPrompt = true

Osservazioni:

Prima di Microsoft JDBC Driver 4.0 per SQL Server, le applicazioni potevano specificare l'autenticazione integrata (tramite Kerberos o NTLM, a seconda dell'autenticazione disponibile) usando la proprietà di connessione integratedSecurity e facendo riferimento a mssql-jdbc_auth-<versione>-<arch>.dll, come descritto in Creazione dell'URL di connessione.

A partire da Microsoft JDBC Driver 4.0 for SQL Server, un'applicazione può usare la proprietà di connessione authenticationScheme per specificare una connessione a un database tramite l'autenticazione integrata Kerberos e l'implementazione Kerberos Java pura:

  • Se si vuole usare l'autenticazione integrata con Krb5LoginModule, è comunque necessario specificare la proprietà di connessione integratedSecurity=true. Sarà quindi necessario specificare anche la proprietà di connessione authenticationScheme=JavaKerberos.

  • Per continuare a usare l'autenticazione integrata con mssql-jdbc_auth-<versione>-<arch>.dll, è sufficiente specificare la proprietà di connessione integratedSecurity=true e, facoltativamente,authenticationScheme=NativeAuthentication.

  • Se si specifica authenticationScheme=JavaKerberos, ma senza specificare anche integratedSecurity=true, la proprietà di connessione authenticationScheme verrà ignorata dal driver, che cercherà le credenziali di nome utente e password nella stringa di connessione.

Quando si usa un'origine dati per creare connessioni, è possibile impostare a livello di codice lo schema di autenticazione usando setAuthenticationScheme e (facoltativamente) impostare il nome dell'entità servizio per le connessioni Kerberos usando setServerSpn.

È stato aggiunto un nuovo logger per supportare l'autenticazione Kerberos: com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Per altre informazioni, vedere Creazione di tracce.

Le linee guida seguenti consentono di configurare Kerberos:

  1. Impostare AllowTgtSessionKey su 1 nel Registro di sistema di Windows. Per altre informazioni, vedere Voci del Registro di sistema del protocollo Kerberos e chiavi di configurazione KDC in Windows Server 2003.
  2. Assicurarsi che la configurazione di Kerberos (krb5.conf in ambienti UNIX) punti all'area di autenticazione e al servizio KDC corretti per l'ambiente.
  3. Inizializzare la cache TGT tramite kinit o accedendo al dominio.
  4. Quando un'applicazione in cui authenticationScheme=JavaKerberos viene eseguita nel sistema operativo Windows Vista o Windows 7, è consigliabile usare un account utente standard. Se tuttavia si usa un account amministratore, l'applicazione deve essere eseguita con privilegi di amministratore.

Nota

L'attributo di connessione serverSpn è supportato solo da Microsoft JDBC Driver 4.2 e versioni successive.

Nomi dell'entità servizio

Un nome dell'entità servizio (SPN) è il nome con cui un client identifica in modo univoco un'istanza di un servizio.

È possibile specificare il nome dell'entità servizio usando la proprietà di connessione serverSpn o lasciare che sia il driver a crearlo automaticamente (impostazione predefinita). Questa proprietà usa il formato: "MSSQLSvc/fqdn:port@REALM", dove fqdn è il nome di dominio completo, port è il numero di porta e REALM è l'area di autenticazione Kerberos di SQL Server in lettere maiuscole. La parte dell'area di autenticazione di questa proprietà è facoltativa se l'area di autenticazione predefinita della configurazione di Kerberos è la stessa area di autenticazione del server e non è inclusa per impostazione predefinita. Se si desidera supportare uno scenario di autenticazione tra diverse aree di autenticazione, in cui l'area di autenticazione predefinita nella configurazione di Kerberos è diversa dall'area di autenticazione del server, è necessario impostare il nome dell'entità servizio (SPN) con la proprietà serverSpn.

Ad esempio, il nome dell'entità servizio (SPN) potrebbe essere simile al seguente: MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM

Per ulteriori informazioni sui nomi dell'entità servizio (SPN), vedere:

Nota

Per le versioni precedenti alla 6.2 del driver JDBC, per un uso corretto di Kerberos tra diverse aree di autenticazione è necessario impostare serverSpn in modo esplicito.

A partire dalla versione 6.2, il driver può compilare serverSpn per impostazione predefinita, anche quando Kerberos viene usato tra diverse aree di autenticazione. È comunque possibile usare serverSpn in modo esplicito.

Creazione di un file di configurazione del modulo di accesso

È eventualmente possibile specificare un file di configurazione Kerberos. Se non si specifica un file di configurazione, vengono utilizzate le seguenti impostazioni:

JVM Sun
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;

JVM IBM
com.ibm.security.auth.module.Krb5LoginModule required useDefaultCcache = true;

Se si sceglie di creare un file di configurazione del modulo di accesso, per il file è necessario utilizzare il formato seguente:

<name> {  
    <LoginModule> <flag> <LoginModule options>;  
    <optional_additional_LoginModules, flags_and_options>;  
};  

Un file di configurazione di accesso è costituito da una o più voci, ciascuna indicante la tecnologia di autenticazione sottostante da utilizzare per un'applicazione o più applicazioni specifiche. ad esempio:

SQLJDBCDriver {  
   com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;  
};  

Tutte le voci del file di configurazione del modulo di accesso sono composte da un nome seguito da una o più voci specifiche di LoginModule. Tutte le voci specifiche di LoginModule terminano con un punto e virgola e l'intero gruppo di voci specifiche di LoginModule è racchiuso tra parentesi graffe. Ogni voce del file di configurazione termina con un punto e virgola.

Oltre a consentire al driver di acquisire credenziali Kerberos tramite le impostazioni specificate nel file di configurazione del modulo di accesso, il driver può utilizzare credenziali esistenti. Questo metodo può risultare utile quando l'applicazione deve creare connessioni con credenziali di più utenti.

Tramite il driver verrà effettuato il tentativo di utilizzare credenziali esistenti, se disponibili, prima di accedere utilizzando il modulo di accesso specificato. Di conseguenza, quando si usa il metodo Subject.doAs per l'esecuzione di codice in un contesto specifico viene creata una connessione con le credenziali passate alla chiamata di Subject.doAs.

Per altre informazioni, vedere le pagine Web relative al file di configurazione di accesso JAAS e alla classe Krb5LoginModule.

A partire da Microsoft JDBC Driver 6.2, il nome della voce della configurazione del modulo di accesso può essere passato usando la proprietà di connessione jaasConfigurationName. Questo metodo consente a ogni connessione di avere una propria configurazione di accesso oppure di usare un nome diverso da SQLJDBCDriver.

Creazione di un file di configurazione Kerberos

Per altre informazioni sui file di configurazione Kerberos, vedere la pagina Web relativa ai requisiti per Kerberos.

L'esempio seguente visualizza un file di configurazione del dominio, in cui YYYY e ZZZZ sono i nomi di dominio.

[libdefaults]  
default_realm = YYYY.CORP.CONTOSO.COM  
dns_lookup_realm = false  
dns_lookup_kdc = true  
ticket_lifetime = 24h  
forwardable = yes  

[domain_realm]  
.yyyy.corp.contoso.com = YYYY.CORP.CONTOSO.COM  
.zzzz.corp.contoso.com = ZZZZ.CORP.CONTOSO.COM  

[realms]  
        YYYY.CORP.CONTOSO.COM = {  
  kdc = krbtgt/YYYY.CORP. CONTOSO.COM @ YYYY.CORP. CONTOSO.COM  
  default_domain = YYYY.CORP. CONTOSO.COM  
}  

        ZZZZ.CORP. CONTOSO.COM = {  
  kdc = krbtgt/ZZZZ.CORP. CONTOSO.COM @ ZZZZ.CORP. CONTOSO.COM  
  default_domain = ZZZZ.CORP. CONTOSO.COM  
}  

Abilitazione del file di configurazione del dominio e del file di configurazione del modulo di accesso

È possibile abilitare un file di configurazione del dominio con -Djava.security.krb5.conf. È possibile abilitare un file di configurazione del modulo di accesso con -Djava.security.auth.login.config.

Ad esempio, è possibile usare il comando seguente per avviare l'applicazione:

Java.exe -Djava.security.auth.login.config=SQLJDBCDriver.conf -Djava.security.krb5.conf=krb5.ini <APPLICATION_NAME>  

Verifica dell'accesso a SQL Server tramite Kerberos

Eseguire la query seguente in SQL Server Management Studio:

select auth_scheme from sys.dm_exec_connections where session_id=\@\@spid

Assicurarsi di disporre dell'autorizzazione necessaria per l'esecuzione della query.

Delega vincolata

A partire da Microsoft JDBC Driver 6.2, il driver supporta la delega vincolata Kerberos. Le credenziali delegate possono essere passate come oggetto org.ietf.jgss.GSSCredential e usate dal driver per stabilire la connessione.

Properties driverProperties = new Properties();
GSSCredential impersonatedUserCredential = [userCredential]
driverProperties.setProperty("integratedSecurity", "true");
driverProperties.setProperty("authenticationScheme", "JavaKerberos");
driverProperties.put("gsscredential", impersonatedUserCredential);
Connection conn = DriverManager.getConnection(CONNECTION_URI, driverProperties);

Connessione Kerberos con nome entità e area autenticazione

A partire da Microsoft JDBC Driver 6.2, il driver può stabilire una connessione Kerberos usando il nome dell'entità e la password passati nella stringa di connessione.

jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user@REALM;password=****

La proprietà nome utente non richiede l'area di autenticazione se l'utente appartiene a default_realm impostato nel file krb5.conf. Quando userName e password vengono impostati insieme alle proprietà integratedSecurity=true; e authenticationScheme=JavaKerberos;, la connessione viene stabilita con un valore nome utente come entità Kerberos insieme alla password specificata.

A partire da Microsoft JDBC Driver 9.4, l'utente può specificare l'area di autenticazione Kerberos nella stringa di connessione.

jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user;password=****;realm=REALM

Uso dell'autenticazione Kerberos da computer UNIX nello stesso dominio

In questa guida si presuppone che esista già una configurazione Kerberos funzionante. Eseguire il codice seguente in un computer Windows con autenticazione Kerberos funzionante per verificare quanto illustrato in precedenza. Se l’esito è positivo, il codice stamperà "Schema di autenticazione: KERBEROS" nella console. Non sono necessari altri flag di esecuzione, dipendenze o impostazioni del driver oltre a quelli specificati. Lo stesso blocco di codice può essere eseguito in Linux per verificare le connessioni riuscite.

SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("<server>");
ds.setPortNumber(1433); // change if necessary
ds.setIntegratedSecurity(true);
ds.setAuthenticationScheme("JavaKerberos");
ds.setDatabaseName("<database>");

try (Connection c = ds.getConnection(); Statement s = c.createStatement();
        ResultSet rs = s.executeQuery("select auth_scheme from sys.dm_exec_connections where session_id=@@spid")) {
    while (rs.next()) {
        System.out.println("Authentication Scheme: " + rs.getString(1));
    }
}
  1. Aggiungere il computer client allo stesso dominio del server.
  2. Impostare facoltativamente il percorso predefinito del ticket Kerberos. Questo passaggio viene eseguito più facilmente impostando la variabile di ambiente KRB5CCNAME.
  3. Ottenere il ticket Kerberos, generandone uno nuovo o inserendone uno esistente nel percorso predefinito del ticket Kerberos. Per generare un ticket, è sufficiente usare un terminale e inizializzare il ticket tramite kinit USER@DOMAIN.AD dove "USER" e "DOMAIN.AD" sono rispettivamente l'entità utente e il dominio. Ad esempio: kinit SQL_SERVER_USER03@EXAMPLE.COM. Il ticket verrà generato nel percorso predefinito del ticket o nel percorso di KRB5CCNAME, se impostato.
  4. Immettere la password richiesta dal terminale.
  5. Verificare le credenziali nel ticket tramite klist e verificare che le credenziali siano quelle che si intende usare per l'autenticazione.
  6. Eseguire il codice di esempio precedente e verificare che l'autenticazione Kerberos sia stata completata correttamente.

Integrazione GSS della piattaforma nativa

L'integrazione GSS della piattaforma nativa consente alle applicazioni Java di usare la GSS-API nativa anziché i meccanismi crittografici dell'implementazione JDK della GSS-API. Ad esempio, il seguente codice di esempio illustra come abilitare l'uso della GSS-API nativa all'interno del driver:

GSSCredential credential = GSSManager.getInstance().createCredential(null, GSSCredential.DEFAULT_LIFETIME, new Oid("1.2.840.113554.1.2.2"), GSSCredential.INITIATE_ONLY);

SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL("jdbc:sqlserver://<server>;databaseName=<database>;integratedSecurity=true;authenticationScheme=JavaKerberos;");
ds.setGSSCredentials(credential);
ds.getConnection();

try (Connection conn = ds.getConnection()) {
    ResultSet rs = conn.executeQuery("select auth_scheme from sys.dm_exec_connections where session_id=@@spid")) {
    while (rs.next()) {
        System.out.println("Authentication Scheme: " + rs.getString(1));
    }
}

Sono inoltre necessari i seguenti argomenti JVM:

-Dsun.security.jgss.native=true
-Djavax.security.auth.useSubjectCredsOnly=false

Opzionalmente, è anche possibile specificare il percorso della libreria GSS nativa.

-Dsun.security.jgss.lib=path/to/native/gss/library // This is optional

Per altre informazioni sugli argomenti JVM, vedere la documentazione ufficiale di Java.

Vedi anche

Connessione a SQL Server con il driver JDBC