Dela via


Använda Kerberos-integrerad autentisering för att ansluta till SQL Server

Ladda ned JDBC-drivrutin

Från och med Microsoft JDBC Driver 4.0 för SQL Server kan ett program använda egenskapen authenticationScheme-anslutning för att indikera att det vill ansluta till en databas med hjälp av typ 4 Kerberos-integrerad autentisering. Mer information om anslutningsegenskaper finns i Ange anslutningsegenskaper. Mer information om Kerberos finns i Microsoft Kerberos.

När du använder integrerad autentisering med Java Krb5LoginModule kan du konfigurera modulen med hjälp av Class Krb5LoginModule.

Microsoft JDBC-drivrutinen för SQL Server anger följande egenskaper för virtuella IBM Java-datorer:

  • useDefaultCcache = true
  • moduleBanner = falskt

Microsoft JDBC-drivrutinen för SQL Server anger följande egenskaper för alla andra virtuella Java-datorer:

  • useTicketCache = sant
  • doNotPrompt = sant

Anmärkningar

Före Microsoft JDBC Driver 4.0 för SQL Server kan program ange integrerad autentisering (med Kerberos eller NTLM, beroende på vilken som är tillgänglig) med hjälp av egenskapen integratedSecurity-anslutning och genom att referera till mssql-jdbc_auth-version-arch<><>.dll, enligt beskrivningen i Skapa anslutnings-URL:en.

Från och med Microsoft JDBC Driver 4.0 för SQL Server kan ett program använda egenskapen authenticationScheme-anslutning för att indikera att det vill ansluta till en databas med kerberos-integrerad autentisering med hjälp av den rena Java Kerberos-implementeringen:

  • Om du vill ha integrerad autentisering med Krb5LoginModule måste du fortfarande ange egenskapen integratedSecurity=true connection. Sedan anger du även egenskapen authenticationScheme=JavaKerberos-anslutning .

  • Om du vill fortsätta använda integrerad autentisering med mssql-jdbc_auth-<version>-<arch>.dll, anger du bara anslutningsegenskapen integratedSecurity=true (och valfritt authenticationScheme=NativeAuthentication).

  • Om du anger authenticationScheme=JavaKerberos men inte också anger integratedSecurity=true ignorerar drivrutinen egenskapen authenticationScheme-anslutning och förväntar sig att hitta användarnamn och lösenordsautentiseringsuppgifter i anslutningssträngen.

När du använder en datakälla för att skapa anslutningar kan du programmatiskt ange autentiseringsschemat med setAuthenticationScheme och (valfritt) ange SPN för Kerberos-anslutningar med setServerSpn.

En ny loggare har lagts till för att stödja Kerberos-autentisering: com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Mer information finns i Spårning av drivrutinsfunktioner.

Följande riktlinjer hjälper dig att konfigurera Kerberos:

  1. Ange AllowTgtSessionKey till 1 i registret för Windows. Mer information finns i Kerberos-protokollregisterposter och KDC-konfigurationsnycklar i Windows Server 2003.
  2. Kontrollera att Kerberos-konfigurationen (krb5.conf i UNIX-miljöer) pekar på rätt sfär och KDC för din miljö.
  3. Initiera TGT-cachen med hjälp av kinit eller inloggning i domänen.
  4. När ett program som använder authenticationScheme=JavaKerberos körs på operativsystemet Windows Vista eller Windows 7 bör du använda ett standardanvändarkonto. Men om du kör programmet under en administratörs konto måste programmet köras med administratörsbehörighet.

Anmärkning

Anslutningsattributet serverSpn stöds endast av Microsoft JDBC Drivers 4.2 och senare.

Tjänsthuvudnamn

Ett namn på tjänstens huvudnamn (SPN) är det namn som en klient unikt identifierar en instans av en tjänst med.

Du kan ange SPN med hjälp av egenskapen serverSpn-anslutning eller låta drivrutinen skapa det åt dig (standardvärdet). Den här egenskapen är i form av: "MSSQLSvc/fqdn:port@REALM" där fqdn är det fullständigt kvalificerade domännamnet, porten är portnumret och REALM är Kerberos-sfären för SQL Server med versaler. Sfärdelen av den här egenskapen är valfri om Kerberos-konfigurationens standardsfär är samma sfär som servern och inte ingår som standard. Om du vill ha stöd för ett scenario med autentisering mellan områden där standardsfären i Kerberos-konfigurationen skiljer sig från serversfären måste du ange SPN med egenskapen serverSpn.

Ditt SPN kan till exempel se ut så här: MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM

Mer information om tjänsthuvudnamn (SPN) finns i:

Anmärkning

Innan 6.2-versionen av JDBC-drivrutinen, för korrekt användning av Cross Realm Kerberos, måste du uttryckligen ange serverSpn.

Från och med 6.2-versionen kommer drivrutinen att kunna skapa serverSpn som standard, även när du använder Cross Realm Kerberos. Även om man kan använda serverSpn explicit också.

Skapa en konfigurationsfil för inloggningsmodulen

Du kan också ange en Kerberos-konfigurationsfil. Om en konfigurationsfil inte har angetts gäller följande inställningar:

Sön JVM
com.sun.security.auth.module.Krb5LoginModule krävs useTicketCache=true;

IBM JVM
com.ibm.security.auth.module.Krb5LoginModule krävs useDefaultCcache = true;

Om du väljer att skapa en konfigurationsfil för inloggningsmodulen måste filen följa det här formatet:

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

En konfigurationsfil för inloggning består av en eller flera poster som var och en anger vilken underliggande autentiseringsteknik som ska användas för ett visst program eller program. Ett exempel:

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

Varje konfigurationsfilpost för inloggningsmodulen består av ett namn följt av en eller flera LoginModule-specifika poster. Varje LoginModule-specifik post avslutas av ett semikolon och hela gruppen med LoginModule-specifika poster omges av klammerparenteser. Varje konfigurationsfilpost avslutas av ett semikolon.

Förutom att tillåta drivrutinen att hämta Kerberos-autentiseringsuppgifter med hjälp av inställningarna som anges i konfigurationsfilen för inloggningsmodulen kan drivrutinen använda befintliga autentiseringsuppgifter. Den här metoden kan vara användbar när programmet behöver skapa anslutningar med fler än en användares autentiseringsuppgifter.

Drivrutinen försöker använda befintliga autentiseringsuppgifter om de är tillgängliga innan du försöker logga in med den angivna inloggningsmodulen. När du använder Subject.doAs metoden för att köra kod under en specifik kontext skapas därför en anslutning med de autentiseringsuppgifter som skickas till anropet Subject.doAs .

Mer information finns i JAAS-inloggningskonfigurationsfil och Klass Krb5LoginModule.

Från och med Microsoft JDBC Driver 6.2 kan postnamnet för konfigurationen av inloggningsmodulen skickas med hjälp av anslutningsegenskapen jaasConfigurationName. Med den här metoden kan varje anslutning ha en egen inloggningskonfiguration eller använda ett annat namn än SQLJDBCDriver.

Skapa en Kerberos-konfigurationsfil

Mer information om Kerberos-konfigurationsfiler finns i Kerberos-krav.

Det här exemplet är en domänkonfigurationsfil, där YYYY och ZZZZ är domännamnen.

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

Aktivera domänkonfigurationsfilen och konfigurationsfilen för inloggningsmodulen

Du kan aktivera en domänkonfigurationsfil med -Djava.security.krb5.conf. Du kan aktivera en konfigurationsfil för inloggningsmodulen med -Djava.security.auth.login.config.

Följande kommando kan till exempel användas för att starta programmet:

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

Verifiera att SQL Server kan nås via Kerberos

Kör följande fråga i SQL Server Management Studio:

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

Kontrollera att du har den behörighet som krävs för att köra den här frågan.

Begränsad delegering

Från och med Microsoft JDBC Driver 6.2 stöder drivrutinen Kerberos-begränsad delegering. Delegerade autentiseringsuppgifter kan skickas som org.ietf.jgss.GSSCredential-objekt. Dessa autentiseringsuppgifter används av drivrutinen för att upprätta anslutningen.

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-anslutning med huvudnamn, lösenord och sfär

Från och med Microsoft JDBC Driver 6.2 kan drivrutinen upprätta en Kerberos-anslutning med hjälp av huvudnamnet och lösenordet som skickas i anslutningssträngen.

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

Användarnamnsegenskapen kräver ingen REALM om användaren tillhör default_realm som anges i filen krb5.conf. När userName och password anges tillsammans med integratedSecurity=true; och authenticationScheme=JavaKerberos; egenskapen upprättas anslutningen med värdet userName som Kerberos-huvudnamn tillsammans med det angivna lösenordet.

Från och med Microsoft JDBC Driver 9.4 kan användaren ange sfären för Kerberos-autentisering i anslutningssträngen.

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

Använda Kerberos-autentisering från Unix-datorer på samma domän

Den här guiden förutsätter att det redan finns en fungerande Kerberos-konfiguration. Kör följande kod på en Windows-dator med fungerande Kerberos-autentisering för att kontrollera om ovanstående är sant. Koden skriver ut "Authentication Scheme: KERBEROS" till konsolen om det lyckas. Inga andra körningsflaggor, beroenden eller drivrutinsinställningar krävs utanför de som tillhandahålls. Samma kodblock kan köras på Linux för att verifiera lyckade anslutningar.

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. Domänanslut klientdatorn till samma domän som servern.
  2. (Valfritt) Ange standardplatsen för Kerberos-biljetten. Det här steget gör du enklast genom att ange KRB5CCNAME miljövariabeln.
  3. Hämta Kerberos-biljetten, antingen genom att generera en ny eller placera en befintlig på standardplatsen för Kerberos-biljett. För att generera en biljett, använd en terminal och initiera biljetten via kinit USER@DOMAIN.AD där "USER" och "DOMAIN.AD" är huvudkontot respektive domänen. Till exempel: kinit SQL_SERVER_USER03@EXAMPLE.COM. Ärendet kommer att genereras på standardplatsen för ärenden eller i KRB5CCNAME-sökvägen om den är angiven.
  4. Terminalen frågar efter ett lösenord och anger lösenordet.
  5. Kontrollera autentiseringsuppgifterna i biljetten via klist och bekräfta att autentiseringsuppgifterna är de som du tänker använda för autentisering.
  6. Kör exempelkoden ovan och bekräfta att Kerberos-autentiseringen lyckades.

Inbyggd GSS-plattformsintegrering

Med inbyggd GSS-integrering på plattformen kan Java-program använda inbyggda GSS-API i stället för de kryptografiska mekanismerna i JDK-implementeringen av GSS-API:et. Följande exempelkod visar till exempel hur du aktiverar användning av den interna GSS-API i drivrutinen:

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

Dessutom krävs följande JVM-argument:

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

Du kan också ange sökvägen till det interna GSS-biblioteket.

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

Mer information om JVM-argument finns i den officiella Java-dokumentationen.

Utökat skydd med Kerberos

Du kan också aktivera Utökat skydd för Kerberos när du använder JDBC-drivrutinen. Den enda begränsningen är att force encryption inte får aktiveras för JDBC-drivrutinen när du använder Utökat skydd.

Mer information om hur du aktiverar Utökat skydd finns i:

Mer information om hur du ansluter med kryptering finns i:

Se även

Ansluta till SQL Server med JDBC-drivrutinen