Dynamic Data Masking I
Na początku chciałbym podać nieco wiadomości wprowadzających do Dynamic Data Masking (DDM). Najprościej mówiąc jest to zabezpieczenie danych w bazie na poziomie logicznym, ale definiowane przez administratora.
Wyobrażmy sobie sytuację gdy deweloper tworzy aplikację, w której wyświetlane są dane wraźliwe jak np. numer telefonu, adres lub nawet pesel czy miesięczne zarobki. Z drugiej strony są osoby w firmie, które powinny te dane widzieć. Możemy to rozwiązać na poziomie pisania aplikacji lub zrobić to globalnie na poziomie bazy. Takie rozwiązanie zmusza każdego użytkownika do zalogowania się w bazie i, w zależności od uprawnień, daje wgląd do wybranych pól w tabelach.
Administrator DDM (lub administrator zabezpieczeń) może skonfigurować maskę dla pól tabeli, która ukrywa poufne dane w zestawie wyników zapytania. Kontroluje on również uprawnienia dostępu użytkowników do przeglądania niezamaskowanych wartości określonych pól.
Żeby korzystać z DDM trzeba mieć licencję na dodatek The OpenEdge Advanced Security (Progress OEAS) i serwer bazy danych Enterprise. Minimalna wersja to 12.8.4.
OK, tworzymy testową bazę, kopię bazy sports2020 i włączamy funkcję DDM.
proutil sports2020 -C enableddm
Sprawdzamy czy funkcja ta jest dodana (na razie jeszcze nieaktywna).
proutil sports2020 -C describe

Pierwszym krokiem jest dodanie użytkowników do bazy. W dokumentacji online jest to zrealizowane przez program w obiektowym ABL. Ja zrobię to standardowo w narzędziu Data Administration -> Admin -> Security -> Edit User List.
Dodaję użytkowników: Admin, User. Oczywiście można wykorzystać tutaj konta użytkowników zdefiniowanych nie w bazie ale w zewnętrznych systemach uwierzytelniania.

Loguję się jako Admin i ustawiam go jako security adminisrtator Admin -> Security -> Security Administrators.

Warto zablokować dostęp podczas runtime’u dla niezalogowanych użytkowników oraz ustawić sprawdzanie uprawnień kont także podczas runtime’u.Admin -> Database Options

Aby określić uprawnienia użytkownika do dostępu do zamaskowanych danych, trzeba utworzyć w kodzie ABL rolę dla użytkowników zdefiniowanych w bazie (operacja mapowania użytkownika do roli).
Poniższy przykładowy kod tworzy rolę myRole, którą wykorzystamy do zdefiniowania uprawnień przyznawanych użytkownikom do demaskowania danych:
USING OpenEdge.DataAdmin.*.
VAR DataAdminService service.
VAR IRole oRole.
VAR LOGICAL lResult.
service = NEW DataAdminService(LDBNAME("DICTDB")).
oRole = service:NewRole("myRole").
oRole:Description = "Role for DDM Admin".
oRole:IsDDM = true.
lResult = service:CreateRole(oRole).
DELETE OBJECT service.
Następnym krokiem jest utwórzenie tagu autoryzacji i powiązania go z rolą utworzoną w poprzednim kroku. Tag autoryzacji ustanawia połączenie między zdefiniowanymi przez użytkownika rolami DDM a polami tabeli, do których ma zostać zastosowana maska. Nazwa tagu musi zaczynać się od #DDM_SEE_.
Poniższy kod kojarzy tag autoryzacji #DDM_SEE_ContactInfo z rolą myRole:
USING OpenEdge.DataAdmin.*.
VAR DataAdminService service.
VAR IAuthTag oTag.
VAR LOGICAL lReturn.
service = NEW DataAdminService (LDBNAME("DICTDB")).
oTag = service:NewAuthTag("#DDM_SEE_ContactInfo").
oTag:RoleName = service:GetRole("myRole"):Name.
oTag:description = "To see contact info".
lRETURN = service:CreateAuthTag(oTag).
No i wreszcie przydzielamy zdefiniowaną rolę użytkownikowi Admin.
USING OpenEdge.DataAdmin.*.
VAR DataAdminService service.
VAR IGrantedRole oRole.
VAR IUser oUser.
VAR LOGICAL lResult = FALSE.
service = NEW DataAdminService(LDBNAME("DICTDB")).
oRole = service:NewGrantedRole().
oRole:Role = service:GetRole("myRole").
oUser = service:GetUser("Admin").
IF VALID-OBJECT(oRole:Role) AND VALID-OBJECT(oUser) THEN DO:
oRole:Grantee = oUser:Name.
IF oUser:Domain:Name NE "" THEN
oRole:Grantee = oRole:Grantee + "@" + oUser:Domain:Name.
oRole:CanGrant = false. // Cannot grant to others.
// Granting Role to Admin
lResult = service:CreateGrantedRole(oRole).
END.
Następnym krokiem jest zdefiniowanie maski dla wybranych pól i przetestowanie przykładów, ale tym zajmiemy się w następnym artykule. Teraz chciałbym pokazać gdzie można szukać informacji o zefiniowanych rolach i tagach.
Elementy te zostały dodane do metaschematu bazy, a jeśli tak, to są w określonych nowych tablicach VST.
Po pierwsze możemy zrzucić dane do plików poprzez opcję w Data Administration Admin -> Dump Data and Definitions -> Security Permissions.
Poniżej widać pierwsze linie z dwóch plików, w których są zdefiniowane przez nas dane.

_sec-auth-tag.d
"myRole" "#DDM_SEE_ContactInfo" "Can see contact info" ...
_sec-granted-role.d
"f82629bb-b26d-6b83-d314-c5d870ea3fee" "Admin" "myRole" no "Admin" "" ...
Informacja w plikach pochodzi z poniższych ukrytych tablic VST.

Wykorzystując je możmy sami wygenerować potrzebne informacje jak w poniższym przykładzie.
FIND FIRST _sec-granted-role NO-LOCK.
DISPLAY _grantee _role-name WITH SIDE-LABELS.
FIND FIRST _sec-auth-tag NO-LOCK.
DISPLAY _sec-auth-tag._role-name _auth-tag SKIP
_description WITH SIDE-LABELS.

OK, następnym razem weźmiemy na warsztat tworzenie różnych masek i testowanie programów.