17.3. Java Authentication and Authorization Service (JAAS)
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
.
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
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
.
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 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.
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.
Figure 17.1. Étapes d'une invocation de méthode EJB sécurisée
- 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 configurationother
côté client utilise le module de connexionClientLoginModule
. 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. - 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. - Sur le serveur, l'intercepteur de sécurité authentifie l'utilisateur qui a invoqué la méthode. Cela nécessite une autre connexion JAAS.
- 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 estjwdomain
. 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 typeorg.jboss.security.SimplePrincipal
représentent les noms de rôles. Ces rôles valident l'accès aux méthodes EJB suivant les contraintes deejb-jar.xml
et de l'implémentation de la méthodeEJBContext.isCallerInRole(String)
. - Un
java.security.acl.Group
optionnel nomméCallerPrincipal
, contenant un seulorg.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éthodeEJBContext.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.
- 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 groupeSubject 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.