Dynamische Datenmaskierung durch Verschlüsselung

Dieses Lernprogramm enthält Anweisungen zur Konfiguration und Verwendung der dynamischen Datenmaskierung mit Verschlüsselung im Netezza Performance Server.

Die dynamische Datenmaskierung hilft, den unbefugten Zugriff auf sensible Daten in Datenbankobjekten wie Feldern oder Tabellenspalten zu verhindern, indem sie diese vor nicht privilegierten Benutzern maskiert. Die Maskierungsregeln werden nur auf die Abfrageergebnisse angewandt, die Daten in der Datenbank bleiben davon unberührt, so dass sie von anderen Anwendungen, die Zugriff auf diese Daten benötigen, verwendet werden können.

Informationen zu dieser Task

Das folgende Beispielschema wird in diesem Lehrgang verwendet:

In dieser Aufgabe verwendetes Schema

Die Spalten " customer_name und " customer_address sind die sensiblen Spalten, die maskiert und verschlüsselt werden müssen. Von allen Benutzern, die auf diese Tabellen zugreifen können (d. h. sie haben das " SELECT ), dürfen nur diejenigen, die die Rolle " ACCOUNTS haben, die beiden sensiblen Spalten sehen. Für andere Benutzer werden diese Werte durch Verschlüsselung maskiert.

Die Standardmethode hierfür besteht darin, den Zugriff auf die zugrunde liegenden Tabellen einzuschränken und die Tabellen mit Ansichten zu überlagern, die die Werte in Abhängigkeit von der Rolle des Benutzers ändern. Dazu benennen Sie zunächst die zugrundeliegende Tabelle um und erstellen dann eine Ansicht unter Verwendung des ursprünglichen Namens der Tabelle, die verschlüsselte Werte für die sensiblen Spalten auf der Grundlage der Rollen projiziert, die Zugriff haben.

Vorgehensweise

  1. Definieren Sie den Verschlüsselungscode:

    Dies ist ein einmaliger Schritt.

    Richten Sie einen Verschlüsselungsschlüssel ein, der für die Maskierung verwendet wird, indem Sie eine separate Tabelle erstellen, auf die nur Administratoren Zugriffsrechte und Zugriff haben. Als Datenbankadministrator:
    create table encryption_keys (key varchar(30)); 
    insert into encryption_keys values('<your key value goes here>');
  2. Bereiten Sie die Basistabelle vor, indem Sie sie umbenennen, und erstellen Sie dann eine Maskierungsansicht auf dieser Tabelle.
    Als Datenbankadministrator:
    alter table customers rename to customers_table;
    create or replace view customers as
    select
    customer_id,
    case when current_role = 'ACCOUNTS' then customer_name
    else encrypt(customer_name, (select encryption_keys.key)) end as customer_name,
    case when current_role = 'ACCOUNTS' then customer_address
    else encrypt(customer_address, (select encryption_keys.key)) end as customer_address,
    customer_state,
    customer_zip
    from customers_table;
    Tipp: Anstatt die Daten mit Hilfe von Verschlüsselung zu maskieren, können Sie dasselbe Verfahren auch zum einfachen Maskieren oder vollständigen Ausblenden der Daten verwenden:
    
    CREATE VIEW customers AS 
    SELECT customer_id, 
           CASE WHEN current_role = 'ACCOUNTS' THEN customer_name 
                ELSE '*****' -- this could be NULL if the column was not (VAR)CHAR
           END AS customer_name,
           CASE WHEN current_role = 'ACCOUNTS' THEN customer_address
                ELSE '*****'
           END AS customer_address,
           customer_state,
           customer_zip
    FROM "$customers_base";
    Der Vorteil der Maskierung durch Verschlüsselung besteht jedoch darin, dass Sie bei Bedarf die verschlüsselte Spalte dieser Tabelle mit der verschlüsselten Spalte einer anderen Tabelle verbinden können und die Beziehung zwischen den Zeilen erhalten bleibt. Dies wäre nicht möglich, wenn die Spalte einfach maskiert oder als NULL behandelt würde.
  3. Gewähren Sie den ausgewählten Benutzern die Rolle " ACCOUNTS.

    In diesem Schritt gewähren Sie einer Untergruppe von Benutzern das Privileg, die Rolle " ACCOUNTS zu übernehmen. Beispielsweise benötigen in einer Gruppe von Benutzern " alice, " bob und " clark nur " alice und " bob das Recht auf die Rolle " ACCOUNTS.

    create role accounts;
    grant list on accounts to alice, bob;
    Erteilen Sie als Nächstes die Berechtigung, Abfragen für Kunden (die maskierte Ansicht) und Bestellungen (die Tabelle) auszuführen.
    grant select on  customers, orders  to  public, accounts;

    Jetzt ist die dynamische Maskierung eingerichtet und einsatzbereit.

Ergebnisse

Angenommen, der Benutzer " alice benötigt einen Bericht über die Gesamtsumme von " order_amount, aufgeschlüsselt nach dem Code des Bundeslandes:
select
sum(order_amount) as total,
customer_state
from customers inner join orders using (customer_id)
group by customer_state;
SUMME KUNDEN_STAND
10750.01 NY
2000.00 TX
99.99 XX

Alice kann auf KUNDEN zugreifen (die maskierte Ansicht). Die Spalte " customer_id ist nicht verschlüsselt und wird zur Verknüpfung mit der Tabelle ORDERS verwendet. Die Spalte " customer_state ist nicht verschlüsselt und wird für das Roll-up (nach Bundesland) verwendet. Aber " customer_name und " customer_address sind empfindlich. Wenn sie sich dafür entscheidet, sie einzusehen, werden sie verschlüsselt:

select * from customers order by customer_id;
CUSTOMER_ID KUNDEN_NAME KUNDEN_ADRESSE KUNDEN_STAND KUNDEN_ZIP
10031 &J.&#+RXV /U/%9$,1WZJ\*?<1L3- TX 90210
21451 INR0-F50_0 1U*"\(7H"V;3S%NH0]!= ['T NY 55555
43918 I_*$)VM0X0 0U+;!="XWV;#T&^Y#F#=8[ NY 98765
60844 M>6%(7Q0Y@ -T+#!9$@9T+#T6L(5L0 NY 55554
80008 H>F0*F]0Y@ 1L>B4*7<#U:WN&Z,JISI7YS< XX 0
Wenn Alice auf die unverschlüsselten Spalten zugreifen muss, hat sie das Recht, die Rolle " ACCOUNTS zu übernehmen, die es ihr erlaubt, die unverschlüsselten Quelldaten zu sehen:
set role accounts;
select * from customers order by customer_id;
CUSTOMER_ID KUNDEN_NAME KUNDEN_ADRESSE KUNDEN_STAND KUNDEN_ZIP
10031 Mark F 234 Hauptstraße TX 90210
21451 Clark K 1 Metropolis Ave. NY 55555
43918 Bruce W 1600 Gotham Lane NY 98765
60844 Peter P 500 Fifth Ave. NY 55554
80008 Diana P Insel Themyscira XX 0