Programmation de la sécurité locale

WebSphere eXtreme Scale fournit plusieurs points de contact de sécurité permettant d'intégrer les mécanismes personnalisés. Dans le modèle de programmation local, la principale fonction de sécurité est l'autorisation, qui n'est associée à aucune prise en charge de l'authentification. Vous devez vous authentifier en dehors de WebSphere Application Server. Toutefois, des plug-in permettant d'obtenir et de valider des objets Subject sont fournis.

Authentification

Dans le modèle de programmation local, eXtreme Scale ne fournit aucun mécanisme d'authentification mais repose sur l'environnement, serveurs d'applications ou applications, pour l'authentification. Lors de l'utilisation d'eXtreme Scale dans WebSphere Application Server ou WebSphere Extended Deployment, les applications peuvent utiliser le mécanisme d'authentification de sécurité WebSphere Application Server. Lors de l'exécution d'eXtreme Scale dans un environnement Java 2 Platform, Standard Edition (J2SE), l'application doit gérer les authentifications à l'aide de l'authentification JAAS (Java Authentication and Authorization Service) ou d'autres mécanismes d'authentification. Pour plus d'informations sur l'utilisation de l'authentification JAAS, reportez-vous auguide de référence JAAS. Le contrat entre une application et une instance ObjectGrid est l'objet javax.security.auth.Subject. Après l'authentification du client par le serveur d'applications ou l'application, cette dernière peut extraire l'objet javax.security.auth.Subject authentifié et utiliser cet objet Subject pour obtenir une session de l'instance ObjectGrid en appelant la méthode ObjectGrid.getSession(Subject). Cet objet Subject est utilisé pour autoriser l'accès aux données de mappe. Ce contrat est appelé mécanisme de passage du sujet. L'exemple ci-dessous illustre l'API ObjectGrid.getSession(Subject).

/**
 * Cette API permet au cache d'utiliser un sujet spécifique et non celui
 * configuré sur l'ObjectGrid pour obtenir une session.
 * @param subject
 * @return An instance of Session
 * @throws ObjectGridException
 * @throws TransactionCallbackException
 * @throws InvalidSubjectException the subject passed in is not valid based
 * on the SubjectValidation mechanism.
 */
public Session getSession(Subject subject)
throws ObjectGridException, TransactionCallbackException, InvalidSubjectException;

La méthode ObjectGrid.getSession() de l'interface ObjectGrid peut également être utilisée pour obtenir un objet Session :

/**
 * Cette méthode renvoie un objet Session utilisable par une seule unité d'exécution à la fois.
 * Vous ne pouvez pas partager cet objet Session entre des unités d'exécution sans l'entourer d'une
 * section critique. Alors que l'infrastructure principale permet à l'objet de se déplacer entre les
 * unités d'exécution, TransactionCallback et Loader peuvent entraver cette utilisation,
 * notamment dans les environnements J2EEs. Lorsque la sécurité est activée, cette méthode utilise
 * SubjectSource pour obtenir l'objet Subject.
 *
 * Si la méthode initialize n'est pas appelée avant la première
 * invocation getSession, une initialisation implicite a lieu.  Cette
 * initialisation fait en sorte que toute la configuration soit terminée avant
 * que l'utilisation de l'exécution soit requise.
 *
 * @see #initialize()
 * @return An instance of Session
 * @throws ObjectGridException
 * @throws TransactionCallbackException
 * @throws IllegalStateException if this method is called after the
 *         destroy() method is called.
 */
public Session getSession()
throws ObjectGridException, TransactionCallbackException;
Comme le spécifie la documentation d'API, lorsque la sécurité est activée, cette méthode utilise le plug-in SubjectSource pour obtenir un objet Subject. Le plug-in SubjectSource est l'un des plug-in de sécurité définis dans eXtreme Scale pour prendre en charge la propagation des objets Subject. Pour plus d'informations, consultez les plug-in de sécurité. La méthode getSession(Subject) peut être appelée sur l'instance ObjectGrid locale uniquement. Si vous appelez la méthode getSession(Subject) côté client dans une configuration répartie eXtreme Scale, une exception IllegalStateException est émise.

Plug-in de sécurité

WebSphere eXtreme Scale fournit deux plug-in de sécurité liés au mécanisme de passage de sujet : les plug-in SubjectSource et SubjectValidation.

Plug-in SubjectSource

Le plug-in SubjectSource représenté par l'interface com.ibm.websphere.objectgrid.security.plugins.SubjectSource est un plug-in utilisé pour obtenir un objet Subject d'un environnement d'exécution eXtreme Scale. Cet environnement peut être une application utilisant l'ObjectGrid ou un serveur d'applications qui héberge l'application. Pensez à utiliser le plug-in SubjectSource comme alternative au mécanisme de passage du sujet. A l'aide du mécanisme de passage du sujet, l'application extrait l'objet et l'utilise pour obtenir l'objet de session ObjectGrid. Avec le plug-in SubjectSource, l'exécution eXtreme Scale extrait l'objet Subject et l'utilise pour obtenir l'objet de session. Le mécanisme de passage du sujet donne le contrôle des objets Subject aux applications alors que le mécanisme de plug-in SubjectSource décharge les applications de l'extraction de l'objet Subject. Vous pouvez utiliser le plug-in SubjectSource pour obtenir un objet Subject représentant un client eXtreme Scale utilisé pour l'autorisation. Lorsque la méthode ObjectGrid.getSession est appelée, le sujet getSubject émet une exception ObjectGridSecurityException si la sécurité est activée. WebSphere eXtreme Scale offre une implémentation par défaut de ce plug-in : com.ibm.websphere.objectgrid.security.plugins.builtins.WSSubjectSourceImpl. Cette implémentation peut être utilisée pour extraire un sujet caller ou un sujet RunAs à partir de l'unité d'exécution lorsqu'une application est exécutée dans WebSphere Application Server. Vous pouvez configurer cette classe dans le fichier XML du descripteur d'ObjectGrid comme la classe d'implémentation SubjectSource lors de l'utilisation d'eXtreme Scale dans WebSphere Application Server. Le fragment de code suivant illustre le flux principal de la méthodeWSSubjectSourceImpl.getSubject.

Subject s = null;
try {
  if (finalType == RUN_AS_SUBJECT) {
    // get the RunAs subject
    s = com.ibm.websphere.security.auth.WSSubject.getRunAsSubject();
  }
  else if (finalType == CALLER_SUBJECT) {
    // obtenez le callersubject
    s = com.ibm.websphere.security.auth.WSSubject.getCallerSubject();
  }
}
catch (WSSecurityException wse) {
  throw new ObjectGridSecurityException(wse);
}

return s;
Pour plus de détails, reportez-vous à la documentation d'API sur le plug-in SubjectSource et l'implémentation WSSubjectSourceImpl.

Plug-in SubjectValidation

Le plug-in SubjectValidation, représenté par l'interface com.ibm.websphere.objectgrid.security.plugins.SubjectValidation, est un autre plug-in de sécurité. Ce plug-in permet de valider qu'un javax.security.auth.Subject qui est transmis à l'ObjectGrid ou extrait par le plug-in SubjectSource est un Subject valide qui n'a pas été falsifié.

La méthode SubjectValidation.validateSubject(Subject) de l'interface SubjectValidation prend un objet Subject et renvoie un objet Subject. Vos implémentations déterminent si un objet Subject est considéré comme valide ou quel objet Subject est renvoyé. Si l'objet Subject n'est pas valide, une exception InvalidSubjectException est émise.

Vous pouvez utiliser ce plug-in si vous ne faites pas confiance à l'objet Subject transmis à cette méthode. Ce cas est rare si l'on considère que vous faites confiance aux développeurs d'applications qui s'occupent du code permettant d'extraire l'objet Subject.

Une implémentation de ce plug-in nécessite l'assistance du créateur d'objets Subject, car le créateur est le seul à savoir si l'objet Subject a été ou non falsifié. Mais il peut arriver qu'un créateur de Subject n'ait pas les moyens de savoir si le Subject a été falsifié. Dans ce cas, ce plug-in n'est pas utile.

WebSphere eXtreme Scale fournit une implémentation par défaut de SubjectValidation: com.ibm.websphere.objectgrid.security.plugins.builtins.WSSubjectValidationImpl. Vous pouvez utiliser cette implémentation pour valider le sujet WebSphere Application authentifié par le serveur. Vous pouvez configurer cette classe comme la classe d'implémentation SubjectValidation lors de l'utilisation d'eXtreme Scale dans WebSphere Application Server. L'implémentation WSSubjectValidationImpl considère qu'un objet Subject est valide uniquement si le jeton d'informations d'identification associé à ce sujet n'a pas été falsifié. Vous pouvez modifier d'autres parties de l'objet Subject. L'implémentation WSSubjectValidationImpl demande à WebSphere Application Server le sujet d'origine correspondant au jeton d'informations d'identification et renvoie l'objet Subject d'origine comme objet Subject validé. Par conséquent, les modifications apportées au contenu Subject autre que le jeton d'informations d'identification ne prennent pas effet. Le fragment de code suivant illustre le flux de base de la méthode WSSubjectValidationImpl.validateSubject(Subject).

// Créez un LoginContext avec un schéma WSLogin et
// transmettez un gestionnaire d'appel.
LoginContext lc = new LoginContext("WSLogin",
new WSCredTokenCallbackHandlerImpl(subject));

// Lorsque cette méthode est appelée, les méthodes du gestionnaire d'appel
// sont appelées pour établir la connexion de l'utilisateur.
lc.login();

// Obtenez le sujet du LoginContext
return lc.getSubject();
Dans le fragment de code précédent, un objet de gestionnaire d'appel de jeton d'informations d'identification, WSCredTokenCallbackHandlerImpl, est créé avec l'objet Subject à valider. Un objet LoginContext est ensuite créé avec le schéma de connexion WSLogin. Lorsque la méthode lc.login est appelée, la sécuritéWebSphere Application Server extrait le jeton d'informations d'identification de l'objet Subject, puis renvoie l'objet Subject correspondant en tant qu'objet Subject validé.

Pour plus de détails, reportez-vous aux API Java de l'implémentation SubjectValidation et WSSubjectValidationImpl.

Configuration du plug-in

Vous pouvez configurer le plug-in SubjectValidation et le plug-in SubjectSource de deux façons :

  • Configuration XMLVous pouvez utiliser le fichier XML ObjectGrid pour définir une ObjectGrid et définir ces deux plug-in. Voici un exemple dans lequel la classe WSSubjectSourceImpl est configurée comme plug-in SubjectSource et la classe WSSubjectValidation est configurée comme plug-in SubjectValidation.
    <objectGrids>
    	<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
    		authorizationMechanism="AUTHORIZATION_MECHANISM_JAAS">
            <bean id="SubjectSource"
    className="com.ibm.websphere.objectgrid.security.plugins.builtins.
    	WSSubjectSourceImpl" />
    			 <bean id="SubjectValidation"
     className="com.ibm.websphere.objectgrid.security.plugins.builtins.
    	WSSubjectValidationImpl" />
    			 <bean id="TransactionCallback"
    className="com.ibm.websphere.samples.objectgrid.
    	HeapTransactionCallback" />
    ...
    </objectGrids>
  • Programmation Si vous souhaitez créer une ObjectGrid à l'aide d'une API, vous pouvez appeler la méthode suivante pour définir le plug-in SubjectSource ou SubjectValidation.
    **
    * Définissez le plug-in SubjectValidation pour cette instance ObjectGrid. Un
    * plug-in SubjectValidation peut être utilisé pour valider l'objet Subject
    * transmis en tant que sujet valide. Reportez-vous à {@link SubjectValidation}
    * pour plus d'informations.
    * @param subjectValidation the SubjectValidation plug-in
    */
    void setSubjectValidation(SubjectValidation subjectValidation);
    
    
    /**
    * Définissez le plug-in SubjectSource. Un plug-in SubjectSource peut être utilisé
    * pour obtenir un objet Subject de l'environnement pour représenter le
    * client ObjectGrid.
    *
    * @param source the SubjectSource plug-in
    */
    void setSubjectSource(SubjectSource source);

Ecriture du code d'authentification JAAS

Vous pouvez écrire votre propre code d'authentification JASS (Java Authentication and Authorization Service) pour gérer l'authentification. Vous devez écrire vos modules de connexion et les configurer pour le module d'authentification.

Le module de connexion reçoit des informations sur un utilisateur et authentifie ce dernier. Il peut s'agir de n'importe quelles informations identifiant l'utilisateur. Par exemple, ces informations peuvent être un ID utilisateur et un mot de passe, un certificat client, etc. Après avoir reçu les informations, le module de connexion vérifie que les informations représentent un sujet valide et crée ensuite un objet Subject. Plusieurs implémentations de modules de connexion sont disponible au public actuellement.

Après avoir écrit un module de connexion, configurez-le pour l'exécution à utiliser. Vous devez configurer un module de connexion JAAS. Ce module de connexion contient le module de connexion et son schéma d'authentification. For exemple :
FileLogin
{
    com.acme.auth.FileLoginModule required
};

Le schéma d'authentification est FileLogin et le module de connexion est com.acme.auth.FileLoginModule. Le jeton requis indique que le module FileLoginModule doit valider cette connexion faute de quoi le schéma échouera.

Le fichier de configuration du module de connexion JAAS peut être défini de l'une des façons suivantes :

  • Définissez le fichier de configuration du module de connexion JAAS dans la propriété login.config.url du fichier java.security, par exemple :
    login.config.url.1=file:${java.home}/lib/security/file.login
  • Définissez le fichier de configuration du module de connexion JAAS à partir de la ligne de commande à l'aide des arguments -Djava.security.auth.login.config de la machine virtuelle Java, par exemple, -Djava.security.auth.login.config ==$JAVA_HOME/lib/security/file.login
Pour plus d'informations, voir Tutoriel sur la sécurité Java SE - Etape 2.Pour plus d'informations, voir Tutoriel sur la sécurité Java SE - Etape 2.

Si votre code est exécuté dans WebSphere Application Server, vous devez configurer la connexion JAAS dans la console d'administration et stocker cette configuration de connexion dans la configuration du serveur d'applications. Pour plus d'informations, reportez-vous à la rubrique relative à la configuration de connexion pour JAAS (Java Authentication and Authorization Service).