Mit Hilfe des SQL-Befehls CREATE PERMISSION können Zeilenzugriffsberechtigungen für Tabellen/physische Dateien eingerichtet werden. Beim Zugriff auf die Tabelle werden nur die Zeilen angezeigt, für die der Benutzer berechtigt ist. Vielfach verhält es sich jedoch so, dass der Benutzer zwar auf bestimmte Datensätze zugreifen, jedoch bestimmte sensible Spalteninhalte nicht sehen soll.

Views oder logische Dateien können zwar ohne die betreffenden Spalten angelegt werden. Wird allerdings direkt auf die Tabelle zugegriffen, sind alle Spalten mitsamt dem Inhalt sichtbar. Mit dem CREATE MASK-Befehl können Berechtigungen für die Anzeige der Spalteninhalte festgelegt werden. Sofern der Benutzer diese Berechtigung nicht hat, wird stattdessen ein Default-Wert angegeben. Wie dies funktioniert, wird in diesem Artikel gezeigt.

Zur Einrichtung von Spaltenberechtigungen bzw. Regeln zur Maskierung von Spalteninhalten wurde der SQL-Befehl CREATE MASK zur Verfügung gestellt.

Die Syntax für den SQL-Befehl CREATE MASK sieht wie folgt aus:

  • Mask-Name Eindeutiger Name, unter dem die Maske gespeichert wird.
  • Table-Name Tabelle oder physische Datei, der die Maske zugewiesen werden soll.
  • Correlation-Name Für die Tabelle kann ein Correlation-Name (Abkürzung) angegeben werden, der in der CASE Expression (IF/THEN/ELSE-Anweisung) verwendet werden kann.

Die Vorgabe eines Correlation-Namens ist nicht zwingend erforderlich.

  • Column-Name Spalte, deren Inhalt maskiert werden soll, sofern der Benutzer für die Anzeige nicht berechtigt ist.
  • Return Case Expression Definition der Berechtigung.

Bei dem Ergebnis, das nach Ausführung der CASE-Anweisung ausgegeben wird, handelt es sich um den echten Spaltenwert, sofern der Benutzer berechtigt bzw. die CASE-Anweisung wahr ist. Wenn dies nicht der Fall ist, wird die vorgegebene Maske, also der Unterlassungswert, angezeigt.

Die Maske kann auch so festgelegt werden, dass nur ein Teil des Originalwerts sichtbar ist, während der Rest mit Hilfe der Maske unsichtbar gemacht wird. So können zum Beispiel von einer Kreditkarte nur die letzten vier Zeichen angezeigt werden, während der Rest durch die Maske verdeckt ist.

  • Enable/Disable Gibt an, ob die Maske direkt aktiviert wird.

Achtung:       Der Default-Wert, der in der CASE-Anweisung zur Maskierung des Originalwerts angegeben wird, muss im gleichen oder einem kompatiblen Datenformat hinterlegt werden.

Sofern zum Beispiel das (numerische) Gehalt maskiert werden soll, muss es sich auch beim Default-Wert um einen numerischen Wert handeln. Wird das Geburtsdatum (echtes Datum) maskiert, so muss die Maske ebenfalls in Form eines Datums angegeben sein.

Der CREATE OR REPLACE MASK-Befehl kann in jeder Umgebung, in der SQL-Befehle ausgeführt werden können, abgesetzt werden.

IBM-i-Navigator-Erfassungsmasken

Im IBM-i-Navigator (Client Access und Webanwendung) sind Wizards hinterlegt, über die die Spaltenmasken erfasst werden können.

Folgende Abbildung zeigt die im IBM-i-Navigator hinterlegten Erfassungsmasken für die Spaltenberechtigungen zunächst von der Webversion und im Anschluss von der Client-Access-Version.

Abbildung 1: IBM-i-Navigator – Erfassen von Spaltenberechtigungen (MASKS)

Aktivierung/Deaktivierung von Spaltenberechtigungen über ALTER TABLE Statement

Die Spaltenberechtigungen sind durch die Erstellung der Masken bzw. die Ausführung des CREATE MASK Statements noch nicht aktiviert, auch dann nicht, wenn ENABLED angegeben wurde.

Wichtig:       Die Spaltenberechtigungen müssen ähnlich wie die Zeilenberechtigungen explizit durch ein ALTER TABLE Statement mit der Option ACTIVATE COLUMN ACCESS CONTROL für die Tabelle/physische Datei aktiviert werden.

Wie auch bei den Zeilenberechtigungen können nur alle Spaltenberechtigungen (für alle Spalten) aktiviert oder deaktiviert werden.

Beispiel: Spaltenberechtigung – Default- oder Spaltenwerte für alle Zeilen

Im folgenden Beispiel werden die Gehälter für die Mitglieder der Gruppenprofile PERSABT (Personalabteilung) und MGMT (Management) angezeigt. Für alle anderen Benutzer ist anstatt des Gehalts der Default-Wert –9999,99 ersichtlich.

Create or Replace Mask YOURSCHEMA.DSPGEHALT on YOURSCHEMA.PERSSTAMM for Column GEHALT Return Case when Verify_Group_For_User(Session_User, ‚PERSABT‘, ‚MGMT‘) = 1 Then GEHALT Else -9999,99 End Enable;

Alter Table YOURSCHEMA.PERSSTAMM Activate Column Access Control;

Abbildung 2: Spaltenberechtigung – Für alle Werte oder den Default-Wert anzeigen

Beispiel: Spaltenberechtigung – Detaillierte Bedingungen

Im vorherigen Beispiel duften nur bestimmte Benutzer alle Gehälter sehen. Für die anderen wurde in allen Zeilen der Default-/Maskenwert ausgegeben. In der Regel ist jedoch eine detailliertere Zuweisung erforderlich. So sollen zum Beispiel alle Mitarbeiter der Personalabteilung die Personalstämme der Mitarbeiter, die sie bearbeiten dürfen, sehen können. Dies kann über eine Row Permission/Zeilenberechtigung eingerichtet werden. Das Gehalt bzw. den Lohn dürfen jedoch nur die Sachbearbeiter sehen, die die Gehaltsabrechnung durchführen. Hier hat man wiederum unterschiedliche Zuständigkeiten, zum Beispiel Abrechnung für die gewerblichen Mitarbeiter oder Abrechnung für die Angestellten. Unter Umständen wird nochmals nach der Hierarchiestufe unterschieden, und die Gehälter der Geschäftsleitung darf nur der Finanzdirektor sehen.

Im folgenden Beispiel werden für die Mitglieder der Gruppenprofile PERSABT und MGMT ebenfalls alle Gehälter angezeigt. Für die Mitglieder des Gruppenprofils PERSSB01 sind die Gehälter der Mitarbeiter von Kostenstelle 344 ersichtlich und für alle anderen Mitarbeiter anstatt des Gehalts nur der Default-Wert –9999,99. Für die Mitglieder des Gruppenprofils PERSSB02 werden die Gehälter der Mitarbeiter aller Kostenstellen zwischen 100 und 199 angezeigt, und für alle anderen Mitarbeiter wird der Default-Wert ausgegeben. Mitarbeiter, die zu keinem der zuvor genannten Gruppenprofile gehören, wird in berechtigten Zeilen anstatt des Gehalts immer der Default-Wert –9999,99 ausgegeben.

Create or Replace Mask YOURSCHEMA.DSPGEHALT on YOURSCHEMA.PERSSTAMM For Column GEHALT RETURN Case when Verify_Group_For_User(Session_User, ‚PERSABT‘, ‚MGMT‘) = 1 Then GEHALT When     Verify_Group_For_User(Session_User, ‚PERSSB01‘)   = 1 and KOSTEN_STELLE = 344 Then GEHALT When     Verify_Group_For_User(Session_User, ‚PERSSB02‘)   = 1 and KOSTEN_STELLE between 100 and 199 Then GEHALT Else -9999,99 End ENABLE;

Alter Table YOURSCHEMA.PERSSTAMM Activate Column Access Control;

Abbildung 3: Spaltenberechtigungen – Unterschiedliche Anzeigen für unterschiedliche Gruppenprofile

Beispiel: Spaltenberechtigung basierend auf der User Defined Function (UDF)

Die gleichen Regeln, die für die Anzeige der Gehälter gelten, könnten auch für andere personenbezogene Daten, zum Beispiel Geburtstag, Bankverbindungen etc., gelten. Da die Spaltenberechtigungen für jede Spalte angelegt werden müssen, müssen die gleichen Regeln oft mehrfach codiert oder zumindest kopiert werden. Im Falle einer Änderung müssen alle Kopien gefunden und überarbeitet werden.

Um nicht die gleichen Regeln mehrfach codieren zu müssen, bietet es sich an, die Bedingungen zu kapseln und in einer User Defined Function (UDF) zu hinterlegen. Diese Funktion kann dann beim Erstellen der Spaltenberechtigungen (bzw. im CREATE MASK-Befehl) eingesetzt werden.

Sofern die Regeln geändert werden müssen, muss lediglich die User Defined Function (UDF) abgeändert und neu erstellt werden.

Wichtig:       Für User Defined Functions, die in Verbindung mit Row and Column Access Control eingesetzt werden, muss die Option SECURED im CREATE FUNCTION Statement gesetzt werden.

Im folgenden Beispiel wird zunächst die Funktion CHKPERSABT erstellt. An diese Funktion muss die Kostenstelle übergeben werden, da diese zur Berechtigungsprüfung herangezogen wird.

Sofern der Benutzer zur Anzeige und Verarbeitung der Spaltenwerte berechtigt ist, wird aus der Funktion der Wert 1 zurückgegeben. Sofern keine Berechtigung vorliegt, wird der Wert 0 ausgegeben.

Die Prüfung bzw. die CASE-Anweisung, deren Ergebnis über den RETURN-Befehl zurückgegeben wird, entspricht der Prüfung im vorherigen Beispiel.

— User Defined Function (UDF) ChkPersAbt Create Or Replace Function YOURSCHEMA.CHKPERSABT (ParKostenStelle Integer) Returns Integer Language SQL Modifies SQL Data Deterministic No External Action Called On NULL Input Secured Return Case when Verify_Group_For_User(Session_User, ‚PERSABT‘, ‚MGMT‘) = 1 Then 1 When     Verify_Group_For_User(Session_User, ‚PERSSB01‘) = 1 and ParKostenStelle = 344 Then 1 When     Verify_Group_For_User(Session_User, ‚PERSSB02‘) = 1 and ParKostenStelle between 100 and 199 Then 1 Else 0 End;

Abbildung 4: User Defined Function für Zugriffsberechtigungen

Die zuvor erstellte Funktion wird jetzt im CREATE MASK Statement eingesetzt. Beim Aufruf wird die Kostenstelle aus dem Personalstamm (PERSSTAMM) übergeben. Der Session User wird in der Funktion über das Special-Register ermittelt.

Sofern der Benutzer berechtigt ist, wird das Gehalt angezeigt, ansonsten nur der Default-Wert 9999,99.

— Spaltenmaske Create Or Replace Mask YOURSCHEMA.DSPGEHALT On YOURSCHEMA.PERSSTAMM For Column GEHALT Return Case when CHKPERSABT(Kosten_Stelle) = 1 Then GEHALT Else -9999,99 End ENABLE;

— Aktivierung über Alter Table Alter Table YOURSCHEMA.PERSSTAMM        Activate Column Access Control;

Abbildung 5: Definieren der Spaltenmaske basierend auf einer User Defined Function (UDF)

So viel zu den Techniken, um Row und Column Access Control implementieren und aktivieren zu können.

Im nächsten Artikel wird sich mit einigen Besonderheiten, insbesondere mit Nicht-SQL-Zugriffen wie native I/O- oder CL-Befehlen, zum Beispiel CPYF, oder auch Journalaufzeichnungen beschäftigt.

Viel Spaß derweil beim Ausprobieren.