Chapitre 13. Authentification et Autorisation
13.1. Intégration Kerberos et SPNEGO
13.1.1. Intégration Kerberos et SPNEGO
Dans une installation normale, l'utilisateur se connecte à un ordinateur de bureau qui est régi par le domaine Active Directory. L'utilisateur utilise ensuite le navigateur web, Firefox ou Internet Explorer pour accéder à une application web qui utilise la négociation de JBoss Negociation sur JBoss EAP. Le navigateur web transfère l'information de sign on de bureau à l'application web. JBoss EAP utilise les messages GSS d'arrière-plan avec Active Directory ou n'importe quel serveur Kerberos pour valider l'utilisateur. Cela permet à l'utilisateur d"effectuer un SSO sans faille dans l'application web
13.1.2. Desktop SSO using SPNEGO
- Domaine de sécurité
- Propriétés système
- Application Web
Procédure 13.1. Configurer Desktop SSO utilisant SPNEGO
Configurer Domaine de sécurité
Configurer les domaines de sécurité pour qu'il représentent l'identité du serveur et pour sécuriser l'application web.Exemple 13.1. Configuration du domaine de sécurité
<security-domains> <security-domain name="host" cache-type="default"> <authentication> <login-module code="Kerberos" flag="required"> <module-option name="storeKey" value="true"/> <module-option name="useKeyTab" value="true"/> <module-option name="principal" value="host/testserver@MY_REALM"/> <module-option name="keyTab" value="/home/username/service.keytab"/> <module-option name="doNotPrompt" value="true"/> <module-option name="debug" value="false"/> </login-module> </authentication> </security-domain> <security-domain name="SPNEGO" cache-type="default"> <authentication> <login-module code="SPNEGO" flag="requisite"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="serverSecurityDomain" value="host"/> </login-module> <!-- Login Module For Roles Search --> </security-domain>
Configuration des propriétés système
Si nécessaire, les propriétés système peuvent être configurées dans le modèle de domaine.Exemple 13.2. Configurer les propriétés système
<system-properties> <property name="java.security.krb5.kdc" value="mykdc.mydomain"/> <property name="java.security.krb5.realm" value="MY_REALM"/> </system-properties>
Configurer Application Web
Il n'est pas possible de remplacer les authentificateurs, mais il est possible d'ajouter leNegotiationAuthenticator
comme valve à votre jboss-web.xml pour configurer l'application web.Note
La valve a besoin d'avoirsecurity-constraint
etlogin-config
définis dans le fichier web.xml car c'est utilisé pour décider quelles sources sont sécurisées. Cependant, l'auth-method
est remplacée par cet authenticateur.Exemple 13.3. Configurer Application Web
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.4//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd"> <jboss-web> <security-domain>SPNEGO</security-domain> <valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve> </jboss-web>
L'application web exige aussi qu'une dépendance soit définie dansMETA-INF/MANIFEST.MF
pour trouver les classes de JBoss Negotiation.Exemple 13.4. Définir la dépendance dans
META-INF/MANIFEST.MF
Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiation
13.1.3. Configurer JBoss Negociation sur un domaine Microsoft Windows.
{hostname}
, {realm}
, le domaine {domain}
et le serveur hébergeant l'instance de JBoss EAP est dénommé {machine_name}
.
Procédure 13.2. Configurer JBoss Negociation sur un domaine Microsoft Windows.
Supprimer les mappages principaux du service existant
Dans un réseau Microsoft Windows, certains mappages sont créés automatiquement. Supprimez les mappages créés automatiquement pour mapper l'identité du serveur avec le service principal pour que la négociation se déroule correctement. Le mappage permet au navigateur web de l'ordinateur client de faire confiance au serveur et d'essayer SPNEGO. L'ordinateur client vérifie avec le contrôleur de domaine un mappage de la formeHTTP {hostname}
Voici les étapes nécessaires pour supprimer les mappages existants :- Listez les mappages enregistrés dans le domaine de l'ordinateur qui utilise la commande
setspn -L {machine_name}
. - Supprimez les mappages existants par les commandes,
setspn -D HTTP/{hostname} {machine_name}
etsetspn -D host/{hostname} {machine_name}
.
- Créez un compte d'utilisateur hôte.
Note
Veillez à ce que le nom d'utilisateur hôte soit différent de{machine_name}
.Dans le reste de la section, le nom d'utilisateur hôte est{user_name}
. Définir le mappage entre
{user_name}
et{hostname}
.- Exécutez la commande suivante pour configurer le mappage pricipal du service,
ktpass -princ HTTP/{hostname}@{realm} -pass * -mapuser {domain}\{user_name}
. - Saisir le mot de passe du nom d'utilisateur quand vous y serez invité.
Note
Réinitialisez le mot de passe de l'utilisateur comme prérequis d'exportation du keytab. - Vérifiez le mappage en exécutant la commande suivante,
setspn -L {user_name}
Exportez le keytab de l'utilisateur dans le serveur sur lequel EAP est installé.
Exécutez la commande suivante pour exporter le keytab,ktab -k service.keytab -a HTTP/{hostname}@{realm}
.Note
Cette commande exporte le ticket duHTTP/{hostname} principal dans le fichier keytabservice.keytab
, qui est utilisé pour configurer le domaine de sécurité hôte sur JBoss.- Définir le principal dans le domaine de sécurité comme suit :
<module-option name="principal">HTTP/{hostname}@{realm}</module-option>
13.1.4. Authentifiction Kerberos pour IDP PicketLink
Procédure 13.3. Installez JBoss EAP 6 et configurer Kerberos
- Télécharger et installer JBoss EAP 6. Voir les instructions dans Installation Guide.
- Que vous utilisiez Oracle Java ou IBM Java, utilisez JCE illimité. Sans JCE illimité, le serveur JBoss ne peut pas négocier sur un type de mécanisme SPNEGO qui convient (en utilisant 1.3.6.1.5.2.5, qui est
GSS_IAKERB_MECHANISM
). - Utilisez l'exemple ci-dessous pour configurer JBoss à utiliser la version Java qui vous convienne.
export JAVA_HOME=JDK/JRE_directory
Procédure 13.4. Tester votre installation Kerberos avec le JBoss Negotiation Toolkit
- Utiliser le JBoss Negotiation Toolkit se trouvant Github
- Modifier les fichiers de configuration et utiliser la commande
mvn clean install
pour créer le projet. - Copier le fichier
jboss-negotiation-toolkit/target/jboss-negotiation-toolkit.war
dans$JBOSS_HOME/standalone/deployments/
. - Vérifier que les trois sections passent par le JBoss Negotiation Toolkit
Procédure 13.5. Configurer PicketLink IDP
idp.war
L'exemple fourni utilise les archives idp.war
et employee.war
, qui se trouvent dans le référentiel PicketLink Quickstarts. Modifier les fichiers dans idp.war
comme décrit ci-dessous.
- Ajouter le module
org.jboss.security.negotiation
à$JBOSS_HOME/standalone/deployments/idp.war/META-INF/jboss-deployment-structure.xml
car IDP utilise le module JBoss Negotiation.<jboss-deployment-structure> <deployment> <!-- Add picketlink module dependency --> <dependencies> <module name="org.picketlink" /> <module name="org.jboss.security.negotiation" /> </dependencies> </deployment> </jboss-deployment-structure>
- Ajouter une valve supplémentaire
org.jboss.security.negotiation.NegotiationAuthenticator
à SPNEGO pour$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/jboss-web.xml
. - Modifier
security-domain
deidp
versSPNEGO
dans$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/jboss-web.xml
comme suit :<jboss-web> <security-domain>SPNEGO</security-domain> <context-root>idp</context-root> <valve> <class-name>org.picketlink.identity.federation.bindings.tomcat.idp.IDPWebBrowserSSOValve</class-name> <param> <param-name>passUserPrincipalToAttributeManager</param-name> <param-value>true</param-value> </param> </valve> <valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve> </jboss-web>
- Ajouter et modifier le security-role ajouté à votre principal par l'installatiion du serveur Kerberos en
$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/web.xml
. - Modifier le fichier
$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/picketlink.xml
comme suit :<PicketLink xmlns="urn:picketlink:identity-federation:config:2.1"> <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1"> <IdentityURL>${idp.url::http://localhost:8080/idp/}</IdentityURL> <Trust> <Domains>redhat.com,localhost,amazonaws.com</Domains> </Trust> </PicketLinkIDP> <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1"> <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2IssuerTrustHandler" /> <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" /> <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" /> <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" /> </Handlers> <!-- The configuration bellow defines a token timeout and a clock skew. Both configurations will be used during the SAML Assertion creation. This configuration is optional. It is defined only to show you how to set the token timeout and clock skew configuration. --> <PicketLinkSTS xmlns="urn:picketlink:identity-federation:config:1.0" TokenTimeout="5000" ClockSkew="0"> <TokenProviders> <TokenProvider ProviderClass="org.picketlink.identity.federation.core.saml.v1.providers.SAML11AssertionTokenProvider" TokenType="urn:oasis:names:tc:SAML:1.0:assertion" TokenElement="Assertion" TokenElementNS="urn:oasis:names:tc:SAML:1.0:assertion" /> <TokenProvider ProviderClass="org.picketlink.identity.federation.core.saml.v2.providers.SAML20AssertionTokenProvider" TokenType="urn:oasis:names:tc:SAML:2.0:assertion" TokenElement="Assertion" TokenElementNS="urn:oasis:names:tc:SAML:2.0:assertion" /> </TokenProviders> </PicketLinkSTS> </PicketLink>
- Modifier
IdentityURL
pour qu'il corresponde au nom d'hôte du serveur sur lequel vous exécutez IDP. - Modifier
Trust
pour qu'il contienne les noms de domaine autorisés par le fournisseur d'identité. - Modifiez le
employee.war
. Ajoutez et modifiez le security-role ajouté à votre principal par l'installatiion du serveur Kerberos en$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/web.xml
. - Modifiez la configuration
security domain
dans le fichier$JBOSS_HOME/standalone/configuration/standalone.xml
. La configuration de mappage des rôles est la même que celle qui existe dans les configurations de domaine de sécurité.<security-domain name="host" cache-type="default"> <authentication> <login-module code="Kerberos" flag="required"> <module-option name="principal" value="HTTP/something.com@yourdomain.COM"/> <module-option name="storeKey" value="true"/> <module-option name="useKeyTab" value="true"/> <module-option name="doNotPrompt" value="true"/> <module-option name="keyTab" value="/root/keytab"/> </login-module> </authentication> </security-domain> <security-domain name="SPNEGO" cache-type="default"> <authentication> <login-module code="SPNEGO" flag="required"> <module-option name="serverSecurityDomain" value="host"/> </login-module> </authentication> </security-domain> <security-domain name="sp" cache-type="default"> <authentication> <login-module code="org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule" flag="required" /> </authentication> </security-domain>
Note
jboss.security.disable.secdomain.option
à true
. Voir Section 13.2.2, « Configurer l'authentification dans un domaine de sécurité » pour obtenir des détails supplémentaires. Mettre le module de connexion à jour ainsi :
<login-module code="Kerberos" flag="required"> <module-option name="principal" value="HTTP/something.com@yourdomain.COM"/> <module-option name="credsType" value="acceptor"/> <module-option name="useKeytab" value="file:///root/keytab"/> </login-module>
Procédure 13.6. Vérifiez la configuration d'authentification Kerberos dans PicketLink IDP
- Démarrez le serveur JBoss EAP par la commande
$JBOSS_HOME/bin/standalone.sh
. - Configurez votre navigateur, comme Firefox, pour qu'il utilise Kerberos. Suivre les instructions fournies ici : https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/sso-config-firefox.html
- Vérifiez de pouvoir accéder à
http://YOUR_DOMAIN:8080/employee
à partir de Firefox configuré comme mentionné ci-dessus.
13.1.5. Se connecter par un certificat avec PicketLink IDP
Vous pouvez configurer IDP PicketLink pour prendre en charge SSL. La procédure suivante est un exemple qui montre comment configurer une application web en tant qu'IDP supportant l'authentification client SSL. Il y a deux façons de configurer l'IDP pour authentifier les utilisateurs :
- Si SSL est utilisé, le serveur demandera au client un certificat et utilisera ce certificat pour authentifier l'utilisateur.
- Si aucun certificat n'est fourni par le client, une authentification basée formulaire sera effectuée.
13.1.5.1. Configuration SSL JBoss EAP 6.3
Procédure 13.7. Créez le certificat, le keystore et le truststore pour votre serveur.
Créez un certificat pour votre serveur.
Utilisez la commande suivante pour créer un certificat pour votre serveur :keytool -genkey -alias server -keyalg RSA -keystore server.keystore -storepass change_it -validity 365
Le système vous demande des informations supplémentaires. Vous devez fournir les valeurs selon les besoins. Le nom CN du certificat doit être le même que le nom de votre serveur DNS. Par exemple, dans le cas de localhost, vous pouvez utiliser la commande suivante :keytool -genkey -alias server -keystore server.keystore -storepass change_it -keypass password -dname "CN=localhost,OU=QE,O=example.com,L=Brno,C=CZ"
Créez un certificat de client
Vous utiliserez ce certificat de client pour vous authentifier auprès du serveur quand vous accéderez à une ressource via SSL.keytool -genkey -alias client -keystore client.keystore -storepass change_it -validity 365 -keyalg RSA -keysize 2048 -storetype pkcs12
Créez le truststore
Exportez le certificat du client et créer un truststore en important ce certificat :keytool -exportcert -keystore client.keystore -storetype pkcs12 -storepass change_it -alias client -keypass change_it -file client.keystore keytool -import -file client.keystore -alias client -keystore client.truststore
Modifiez l'installation du serveur JBoss EAP 6.3 pour activer SSL
Ajoutez le connecteur suivant au sous-système web pour activer SSL :<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true"> <ssl name="localhost-ssl" key-alias="server" password="change_it" certificate-key-file="${jboss.server.config.dir}/server.keystore" protocol="TLSv1" verify-client="want" ca-certificate-file="${jboss.server.config.dir}/client.truststore"/> </connector>
Relancez le serveur
Redémarrez le serveur et vérifiez qu'il répond sur : https://localhost:8443Acceptation du certificat
On vous invitera à approuver le certificat du serveur.
Avant d'accéder à l'application, vous devez importer le client.keystore
dans votre navigateur. Ce fichier contient le certificat client. Quand vous accédez à l'application, le navigateur vous invite à sélectionner le certificat dont vous avez besoin pour vous authentifier auprès du serveur. Sélectionnez le certificat désiré.
Ajoutez le domaine de sécurité à votre installation de serveur. Si vous êtes en mode autonome, vous devrez l'ajouter au JBOSS_HOME/standalone/configuration/standalone.xml
:
<security-domain name="idp" cache-type="default"> <authentication> <login-module code="CertificateRoles" flag="optional"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="securityDomain" value="idp"/> <module-option name="verifier" value="org.jboss.security.auth.certs.AnyCertVerifier"/> </login-module> <login-module code="org.picketlink.identity.federation.bindings.jboss.auth.RegExUserNameLoginModule" flag="optional"> <module-option name="regex" value="CN=(.*?),"/> </login-module> <login-module code="UsersRoles" flag="required"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="usersProperties" value="users.properties"/> <module-option name="rolesProperties" value="roles.properties"/> </login-module> </authentication> <jsse keystore-password="change_it" keystore-url="${jboss.server.config.dir}" truststore-password="change_it" truststore-url="${jboss.server.config.dir}" client-auth="true"/> </security-domain>L'exemple de configuration ci-dessus validifie tout certificat déjà fourni. Si aucun certificat n'est produit ou si l'authentification vient à échouer, la procédure revient à nouveau à l'authentification basée utilisateur/mot de passe.
Le module de connexion de nom d'utilisation d'expression régulière peut être utilisé à la suite des modules de connexion de certificats pour extraire un nom d'utilisateur, un UID ou un autre champ du nom de principal pour que les rôles puissent être obtenus à partir de LDAP. Le module contient une option nommée regex
qui spécifie l'expression régulière à appliquer au nom du principal. Le résultat est passé au module de connexion suivant.
UID=007, EMAILADDRESS=something@something, CN=James Bond, O=SpyAgency
aura pour résultat UID=007
.
Exemple 13.5. Exemple de module de connexion de nom d'utilisation d'expression régulière
<login-module code="org.picketlink.identity.federation.bindings.jboss.auth.RegExUserNameLoginModule" flag="required"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="regex" value="UID=(.*?),"/> </login-module>
java.util.regex.Pattern
à l'adresse suivante http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html.