background image

www.hakin9.org

hakin9 Nr 9/2007

48

Obrona

systemach zorientowanych obiekto-
wo własne listy kontroli dostępu ma-
ją  obiekty  reprezentujące  zasoby, 

takie jak serwery plików i drukarki. Jedna lista 
ACL może określać prawa dostępu/zezwolenia 
dla wielu różnych użytkowników. Z reguły listę 
kontroli dostępu może zmieniać właściciel ka-
talogu lub pliku. Bezpośrednio po instalacji sys-
temu jest to administrator. Listy kontroli dostę-
pu zaimplementowano m. in. w systemach No-
vell  NetWare,  UNIX,  Microsoft  Windows  NT. 
Taką  definicję  możemy  znaleźć  bardzo  czę-
sto w Internecie i jest to w zasadzie najlepsza i 
najbardziej obszerna definicja ACL. Ta pocho-
dzi  ze  strony  wydawnictwa  Robomatic  (http://
www.robomatic.pl/?id=enchaslo&idh=15
).

Programistyczny  dostęp  do  ACL  możliwy 

jest  poprzez  przestrzeń  nazw  System.Securi-
ty.AccessControl
. Pozwala ona na tworzenie i 
modyfikowanie  arbitralnej  (DACL  –  Discretio-
nary  Access  Control  List
)  oraz  systemowej  li-
sty  kontroli  (SACL  –  System  Access  Control 
List
) dla różnych chronionych obiektów – takich 
jak  pliki,  foldery  i  inne  elementy.  Listy  DACL 
pozwalają  na  programistyczną  kontrolę  do-
stępu  do  chronionych  zasobów,  podczas  gdy 
SACL pozwala na kontrolę polis systemowych. 
Przykład – DACL pozwala na ustawienie dostę-

pu do odczytania pliku dla konkretnej osoby, a 
SACL pozwala na logowanie tego, że ktoś da-
ny plik otworzył. 

Artykuł  ma  na  celu  przedstawienie,  w  ja-

ki sposób wykorzystać dostępne mechanizmy 
przy budowaniu własnych aplikacji.

Poznajemy klasy ACL

Jeśli przyjrzymy się zawartości przestrzeni nazw 
System.Security.AccessControl  to  znajdziemy 
tam bardzo wiele klas odpowiedzialnych za róż-
ne elementy systemu. Możemy je podzielić we-
dług różnych aspektów. Podział taki przedstawia 

Access Control List (ACL) 

– dostęp do obiektów .NET

Artur Żarski

stopień trudności

Access Control List, czyli lista kontroli dostępu, to lista lub tabela 

skojarzona z plikiem bądź obiektem, zawierająca informacje o 

użytkownikach, procesach lub obiektach, które mogą uzyskiwać 

do niego dostęp. Listy ACL są z reguły przypisane do katalogów w 

systemie plików oraz do innych obiektów i określają prawa dostępu 

użytkownika, takie jak prawo odczytu, zapisu, usuwania, itp.

Co powinieneś wiedzieć

•  Aby zrozumieć tekst, należy cechować się pod-

stawową  znajomością  zasad  kontroli  dostępu 
do obiektów w systemie operacyjnym 

•  znać pojęcia ACLACE i pokrewne.

Z artykułu dowiesz się

•  Artykuł ma na celu przybliżenie podstawowych 

elementów mechanizmu ACL 

•  przedstawienie  sposobów  programowania  list 

kontroli dostępu z poziomu Microsoft.NET.

background image

Access Control List 

hakin9 Nr 9/2007

www.hakin9.org

49

Tabela  1.  Nie  jest  to  lista  wszystkich 
dostępnych klas, ale obejmuje najbar-
dziej popularne obszary. 

Hierarchia klas ACL

W  przypadku  większości  scenariuszy 
możliwe jest użycie klas abstrakcyjnych 
zamiast zaawansowanych klas do two-
rzenia i modyfikacji ACL. Dla każdego 
zasobu klasy wyższego poziomu mogą 
przybrać następujące formy:

•   Klasa, która enkapsuluje arbitralne 

listy kontroli dostępu (DACL) oraz 
systemowe  listy  kontroli  (SACL). 
Klasa taka przyjmuje nazwę „<Na-
zwaZasobu>Security
” – dla przy-
kładu FileSecurity oraz Directory-
Security

•   Klasa, która enkapuluje wpis dla 

liście (ACE – Access Control En-
try
). Klasa taka przyjmuje nazwę 
<NazwaZasobu>AccessRule

•   Klasa,  która  enkapsuluje  zawar-

tość wpisu ACE. Klasa taka przyj-
muje nazwę „<NazwaZasobu>Au-
ditRule

Dodatkowo  klasa  może  przyjąć  po-
stać  iteratorów,  które  pozwalają  na 
tworzenie  specyficznych  reguł  do-
stępu oraz audytu.

Dodawanie wpisu do listy

Po utworzeniu wpisu przy użyciu jed-
nej z klas reguł dostępu lub klas re-

guł audytu, możliwe jest przypisanie 
tej reguły do zasobu lub użycie jej do 
skasowania już istniejącej reguły. Li-
sting  1.  pokazuje  przykład  stworze-
nia reguły oraz zastosowania jej na 
pliku.  Fragment  kodu  podaje  regułę 
zabronienia  odczytu  pliku  *.PDF  na 
dysku użytkownikowi lokalnemu ad-
ministrator. Po uruchomieniu tej pro-
cedury  próba  otwarcia  dokumentu 
zakończy się błędem braku dostępu 
(Rysunek  1).  Jeśli  zobaczymy  wła-
ściwości pliku w systemie, to również 

zauważymy, że dla wybranego użyt-
kownika  dostęp  do  pliku  (do  czyta-
nia) jest zabroniony. Przedstawia to 
Rysunek 2.

Aby  skasować  taki  zapis  należy 

wykonać  fragment  załączony  na  Li-
stingu 2. Najważniejsze w obu przy-
padkach  są  metody 

AddAccessRule

 

oraz 

RemoveAccessRule

,  które  usta-

wiają lub usuwają reguły.

Dodając  jakiś  wpis,  który  da-

je  nam  dostęp  do  pewnego  zaso-
bu nie mamy gwarancji, że ta regu-

Tabela 1. 

Zestawienie klas w przestrzeni nazw System.Security.AccessControl

Obszar 

Klasy

Klucze kryptograficzne

CryptoKeySecurity
CryptoKeyAccessRule
CryptoKeyAuditRule

Katalogi

DirectorySecurity 
FileSystemAccessRule 
FileSystemAuditRule 

Pliki

FileSecurity
FileSystemAccessRule 
FileSystemAuditRule 

Muteksy

MutexSecurity
MutexAccessRule 
MutexAuditRule 

Rejestr

RegistrySecurity
RegistryAccessRule 
RegistryAuditRule 

Semafory

SemaphoreSecurity
SemaphoreAccessRule 
SemaphoreAuditRule 

Listing 1. 

Dodanie reguły zabraniającej odczytu dla pliku

FileSecurity _fileSec = 

File

.GetAccessControl

(

@

"c:

\S

DJE_25_PL.pdf"

)

;

FileSystemAccessRule _fileAccessRule = 
  

new

 FileSystemAccessRule

(

@

"localhost

\a

dministrator"

                           FileSystemRights.Read, 
                           AccessControlType.Deny

)

;

_fileSec.AddAccessRule

(

_fileAccessRule

)

;

File

.SetAccessControl

(

@

"c:

\S

DJE_25_PL.pdf"

, _fileSec

)

;

Rysunek 1. 

Błąd odczytu – zakaz dostępu – podczas próby odczytania 

pliku, na którym została założona reguła

Rysunek 2. 

Właściwości pliku w 

systemie operacyjnym. Zabroniony 
odczyt dla wybranego użytkownika

background image

hakin9 Nr 9/2007

www.hakin9.org

Obrona

50

ła  będzie  zastosowana.  Spowodo-
wane jest to tym, że reguły, które za-
braniają dostępu mają wyższy prio-
rytet  i  zawsze  nadpisują  reguły  da-
jące dostęp. 

Każdy  obiekt  zgodny  z  konwen-

cją  <NazwaZasobu>Security  do-
starcza  szeregu  metod  do  dodawa-
nia lub kasowania reguł dostępu i re-
guł audytu. Metody te przedstawione 
są w Tabeli 2.

Reguły propagacji ACL

Podczas  tworzenia  lub  modyfikacji 
odpowiednich  wpisów  (ACE  –  Ac-
cess  Control  Entries
)  dla  kontenera 
obiektów takich jak np. foldery, moż-
liwe  jest  wyspecyfikowanie  sposo-
bu  propagacji  wpisów  na  poszcze-
gólnych  obiektach  wewnątrz  dane-
go kontenera. Dla przykładu możliwe 
jest zastosowanie reguł na podfolde-
rach, a na plikach już nie. 

Reguły  propagacji  kontrolowane 

są przez różne kombinacje flag dzie-
dziczenia oraz flag propagacji. Róż-
ne kombinacje flag i ich efektów pro-
pagacji pokazuje Tabela 3.

Scenariusze 

zastosowania ACL

Przykładów  zastosowań  ACL  jest 
wiele.  Przede  wszystkim  możemy 
stworzyć  aplikację,  dzięki  której  w 
szybki  sposób  możemy  dostać  listę 
obiektów  i  uprawnień  związanych  z 
obiektami.  Listing  3  pokazuje  kod, 
który dla zadanego pliku pokazuje, ja-

Listing 2. 

Usunięcie reguły zabraniającej odczytu pliku

FileSecurity _fileSec = 

File

.GetAccessControl

(

@

"c:

\S

DJE_25_PL.pdf"

)

;

FileSystemAccessRule _fileAccessRule =
    

new

 FileSystemAccessRule

((

@

"localhost

\a

dministrator"

                             FileSystemRights.Read,
                             AccessControlType.Deny

)

;

_fileSec.RemoveAccessRule

(

_fileAccessRule

)

;

File

.SetAccessControl

(

@

"c:

\S

DJE_25_PL.pdf"

, _fileSec

)

;

Tabela 2. 

Zestawienie metod i ich funkcjonalności

Metoda

Opis 

AddAccessRule
AddAuditRule

Wyszukuje takiej reguły dostępu lub audytu, która może być połączona z no-
wą regułą. Jeśli żadna nie zostanie odnaleziona, dodaje nową regułę.

SetAccessRule
SetAuditRule

Kasuje wszystkie reguły dostępu z tymi samymi: użytkownikiem oraz warto-
ścią typu dostępu (AccessControlType i wartości Allow oraz Deny), co w wy-
specyfikowanej regule, a następnie dodaje stworzoną regułę.

ResetAccessRule

Działa podobnie jak SetAccessRule, ale nie zwraca uwagi na wartość Acces-
sControlType
.

RemoveAccessRule
RemoveAuditRule

Poszukuje reguł kontroli dostępu dla tych samych: użytkownika oraz wartości 
AccessControlType (Allow lub Deny), jak we wskazanej regule, a także z od-
powiednią flagą propagacji i dziedziczenia. Jeśli znajdzie, to prawa zawierają-
ce wyspecyfikowaną regułę zostają skasowane z reguły.

RemoveAccessRuleAll
RemoveAuditRuleAll

Szuka wszystkich reguł z tymi samymi: użytkownikiem oraz wartością Acces-
sControlType
, co w wyspecyfikowanej regule i – jeśli znajdzie – kasuje te reguły.

RemoveAccessRuleSpecific
RemoveAuditRuleSpecific

Wyszukuje wszystkich reguł, które dokładnie pasują do wyspecyfikowanych 
reguł i – jeśli znajdzie – kasuje te reguły.

Rysunek 3. 

Wynik działania programu z Listingu 3

Rysunek 4. 

Lista uprawnień dla pliku konfiguracyjnego web.config

background image

Access Control List 

hakin9 Nr 9/2007

51

kie uprawnienia ma dana grupa użyt-
kowników  lub  użytkownik.  Kod  ten 
składa się z trzech części. Pierwsza 
z nich to otwarcie wybranego pliku. W 
drugiej  części  dla  wcześniej  wybra-
nego pliku pobieramy listę uprawnień. 
W  ostatnim  kroku  wypisujemy  ele-
menty  dostępne  na  liście  uprawnień 
–  w  kolejności:  użytkownik/grupa, 
uprawnienie  oraz  typ  uprawnienia 
–  zabroniony/dozwolony.  Rysunek  3 
pokazuje wynik działania programu.

Oczywiście spośród innych sce-

nariuszy  możemy  wyobrazić  sobie 
sytuację, kiedy nasz system automa-
tycznie generuje jakieś pliki i nadaje 
im uprawnienia. Kroki, jakie należa-
łoby wykonać to:

•   Stworzenie  jednej  lub  wielu  re-

guł reprezentowanych przez kla-
sy FileSystemAccessRule lub Fi-
leSystemAuditRule
,

•   Dodanie  wcześniej  stworzonych 

obiektów do nowych obiektów re-
prezentujących  klasy  FileSecuri-
ty
 lub DirectorySecurity,

•   Utworzenie pliku lub folderu z wy-

korzystaniem wcześniej stworzo-
nych reguł. Dla przykładu można 
użyć następującej deklaracji:

Ciemna strona mocy

Powiedzieliśmy dużo o zaletach ACL 
i  sposobie  programowania.  Istnieje 
również  druga  strona  medalu.  Jeśli 
nasz  system  będzie  źle  skonfiguro-
wany (np. w przypadku instalacji bar-
dzo ważnej aplikacji WWW), niepo-
wołany użytkownik zyska możliwość 
uzyskania  danych  zawartych  w  na-
szych plikach.

Wyobraźmy  sobie  sytuację,  w 

której  plik  konfiguracyjny  aplikacji 
WWW  –  web.config  –  będzie  mieć 
takie  same  uprawnienia,  jak  nasz 
plik  i  użytkownik,  z  uprawnienia-
mi  którego  działa  nasza  aplikacja 
WWW.  Możliwa  jest  sytuacja,  kie-
dy  napiszemy  aplikację,  która  bę-
dzie poszukiwać określonych plików 
i wyciągać z nich dane. Jeśli przyj-
rzymy  się  Rysunkowi  4,  to  może-
my zauważyć, że do naszego pliku 
konfiguracyjnego  ma  dostęp  użyt-
kownik  IIS_IUSRS.  Jeśli  plik  ten 
będzie  zawierać  odpowiednie  in-

background image

hakin9 Nr 9/2007

www.hakin9.org

Obrona

52

formacje,  to  w  bardzo  prosty  spo-
sób  będziemy  mogli  uzyskać  dane 
o  użytkowniku  oraz  haśle,  na  któ-
rym działa aplikacja. Trzeba pamię-
tać, aby brać to pod uwagę i odpo-
wiednio konfigurować dostęp do pli-
ków. Dodatkowo uważać trzeba, je-

śli  nasza  strona  WWW  daje  możli-
wość ładowania aplikacji przy wyko-
rzystaniu kontrolki FileUpload – dla-
czego? Dlatego, że użytkownik mo-
że wgrać plik o nazwie web.config
który będzie zawierał zupełnie inne 
informacje niż oczekuje tego nasza 

aplikacja. Może się to okazać zgub-
ne  przy  zastosowaniu  ataków  typu 
Denial-of-Service

Podsumowanie

Mechanizm Access Control List defi-
niuje nam sposób dostępu do obiek-
tów.  Microsoft.NET  bardzo  mocno 
wspiera  ACL  oraz  możliwości  opro-
gramowania  go,  aby  aplikacje,  któ-
re tworzymy, mogły działać zgodnie 
z regułami bezpieczeństwa obowią-
zującymi  w  naszych  firmach.  Nale-
ży  oczywiście  uważać,  w  jaki  spo-
sób używamy tego sposobu dostępu 
do  uprawnień,  ponieważ  przez  nie-
dopatrzenie możemy tak poustawiać 
uprawniania  do  plików  lub  folderów, 
że nawet sami (jako administratorzy) 
będziemy mieć problem z dostępem 
do odpowiednich zasobów. l

O autorze

Autor  jest  pracownikiem  firmy  Micro-
soft. Na co dzień zajmuje się m. in. two-
rzeniem  rozwiązań  w  oparciu  o  SQL 
Server w różnych aspektach – bazy re-
lacyjne, usługi integracyjne, usługi ana-
lityczne.  Jest  certyfikowanym  admini-
stratorem baz danych (MCDBA). Kon-
takt z autorem: arturz@microsoft.com

Tabela 3. 

Zestawienie flag i odpowiadające im sposoby propagacji

Kombinacja flag

Propagacja

Brak flag

Docelowy folder

ObjectInherit

Docelowy folder, obiekt podrzędny (plik), obiekt pod-
rzędny do obiektu podrzędnego (plik) 

ObjectInherit i NoPropagateInherit 

Docelowy folder, obiekt podrzędny (plik)

ObjectInherit i InheritOnly

Obiekt podrzędny (plik), obiekt podrzędny do obiektu 
podrzędnego (plik)

ObjectInherit, InheritOnly oraz NoPropagateInherit

Obiekt podrzędny (plik)

ContainerInherit

Docelowy folder, podfolder, podfolder dla podfolderu

ContainerInherit oraz NoPropagateInherit

Docelowy folder, podfolder

ContainerInherit oraz InheritOnly

Podfolder, podfolder dla podfolderu

ContainerInherit, InheritOnly, oraz NoPropagateInherit

Podfolder

ContainerInherit oraz ObjectInherit

Docelowy folder, podfolder, obiekt podrzędny (plik), pod-
folder dla podfolderu, obiekt podrzędny do obiektu pod-
rzędnego (plik)

ContainerInherit, ObjectInherit oraz NoPropagateInherit Folder docelowy, podfolder, obiekt podrzędny (plik)
ContainerInherit, ObjectInherit oraz InheritOnly

Podfolder, obiekt podrzędny (plik), podfolder dla podfol-
deru, obiekt podrzędny do obiektu podrzędnego (plik)

ContainerInherit, ObjectInherit, NoPropagateInherit, In-
heritOnly

Podfolder, obiekt podrzędny (plik)

Listing 3. 

Kod wypisujący listę uprawnień dla pliku.

FileStream _file = 

new

 FileStream

(

@

"c:

\S

DJE_25_PL.pdf"

,

              FileMode.Open, 
              FileAccess.ReadWrite

)

;

FileSecurity _sec = _file.GetAccessControl

()

;

foreach

 

(

FileSystemAccessRule rule in _sec.GetAccessRules

(

true,   

    true, typeof

(

System.Security.Principal.NTAccount

)))

 

{

listBox1.Items.Add

(

rule.IdentityReference.ToString

()

 + 

" - "

 + 

                   rule.FileSystemRights.ToString

()

 + 

" - "

 + 

                   rule.AccessControlType.ToString

())

;

}

Listing 4. 

Stworzenie pliku lub folderu za pomocą wcześniejszych reguł

System.IO.

File

.Create

(

System.

String

,System.Int32,System.IO.FileOptions,Syste

m.Security.AccessControl.FileSecurity

)

System.IO.Directory.CreateDirectory

(

System.

String

,System.Security.AccessCont

rol.DirectorySecurity

)

Listing 5. 

Fragment kodu umożliwiający uzyskanie informacji 

o użytkowniku i haśle

<

identity impersonate=

"true"

 

 

 

userName=

"domena\mojUzytkownik"

 

 

 

password=

"TrudneHaslo"

 /

>