Zugriffssteuerungsausnahme für Java-2-Sicherheit

Das Verhalten der Java™-2-Sicherheit wird durch die zugehörige Sicherheitsrichtlinie festgelegt. Die Sicherheitsrichtlinie ist eine Matrix für die Zugriffssteuerung, die festlegt, auf welche Systemressourcen bestimmte Codebasen zugreifen können und wer diese unterzeichnen muss. Die Richtlinie für die Java-2-Sicherheit ist deklarativ und wird durch die Methode java.security.AccessController.checkPermission in Kraft gesetzt.

Das folgende Beispiel veranschaulicht den Algorithmus für die Methode java.security.AccessController.checkPermission. Der vollständige Algorithmus ist unter "Algorithmus für die Überprüfung von Berechtigungen in der Java-2-Sicherheit" im Artikel "Sicherheit: Lernmaterial" beschrieben.

i = m;
while (i > 0) {
if (caller i's domain does not have the permission)
throw AccessControlException;
else if (caller i is marked as privileged)
return;
i = i - 1;
};

Der Algorithmus erfordert, dass alle Klassen oder aufrufenden Prozesse im Aufruf-Stack die erforderlichen Berechtigungen hat, wenn eine java.security.AccessController.checkPermission ausgeführt oder die Anforderung zurückgewiesen und eine Ausnahme vom Typ java.security.AccessControlException ausgelöst wird. Wenn das aufrufende Programm jedoch als privilegiert gekennzeichnet ist und der Klasse (Caller) diese Berechtigungen erteilt wurden, kehrt der Algorithmus zurück und traversiert nicht den gesamten Aufrufstack. Nachfolgenden Klassen (Caller) muss nicht die erforderliche Berechtigung erteilt sein.

Es wird eine Ausnahme vom Typ java.security.AccessControlException ausgelöst, wenn bei der Ausführung der Methode java.security.AccessController.checkPermission festgestellt wird, dass bestimmte Klassen im Aufruf-Stack nicht die erforderlichen Berechtigungen besitzen. Im Folgenden werden zwei Lösungsvorschläge für die Ausnahme java.security.AccessControlException vorgestellt:
  • Wenn die Anwendung eine durch Java-2-Sicherheit geschützte API aufruft, erteilen Sie der Java-2-Sicherheitsrichtlinie der Anwendung die erforderliche Berechtigung. Wenn die Anwendung eine durch die Java-2-Sicherheit geschützte API nicht direkt aufruft, kann die Berechtigung trotzdem erforderlich sein, weil APIs von Fremdanbietern auf Ressourcen zugreifen, die durch Java-2-Sicherheit geschützt sind.
  • Wenn der Anwendung die erforderlichen Berechtigungen erteilt werden, erhält sie mehr Zugriffsrechte, als sie eigentlich haben sollte. In diesem Fall ist es wahrscheinlich, dass der Code des Fremdanbieters, der auf die durch die Java-2-Sicherheit geschützte Ressource zugreift, nicht ordnungsgemäß als berechtigt gekennzeichnet ist.

Beispiel für Aufruf-Stack

Dieses Beispiel für einen Aufruf-Stack zeigt einen Anwendungscode, der eine API-Dienstprogrammbibliothek eines Fremdanbieters zum Aktualisieren des Kennworts verwendet. Die Entscheidung, wann der Code als berechtigt zu markieren ist, ist anwendungsspezifisch und situationsabhängig. Diese Entscheidung setzt umfassende Kenntnisse in Domänen und Erfahrung mit der Sicherheit voraus. Es gibt eine Reihe gut geschriebener Veröffentlichungen und Bücher zu diesem Thema. Es wird empfohlen, dieses Material zu lesen, um ausführlichere Informationen zu erhalten.
Dieses Beispiel für einen Aufruf-Stack zeigt einen Anwendungscode, der eine API-Dienstprogrammbibliothek eines Fremdanbieters zum Aktualisieren des Kennworts verwendet. Die Entscheidung darüber, wo der Code als berechtigt markiert wird, ist anwendungsspezifisch und in jeder Situation eindeutig. Um die richtige Entscheidung zu treffen, sind detailliertes Wissen in diesem Bereich und Erfahrung mit der Sicherheit erforderlich.

Sie können das Dienstprogramm PasswordUtil verwenden, um das Kennwort eines Benutzers zu ändern. Geben Sie das alte und das neue Kennwort zweimal ein, um sicherzugehen, dass das richtige Kennwort eingegeben wurde. Wenn das alte Kennwort mit dem Kennwort in der Kennwortdatei übereinstimmt, wird das neue Kennwort gespeichert und die Kennwortdatei aktualisiert. Beispiel: Einer der Stack-Rahmen ist als berechtigt gekennzeichnet. Gemäß dem Algorithmus von java.security.AccessController.checkPermission schlägt die Anwendung fehl, wenn nicht allen Klassen im Aufruf-Stack die Berechtigung erteilt ist, in die Kennwortdatei zu schreiben. Der Clientanwendung sollte die Berechtigung, direkt in die Kennwortdatei zu schreiben und die Kennwortdatei beliebig zu aktualisieren, nicht erteilt werden.

Wenn die Methode PasswordUtil.updatePasswordFile den Code, der auf die Kennwortdatei zugreift, jedoch als privilegiert kennzeichnet, überprüft der Algorithmus für die Überprüfung der Berechtigungen die erforderliche Berechtigung von Klassen, die die Methode thePasswordUtil.updatePasswordFile aufrufen, nicht, solange der Klasse PasswordUtil die Berechtigung erteilt wurde. Die Clientanwendung kann dann ein Kennwort erfolgreich aktualisieren, ohne die Berechtigung zum Schreiben in die Kennwortdatei zu haben.

Den Code als berechtigt kennzeichnen zu können, bietet viel Flexibilität und weitgreifende Möglichkeiten. Wenn diese Funktion nicht ordnungsgemäß verwendet wird, ist die Sicherheit des gesamten Systems gefährdet, und es können Sicherheitslücken entstehen. Verwenden Sie diese Funktion sehr sorgfältig, wenn Sie Code als berechtigt markieren.

Auflösung der Ausnahme java.security.AccessControlException

Wie bereits zuvor beschrieben, kann eine Ausnahme java.security.AccessControlException auf zwei Arten aufgelöst werden. Untersuchen Sie die Ausnahmen einzeln, um zu bestimmen, welche Lösung die beste ist:
  1. Der Anwendung die fehlende Berechtigung gewähren.
  2. Markieren Sie bestimmte Codeteile als berechtigt (unter Berücksichtigung der Probleme und Risiken).

Symbol, das den Typ des Artikels anzeigt. Konzeptartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=csec_access
Dateiname:csec_access.html