WebSphere eXtreme Scale unterstützt die vordefinierte JAAS-Berechtigung (Java Authentication and Authorization) und auch die angepasste Berechtigung mit über die Schnittstelle "ObjectGridAuthorization".
Das ObjectGridAuthorization-Plug-in wird verwendet, um ObjectGrid-, ObjectMap- und JavaMap-Zugriff auf die Principals, die durch ein Subject-Objekt dargestellt werden, auf angepasste Weise zu berechtigen. Eine typische Implementierung dieses Plug-ins ist der Abruf der Principals aus dem Subject-Objekt mit anschließender dahingehender Prüfung, ob die angegebenen Berechtigungen den Principals erteilt wurden.
Die folgenden Berechtigungen können an die Methode "checkPermission(Subject, Permission)" übergeben werden:
Weitere Einzelheiten finden Sie in der Dokumentation zur API ObjectGridAuthorization.
Die öffentliche Klasse "com.ibm.websphere.objectgrid.security.MapPermission" stellt Berechtigungen für die ObjectGrid-Ressourcen, insbesondere die Methoden der Schnittstellen "ObjectMap" und "JavaMap", dar. WebSphere eXtreme Scale definiert die folgenden Berechtigungszeichenfolgen für den Zugriff auf die Methoden der Schnittstellen "ObjectMap" und "JavaMap":
Weitere Einzelheiten finden Sie in der Dokumentation zur API "MapPermission".
Sie können ein MapPermission-Objekt erstellen, indem Sie den vollständig qualifizierten Namen der ObjectGrid-Map (im Format [ObjectGrid_name].[ObjectMap_name]) und die Berechtigungszeichenfolge oder den ganzzahligen Wert übergeben. Eine Berechtigungszeichenfolge kann eine durch Kommas getrennte Zeichenfolge der zuvor beschriebenen Berechtigungszeichenfolgen wie read, insert oder all sein. Ein ganzzahliger Berechtigungswert kann jeder der zuvor genannten ganzzahligen Berechtigungskonstanten oder ein mathematischer Wert sein, der sich aus mehreren ganzzahligen Berechtigungskonstanten zusammensetzt, z. B. MapPermission.READ|MapPermission.WRITE.
Die Berechtigung findet statt, wenn eine ObjectMap- oder JavaMap-Methode aufgerufen wird. Die Laufzeitumgebung überprüft verschiedene Berechtigungen für verschiedene Methoden. Wenn dem Client die erforderlichen Berechtigungen nicht erteilt wurden, wird eine Ausnahme des Typs "AccessControlException" ausgegeben.
Berechtigung | ObjectMap/JavaMap |
---|---|
read | Boolean containsKey(Object) |
Boolean equals(Object) | |
Object get(Object) | |
Object get(Object, Serializable) | |
List getAll(List) | |
List getAll(List keyList, Serializable) | |
List getAllForUpdate(List) | |
List getAllForUpdate(List, Serializable) | |
Object getForUpdate(Object) | |
Object getForUpdate(Object, Serializable) | |
public Object getNextKey(long) | |
write | Object put(Object key, Object value) |
void put(Object, Object, Serializable) | |
void putAll(Map) | |
void putAll(Map, Serializable) | |
void update(Object, Object) | |
void update(Object, Object, Serializable) | |
insert | public void insert (Object, Object) |
void insert(Object, Object, Serializable) | |
remove | Object remove (Object) |
void removeAll(Collection) | |
void clear() | |
invalidate | public void invalidate (Object, Boolean) |
void invalidateAll(Collection, Boolean) | |
void invalidateUsingKeyword(Serializable) | |
int setTimeToLive(int) |
Die Berechtigung basiert allein darauf, welche Methode verwendet wird, und nicht darauf, was die Methode wirklich tut. Eine Methode "put" kann beispielsweise einen Datensatz einfügen oder aktualisieren, je nachdem, ob der Datensatz vorhanden ist oder nicht. Diese Fälle werden jedoch nicht unterschieden.
Ein Operationstyp kann durch Kombinationen anderer Typen erreicht werden. Eine Aktualisierung kann beispielsweise durch die Kombination einer Entfernungs- und einer anschließenden Einfügeoperation erreicht werden. Berücksichtigen Sie diese Kombinationen, wenn Sie Ihre Berechtigungsrichtlinien gestalten.
In der folgenden Tabelle sind die Methoden und die jeweils erforderliche ObjectGridPermission zusammengefasst:
Berechtigungsaktion | Methoden |
---|---|
query | com.ibm.websphere.objectgrid.Session.createObjectQuery(String) |
query | com.ibm.websphere.objectgrid.em.EntityManager.createQuery(String) |
dynamicmap | com.ibm.websphere.objectgrid.Session.getMap(String) |
ServerMapPermission stellt Berechtigungen für eine ObjectMap in einem Server dar. Der Name der Berechtigung ist der vollständige Name der ObjectGrid-Map. Die folgenden Aktionen werden unterstützt:
Berechtigungsaktion | Methoden |
---|---|
replicate | com.ibm.websphere.objectgrid.ClientReplicableMap.enableClientReplication(Mode, int[], ReplicationMapListener) |
dynamicIndex | com.ibm.websphere.objectgrid.BackingMap.createDynamicIndex(String, Boolean, String, DynamicIndexCallback) |
dynamicIndex | com.ibm.websphere.objectgrid.BackingMap.removeDynamicIndex(String) |
AgentPermission stellt Berechtigungen für die DataGrid-Agenten dar. Der Name der Berechtigung ist der vollständige Name der ObjectGrid-Map, und die Aktion ist eine durch Kommas getrennte Zeichenfolge, die sich aus den Namen der Agentenimplementierungsklassen bzw. Paketnamen zusammensetzt.
Weitere Informationen finden Sie in der Dokumentation zur API "AgentPermission".
com.ibm.websphere.objectgrid.datagrid.AgentManager#callMapAgent(MapGridAgent, Collection)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callMapAgent(MapGridAgent)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callReduceAgent(ReduceGridAgent, Collection)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callReduceAgent(ReduceGridAgent, Collection)
WebSphere eXtreme Scale unterstützt zwei Arten von Berechtigungsmechanismen: JAAS-Berechtigung (Java Authentication and Authorization Service) und angepasste Berechtigung. Diese Mechanismen gelten für alle Berechtigungen. Die JAAS-Berechtigung erweitert die Java-Sicherheitsrichtlinien mit benutzerorientierten Zugriffsteuerungselementen. Berechtigungen können nicht nur auf der Basis des ausgeführten Codes, sondern auch danach erteilt werden, wer den Code ausführt. Die JAAS-Berechtigung ist Teil von SDK Version 5 und höher.
Außerdem unterstützt WebSphere eXtreme Scale die angepasste Berechtigung mit dem folgenden Plug-in:
Sie können einen eigenen Berechtigungsmechanismus implementieren, wenn Sie die JAAS-Berechtigung nicht verwenden möchten. Wenn Sie einen angepassten Berechtigungsmechanismus verwenden, können Sie die Richtliniendatenbank, den Richtlinienserver oder Tivoli Access Manager für die Verwaltung der Berechtigungen verwenden.
Sie können den Berechtigungsmechanismus auf zwei Arten konfigurieren:
Sie können die ObjectGrid-XML-Datei verwenden, um ein ObjectGrid zu definieren und den Berechtigungsmechanismus AUTHORIZATION_MECHANISM_JAAS oder AUTHORIZATION_MECHANISM_CUSTOM festzulegen. Im Folgenden sehen Sie die Datei "secure-objectgrid-definition.xml", die in der Unternehmensanwendung "ObjectGridSample" verwendet wird:
<objectGrids>
<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
authorizationMechanism="AUTHORIZATION_MECHANISM_JAAS">
<bean id="TransactionCallback"
classname="com.ibm.websphere.samples.objectgrid.HeapTransactionCallback" />
...
</objectGrids>
Wenn Sie ein ObjectGrid mit der Methode "ObjectGrid.setAuthorizationMechanism(int)" erstellen möchten, können Sie die folgende Methode aufrufen, um den Berechtigungsmechanismus festzulegen. Der Aufruf dieser Methode gilt nur dann für das lokale eXtreme-Scale-Programmiermodell, wenn Sie die ObjectGrid-Instanz direkt instanziieren:
/**
* Berechtigungsmechanismus festlegen. Die Standardeinstellung ist
* com.ibm.websphere.objectgrid.security.SecurityConstants.
* AUTHORIZATION_MECHANISM_JAAS.
* @param authMechanism Der Berechtigungsmechanismus für die Map.
*/
void setAuthorizationMechanism(int authMechanism);
JAAS-Berechtigung
Ein javax.security.auth.Subject-Objekt stellt einen authentifizierten Benutzer dar. Ein Subject-Objekt setzt sich aus einer Gruppe von Principals zusammen, und jeder Principal stellt eine Identität für diesen Benutzer dar. Beispielsweise kann ein Subject-Objekt einen Namens-Principal, z. B. Joe Smith, und einen Gruppen-Principal, z. B. manager, haben.
Mit der JAAS-Berechtigungsrichtlinie können Berechtigungen bestimmten Principals erteilt werden. WebSphere eXtreme Scale ordnet das Subject-Objekt dem aktuellen Zugriffssteuerungskontext zu. Für jeden Aufruf der ObjectMap- oder JavaMap-Methode bestimmt die Java-Laufzeitumgebung automatisch, ob die Richtlinie die erforderliche Berechtigung nur einem bestimmten Principal erteilt, und wenn ja, wird die Operation nur zugelassen, wenn das Subject-Objekt, das dem Zugriffssteuerungskontext zugeordnet ist, den angegebenen Principal enthält.
Sie müssen mit der Richtliniensyntax der Richtliniendatei vertraut sein. Eine ausführliche Beschreibung der JAAS-Berechtigung finden Sie in der Veröffentlichung "JAAS Reference Guide".
WebSphere eXtreme Scale hat eine spezielle Codebasis, die für die Überprüfung der JAAS-Berechtigung für die ObjectMap- und JavaMap-Methodenaufrufe verwendet wird. Diese spezielle Codebasis ist http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction. Verwenden Sie diese Codebasis, wenn Sie Principals ObjectMap- oder JavaMap-Berechtigungen erteilen. Dieser spezielle Code wurde erstellt, weil die JAR-Datei (Java-Archiv) für eXtreme Scale mit allen Berechtigungen ausgestattet ist.
Die Richtlinienschablone für die Erteilung der MapPermission-Berechtigung sieht wie folgt aus:
grant codeBase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction"
<Principal field(s)>{
permission com.ibm.websphere.objectgrid.security.MapPermission
"[ObjectGrid_name].[ObjectMap_name]", "action";
....
permission com.ibm.websphere.objectgrid.security.MapPermission
"[ObjectGrid_name].[ObjectMap_name]", "action";
};
Ein Beispiel für ein Principal-Feld sehen Sie im Folgenden:principal Principal_class "principal_name"
In dieser Richtlinie werden einem bestimmten Principal nur Einfüge- und Leseberechtigungen für diese vier Maps erteilt. In der anderen Richtliniendatei, fullAccessAuth.policy, werden einem Principal alle Berechtigungen für diese Maps erteilt. Ändern Sie vor dem Ausführen der Anwendung "principal_name" und "principal_class" in die entsprechenden Werte. Der Wert für "principal_name" richtet sich nach der Benutzerregistry. Wird beispielsweise das lokale Betriebssystem als Benutzerregistry verwendet, ist der Maschinenname MACH1, die Benutzer-ID user1 und der Principal-Name MACH1/user1.
Die JAAS-Berechtigungsrichtlinie kann direkt in die Java-Richtliniendatei oder in eine separate JAAS-Berechtigungsdatei eingefügt und anschleßend auf eine der folgenden beiden Arten definiert werden:
-Djava.security.auth.policy=file:[JAAS_AUTH_POLICY_FILE]
-Dauth.policy.url.x=file:[JAAS_AUTH_POLICY_FILE]
Angepasste ObjectGrid-Berechtigung
Das ObjectGridAuthorization-Plug-in wird verwendet, um ObjectGrid-, ObjectMap- und JavaMap-Zugriff auf die Principals, die durch ein Subject-Objekt dargestellt werden, auf angepasste Weise zu berechtigen. Eine typische Implementierung dieses Plug-ins ist der Abruf der Principals aus dem Subject-Objekt mit anschließender dahingehender Prüfung, ob die angegebenen Berechtigungen den Principals erteilt wurden oder nicht.
Die folgenden Berechtigungen können an die Methode "checkPermission(Subject, Permission)" übergeben werden:
Weitere Einzelheiten finden Sie in der Dokumentation zur API "ObjectGridAuthorization".
Das ObjectGridAuthorization-Plug-in kann auf die folgenden Arten konfiguriert werden:
Sie können die ObjectGrid-XML-Datei verwenden, um ein ObjectAuthorization-Plug-in zu definieren. Es folgt ein Beispiel:
<objectGrids>
<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
authorizationMechanism="AUTHORIZATION_MECHANISM_CUSTOM">
...
<bean id="ObjectGridAuthorization"
className="com.acme.ObjectGridAuthorizationImpl" />
</objectGrids>
Wenn Sie ein ObjectGrid mit der API-Methode "ObjectGrid.setObjectGridAuthorization(ObjectGridAuthorization)" erstellen möchten können Sie die folgende Methode aufrufen, um das Berechtigungs-Plug-in zu definieren. Diese Methode gilt nur für das lokale Programmiermodell von eXtreme Scale, wenn Sie die ObjectGrid-Instanz direkt instanziieren.
/**
* Setzt die <code>ObjectGridAuthorization</code> für diese ObjectGrid-Instanz.
* <p>
* Bei der Übergabe von <code>null</code> an diese Methode wird ein zuvor definiertes
* <code>ObjectGridAuthorization</code>-Objekt aus einem früheren Aufruf dieser Methode
* entfernt. Außerdem wird damit angezeigt, dass dieses <code>ObjectGrid</code> keinem
* <code>ObjectGridAuthorization</code>-Objekt zugeordnet ist.
* <p>
* Diese Methode sollte nur verwendet werden, wenn die ObjectGrid-Sicherheit aktiviert ist. Wenn
* die ObjectGrid-Sicherheit inaktiviert ist, wird das bereitgestellte <code>ObjectGridAuthorization</code>-Objekt
* nicht verwendet.
* <p>
* Ein <code>ObjectGridAuthorization</code>-Plug-in kann verwendet werden, um den
* Zugriff auf das ObjectGrid und die Maps zu berechtigen. Weitere Einzelheiten finden Sie
* in der Dokumentation zu <code>ObjectGridAuthorization</code>.
*
* <p>
* Ab Extended Deployment 6.1 ist <code>setMapAuthorization</code> veraltet und
* <code>setObjectGridAuthorization</code> die empfohlene Methode. Wenn jedoch
* das <code>MapAuthorization</code>-Plug-in und das <code>ObjectGridAuthorization</code>-Plug-in
* verwendet werden, verwendet ObjectGrid das bereitgestellte <code>MapAuthorization</code>-Plug-in,
* um Map-Zugriffe zu berechtigen, obwohl es veraltet ist.
* <p>
* Zur Vermeidung von Ausnahmen des Typs <code>IllegalStateException</code> muss
* diese Methode vor der Methode <code>initialize()</code> aufgerufen werden.
* Beachten Sie außerdem, dass die <code>getSession</code>-Methoden die Methode
* <code>initialize()</code> implizit aufrufen, wenn sie noch von der Anwendung
* aufgerufen werden muss.
*
* @param ogAuthorization Das <code>ObjectGridAuthorization</code>-Plug-in.
*
* @throws IllegalStateException, wenn diese Methode nach dem Aufruf der
* Methode <code>initialize()</code> aufgerufen wird.
*
* @see #initialize()
* @see ObjectGridAuthorization
* @since WAS XD 6.1
*/
void setObjectGridAuthorization(ObjectGridAuthorization ogAuthorization);
Die Methode Boolean checkPermission(Subject subject, Permission permission) der Schnittstelle ObjectGridAuthorization wird von der Laufzeitumgebung von WebSphere eXtreme Scale aufgerufen, um zu prüfen, ob das übergebene Subject-Objekt die übergebenen Berechtigungen besitzt. Die Implementierung der Schnittstelle ObjectGridAuthorization gibt "true" zurück, wenn das Objekt die Berechtigung besitzt, und "false", wenn nicht.
Eine typische Implementierung dieses Plug-ins ist der Abruf der Principals aus dem Subject-Objekt mit anschließender dahingehender Prüfung, ob die angegebenen Berechtigungen den Principals erteilt wurden oder nicht, unter Verwendung der angegebenen Richtlinien. Diese Richtlinien werden von Benutzern definiert. Die Richtlinien können beispielsweise in einer Datenbank, einer unverschlüsselten Datei oder in einem Richtlinienserver von Tivoli Access Manager definiert werden.
Sie können einen Richtlinienserver von Tivoli Access Manager beispielsweise verwenden, um die Berechtigungsrichtlinie zu verwalten, und die zugehörige API, um den Zugriff zu berechtigen. Informationen zur Verwendung der Berechtigungs-APIs von Tivoli Access Manager Authorization finden Sie in der Veröffentlichung "IBM® Tivoli Access Manager Authorization Java Classes Developer Reference".
Diese Beispielimplementierung basiert auf den folgenden Annahmen:
Das folgende Code-Snippet veranschaulicht, wie die Methode checkPermission implementiert wird:
/**
* @see com.ibm.websphere.objectgrid.security.plugins.
* MapAuthorization#checkPermission
* (javax.security.auth.Subject, com.ibm.websphere.objectgrid.security.
* MapPermission)
*/
public boolean checkPermission(final Subject subject,
Permission p) {
// Für andere Berechtigungen als MapPermission-Berechtigungen, immer
// Berechtigung erteilen.
if (!(p instanceof MapPermission)){
return true;
}
MapPermission permission = (MapPermission) p;
String[] str = permission.getParsedNames();
StringBuffer pdPermissionStr = new StringBuffer(5);
for (int i=0; i<str.length; i++) {
pdPermissionStr.append(str[i].substring(0,1));
}
PDPermission pdPerm = new PDPermission(permission.getName(),
pdPermissionStr.toString());
Set principals = subject.getPrincipals();
Iterator iter= principals.iterator();
while (iter.hasNext()) {
try {
PDPrincipal principal = (PDPrincipal) iter.next();
if (principal.implies(pdPerm)) {
return true;
}
}
catch (ClassCastException cce) {
// Ausnahme behandeln
}
}
return false;
}