Zarządzanie uprawnieniami w Microsoft .NET
W poprzednim poście dotyczącym migracji pracowników w działach IT wspominałem o narzędziu wspomagającym zarządzanie udziałami sieciowymi w Microsoft Windows. Kontynuując ten temat chciałbym skupić się na jednym z problemów, o którym warto pamiętać tworząc tego typu rozwiązanie.
Przechodząc bezpośrednio do tematu, programiści są przyzwyczajeni, że pobrany dowolny obiekt zapisany bez żadnych zmian nie powinien wprowadzić żadnych zmian w systemie. W ten sposób działa np. wykrywanie zmian w ORM takich jak Entity Framework.
Z przyczyn znanych tylko programistom Microsoftu pracującym nad rozwojem .NET frameworka zasada ta niestety nie obowiązuje w przypadku reguł dostępu do plików i folderów. W środowisku, w którym istnieje wiele domen może okazać się, że sam proces odczytania a następnie zapisania ponownie „tych samych” reguł może zmodyfikować fizyczne uprawnienia na dysku.
Pisząc kod pobierający i modyfikujący uprawnienia użytkowników możemy posługiwać się zarówno nazwą konta (System.Security.Principal.NTAccount) albo jego identyfikatorem SID (System.Security.Principal.SecurityIdentifier). Chociaż wygodniejsze wydaje się posługiwanie zrozumiałą nazwą konta, niż technicznym identyfikatorem, to w przypadku wyboru pierwszej metody mogą nas czekać niemiłe niespodzianki.
Rozważmy następujący przypadek.
- W organizacji istnieją równolegle dwie domeny STARA i NOWA.
- Użytkownicy zostali przeniesieni ze starej do nowej.
- Mamy następujące konta STARA\marcinz (SID1) i NOWA\marcinz (SID2).
- Mamy serwer w domenie NOWA z uprawnieniem na pliku dla konta STARA\marcinz
Jeżeli pobierzemy uprawnienia drugą metodą to pobierzemy uprawnienie dla SID1 i dokładnie tak samo zapiszemy. Jeżeli pobierzemy uprawnienia z nazwami kont, wówczas jako nazwa konta dla SID1 zostanie zwrócona nazwa „NOWA\marcinz”. Zapisując tą regułę zmienimy uprawnienia na dysku, mimo że nic nie zmienialiśmy.
Dzieje się tak z uwagi na parametr konta w AD o nazwie SID-History. Konto NOWA\marcinz oprócz identyfikatora SID2 ma również ustawiony parametr SID-History=SID1. Dlatego kod .NET działając w domenie NOWA zwróci nazwę NOWA\marcinz gdyż znalazł, że konto NOWA\marcinz jest zmigrowane konto STARA\marcinz.
Jest to tylko jeden z przypadków pokazujących, że tworzenie oprogramowania do zarządzania infrastrukturą IT w firmach nie jest tak proste, jak mogłoby się na pierwszy rzut oka wydawać.
Grafika tytułowa http://negativespace.co/photos/computer-stock-photo-3/
0 komentarze