
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 enableddm
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 oDAS. VAR IRole oRole. VAR LOGICAL lResult. ASSIGN oDAS = NEW DataAdminService(LDBNAME("DICTDB")). oRole = oDAS:NewRole("myRole"). oRole:Description = "Role for DDM Admin". oRole:IsDDM = true. lResult = oDAS:CreateRole(oRole). DELETE OBJECT oDAS.
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. ASSIGN 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 oDAS. VAR IGrantedRole oRole. VAR IUser oUser. VAR LOGICAL lResult = FALSE. ASSIGN oDAS = NEW DataAdminService(LDBNAME("DICTDB")). oRole = oDAS:NewGrantedRole(). oRole:Role = oDAS:GetRole("myRole"). oUser = oDAS: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 = oDAS: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.