donderdag 24 januari 2008

Eigen fout

Iedereen maakt wel eens fouten, opzich geen probleem maar ik maak ook wel eens fouten.

Deze week geef ik de advanced .net framework cursus met daarin een hoofdstuk over security. In een van de voorbeelden die ik gemaakt heb gebeurd het volgende:

Er is een gebruiker met de naam Dummy
De Dummy gebruiker heeft geen rechten op de c:\
De code maakt en verwijderd vervolgens een bestand in de de temp directory -> securtiy exception
Via een stukje code krijgt de Dummy gebruiker rechten op de c:\temp\ directory
De code maakt en verwijderd vervolgens een bestand in de de temp directory zonder exception

Na het aanmaken van de dummy gebruiker zag ik dat deze gebruiker volledige rechten had op de c:\ schijf omdat de dummy gebruiker Administrator rechten had. Toen kon ik twee dingen doen:

De dummy gebruiker 'normal' user maken
De Administrator groep als rechthebbende van de c:\ schijf verwijderen.

Slim als ik ben heb ik natuurlijk gekozen voor beide oplossingen. Vervolgens was er geen gebruiker meer op het systeem die volledige rechten had op de c:\ schijf. De administrators hadden geen 'Full' rechten meer en alle users van het systeem hadden read en write rechten op de c:\ schijf.

Omdat ik VS.net 2008 geinstalleerd heb met de setup /q is de installatie verlopen onder het system account met 'Full' rechten op het hele systeem (is dat geen vunerability?)

Nadat ik dus het probleem van de rechten had gevonden moest ik het ook nog oplossen. Helaas was er geen gebruiker meer met voldoende rechten op de c:\ schijf om de rechtenstructuur aan te passen. Er was geen gebruiker meer met 'Full' rechten. Anders dan de system gebruiker en met de system gebruiker kan je niet inloggen.

Onder windows is er echter een tooltje met de naam TAKEOWN dat gebruikt kan worden om de ownership van bestanden over te nemen zolang je maar als administrator draait. De Takeown heeft ook een UI verstopt bij:

drive->properties->advanced->owner

En dan maar kiezen voor "change owner to"

De code die je kan gebruiker om een overzicht van rechten te maken:
DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(tbFileLocation.Text));
DirectorySecurity ds = di.GetAccessControl();
AuthorizationRuleCollection rules = ds.GetAccessRules(true, true, typeof(NTAccount));
textBox1.Text = "";
foreach (FileSystemAccessRule fr in rules)
{
textBox1.Text += fr.IdentityReference + br;
textBox1.Text += fr.AccessControlType + br;
textBox1.Text += fr.FileSystemRights + br;
textBox1.Text += fr.InheritanceFlags + br;
textBox1.Text += fr.PropagationFlags + br;
textBox1.Text += fr.IsInherited + br;
textBox1.Text += br;
}
}
-----------------------------------------------
De code die je kan gebruiken om rechten toe te voegen:
DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(tbFileLocation.Text));

DirectorySecurity ds = di.GetAccessControl();

removeUserRights(ds, "Dummy");

FileSystemRights fsRights = FileSystemRights.FullControl;
FileSystemAccessRule accessRule = new FileSystemAccessRule("Dummy", fsRights, AccessControlType.Allow);

ds.AddAccessRule(accessRule);
di.SetAccessControl(ds);

-----------------------------------------------

DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(tbFileLocation.Text));
DirectorySecurity ds = di.GetAccessControl();

removeUserRights(ds, "Dummy");

FileSystemRights fsRights = FileSystemRights.Write;
FileSystemAccessRule accessRule = new FileSystemAccessRule("Dummy", fsRights, AccessControlType.Deny);
ds.AddAccessRule(accessRule);

di.SetAccessControl(ds);

-----------------------------------------------

En de helper functie

private void removeUserRights(DirectorySecurity ds, string username)
{
AuthorizationRuleCollection rules = ds.GetAccessRules(true, true, typeof(NTAccount));
foreach (FileSystemAccessRule fr in rules)
{
if (fr.IdentityReference.ToString().IndexOf(username) >= 0)
{
ds.RemoveAccessRule(fr);
}
}
}

Geen opmerkingen: