Lokale Programmierung der Sicherheit

WebSphere eXtreme Scale stellt mehrere Sicherheitsendpunkte für die Integration angepasster Mechanismen bereit. Im lokalen Programmiermodell ist die Hauptsicherheitsfunktion Berechtigung. Authentifizierung wird nicht unterstützt. Sie müssen die Authentifizierung außerhalb von WebSphere Application Server durchführen. Es werden jedoch Plug-ins für das Anfordern und Validieren von Subject-Objekten bereitgestellt.

Authentifizierung

Im lokalen Programmiermodell stellt eXtreme Scale kein Authentifizierungsverfahren bereit, sondern stützt sich bei der Authentifizierung auf die Umgebung, d. h. Anwendungsserver oder Anwendungen. Wenn eXtreme Scale in WebSphere Application Server oder WebSphere Extended Deployment verwendet wird, können Anwendungen das Sicherheitsauthentifizierungsverfahren von WebSphere Application Server verwenden. Wenn eXtreme Scale in einer J2SE-Umgebung (Java 2 Platform, Standard Edition) ausgeführt wird, muss die Anwendung die Authentifizierung mit JAAS-Authentifizierung (Java Authentication and Authorization Service) oder anderen Authentifizierungsverfahren verwalten. Weitere Informationen zur Verwendung der JAAS-Authentifizierung finden Sie in der Veröffentlichung "JAAS Reference Guide". Der Vertrag zwischen einer Anwendung und einer ObjectGrid-Instanz ist das Objekt "javax.security.auth.Subject". Nachdem der Client vom Anwendungsserver oder von der Anwendung authentifiziert wurde, kann die Anwendung das authentifizierte Objekt "javax.security.auth.Subject" abrufen und dieses Subject-Objekt verwenden, um eine Sitzung von der ObjectGrid-Instanz abzurufen, indem sie die Methode "ObjectGrid.getSession(Subject)" aufruft. Dieses Subject-Objekt wird verwendet, um Zugriff auf die Map-Daten zu berechtigen. Dieser Vertrag wird als Subject-Übergabemechanismus bezeichnet. Das folgende Beispiel veranschaulicht die API "ObjectGrid.getSession(Subject)".

/**
 * Diese API ermöglicht dem Cache die Verwendung eines bestimmten Subject-Objekts an
 * Stelle desim ObjectGrid konfigurierten Subject-Objekts für den Abruf einer Sitzung.
 * @param Subject-Objekt
 * @return Instanz des Session-Objekts
 * @throws ObjectGridException
 * @throws TransactionCallbackException
 * @throws InvalidSubjectException Das übergebene Subject-Objekt ist nach dem
 * SubjectValidation-Mechanismus nicht gültig.
 */
public Session getSession(Subject subject)
throws ObjectGridException, TransactionCallbackException, InvalidSubjectException;

Die Methode "ObjectGrid.getSession()" in der Schnittstelle "ObjectGrid" kann auch für das Abrufen eines Session-Objekts verwendet werden:

/**
 * Diese Methode gibt ein Session-Objekt zurück, das jeweils von einem einzigen Thread
 * verwendet werden kann.
 * Dieses Session-Objekt kann nicht von Threads gemeinsam genutzt werden, ohne ein kritischen
 * Abschnitt um es herum zu erstellen. Während das Basis-Framework das Verschieben des Objekts
 * zwischen Threads zulässt, können die Schnittstellen "TransactionCallback" und "Loader" diese
 * Verwendung verhindern, insbesondere in J2EE-Umgebungen. Wenn die Sicherheit aktiviert ist,
 * verwendet diese Methode SubjectSource, um ein Subject-Objekt abzurufen.
 *
 * Wenn die Methode "initialize" nicht vor dem ersten Aufruf von "getSession"
 * aufgerufen wurde, findet eine implizite Initialisierung statt. Diese
 * Initialisierung stellt sicher, dass die gesamte Konfiguration abgeschlossen
 * ist, bevor sie zur Laufzeit benötigt wird.
 *
 * @see #initialize()
 * @return Instanz des Session-Objekts
 * @throws ObjectGridException
 * @throws TransactionCallbackException
 * @throws IllegalStateException, wenn diese Methode nach dem Aufruf
 *         der Methode destroy() aufgerufen wird.
 */
public Session getSession()
throws ObjectGridException, TransactionCallbackException;
Wie in der API-Dokumentation beschrieben, verwendet diese Methode bei aktivierter Sicherheit das SubjectSource-Plug-in, um ein Subject-Objekt abzurufen. Das SubjectSource-Plug-in ist eines der Sicherheits-Plug-ins, die in eXtreme Scale für die Unterstützung der Weitergabe von Subject-Objekten definiert sind. Weitere Informationen hierzu finden Sie in der Dokumentation zu den sicherheitsrelevanten Plug-ins. Die Methode "getSession(Subject)" kann nur für die lokale ObjectGrid-Instanz aufgerufen werden. Wenn Sie die Methode "getSession(Subject)" auf Clientseite in einer verteilten eXtreme-Scale-Konfiguration aufrufen, wird eine Ausnahme des Typs "IllegalStateException" ausgelöst.

Sicherheits-Plug-ins

WebSphere eXtreme Scale stellt zwei Sicherheits-Plug-ins bereit, die sich auf den Subject-Übergabemechanismus beziehen: das SubjectSource-Plug-in und das SubjectValidation-Plug-in.

SubjectSource-Plug-in

Das SubjectSource-Plug-in, das von der Schnittstelle "com.ibm.websphere.objectgrid.security.plugins.SubjectSource" dargestellt wird, ist ein Plug-in, das verwendet wird, um ein Subject-Objekt von einer Umgebung mit eXtreme Scale abzurufen. Diese Umgebung kann eine Anwendung sein, die ObjectGrid verwendet, oder ein Anwendungsserver, in dem die Anwendung ausgeführt wird. Betrachten Sie das SubjectSource-Plug-in als Alternative zum Subject-Übergabemechanismus. Mit dem Subject-Übergabemechanismus ruft die Anwendung das Subject-Objekt ab und verwendet es, um das ObjectGrid-Session-Objekt abzurufen. Mit dem SubjectSource-Plug-in ruft die Laufzeitumgebung von eXtreme Scale das Subject-Objekt ab und verwendet es, um das Session-Objekt abzurufen. Der Subject-Übergabemechanismus übergibt die Steuerung der Subject-Objekte an die Anwendungen, wohingegen das SubjectSource-Plug-in die Anwendungen vom Abrufen des Subject-Objekts befreit. Sie können das SubjectSource-Plug-in verwenden, um ein Subject-Objekt abzurufen, das einen eXtreme-Scale-Client darstellt, der für die Berechtigung verwendet wird. Wenn die Methode "ObjectGrid.getSession" aufgerufen wird, löst die Subject-Methode "getSubject" eine Ausnahme des Typs "ObjectGridSecurityException" aus, wenn die Sicherheit aktiviert ist. WebSphere eXtreme Scale stellt eine Standardimplementierung dieses Plug-ins bereit: com.ibm.websphere.objectgrid.security.plugins.builtins.WSSubjectSourceImpl. Diese Implementierung kann verwendet werden, um ein Caller-Subject-Objekt oder ein RunAs-Subject-Objekt vom Thread abzurufen, wenn eine Anwendung in WebSphere Application Server ausgeführt wird. Sie können diese Klasse als SubjectSource-Implementierungsklasse in Ihrer ObjectGrid-XML-Deskriptordatei konfigurieren, wenn eXtreme Scale in WebSphere Application Server verwendet wird. Das folgende Code-Snippet zeigt den Hauptablauf der Methode "WSSubjectSourceImpl.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) {
    // get the callersubject
    s = com.ibm.websphere.security.auth.WSSubject.getCallerSubject();
  }
}
catch (WSSecurityException wse) {
  throw new ObjectGridSecurityException(wse);
}

return s;
Weitere Einzelheiten finden Sie in der API-Dokumentation zum SubjectSource-Plug-in und zur WSSubjectSourceImpl-Implementierung.

SubjectValidation-Plug-in

Das SubjectValidation-Plug-in, das durch die Schnittstelle "com.ibm.websphere.objectgrid.security.plugins.SubjectValidation" dargestellt wird, ist ein weiteres Sicherheits-Plug-in. Das SubjectValidation-Plug-in kann verwendet werden, um zu prüfen, ob ein javax.security.auth.Subject-Objekt, das an das ObjectGrid übergeben oder vom SubjectSource-Plug-in abgerufen wird, ein gültiges Subject-Objekt ist, das nicht manipuliert wurde.

Die Methode "SubjectValidation.validateSubject(Subject)" in der Schnittstelle "SubjectValidation" akzeptiert ein Subject-Objekt und gibt ein Subject-Objekt zurück. Ob ein Subject-Objekt als gültig eingestuft wird und welches Subject-Objekt zurückgegeben wird, liegt rein im Ermessen Ihrer Implementierungen. Wenn das Subject-Objekt nicht gültig ist, wird eine Ausnahme des Typs "InvalidSubjectException" ausgelöst.

Sie können dieses Plug-in verwenden, wenn Sie das Subject-Objekt, das an diese Methode übergeben wird, nicht anerkennen. Dieser Fall tritt nur selten ein, wenn man bedenkt, dass Sie den Anwendungsentwicklern vertrauen, die den Code zum Abrufen des Subject-Objekts entwickeln.

Für die Implementierung dieses Plug-ins wird die Unterstützung des Subject-Objekterstellers benötigt, da nur der Ersteller weiß, ob das Subject-Objekt manipuliert wurde. Es kann jedoch vorkommen, dass ein Subject-Ersteller nicht weiß, ob das Subject-Objekt manipuliert wurde. In diesem Fall ist das Plug-in nicht hilfreich.

WebSphere eXtreme Scale stellt eine Standardimplementierung von SubjectValidation bereit: com.ibm.websphere.objectgrid.security.plugins.builtins.WSSubjectValidationImpl. Sie können diese Implementierung verwenden, um das von WebSphere Application Server authentifizierte Subject-Objekt zu prüfen. Sie können diese Klasse als SubjectValidation-Implementierungsklasse konfigurieren, wenn Sie eXtreme Scale in WebSphere Application Server verwenden. Die WSSubjectValidationImpl-Implementierung stuft ein Subject-Objekt nur dann als gültig ein, wenn das Berechtigungsnachweistoken, das diesem Subject-Objekt zugeordnet ist, nicht manipuliert wurde. Andere Komponenten des Subject-Objekts können geändert werden. Die WSSubjectValidationImpl-Implementierung fordert das ursprüngliche Subject-Objekt, das dem Berechtigungsnachweistoken entspricht, von WebSphere Application Server an und gibt das ursprüngliche Subject-Objekt als validiertes Subject-Objekt zurück. Deshalb haben Änderungen, die an anderen Inhaltskomponenten des Subject-Objekts als dem Berechtigungsnachweistoken vorgenommen werden, keine Auswirkungen. Das folgende Code-Snippet veranschaulicht den Basisablauf von WSSubjectValidationImpl.validateSubject(Subject).

// LoginContext-Objekt mit Schema-WSLogin erstellen
// und einen Callback-Handler zurückgeben.
LoginContext lc = new LoginContext("WSLogin",
new WSCredTokenCallbackHandlerImpl(subject));

// Wenn diese Methode aufgerufen wird, werden Methoden des Callback-Handlers aufgerufen,
// um den Benutzer anzumelden.
lc.login();

// Subject-Objekt vom LoginContext abrufen
return lc.getSubject();
Im vorherigen Code-Snippet wird ein Callback-Handler-Objekt für das Berechtigungsnachweistoken, WSCredTokenCallbackHandlerImpl, mit dem zu validierenden Subject-Objekt erstellt. Anschließend wird ein LoginContext-Objekt mit dem WSLogin-Objekt für das Anmeldeschema erstellt. Wenn die Methode "lc.login" aufgerufen wird, ruft die Sicherheit von WebSphere Application Server das Berechtigungsnachweistoken aus dem Subject-Objekt ab und gibt dann das entsprechende Subject-Objekt als validiertes Subject-Objekt zurück.

Weitere Einzelheiten finden Sie in den Java-API-Beschreibungen für die SubjectValidation- und WSSubjectValidationImpl-Implementierungen.

Plug-in-Konfiguration

Sie können das SubjectValidation-Plug-in und das SubjectSource-Plug-in auf zwei Arten konfigurieren:

  • XML-Konfiguration: Sie können die ObjectGrid-XML-Datei verwenden, um ein ObjectGrid zu definieren und diese beiden Plug-ins zu konfigurieren. Im Folgenden sehen Sie ein Beispiel, in dem die Klasse "WSSubjectSourceImpl" als SubjectSource-Plug-in und die Klasse "WSSubjectValidation" als SubjectValidation-Plug-in konfiguriert wird:
    <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>
  • Programmierung: Wenn Sie ein ObjectGrid über APIs erstellen möchten, können Sie die folgenden Methoden aufrufen, um das SubjectSource- oder SubjectValidation-Plug-in zu konfigurieren.
    **
    * SubjectValidation-Plug-in für diese ObjectGrid-Instanz konfigurieren.
    * Ein SubjectValidation-Plug-in kann verwendet werden, um das Subject-Objekt
    * zu validieren, das als gültiges Subject-Objekt übergeben wird. Weitere
    * Einzelheiten finden Sie unter {@link SubjectValidation}.
    * @param subjectValidation Das SubjectValidation-Plug-in
    */
    void setSubjectValidation(SubjectValidation subjectValidation);
    
    
    /**
    * SubjectSource-Plug-in konfigurieren. Ein SubjectSource-Plug-in kann verwendet
    * werden, um ein Subject-Objekt von der Umgebung abzurufen, um den
    * ObjectGrid-Client darzustellen.
    *
    * @param source Das SubjectSource-Plug-in
    */
    void setSubjectSource(SubjectSource source);

Eigenen JAAS/Authentifizierungscode schreiben

Sie können Ihren eigenen JAAS-Authentifizierungscode (Java Authentication and Authorization Service) schreiben, der für die Authentifizierung zuständig ist. Sie müssen eigene Anmeldemodule schreiben und die Anmeldemodule anschließend für Ihr Authentifizierungsmodul konfigurieren.

Das Anmeldemodul empfängt Informationen über einen Benutzer und authentifiziert den Benutzer. Diese Informationen können beliebige Informationen sein, die den Benutzer identifizieren, z. B. eine Benutzer-ID und ein Kennwort, ein Clientzertifikat usw. Nach dem Empfang der Informationen prüft das Anmeldemodul, ob die Informationen ein gültiges Subject-Objekt darstellen, und erstellt dann ein Subject-Objekt. Derzeit sind mehrere Implementierungen von Anmeldemodulen öffentlich verfügbar.

Nachdem Sie ein Anmeldemodul geschrieben haben, konfigurieren Sie dieses für die Verwendung in der Laufzeitumgebung. Sie müssen ein JAAS-Anmeldemodul konfigurieren. Dieses Anmeldemodul enthält das Anmeldemodul selbst und das zugehörige Authentifizierungsschema. Beispiel:
FileLogin
{
    com.acme.auth.FileLoginModule required
};

Das Authentifizierungsschema ist "FileLogin", und das Anmeldemodul ist "com.acme.auth.FileLoginModule". Das Token "required" zeigt an, dass das Modul "FileLoginModule" diese Anmeldung authentifizieren muss, da ansonsten das gesamte Schema scheitert.

Die Definition der Konfigurationsdatei für das JAAS-Anmeldemodul kann auf eine der folgenden Arten erfolgen:

  • Sie können die Konfigurationsdatei für das JAAS-Anmeldemodul in der Eigenschaft "login.config.url" in der Datei "java.security" definieren. Beispiel:
    login.config.url.1=file:${java.home}/lib/security/file.login
  • Sie können die Konfigurationsdatei für das JAAS-Anmeldemodul über die Befehlszeile mit den JVM-Argumenten -Djava.security.auth.login.config konfigurieren. Beispiel: -Djava.security.auth.login.config ==$JAVA_HOME/lib/security/file.login
Weitere Informationen finden Sie unter Lernprogramm zur Java-SE-Sicherheit - Schritt 2.Weitere Informationen finden Sie unter Lernprogramm zur Java-SE-Sicherheit - Schritt 2.

Wenn Ihr Code in WebSphere Application Server ausgeführt wird, müssen Sie die JAAS-Anmeldung über die Administrationskonsole konfigurieren und diese Anmeldekonfiguration in der Konfiguration des Anwendungsservers speichern. Weitere Einzelheiten hierzu finden Sie in der Beschreibung der Anmeldekonfiguration für Java Authentication and Authorization Service.