17.3. Java Authentication and Authorization Service (JAAS)

L'architecture de sécurité de JBoss EAP 6 comprend le sous-système de configuration de sécurité, des configurations de sécurité propres aux applications qui sont incluses dans plusieurs fichiers de configuration de l'application et le gestionnaire de sécurité JAAS, qui est implémenté comme un MBean.
Domaine, Groupe serveur et Configuration spécifique au serveur

Les groupes de serveurs (dans un domaine géré) et les serveurs (dans un serveur autonome) comprennent la configuration des domaines de la sécurité. Un domaine de sécurité comprend des informations sur une combinaison d'authentification, autorisation, mapping et modules, avec détails de configuration. Une application spécifie quel domaine de sécurité est exigé, par son nom, dans son fichier jboss-web.xml.

Configuration spécifique à une application

Une configuration spécifique à une application a lieu dans un ou plusieurs fichiers.

Tableau 17.1. Fichiers de configuration spécifique à une application

Fichier Description
ejb-jar.xml
Le descripteur de déploiement pour une application Enterprise JavaBeans (EJB), situé dans le répertoire META-INF de l'EJB. Utiliser le fichier ejb-jar.xml pour préciser les rôles et les mapper aux principaux, au niveau de l'application. Vous pouvez également limiter certaines méthodes et classes spécifiques à certains rôles. Également utilisé pour les autres configurations EJB spécifiques non liées à la sécurité.
web.xml
Le descripteur de déploiement pour une application web en Java Enterprise Edition (EE). Utilisez le fichier web.xml pour déclarer le domaine de sécurité que l'application utilise pour l'authentification et l'autorisation, ainsi que les contraintes de transport et ressources, comme limiter les types de demandes HTTP autorisées. Vous pouvez également configurer l'authentification basée-web dans ce fichier. Utilisé également pour d'autre configurations spécifiques à l'application non liées à la sécurité.
jboss-ejb3.xml
Contient des extensions au descripteur ejb-jar.xml spécifiques à JBoss.
jboss-web.xml
Contient des extensions au descripteur web.xml spécifiques à JBoss.

Note

Les fichiers ejb-jar.xml et web.xml sont définis dans la spécification Java Enterprise Edition (Java EE). Le fichier jboss-ejb3.xml fournit des extensions spécifiques à JBoss pour le fichier ejb-jar.xml, et le fichier jboss-web.xml fournit des extensions spécifiques à JBoss pour le fichier web.xml.
JAAS Security Manager MBean

Java Authentication and Authorization Service (JAAS) est un cadre de sécurité au niveau utilisateur pour les applications Java, utilisant des modules d'authentification enfichables (PAM). Il est intégré dans le Java Runtime Environment (JRE). Dans JBoss EAP 6, le composant côté conteneur est le MBean org.jboss.security.plugins.JaasSecurityManager. Il fournit les implémentations par défaut des interfaces AuthenticationManager et RealmMapping.

JaasSecurityManager MBean s'intègre dans EJB et dans les couches de conteneur web basées sur le domaine de sécurité spécifié dans EJB ou dans les fichiers de descripteur de déploiement de l'application. Lorsqu'une application se déploie, le conteneur associe le domaine de sécurité spécifié dans le descripteur de déploiement avec l'instance de gestionnaire de sécurité du conteneur. Le gestionnaire de sécurité applique la configuration du domaine de sécurité telle qu'elle est configurée sur le serveur de groupe ou autonome.
Flux des interactions entre le Client et le Conteneur dans JAAS

JaasSecurityManager utilise les packages JAAS pour implémenter le comportement d'interface AuthenticationManager et RealmMapping. En particulier, son comportement découle de l'exécution des instances de modules de connexion qui sont configurées dans le domaine de sécurité assigné au JaasSecurityManager. Les modules de connexion implémentent l'authentification principale du domaine de sécurité et le comportement de mappage de rôle. Vous pouvez utiliser le JaasSecurityManager à travers tous les domaines de la sécurité en assignant des configurations de modules de connexion différentes pour les domaines.

Pour montrer comment le JaasSecurityManager utilise le processus d'authentification JAAS, les étapes suivantes vont indiquer une méthode d'invocation du client qui implémente la méthode EJBHome. L'EJB a déjà été déployé dans le serveur et ses méthodes d'interface EJBHome ont déjà été sécurisées par les éléments <method-permission> qui se trouvent dans le descripteur ejb-jar.xml. Utilise le domaine de sécurité jwdomain, qui est indiqué dans l'élément <security-domain> du fichier jboss-ejb3.xml. L'image ci-dessous indique les étapes qui seront expliquées par la suite.
Étapes d'authentification d'un EJB

Figure 17.1. Étapes d'une invocation de méthode EJB sécurisée

  1. Le client effectue une connexion JAAS pour établir le principal et les informations d'identification pour l'authentification. Correspond à Client Side Login dans le schéma. Peut être exécuté via JNDI.
    Pour effectuer une connexion JAAS, vous devez créer une instance de LoginContext et y indiquer le nom de la configuration à utiliser. Ici, le nom de configuration est other. Cette connexion unique associe la connexion principale et les informations d'identification à toutes les invocations de méthode EJB. Le processus n'authentifie pas forcément l'utilisateur. La nature de la connexion côté client dépend de la configuration du module de connexion que le client utilise. Dans cet exemple, l'entrée de configuration other côté client utilise le module de connexion ClientLoginModule. Ce module lie le nom d'utilisateur et le mot de passe à la couche d'invocation EJB pour une authentification ultérieure sur le serveur. L'identité du client n'est pas authentifiée sur le client.
  2. Le client obtient la méthode EJBHome et l'invoque sur le serveur. L'invocation inclut les arguments de la méthode adoptée par le client, ainsi que l'identité de l'utilisateur et les informations d'identification de la connexion JAAS de côté client.
  3. Sur le serveur, l'intercepteur de sécurité authentifie l'utilisateur qui a invoqué la méthode. Cela nécessite une autre connexion JAAS.
  4. Le domaine de sécurité ci-dessous détermine le choix des modules de connexion. Le nom du domaine de sécurité est passé au constructeur LoginContext en tant que nom de configuration de la connexion. Le domaine de sécurité des EJB est jwdomain. Si l'authentification JAAS est réussie, un sujet JAAS sera créé. Un sujet JAAS comprend un PrincipalSet avec les détails suivants :
    • Une instance java.security.Principal qui correspond à l'identité du client en provenance de l'environnement de sécurité du déploiement.
    • Un groupe java.security.acl.Group appelé Roles, qui contient les noms de rôles du domaine d'application de l'utilisateur. Les objets de type org.jboss.security.SimplePrincipal représentent les noms de rôles. Ces rôles valident l'accès aux méthodes EJB suivant les contraintes de ejb-jar.xml et de l'implémentation de la méthode EJBContext.isCallerInRole(String).
    • Un java.security.acl.Group optionnel nommé CallerPrincipal, contenant un seul org.jboss.security.SimplePrincipal qui correspond à l'identité de l'appelant du domaine de l'application. Le membre du groupe CallerPrincipal correspond à la valeur renvoyée par la méthode EJBContext.getCallerPrincipal(). Ce mappage permet au Principal de l'environnement de sécurité professionnel de se mapper à un Principal connu de l'application. En l'absence d'un mappage CallerPrincipal, le principal opérationnel est le même que le principal du domaine d'application.
  5. Le serveur vérifie que l'utilisateur qui appelle la méthode EJB a la permission de le faire. Cette autorisation requiert les étapes suivantes :
    • Obtenir les noms des rôles autorisés à accéder à la méthode EJB à partir du conteneur EJB. Les noms de rôles sont déterminés par les éléments <role-name> de tous les éléments <method-permission> du descripteur ejb-jar.xml qui contiennent la méthode invoquée.
    • Si aucun des rôles n'a été attribué, ou si la méthode est spécifiée dans un élément de la liste d'exclusion, l'accès à la méthode sera refusé. Sinon, la méthode doesUserHaveRole sera appelée dans le gestionnaire de sécurité par l'intercepteur de sécurité pour vérifier si l'appelant possède l'un des noms de rôles assignés. Cette méthode effectue une itération dans les noms de rôles et vérifie si le groupe Subject Roles de l'utilisateur authentifié contient un SimplePrincipal avec le nom de rôle assigné. L'accès est autorisé si un nom de rôle est membre du groupe Rôles. L'accès est refusé si aucun des noms de rôles n'est membre.
    • Si l'EJB utilise un proxy de sécurité personnalisé, l'invocation de méthode sera déléguée au proxy. Si le proxy de sécurité refuse l'accès à l'appelant, elle lève une exception java.lang.SecurityException. Sinon, l'accès à la méthode EJB sera autorisé et l'invocation de méthode passera au prochain intercepteur de conteneur. Le SecurityProxyInterceptor s'occupe de ce contrôle et cet intercepteur n'est pas affiché.
    • Pour les demandes de connexion web, le serveur web vérifie les contraintes de sécurité définies dans web.xml qui correspondent à la ressource demandée et à la méthode HTTP à laquelle on a accédé.
      S'il existe une contrainte pour la demande, le serveur web appelle le JaasSecurityManager pour effectuer l'authentification du principal, qui assure à son tour veille à ce que les rôles d'utilisateur soient associés à cet objet principal.