Nous sommes heureux d’annoncer que la première étape de l’extension Spring Security Kerberos est maintenant disponible en téléchargement. La version est également disponible via le référentiel Maven Milestone à http://maven.springframework.org/milestone. Avec l’extension Spring Security Kerberos, vos utilisateurs sont authentifiés par rapport à votre application Web simplement en ouvrant l’URL. Il n’est pas nécessaire d’entrer un nom d’utilisateur / mot de passe et d’installer un logiciel supplémentaire.
Avant d’aller plus loin dans Kerberos, je voudrais présenter Spring Security Extensions, un nouveau projet d’extension Spring dédié à fournir des modules d’extension pour le projet de sécurité Spring core. Actuellement, nous y avons développé deux extensions: une intégration SAML2 et une intégration Kerberos/SPNEGO. Chaque module aura son propre cycle de publication, afin que les utilisateurs puissent bénéficier de ces extensions dès qu’ils sont prêts et n’aient pas à attendre la prochaine version de sécurité du printemps. Si vous avez des idées ou même du code pour d’autres extensions, veuillez nous le dire!
Kerberos/ SPNEGO
Dans la première étape de ce module, nous vous fournissons une solution Kerberos / SPNEGO prête à l’emploi pour les applications Web. Kerberos est un protocole d’authentification réseau standardisé, conçu pour fournir une authentification forte pour les applications client / serveur, comme les applications Web où le navigateur est le client. C’est également le moyen recommandé d’authentifier les utilisateurs d’un réseau Windows et il remplace le NTLM obsolète et relativement peu sûr. En outre, il est largement utilisé dans les environnements *NIX et il existe des implémentations pour chaque plate-forme majeure. Il est donc très probable que vous ayez déjà Kerberos en place et que vous puissiez maintenant l’utiliser également dans votre propre application Web. Cela signifie que votre utilisateur entre simplement l’URL et qu’il est automatiquement authentifié avec son nom d’utilisateur de domaine, par exemple [email protected] . Vous pouvez ensuite trouver ce nom d’utilisateur via Spring Security ou même avec demande.getRemoteUser(). Comment cela fonctionne-t-il? Voici un bref aperçu:
Le navigateur envoie une requête GET à votre application Web (1), qui renvoie ensuite que l’authentification « négocier » est requise (2). Le Navigateur demandera alors au serveur Kerberos d’obtenir un ticket de service (3). Le navigateur envoie ensuite ce ticket de service, qui prouve l’identité de l’appelant, et quelques éléments supplémentaires à l’application Web (5). Après avoir validé le ticket, basé sur un secret partagé entre votre application web et le serveur Kerberos, vous récupérez le nom d’utilisateur.
Pour que cela fonctionne, toutes les applications Web doivent être enregistrées sur le serveur Kerberos et reçoivent un service prinicipal et un secret partagé attribué. Pour les applications Web, le principal de service doit être « HTTP/< nom de domaine qualifié complet > @DOMAIN « . Par exemple « HTTP/[email protected] « , si votre application fonctionne sur web.springsource.com . Vous devez ensuite exporter les informations d’identification de ce principal dans un fichier keytab (secret partagé) et les mettre à la disposition de votre application. Chaque système basé sur Kerberos fonctionnera de cette façon, mais la création de ce principal de service et du keytab est différente entre les systèmes. Je vais vous montrer comment vous le faites avec Microsoft Windows et MIT Kerberos, mais cela devrait également fonctionner avec d’autres implémentations.
Création du service principal avec Microsoft Windows 2008 Server
Bien que cela se réfère à Microsoft Windows 2008 Server, cela devrait être très similaire en 2003 et même en 2000 Server. Dans ActiveDirectory, vous créez simplement un utilisateur de domaine normal, puis lui attribuez un service principal (SPN) et créez le keytab avec un utilitaire de ligne de commande. Et maintenant étape par étape :
Créez un utilisateur normal qui deviendra le principal du service. Le nom d’utilisateur et le mot de passe n’ont aucun sens pour Kerberos, mais vous devez bien sûr choisir un nom utile, comme http-web.springsource.com . Assurez-vous simplement de désactiver l’option « L’utilisateur doit changer le mot de passe lors de la prochaine connexion » et activez « Le mot de passe n’expire jamais ».
Après cela, vous devez utiliser l’outil de ligne de commande « ktpass.EXE ». Il est déjà inclus dans Windows 2008 Server, dans les versions antérieures, vous devez l’installer vous-même. Assurez-vous simplement que vous utilisez une version qui correspond à la version de votre serveur et que les paramètres régionaux doivent également correspondre. Cet outil affectera le nom principal du service (SPN) à votre utilisateur créé précédemment et exportera la clé utilisateur dans un fichier keytab. Si votre principal de service est « HTTP/[email protected] » et votre utilisateur est http-web.springsource.com , alors votre commande ktpass devrait ressembler à ceci:
ktpass /out http-web.keytab /mapuser /princ HTTP/ /pass *
ktpass vous demandera un mot de passe. Vous devriez en choisir un aléatoire sécurisé. Si vous avez maintenant un fichier http-web.keytab dans votre répertoire, alors tout a bien fonctionné. Ce fichier est nécessaire plus tard dans votre application, car il contient le secret partagé pour valider les tickets de service.
Création du service principal avec MIT Kerberos
Sur les systèmes *NIX et également sous Mac OS X, l’implémentation MIT Kerberos est largement utilisée. Avec MIT Kerberos, c’est encore plus simple. Ouvrez simplement la console kadmin et exécutez les commandes suivantes:
kadmin: addprinc -randkey HTTP/web.springsource.comkadmin: ktadd -k /http-web.keytab HTTP/web.springsource.com
Vous devriez alors avoir un fichier http-web.keytab sous root. Ce fichier est ensuite nécessaire dans votre application, car il contient le secret partagé pour valider les tickets de service.
Configuration de la sécurité Spring
Tout d’abord, les exigences:
- Sécurité du ressort 3.0.0 M2
- SUN JRE/JDK 1.6.x
- Environnement Kerberos
- Navigateur prenant en charge SPNEGO (Firefox, IE, Safari)
Pour utiliser le module Kerberos dans Spring Security, il vous suffit de déclarer un filtre, un point d’entrée d’authentification et un fournisseur d’authentification. Nous avons inclus un exemple d’application Web que vous pouvez utiliser comme point de départ. Il vous suffit de configurer le nom principal de votre service et d’y placer votre keytab de génération. L’exemple d’application est inclus dans le téléchargement mentionné ci-dessus.
Si vous ouvrez la sécurité.fichier xml de l’exemple d’application, qui se trouve sous /src/main/webapp/WEB-INF, vous voyez une configuration de sécurité Spring de base qui utilise le nouveau module Kerberos.
Les deux premiers beans (SpnegoEntryPoint et SpnegoAuthenticationProcessingFilter) sont responsables de la poignée de main, et le KerberosServiceAuthenticationProvider valide finalement le ticket de service. Actuellement, nous ne prenons en charge que l’implémentation Kerberos / SPNEGO qui est incluse dans le JRE / JDK de SUN. Comme vous ne récupérez que le nom d’utilisateur de Kerberos, vous avez également besoin d’un UserDetailsService pour récupérer les rôles et peut-être d’autres attributs utilisateur. Dans cet exemple, nous utilisons simplement une implémentation fictive pour faciliter les tests.
Comme vous pouvez le voir, nous avons déjà renseigné le nom prinicipal du service et l’emplacement du keytab. Modifiez ces valeurs selon vos besoins et assurez-vous que le keytab généré précédemment est disponible à cet emplacement.
Démarrez maintenant votre serveur et essayez de tenter une authentification SPNEGO. Vous devriez voir votre nom d’utilisateur complet dans le navigateur. Dans votre code, vous pouvez récupérer le nom d’utilisateur avec les classes de sécurité Spring normales ou même avec la demande d’appel de servlet Java standard.getRemoteUser(). Si cela ne fonctionne pas (peut-être voyez-vous une page vide), vérifiez ces choses:
- Vérifiez le fichier journal
- Assurez-vous d’utiliser le nom de domaine qualifié complet (pas l’adresse IP et pas le nom court) dans votre URL.
- Si vous utilisez Internet Explorer : Activez « Authentification intégrée Windows » et assurez-vous que le domaine (dans notre cas web.springsource.com ) est répertorié dans la section du site intranet local d’IE.
- Si vous utilisez Firefox : Jetez un oeil ici.
- Si vous utilisez un client Windows: Le client et le serveur doivent être sur des machines différentes, sinon Windows utilisera NTLM au lieu de Kerberos.
- Vérifiez si l’heure est synchronisée sur toutes les machines impliquées.
- Si vous utilisez Microsoft AD, vous trouverez de l’aide ici: http://msdn.microsoft.com/en-us/library/ms995329.aspx
En outre, la configuration d’un environnement Kerberos approprié peut être compliquée, et il est important de bien comprendre cela avant de commencer à utiliser l’extension Spring Security Kerberos. La plupart des problèmes que nous rencontrons lors de la consultation sont des problèmes avec l’environnement Kerberos et non avec l’application elle-même.
Si vous ne souhaitez pas utiliser l’extension Spring Security Kerberos dans votre propre projet Maven, vous devez ajouter le référentiel Spring Milestone à votre pom.XML. Cela devrait ressembler à ceci:
et bien sûr la dépendance:
Il y a encore du travail à faire, par exemple pour fournir également des Kerberos pour les clients Java et pas seulement pour le serveur, mais nous espérons que vous allez essayer cette version milestone et fournir des commentaires. Le Forum communautaire est le meilleur endroit pour poser des questions ou pour entamer des discussions sur de nouvelles fonctionnalités. Sinon, si vous trouvez quelque chose qui ne va pas, vous pouvez soulever un problème Jira.