Delen via


Geïntegreerde Kerberos-verificatie gebruiken om verbinding te maken met SQL Server

JDBC-stuurprogramma downloaden

Vanaf Microsoft JDBC Driver 4.0 voor SQL Server kan een toepassing de eigenschap authenticationScheme-verbinding gebruiken om aan te geven dat deze verbinding wil maken met een database met behulp van geïntegreerde Kerberos-verificatie van type 4. Zie De verbindingseigenschappen instellen voor meer informatie over verbindingseigenschappen. Zie Microsoft Kerberos voor meer informatie over Kerberos.

Wanneer u geïntegreerde verificatie gebruikt met de Java Krb5LoginModule, kunt u de module configureren met klasse Krb5LoginModule.

Het Microsoft JDBC-stuurprogramma voor SQL Server stelt de volgende eigenschappen in voor IBM Java-VM's:

  • useDefaultCcache = waar
  • moduleBanner = onwaar

Het Microsoft JDBC-stuurprogramma voor SQL Server stelt de volgende eigenschappen in voor alle andere Java-VM's:

  • useTicketCache = waar
  • doNotPrompt = waar

Opmerkingen

Vóór Microsoft JDBC-stuurprogramma 4.0 voor SQL Server konden toepassingen geïntegreerde verificatie opgeven (met behulp van Kerberos of NTLM, afhankelijk van welke beschikbaar is) met behulp van de verbindingseigenschap integratedSecurity en door te verwijzen naar mssql-jdbc_auth-<version>-<arch>.dll, zoals beschreven in Building the connection URL.

Vanaf Microsoft JDBC Driver 4.0 voor SQL Server kan een toepassing de eigenschap authenticationScheme-verbinding gebruiken om aan te geven dat deze verbinding wil maken met een database met behulp van geïntegreerde Kerberos-verificatie met behulp van de pure Java Kerberos-implementatie:

  • Als u geïntegreerde verificatie wilt gebruiken met Krb5LoginModule, moet u nog steeds de eigenschap integratedSecurity=true connection opgeven. Vervolgens specificeert u ook de verbindingsattribuut authenticationScheme=JavaKerberos.

  • Als u geïntegreerde verificatie wilt blijven gebruiken met mssql-jdbc_auth-version-arch<><>.dll, geeft u de eigenschap integratedSecurity=true connection (en optioneel authenticationScheme=NativeAuthentication) op.

  • Als u authenticationScheme=JavaKerberos opgeeft, maar niet ook integratedSecurity=true opgeeft, negeert het stuurprogramma de eigenschap authenticationScheme-verbinding en verwacht dat de gebruikersnaam en wachtwoordreferenties in de verbindingsreeks worden gevonden.

Wanneer u een gegevensbron gebruikt om verbindingen te maken, kunt u het verificatieschema programmatisch instellen met setAuthenticationScheme en (optioneel) de SPN voor Kerberos-verbindingen instellen met behulp van setServerSpn.

Er is een nieuwe logger toegevoegd ter ondersteuning van Kerberos-verificatie: com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Zie voor meer informatie De werking van het traceerstuurprogramma.

De volgende richtlijnen helpen u bij het configureren van Kerberos:

  1. Stel AllowTgtSessionKey in op 1 in het register voor Windows. Zie registervermeldingen en KDC-configuratiesleutels voor Kerberos in Windows Server 2003 voor meer informatie.
  2. Zorg ervoor dat de Kerberos-configuratie (krb5.conf in UNIX-omgevingen) verwijst naar de juiste realm en KDC voor uw omgeving.
  3. Initialiseer de TGT-cache met behulp van kinit of meld u aan bij het domein.
  4. Wanneer een toepassing die gebruikmaakt van authenticationScheme=JavaKerberos wordt uitgevoerd op de besturingssystemen Windows Vista of Windows 7, moet u een standaardgebruikersaccount gebruiken. Als u de toepassing echter uitvoert onder het account van een beheerder, moet de toepassing worden uitgevoerd met beheerdersbevoegdheden.

Opmerking

Het kenmerk serverSpn-verbinding wordt alleen ondersteund door Microsoft JDBC-stuurprogramma's 4.2 en hoger.

Namen van service-principals

Een SPN (Service Principal Name) is de naam waarmee een client een exemplaar van een service op unieke wijze identificeert.

U kunt de SPN opgeven met behulp van de eigenschap serverSpn-verbinding of het stuurprogramma deze laten bouwen voor u (de standaardinstelling). Deze eigenschap heeft de vorm van: 'MSSQLSvc/fqdn:port@REALM' waarbij fqdn de volledig gekwalificeerde domeinnaam is, poort het poortnummer is en REALM de Kerberos-realm van de SQL Server is in hoofdletters. Het realmgedeelte van deze eigenschap is optioneel als de standaardrealm van uw Kerberos-configuratie dezelfde realm is als de server en niet standaard is opgenomen. Als u ondersteuning wilt bieden voor een scenario voor cross-realm-verificatie waarbij de standaardrealm in de Kerberos-configuratie anders is dan het domein van de server, moet u de SPN instellen met de eigenschap serverSpn.

Uw SPN kan er bijvoorbeeld als volgt uitzien: MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM

Zie voor meer informatie over spn's (Service Principal Names):

Opmerking

Vóór de release van 6.2 van het JDBC-stuurprogramma moet u voor het juiste gebruik van Cross Realm Kerberos expliciet de serverSpn instellen.

Vanaf de release 6.2 kan het stuurprogramma de serverSpn standaard bouwen, zelfs wanneer u Cross Realm Kerberos gebruikt. Hoewel ook serverSpn expliciet kan worden gebruikt.

Een configuratiebestand voor de aanmeldingsmodule maken

U kunt eventueel een Kerberos-configuratiebestand opgeven. Als er geen configuratiebestand is opgegeven, zijn de volgende instellingen van kracht:

Sun Java Virtual Machine
com.sun.security.auth.module.Krb5LoginModule vereist useTicketCache=true;

IBM JVM
com.ibm.security.auth.module.Krb5LoginModule vereist useDefaultCcache = waar;

Als u besluit een configuratiebestand voor de aanmeldingsmodule te maken, moet het bestand deze indeling volgen:

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

Een aanmeldingsconfiguratiebestand bestaat uit een of meer vermeldingen, die elk aangeven welke onderliggende verificatietechnologie moet worden gebruikt voor een bepaalde toepassing of toepassingen. Bijvoorbeeld

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

Elke vermelding in het configuratiebestand van de aanmeldingsmodule bestaat uit een naam, gevolgd door een of meer LoginModule-specifieke vermeldingen. Elke LoginModule-specifieke vermelding wordt beëindigd door een puntkomma en de hele groep LoginModule-specifieke vermeldingen staat tussen accolades. Elke vermelding van het configuratiebestand wordt beëindigd door een puntkomma.

Naast het toestaan van het stuurprogramma om Kerberos-referenties te verkrijgen met behulp van de instellingen die zijn opgegeven in het configuratiebestand van de aanmeldingsmodule, kan het stuurprogramma bestaande referenties gebruiken. Deze methode kan handig zijn wanneer uw toepassing verbindingen moet maken met behulp van de referenties van meer dan één gebruiker.

De driver probeert bestaande inloggegevens te gebruiken indien beschikbaar, voordat hij probeert in te loggen door de opgegeven aanmeldmodule te gebruiken. Wanneer u dus de methode gebruikt voor het Subject.doAs uitvoeren van code onder een specifieke context, wordt er een verbinding gemaakt met de referenties die aan de Subject.doAs aanroep worden doorgegeven.

Zie jaas-aanmeldingsconfiguratiebestand en klasse Krb5LoginModule voor meer informatie.

Vanaf Microsoft JDBC-stuurprogramma 6.2 kan de vermeldingsnaam van de configuratie van de aanmeldingsmodule worden doorgegeven met behulp van de verbindingseigenschap jaasConfigurationName. Met deze methode kan elke verbinding een eigen aanmeldingsconfiguratie hebben of een andere naam gebruiken dan SQLJDBCDriver.

Een Kerberos-configuratiebestand maken

Zie Kerberos-vereisten voor meer informatie over Kerberos-configuratiebestanden.

Dit voorbeeld is een domeinconfiguratiebestand, waar YYYY en ZZZZ zijn dit de domeinnamen.

[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  
}  

Het configuratiebestand voor het domein en het configuratiebestand voor de aanmeldingsmodule inschakelen

U kunt een domeinconfiguratiebestand inschakelen met -Djava.security.krb5.conf. U kunt een configuratiebestand voor de aanmeldingsmodule inschakelen met -Djava.security.auth.login.config.

De volgende opdracht kan bijvoorbeeld worden gebruikt om de toepassing te starten:

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

Controleren of SQL Server toegankelijk is via Kerberos

Voer de volgende query uit in SQL Server Management Studio:

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

Zorg ervoor dat u over de benodigde machtigingen beschikt om deze query uit te voeren.

Beperkte delegering

Vanaf Microsoft JDBC Driver 6.2 ondersteunt het stuurprogramma Kerberos Constrained Delegation. De gedelegeerde referentie kan worden doorgegeven als org.ietf.jgss.GSSCredential-object. Deze referenties worden door het stuurprogramma gebruikt om verbinding te maken.

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);

Kerberos-verbinding met principalnaam, wachtwoord en realm

Vanaf Microsoft JDBC-stuurprogramma 6.2 kan het stuurprogramma een Kerberos-verbinding tot stand brengen met behulp van de principal-naam en het wachtwoord dat is doorgegeven in de verbindingsreeks.

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

Voor de eigenschap gebruikersnaam is geen REALM vereist als de gebruiker deel uitmaakt van het default_realm ingesteld in het krb5.conf-bestand. Wanneer userName en password worden ingesteld samen met integratedSecurity=true; en de authenticationScheme=JavaKerberos; eigenschap, wordt de verbinding tot stand gebracht met een waarde van userName als de Kerberos-principal, samen met het opgegeven wachtwoord.

Vanaf Microsoft JDBC Driver 9.4 kan de gebruiker de realm voor Kerberos-verificatie opgeven in de verbindingsreeks.

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

Kerberos-verificatie van Unix-machines in hetzelfde domein gebruiken

In deze handleiding wordt ervan uitgegaan dat er al een werkende Kerberos-installatie bestaat. Voer de volgende code uit op een Windows-computer met werkende Kerberos-verificatie om te controleren of het bovenstaande waar is. Met deze code wordt "Verificatieschema: KERBEROS" op de console afgedrukt als het succesvol is. Er zijn geen andere runtime-vlaggen, afhankelijkheden of stuurprogramma-instellingen vereist naast de opgegeven. Hetzelfde codeblok kan worden uitgevoerd op Linux om geslaagde verbindingen te verifiëren.

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. Voeg de clientcomputer toe aan hetzelfde domein als de server.
  2. (Optioneel) Stel de standaardlocatie van het Kerberos-ticket in. Deze stap is het handigst door de KRB5CCNAME omgevingsvariabele in te stellen.
  3. Haal het Kerberos-ticket op door een nieuw ticket te genereren of een bestaande op de standaardlocatie van het Kerberos-ticket te plaatsen. Als u een ticket wilt genereren, gebruikt u een terminal en initialiseert u het ticket via kinit USER@DOMAIN.AD, waarbij 'GEBRUIKER' de hoofdpersoon en 'DOMEIN.AD' het domein is. Voorbeeld: kinit SQL_SERVER_USER03@EXAMPLE.COM. Het ticket wordt gegenereerd op de standaardlocatie van het ticket of in het KRB5CCNAME pad als dit is ingesteld.
  4. De terminal vraagt om een wachtwoord en voert het wachtwoord in.
  5. Controleer de referenties in het ticket via klist en controleer of de referenties de referenties zijn die u wilt gebruiken voor verificatie.
  6. Voer de bovenstaande voorbeeldcode uit en controleer of kerberos-verificatie is geslaagd.

Native-platform GSS-integratie

Met systeemeigen platform GSS-integratie kunnen Java-toepassingen de systeemeigen GSS-API gebruiken in plaats van de cryptografische mechanismen van de JDK-implementatie van de GSS-API. De volgende voorbeeldcode laat bijvoorbeeld zien hoe u het gebruik van de systeemeigen GSS-API in het stuurprogramma inschakelt:

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));
    }
}

Daarnaast zijn ook de volgende JVM-argumenten vereist:

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

U kunt eventueel ook het pad naar de systeemeigen GSS-bibliotheek opgeven.

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

Zie de officiële Java-documentatie voor meer informatie over JVM-argumenten.

Uitgebreide beveiliging met Kerberos

U kunt uitgebreide beveiliging voor Kerberos ook inschakelen wanneer u het JDBC-stuurprogramma gebruikt. De enige beperking is dat voor het JDBC-stuurprogramma, bij het gebruik van uitgebreide beveiliging, forceversleuteling niet mag worden ingeschakeld.

Zie voor meer informatie over het inschakelen van Uitgebreide beveiliging:

Zie voor meer informatie over het maken van verbinding met versleuteling:

Zie ook

Verbinding maken met SQL Server met het JDBC-stuurprogramma