Lernprogramm zur Java-SE-Sicherheit - Schritt 5

Nach der Authentifizierung eines Clients (wie im vorherigen Schritt) können Sie über die Berechtigungsmechanismen von eXtreme Scale Sicherheitsberechtigungen erteilen.

Vorbereitende Schritte

Stellen Sie sicher, dass Sie die Anweisungen im Abschnitt Lernprogramm zur Java-SE-Sicherheit - Schritt 4 ausgeführt haben, bevor Sie mit dieser Task fortfahren.

Informationen zu diesem Vorgang

Im vorherigen Schritt dieses Lernprogramms wurde veranschaulicht, wie die Authentifizierung in einem eXtreme-Scale-Grid aktiviert wird. Aufgrund der Aktivierung kann kein nicht authentifizierter Client eine Verbindung zu Ihrem Server mehr herstellen und Anforderungen an Ihr System übergeben. Jeder authentifizierte Client hat jedoch dieselben Berechtigungen oder Privilegien beim Server, z. B. Lesen, Schreiben oder Löschen von Daten, die in ObjectGrid-Maps gespeichert sind. Clients können auch jeden Typ von Abfrage absetzen. In diesem Abschnitt wird gezeigt, wie Sie über eXtreme-Scale-Berechtigungen verschiedenen authentifizierten Benutzern unterschiedliche Privilegien erteilen.

Ähnlich wie viele andere Systeme verwendet eXtreme Scale einen rechtebasierten Berechtigungsmechanismus. WebSphere eXtreme Scale hat verschiedene Berechtigungskategorien, die von verschiedenen Berechtigungsklassen dargestellt werden. Hier wird die Berechtigungsklasse "MapPermission" verwendet. Informationen zur vollständigen Berechtigungskategorie finden Sie unter Programmierung der Clientberechtigung.

In WebSphere eXtreme Scale stellt die Klasse "com.ibm.websphere.objectgrid.security.MapPermission" Berechtigungen für die eXtreme-Scale-Ressourcen dar, insbesondere die Methoden der Schnittstellen "ObjectMap" und "JavaMap". WebSphere eXtreme Scale definiert die folgenden Berechtigungszeichenfolgen für den Zugriff auf die Methoden der Schnittstellen "ObjectMap" und "JavaMap":
  • read: Erteilt die Berechtigung zum Lesen der Daten aus der Map.
  • write: Erteilt die Berechtigung zum Aktualisieren der Daten in der Map.
  • insert: Erteilt die Berechtigung zum Einfügen der Daten in die Map.
  • remove: Erteilt die Berechtigung zum Entfernen der Daten aus der Map.
  • invalidate: Erteilt die Berechtigung zum Ungültigmachen der Daten in der Map.
  • all: Erteilt alle zuvor beschriebenen Berechtigungen: read, write, insert, remote und invalidate.

Die Berechtigung findet statt, wenn ein Client eine Methode von ObjectMap oder JavaMap aufruft. Der Laufzeitumgebung von eXtreme Scale prüft verschiedene Map-Berechtigungen für verschiedene Methoden. Wenn dem Client die erforderlichen Berechtigungen nicht erteilt wurden, wird eine Ausnahme des Typs "AccessControlException" ausgegeben.

Dieses Lernprogramm veranschaulicht, wie über JAAS-Berechtigung verschiedenen Benutzern Berechtigungen für Map-Zugriffe erteilt werden.

Vorgehensweise

  1. Aktivieren Sie die eXtreme-Scale-Berechtigung. Zum Aktivieren der Berechtigung im ObjectGrid müssen Sie das Attribut "securityEnabled" für das gewünschte ObjectGrid in der XML-Datei auf true setzen. Die Sicherheit im ObjectGrid zu aktivieren, bedeutet, dass Sie die Berechtigung aktivieren. Verwenden Sie die folgenden Befehle, um eine neue ObjectGrid-XML-Datei mit aktivierter Sicherheit zu erstellen.
    1. Navigieren Sie zum Verzeichnis xml.
      cd objectgridRoot/xml
    2. Kopieren Sie die Datei SimpleApp.xml in die Datei SecureSimpleApp.xml.
      cp SimpleApp.xml SecureSimpleApp.xml
    3. Öffnen Sie die Datei SecureSimpleApp.xml, und fügen Sie, wie in der folgenden XML gezeigt, securityEnabled="true" auf ObjectGrid-Ebene hinzu.
      <?xml version="1.0" encoding="UTF-8"?>
      <objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
      		 xmlns="http://ibm.com/ws/objectgrid/config">
          <objectGrids>
              <objectGrid name="accounting" securityEnabled="true">
                  <backingMap name="customer" readOnly="false" copyKey="true"/>
              </objectGrid>
          </objectGrids>
      </objectGridConfig>
  2. Definieren Sie die Berechtigungsrichtlinie.
    Im vorherigen Schritt haben Sie zur Vorbereitung der Clientauthentifizierung drei Benutzer im Keystore erstellt: cashier, manager und administrator. In diesem Beispiel wird gezeigt, dass der Benutzer "cashier" nur Leseberechtigungen für alle Maps und der Benutzer "manager" alle Berechtigungen besitzt. In diesem Beispiel wird die JAAS-Berechtigung verwendet. Die JAAS-Berechtigung verwendet eine Berechtigungsrichtliniendatei, um Principals Berechtigungen zu erteilen. Die folgende Datei og_auth.policy wird im Verzeichnis "security" definiert:
    og_auth.policy
    grant codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction" 
        principal javax.security.auth.x500.X500Principal "CN=cashier,O=acme,OU=OGSample" {
        permission com.ibm.websphere.objectgrid.security.MapPermission "accounting.*", "read ";
    };
    
    grant codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction" 
        principal javax.security.auth.x500.X500Principal "CN=manager,O=acme,OU=OGSample" {
        permission com.ibm.websphere.objectgrid.security.MapPermission "accounting.*", "all";
    };
    Anmerkung:
    • codebase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction" ist ein speziell reservierter URL für ObjectGrid. Alle ObjectGrid-Berechtigungen, die Principals erteilt werden, müssen diese spezielle Codebasis verwenden.
    • Die erste grant-Anweisung erteilt dem Principal "CN=cashier,O=acme,OU=OGSample" die Map-Berechtigung "read", so dass der Benutzer "cashier" ausschließlich Leseberechtigung für alle Maps im ObjectGrid "accounting" hat.
    • Die zweite grant-Anweisung erteilt dem Principal "CN=manager,O=acme,OU=OGSample" die Map-Berechtigung "all", so dass der Benutzer "manager" alle Berechtigungen für die Maps im ObjectGrid "accounting" hat.
    Jetzt können Sie einen Server mit einer Berechtigungsrichtlinie starten. Die JAAS-Berechtigungsrichtliniendatei kann mit der Standardeigenschaft -D definiert werden: -Djava.security.auth.policy=../security/og_auth.policy
  3. Führen Sie die Anwendung aus.

    Nachdem Sie die zuvor beschriebenen Dateien erstellt haben, können Sie die Anwendung ausführen.

    Verwenden Sie die folgenden Befehle, um den Katalogserver zu starten. Weitere Informationen zum Starten des Katalogservice finden Sie unter Eigenständigen Katalogservice starten.

    1. Navigieren Sie wie folgt zum Verzeichnis "bin": cd ObjectGrid-Stammverzeichnis/bin
    2. Starten Sie den Katalogserver:
      • [Unix][Linux] startOgServer.sh catalogServer -clusterSecurityFile ../security/security.xml -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config"
      • [Windows] startOgServer.bat catalogServer -clusterSecurityFile ../security/security.xml -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config"

      Die Dateien security.xml und server.properties wurden im vorherigen Schritt dieses Lernprogramms erstellt.

    3. Anschließend können Sie einen sicheren Container-Server mit dem folgenden Script starten. Führen Sie das Script im Verzeichnis "bin" aus:
      • [Unix][Linux] # startOgServer.sh c0 -objectGridFile ../xml/SecureSimpleApp.xml -deploymentPolicyFile ../xml/SimpleDP.xml -catalogServiceEndPoints localhost:2809 -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config" -Djava.security.auth.policy="../security/og_auth.policy"
      • [Windows] startOgServer.bat c0 -objectGridFile ../xml/SecureSimpleApp.xml -deploymentPolicyFile ../xml/SimpleDP.xml -catalogServiceEndPoints localhost:2809 -serverProps ../security/server.properties -jvmArgs -Djava.security.auth.login.config="../security/og_jaas.config" -Djava.security.auth.policy="../security/og_auth.policy"
    Beachten Sie die folgenden Unterschiede zum vorherigen Startbefehl für den Katalogserver:
    • Verwenden Sie die Datei SecureSimpleApp.xml anstelle der Datei SimpleApp.xml.
    • Es wird eine weitere Eigenschaft -Djava.security.auth.policy hinzugefügt, um die JAAS-Berechtigungsrichtliniendatei für den Container-Serverprozess zu definieren.
    Verwenden Sie denselben Befehl wie im vorherigen Schritt des Lernprogramms.
    1. Navigieren Sie zum Verzeichnis "bin".
    2. java -classpath ../lib/objectgrid.jar;../applib/sec_sample.jar com.ibm.websphere.objectgrid.security.sample.guide.SecureSimpleApp ../security/client.properties manager manager1

      Da der Benutzer "manager" alle Berechtigungen für die Maps im ObjectGrid "accounting" hat, wird die Anwendung ordnungsgemäß ausgeführt.

      Jetzt verwenden Sie an Stelle des Benutzers "manager" den Benutzer "cashier", um die Clientanwendung zu starten.

    3. Navigieren Sie zum Verzeichnis "bin".
    4. java -classpath ../lib/objectgrid.jar;../applib/sec_sample.jar com.ibm.ws.objectgrid.security.sample.guide.SecureSimpleApp ../security/client.properties cashier cashier1

    Die folgende Ausnahme wird ausgegeben:

    Exception in thread "P=387313:O=0:CT" com.ibm.websphere.objectgrid.TransactionException: 
    rolling back transaction, see caused by exception
    	at com.ibm.ws.objectgrid.SessionImpl.rollbackPMapChanges(SessionImpl.java:1422)
     	at com.ibm.ws.objectgrid.SessionImpl.commit(SessionImpl.java:1149)
     	at com.ibm.ws.objectgrid.SessionImpl.mapPostInvoke(SessionImpl.java:2260)
     	at com.ibm.ws.objectgrid.ObjectMapImpl.update(ObjectMapImpl.java:1062)
     	at com.ibm.ws.objectgrid.security.sample.guide.SimpleApp.run(SimpleApp.java:42)
    	at com.ibm.ws.objectgrid.security.sample.guide.SecureSimpleApp.main(SecureSimpleApp.java:27)
    Caused by: com.ibm.websphere.objectgrid.ClientServerTransactionCallbackException: 
       Client Services - received exception from remote server:
         com.ibm.websphere.objectgrid.TransactionException: transaction rolled back, 
    			see caused by Throwable
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.processReadWriteResponse(
                RemoteTransactionCallbackImpl.java:1399)
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.processReadWriteRequestAndResponse(
                RemoteTransactionCallbackImpl.java:2333)
            at com.ibm.ws.objectgrid.client.RemoteTransactionCallbackImpl.commit(RemoteTransactionCallbackImpl.java:557)
            at com.ibm.ws.objectgrid.SessionImpl.commit(SessionImpl.java:1079)
            ... 4 more
    Caused by: com.ibm.websphere.objectgrid.TransactionException: transaction rolled back, see caused by Throwable
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processLogSequence(ServerCoreEventProcessor.java:1133)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processReadWriteTransactionRequest
    					(ServerCoreEventProcessor.java:910)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processClientServerRequest(ServerCoreEventProcessor.java:1285)
    
            at com.ibm.ws.objectgrid.ShardImpl.processMessage(ShardImpl.java:515)
            at com.ibm.ws.objectgrid.partition.IDLShardPOA._invoke(IDLShardPOA.java:154)
            at com.ibm.CORBA.poa.POAServerDelegate.dispatchToServant(POAServerDelegate.java:396)
            at com.ibm.CORBA.poa.POAServerDelegate.internalDispatch(POAServerDelegate.java:331)
            at com.ibm.CORBA.poa.POAServerDelegate.dispatch(POAServerDelegate.java:253)
            at com.ibm.rmi.iiop.ORB.process(ORB.java:503)
            at com.ibm.CORBA.iiop.ORB.process(ORB.java:1553)
            at com.ibm.rmi.iiop.Connection.respondTo(Connection.java:2680)
            at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2554)
            at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:62)
            at com.ibm.rmi.iiop.WorkerThread.run(ThreadPoolImpl.java:202)
            at java.lang.Thread.run(Thread.java:803)
    Caused by: java.security.AccessControlException: Access denied (
       com.ibm.websphere.objectgrid.security.MapPermission accounting.customer write)
            at java.security.AccessControlContext.checkPermission(AccessControlContext.java:155)
            at com.ibm.ws.objectgrid.security.MapPermissionCheckAction.run(MapPermissionCheckAction.java:141)
            at java.security.AccessController.doPrivileged(AccessController.java:275)
            at javax.security.auth.Subject.doAsPrivileged(Subject.java:727)
            at com.ibm.ws.objectgrid.security.MapAuthorizer$1.run(MapAuthorizer.java:76)
            at java.security.AccessController.doPrivileged(AccessController.java:242)
            at com.ibm.ws.objectgrid.security.MapAuthorizer.check(MapAuthorizer.java:66)
            at com.ibm.ws.objectgrid.security.SecuredObjectMapImpl.checkMapAuthorization(SecuredObjectMapImpl.java:429)
            at com.ibm.ws.objectgrid.security.SecuredObjectMapImpl.update(SecuredObjectMapImpl.java:490)
            at com.ibm.ws.objectgrid.SessionImpl.processLogSequence(SessionImpl.java:1913)
            at com.ibm.ws.objectgrid.SessionImpl.processLogSequence(SessionImpl.java:1805)
            at com.ibm.ws.objectgrid.ServerCoreEventProcessor.processLogSequence(ServerCoreEventProcessor.java:1011)
            ... 14 more

    Diese Ausnahme tritt ein, weil der Benutzer "cashier" keine Schreibberechtigung hat und deshalb die Map "Customer" nicht aktualisieren kann.

    Jetzt unterstützt Ihr System Berechtigung. Sie können Berechtigungsrichtlinien definieren, um unterschiedlichen Benutzern unterschiedliche Berechtigungen zu erteilen. Weitere Informationen zur Berechtigung finden Sie unter Anwendungsclientberechtigung.

Nächste Schritte

Führen Sie den nächsten Schritt des Lernprogramms aus (siehe Lernprogramm zur Java-SE-Sicherheit - Schritt 6).