Utilisation de l'authentification intégrée Kerberos pour se connecter à SQL Server

Télécharger le pilote JDBC

À compter de Microsoft JDBC Driver 4.0 pour SQL Server, les applications peuvent utiliser la propriété de connexion authenticationScheme pour indiquer qu’elles souhaitent se connecter à une base de données à l’aide de l’authentification intégrée Kerberos de type 4. Pour plus d’informations sur les propriétés de connexion, consultez Définition des propriétés de connexion. Pour plus d’informations sur Kerberos, consultez Microsoft Kerberos.

Lors de l’utilisation de l’authentification intégrée avec le Krb5LoginModule Java, vous pouvez configurer le module à l’aide de la classe Krb5LoginModule.

Le Pilote Microsoft JDBC pour SQL Server permet de définir les propriétés suivantes pour les machines virtuelles Java IBM :

  • useDefaultCcache = true
  • moduleBanner = false

Le Pilote Microsoft JDBC pour SQL Server permet de définir les propriétés suivantes pour toutes les autres machines virtuelles Java :

  • useTicketCache = true
  • doNotPrompt = true

Notes

Avant Microsoft JDBC Driver 4.0 pour SQL Server, les applications pouvaient spécifier l'authentification intégrée (à l'aide de Kerberos ou de NTLM, selon les disponibilités) en utilisant la propriété de connexion integratedSecurity et en référençant mssql-jdbc_auth-<version>-<arch>.dll, comme décrit dans Génération de l'URL de connexion.

À compter de Microsoft JDBC Driver 4.0 pour SQL Server, les applications peuvent utiliser la propriété de connexion authenticationScheme pour indiquer qu’elles souhaitent se connecter à une base de données à l’aide de l’authentification intégrée Kerberos et de l’implémentation pure Kerberos Java :

  • Si vous souhaitez que l'authentification intégrée utilise Krb5LoginModule, vous devez spécifier la propriété de connexion integratedSecurity=true. Vous devez alors également spécifier la propriété de connexion authenticationScheme=JavaKerberos.

  • Pour continuer à utiliser l’authentification intégrée avec mssql-jdbc_auth-<version>-<arch>.dell, il vous suffit de spécifier la propriété de connexion integratedSecurity=true (et éventuellement authenticationScheme=NativeAuthentication).

  • Si vous spécifiez authenticationScheme=JavaKerberos mais pas integratedSecurity=true, le pilote ignore la propriété de connexion authenticationScheme et s’attend à trouver le nom d’utilisateur et les informations d’identification dans la chaîne de connexion.

Quand vous utilisez une source de données pour créer des connexions, vous pouvez définir par programmation le schéma d’authentification à l’aide de setAuthenticationScheme et (éventuellement) définir le SPN pour les connexions Kerberos à l’aide de setServerSpn.

Un nouvel enregistreur d'événements a été ajouté pour la prise en charge de l'authentification Kerberos : com.microsoft.sqlserver.jdbc.internals.KerbAuthentication. Pour plus d'informations, consultez Suivi du fonctionnement du pilote.

Les consignes suivantes vous aideront à configurer Kerberos :

  1. Affectez la valeur 1 à AllowTgtSessionKey dans le registre pour Windows. Pour plus d’informations, consultez Entrées de Registre du protocole Kerberos et clés de configuration KDC dans Windows Server 2003.
  2. Assurez-vous que la configuration Kerberos (krb5.conf dans les environnements UNIX) référence le bon domaine et le centre de distribution de clés (KDC) convenant à votre environnement.
  3. Initialisez le cache des tickets TGT à l'aide de l'outil kinit, en vous connectant au domaine.
  4. Quand une application utilisant authenticationScheme=JavaKerberos s’exécute sur les systèmes d’exploitation Windows Vista ou Windows 7, vous devez utiliser un compte d’utilisateur standard. Toutefois, si vous exécutez l’application à l’aide d’un compte d’administrateur, vous devrez l’exécuter à l’aide de privilèges d’administrateur.

Notes

L’attribut de connexion serverSpn est uniquement pris en charge par Microsoft JDBC Driver 4.2 et versions ultérieures.

Noms des principaux du service

Le nom de principal du service (SPN) est le nom par lequel un client identifie de manière unique l'instance d'un service.

Vous pouvez spécifier le SPN à l’aide de la propriété de connexion serverSpn, ou laisser le pilote le créer pour vous (par défaut). Cette propriété a le format suivant : « MSSQLSvc/fqdn:port@REALM », où fqdn désigne le nom de domaine complet, port désigne le numéro de port et REALM désigne le domaine Kerberos de SQL Server en majuscules. La partie domaine de cette propriété est facultative si le domaine par défaut de votre configuration Kerberos est le même que celui du serveur et n’est pas inclus par défaut. Si vous souhaitez prendre en charge un scénario d’authentification entre plusieurs domaines où le domaine par défaut dans la configuration Kerberos diverge par rapport à celui du serveur, vous devez définir le SPN avec la propriété serverSpn.

Voici à quoi votre SPN peut ressembler : MSSQLSvc/some-server.zzz.corp.contoso.com:1433@ZZZZ.CORP.CONTOSO.COM

Pour plus d'informations sur les noms des principaux du service (SPN), consultez :

Notes

Avant la version 6.2 du pilote JDBC, pour utiliser correctement l’approbation de domaine croisé, vous deviez définir explicitement le serverSpn.

Depuis la version 6.2, le pilote est en mesure de générer le serverSpn par défaut, bien qu’il soit possible d’utiliser l’approbation de domaine croisé. Il est également possible d’utiliser explicitement le serverSpn.

Création du fichier de configuration d'un module de connexion

Vous pouvez, si vous le désirez, créer un fichier de configuration Kerberos. Si vous ne spécifiez pas de fichier de configuration, les paramètres suivants s’appliquent :

Machine virtuelle Java Sun
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true;

Machine virtuelle Java IBM
com.ibm.security.auth.module.Krb5LoginModule required useDefaultCcache = true;

Si vous décidez de créer un fichier de configuration de module de connexion, le fichier doit respecter le format suivant :

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

Un fichier de configuration de connexion est composé d'une ou plusieurs entrées, chacune spécifiant la technologie d'authentification sous-jacente qui doit être utilisée pour une application en particulier. Par exemple,

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

Chaque entrée de fichier de configuration de module de connexion correspond à un nom suivi d’une ou de plusieurs entrées spécifiques à LoginModule. Chaque entrée spécifique à LoginModule est suivie d’un point-virgule et le groupe entier des entrées spécifiques à LoginModule est placé entre accolades. Chaque entrée du fichier de configuration se termine par un point-virgule.

En plus de permettre au pilote d'acquérir les informations d'identification Kerberos à l'aide des paramètres spécifiés dans le fichier de configuration du module de connexion, le pilote peut utiliser les informations d'identification existantes. Cette méthode peut se révéler utile si votre application doit créer des connexions utilisant les informations d’identification de plusieurs utilisateurs.

Le pilote tente d’utiliser les informations d’identification existantes le cas échéant, puis il tente de se connecter via le module de connexion spécifié. Par conséquent, quand vous utilisez la méthode Subject.doAs pour exécuter le code dans un contexte spécifique, une connexion est créée avec les informations d’identification passées à l’appel Subject.doAs.

Pour plus d’informations, consultez JAAS Login Configuration File et Class Krb5LoginModule.

À partir de Microsoft JDBC Driver 6.2, le nom d’entrée de la configuration du module de connexion peut être transmis à l’aide de la propriété de connexion jaasConfigurationName. Cette méthode permet à chaque connexion d’avoir sa propre configuration de connexion ou d’utiliser un nom autre que SQLJDBCDriver.

Création d'un fichier de configuration Kerberos

Pour plus d’informations sur les fichiers de configuration Kerberos, consultez Kerberos Requirements.

Voici un exemple de fichier de configuration de domaine, où YYYY et ZZZZ correspondent aux noms de domaine.

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

Activation du fichier de configuration du domaine et du fichier de configuration du module de connexion

Le fichier de configuration de domaine peut être activé à l'aide de -Djava.security.krb5.conf. Vous pouvez activer le fichier de configuration d’un module de connexion avec -Djava.security.auth.login.config.

Par exemple, la commande suivante peut être utilisée pour démarrer l’application :

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

Vérification de l'accessibilité de SQL Server via Kerberos

Exécutez la requête suivante dans SQL Server Management Studio :

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

Assurez-vous de disposer de l'autorisation nécessaire pour exécuter cette requête.

Délégation contrainte

À partir du pilote Microsoft JDBC 6.2, le pilote prend en charge la délégation contrainte Kerberos. Les informations d’identification déléguées peuvent être transmises en tant qu’objet org.ietf.jgss.GSSCredential. Ces informations d’identification sont utilisées par le pilote pour établir la connexion.

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

Connexion Kerberos utilisant le nom du principal, le mot de passe et le domaine

À partir de Microsoft JDBC Driver 6.2, le pilote peut établir une connexion Kerberos à l'aide du nom du principal et du mot de passe transmis dans la chaîne de connexion.

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

La propriété username ne nécessite pas de domaine REALM si l’utilisateur fait partie du domaine par défaut default_realm défini dans le fichier krb5.conf. Lorsque userName et password sont définis avec integratedSecurity=true; et la propriété authenticationScheme=JavaKerberos;, la connexion est établie avec la valeur userName en tant que principal Kerberos et le mot de passe fourni.

À partir de Microsoft JDBC Driver 9.4, l'utilisateur peut spécifier le domaine pour l'authentification Kerberos dans la chaîne de connexion.

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

Utilisation de l’authentification Kerberos à partir d’ordinateurs Unix sur le même domaine

Ce guide suppose qu’une configuration Kerberos opérationnelle existe déjà. Exécutez le code suivant sur un ordinateur Windows avec l’authentification Kerberos opérationnelle pour vérifier si la condition ci-dessus est vraie. Le code affiche « Schéma d’authentification : KERBEROS » sur la console en cas de réussite. Aucun indicateur d’exécution, dépendance ni paramètre de pilote autres que ceux fournis ne sont nécessaires. Le même bloc de code peut être exécuté sur Linux pour vérifier que les connexions sont bien établies.

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. Joindre le domaine de l’ordinateur client au même domaine que le serveur.
  2. (Facultatif) Définissez l’emplacement par défaut du ticket Kerberos. Il est plus pratique de réaliser cette étape en définissant la variable d’environnement KRB5CCNAME.
  3. Obtenir le ticket Kerberos en générant un nouveau ou en plaçant un ticket existant dans l’emplacement par défaut du ticket Kerberos. Pour générer un ticket, utilisez un terminal et initialisez le ticket via kinit USER@DOMAIN.AD, où « USER » et « DOMAIN.AD » sont respectivement le principal et le domaine. Par exemple : kinit SQL_SERVER_USER03@EXAMPLE.COM. Le ticket sera généré à l’emplacement par défaut du ticket ou dans le chemin KRB5CCNAME si ce dernier a été défini.
  4. Entrez le mot de passe lorsque le terminal vous y invite.
  5. Vérifiez les informations d’identification dans le ticket via klist et vérifiez que les informations d’identification sont bien celles que vous envisagez d’utiliser pour l’authentification.
  6. Exécutez l’exemple de code ci-dessus et vérifiez que l’authentification Kerberos s’est correctement déroulée.

Intégration de plateforme native GSS

L’intégration de plateforme native GSS permet aux applications Java d’utiliser l’API GSS native plutôt que les mécanismes de chiffrement de l’implémentation JDK de l’API GSS. L’exemple de code suivant montre par exemple comment activer l’utilisation de l’API GSS native dans le pilote :

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

En outre, les arguments JVM suivants sont également nécessaires :

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

Vous pouvez également fournir le chemin d’accès à la bibliothèque native GSS.

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

Pour plus d’informations sur les arguments JVM, consultez la documentation Java officielle.

Voir aussi

Connexion à SQL Server avec le pilote JDBC