Herstellen von Verbindungen mit SQL Server mit der integrierten Kerberos-Authentifizierung
Ab Microsoft JDBC-Treiber 4.0 für SQL Server können Anwendungen mithilfe der Verbindungseigenschaft authenticationScheme angeben, dass eine Verbindung mit einer Datenbank unter Verwendung der integrierten Kerberos-Authentifizierung Typ 4 hergestellt werden soll. Weitere Informationen zu Verbindungseigenschaften finden Sie unter Festlegen von Verbindungseigenschaften. Weitere Informationen zu Kerberos finden Sie unter Microsoft Kerberos.
Bei Verwendung der integrierten Authentifizierung mit dem Java-Krb5LoginModule können Sie das Modul mithilfe der Klasse Krb5LoginModule konfigurieren.
Microsoft JDBC-Treiber für SQL Server legt für Java-VMs von IBM die folgenden Eigenschaften fest:
- useDefaultCcache = true
- moduleBanner = false
Microsoft JDBC-Treiber für SQL Server legt für alle anderen Java-VMs die folgenden Eigenschaften fest:
- useTicketCache = true
- doNotPrompt = true
Bemerkungen
Vor Microsoft JDBC-Treiber 4.0 für SQL Server konnten Anwendungen die integrierte Authentifizierung (mit Kerberos oder NTLM, je nach Verfügbarkeit) mithilfe der Verbindungseigenschaft integratedSecurity und durch Verweisen auf die mssql-jdbc_auth<-Version>-<arch>.dll angeben, wie unter Erstellen der Verbindungs-URL beschrieben.
Ab Microsoft JDBC-Treiber 4.0 für SQL Server können Anwendungen mit der Verbindungseigenschaft authenticationScheme angeben, dass eine Verbindung mit einer Datenbank mithilfe der integrierten Kerberos-Authentifizierung hergestellt werden soll, unter Verwendung der reinen Java-Kerberos-Implementierung:
Wenn die integrierte Authentifizierung mit dem Krb5LoginModule ausgeführt werden soll, müssen Sie dennoch die Verbindungseigenschaft integratedSecurity=true angeben. Dann müssen Sie auch die Verbindungseigenschaft authenticationScheme=JavaKerberos angeben.
Um weiterhin die integrierte Authentifizierung mit mssql-jdbc_auth-<version>-<arch>.dll zu verwenden, geben Sie einfach die Verbindungseigenschaft integratedSecurity=true (und optional authenticationScheme=NativeAuthentication) an.
Wenn Sie authenticationScheme=JavaKerberos angeben, ohne gleichzeitig integratedSecurity=true anzugeben, ignoriert der Treiber die Verbindungseigenschaft authenticationScheme und erwartet, dass der Benutzername und das Kennwort für die Anmeldeinformationen in der Verbindungszeichenfolge enthalten sind.
Wenn Verbindungen mit einer Datenquelle erstellt werden, können Sie das Authentifizierungsschema programmgesteuert mit setAuthenticationScheme und optional den SPN für Kerberos mithilfe von setServerSpn festlegen.
Zur Unterstützung der Kerberos-Authentifizierung wurde eine neue Protokollierung eingeführt: com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Weitere Informationen finden Sie unter Ablaufverfolgung für Treibervorgänge.
Befolgen Sie beim Konfigurieren von Kerberos die folgenden Richtlinien:
- Legen Sie AllowTgtSessionKey in der Registrierung für Windows auf 1 fest. Weitere Informationen finden Sie unter Kerberos protocol registry entries and KDC configuration keys in Windows Server 2003 (KDC-Konfigurationsschlüssel in Windows Server 2003 und Kerberos-Protokoll-Registrierungseinträge).
- Stellen Sie sicher, dass die Kerberos-Konfiguration (krb5.conf in UNIX-Umgebungen) auf den richtigen Bereich und KDC für Ihre Umgebung zeigt.
- Initialisieren Sie den TGT-Cache mit "kinit" oder indem Sie sich bei der Domäne anmelden.
- Bei Ausführung einer Anwendung, die authenticationScheme=JavaKerberos verwendet, unter dem Betriebssystem Windows Vista bzw. Windows 7 muss ein Standardbenutzerkonto verwendet werden. Wenn Sie jedoch die Anwendung unter einem Administratorkonto ausführen, muss sie mit Administratorberechtigungen ausgeführt werden.
Hinweis
Das Verbindungsattribut „serverSpn“ wird nur vom Microsoft JDBC-Treiber 4.2 und höher unterstützt.
Dienstprinzipalnamen
Ein Dienstprinzipalname (SPN, Service Principal Name) ist der Name, über den ein Client eine Instanz eines Diensts eindeutig identifiziert.
Sie können den SPN mithilfe der Verbindungseigenschaft serverSpn angeben oder ihn vom Treiber erstellen lassen (Standardeinstellung). Diese Eigenschaft kann in der Form „MSSQLSvc/fqdn:port@REALM“ angegeben werden, wobei „fqdn“ den vollqualifizierten Domänennamen, „port“ die Portnummer und „REALM“ den Kerberos-Bereich der SQL Server-Instanz in Großbuchstaben darstellen. Der Bereichsteil dieser Eigenschaft ist optional, wenn der Standardbereich Ihrer Kerberos-Konfiguration der gleiche Bereich wie der der Server-Instanz ist, und wird standardmäßig nicht angegeben. Wenn Sie ein bereichsübergreifendes Authentifizierungsszenario unterstützen möchten, in dem sich der Standardbereich der Kerberos-Konfiguration vom Bereich der Server-Instanz unterscheidet, müssen Sie den SPN mithilfe der Eigenschaft „serverSpn“ angeben.
Ihr SPN könnte beispielsweise so aussehen: MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM
Weitere Informationen zu Dienstprinzipalnamen (SPNs) finden Sie in folgendem Thema:
Hinweis
Vor Release 6.2 des JDBC-Treibers mussten Sie den serverSpn explizit festlegen, damit die bereichsübergreifende Kerberos-Authentifizierung ordnungsgemäß verwendet wurde.
Ab Release 6.2 kann der Treiber den serverSpn standardmäßig erstellen, auch bei Verwendung der bereichsübergreifenden Kerberos-Authentifizierung. Sie können serverSpn jedoch weiterhin explizit festlegen.
Erstellen einer Anmeldemodul-Konfigurationsdatei
Sie können optional eine Kerberos-Konfigurationsdatei angeben. Wenn keine Konfigurationsdatei angegeben wird, gelten die folgenden Einstellungen:
Sun-JVM
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
IBM-JVM
com.ibm.security.auth.module.Krb5LoginModule required useDefaultCcache = true;
Wenn Sie selbstständig eine Anmeldemodul-Konfigurationsdatei erstellen, muss die Datei das folgende Format aufweisen:
<name> {
<LoginModule> <flag> <LoginModule options>;
<optional_additional_LoginModules, flags_and_options>;
};
Eine Anmeldemodul-Konfigurationsdatei enthält einen oder mehrere Einträge, die jeweils angeben, welche zugrunde liegende Authentifizierungstechnologie für eine bestimmte Anwendung bzw. für bestimmte Anwendungen verwendet werden soll. Beispiel:
SQLJDBCDriver {
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;
};
Jeder Konfigurationsdateieintrag des Anmeldemoduls besteht aus einem Namen gefolgt von mindestens einem LoginModule-spezifischen Eintrag. Jeder LoginModule-spezifische Eintrag wird durch ein Semikolon abgeschlossen und die gesamte Gruppe der LoginModule-spezifischen Einträge in geschweifte Klammern eingeschlossen. Jeder Konfigurationsdateieintrag wird durch ein Semikolon abgeschlossen.
Für den Treiber kann nicht nur festgelegt werden, dass Kerberos-Anmeldeinformationen mit den Einstellungen in der Anmeldemodul-Konfigurationsdatei erhalten werden können. Stattdessen kann der Treiber auch vorhandene Anmeldeinformationen verwenden. Diese Methode kann hilfreich sein, wenn die Anwendung Verbindungen mit den Anmeldeinformationen mehrerer Benutzer herstellen muss.
Der Treiber versucht zunächst vorhandene Anmeldeinformationen zu verwenden (sofern diese verfügbar sind), bevor er die Anmeldung mit dem angegebenen Anmeldemodul ausführt. Bei Ausführung von Code unter einem bestimmten Kontext mithilfe der Subject.doAs
-Methode wird daher eine Verbindung mit den Anmeldeinformationen erstellt, die an den Aufruf von Subject.doAs
übergeben werden.
Weitere Informationen finden Sie unter JAAS Login Configuration File (JAAS-Anmeldekonfigurationsdatei) und Class Krb5LoginModule (Klasse Krb5LoginModule).
Ab Version 6.2 des Microsoft-JDBC-Treibers kann der eingetragene Name der Konfiguration für das Anmeldemodul mithilfe der Verbindungseigenschaft jaasConfigurationName
übergeben werden. Mit dieser Methode kann jede Verbindung über eine eigene Anmeldekonfiguration verfügen oder einen anderen Namen als SQLJDBCDriver
verwenden.
Erstellen einer Kerberos-Konfigurationsdatei
Weitere Informationen zu Kerberos-Konfigurationsdateien finden Sie unter Kerberos Requirements (Kerberos-Anforderungen).
Dies ist eine Konfiguration für eine Beispieldomäne. YYYY
und ZZZZ
sind die Domänennamen.
[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
}
Aktivieren der Domänenkonfigurationsdatei und der Anmeldemodul-Konfigurationsdatei
Sie können eine Domänenkonfigurationsdatei mit -Djava.security.krb5.conf aktivieren. Sie können eine Konfigurationsdatei für das Anmeldemodul mit -Djava.security.auth.login.config aktivieren.
Zum Starten der Anwendung kann beispielsweise der folgende Befehl verwendet werden:
Java.exe -Djava.security.auth.login.config=SQLJDBCDriver.conf -Djava.security.krb5.conf=krb5.ini <APPLICATION_NAME>
Überprüfen des Zugriffs auf SQL Server über Kerberos
Führen Sie in SQL Server Management Studio die folgende Abfrage aus:
select auth_scheme from sys.dm_exec_connections where session_id=\@\@spid
Vergewissern Sie sich, dass Sie über die erforderliche Berechtigung zum Ausführen dieser Abfrage verfügen.
Eingeschränkte Delegierung
Ab Version 6.2 unterstützt der Microsoft-JDBC-Treiber die eingeschränkte Delegierung von Kerberos. Die delegierten Anmeldeinformationen können als org.ietf.jgss.GSSCredential-Objekt übergeben werden. Diese Anmeldeinformationen werden vom Treiber zum Herstellen der Verbindung verwendet.
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-Verbindung mit Prinzipalname, Kennwort und Bereich
Ab Version 6.2 kann der Microsoft-JDBC-Treiber eine Kerberos-Verbindung mithilfe des in der Verbindungszeichenfolge übergebenen Prinzipalnamens und Kennworts herstellen.
jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user@REALM;password=****
Die Eigenschaft „username“ erfordert keine Festlegung von REALM, wenn der Benutzer zum in der Datei „krb5.conf“ festgelegten Standardbereich (default_realm) gehört. Wenn userName
und password
zusammen mit den Eigenschaften integratedSecurity=true;
und authenticationScheme=JavaKerberos;
festgelegt sind, wird die Verbindung mit „Kerberos-Prinzipal“ als Wert von „userName“ und dem bereitgestellten Kennwort hergestellt.
Ab dem Microsoft JDBC-Treiber 9.4 kann der Benutzer den Bereich für die Kerberos-Authentifizierung in der Verbindungszeichenfolge angeben.
jdbc:sqlserver://servername=server_name;encrypt=true;integratedSecurity=true;authenticationScheme=JavaKerberos;userName=user;password=****;realm=REALM
Verwenden der Kerberos-Authentifizierung auf UNIX-Computern in derselben Domäne
In diesem Leitfaden wird davon ausgegangen, dass bereits eine funktionierende Kerberos-Einrichtung vorhanden ist. Führen Sie den folgenden Code auf einem Windows-Computer mit funktionierender Kerberos-Authentifizierung aus, um zu überprüfen, ob diese Aussage zutreffend ist. Der Code gibt "Authentifizierungsschema: KERBEROS" an der Konsole aus, wenn die Ausführung erfolgreich war. Außer den bereitgestellten Laufzeitflags, Abhängigkeiten und Treibereinstellungen werden keine weiteren Einstellungen benötigt. Der gleiche Codeblock kann unter Linux ausgeführt werden, um erfolgreiche Verbindungen zu verifizieren.
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));
}
}
- Binden Sie den Clientcomputer in dieselbe Domäne ein, in der sich der Server befindet.
- (Optional) Legen Sie den Standardspeicherort für Kerberos-Tickets fest. Die bequemste Methode hierfür ist das Festlegen der Umgebungsvariablen
KRB5CCNAME
. - Rufen Sie das Kerberos-Ticket ab, indem Sie ein neues Ticket generieren oder ein vorhandenes Ticket im Standardspeicherort für Kerberos-Tickets ablegen. Um ein Ticket zu generieren, verwenden Sie ein Terminal, und initialisieren Sie das Ticket über
kinit USER@DOMAIN.AD
, wobei es sich bei „USER“ und „DOMAIN.AD“ um den Prinzipal bzw. die Domäne handelt. Beispiel:kinit SQL_SERVER_USER03@EXAMPLE.COM
Das Ticket wird im Standardspeicherort oder im PfadKRB5CCNAME
generiert, falls dieser festgelegt wurde. - Geben Sie das Kennwort ein, wenn Sie im Terminal dazu aufgefordert werden.
- Überprüfen Sie die Anmeldeinformationen im Ticket über
klist
, und vergewissern Sie sich, dass es sich um die Anmeldeinformationen handelt, die Sie für die Authentifizierung verwenden möchten. - Führen Sie den obigen Beispielcode aus, und vergewissern Sie sich, dass die Kerberos-Authentifizierung erfolgreich war.
Native Plattform-GSS-Integration
Native Plattform-GSS-Integration ermöglicht Java-Anwendungen, die native GSS-API anstelle der kryptografischen Mechanismen der JDK-Implementierung der GSS-API zu verwenden. Der folgende Beispielcode veranschaulicht, wie Sie die Verwendung der nativen GSS-API innerhalb des Treibers aktivieren:
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));
}
}
Darüber hinaus sind die folgenden JVM-Argumente erforderlich:
-Dsun.security.jgss.native=true
-Djavax.security.auth.useSubjectCredsOnly=false
Optional können Sie auch den Pfad zur nativen GSS-Bibliothek angeben.
-Dsun.security.jgss.lib=path/to/native/gss/library // This is optional
Weitere Informationen zu JVM-Argumenten finden Sie in der offiziellen Java-Dokumentation.
Erweiterter Schutz mit Kerberos
Bei Nutzung des JBDC-Treibers können Sie auch den erweiterten Schutz für Kerberos aktivieren. Die einzige Einschränkung dabei ist, dass bei Einsatz des erweiterten Schutzes das Erzwingen der Verschlüsselung für den JDBC-Treiber nicht aktiviert werden darf.
Weitere Informationen zur Aktivierung des erweiterten Schutzes finden Sie unter:
Weitere Informationen zum Herstellen einer Verbindung mit Verschlüsselung finden Sie unter: