Herstellen von Verbindungen mit SQL Server mit der integrierten Kerberos-Authentifizierung

JDBC-Treiber herunterladen

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:

  1. 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).
  2. Stellen Sie sicher, dass die Kerberos-Konfiguration (krb5.conf in UNIX-Umgebungen) auf den richtigen Bereich und KDC für Ihre Umgebung zeigt.
  3. Initialisieren Sie den TGT-Cache mit "kinit" oder indem Sie sich bei der Domäne anmelden.
  4. 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));
    }
}
  1. Binden Sie den Clientcomputer in dieselbe Domäne ein, in der sich der Server befindet.
  2. (Optional) Legen Sie den Standardspeicherort für Kerberos-Tickets fest. Die bequemste Methode hierfür ist das Festlegen der Umgebungsvariablen KRB5CCNAME.
  3. 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 Pfad KRB5CCNAME generiert, falls dieser festgelegt wurde.
  4. Geben Sie das Kennwort ein, wenn Sie im Terminal dazu aufgefordert werden.
  5. Ü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.
  6. 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.

Weitere Informationen

Verbinden mit SQL Server mit dem JDBC-Treiber