Hoofdstuk 11 - Les 3

CAS kan op twee manieren worden gebruikt. Declaratief, waarbij de compiler de security checks uitvoert voordat de code uitgevoerd wordt of imperatief, waarbij de code zelf de security checks uitvoert en bepaalt at er gebeurt als de check faalt.

Er zijn vier opties voor imperatief en declaratief permissions voor een method:

  1. Assert – Instrueert runtime om aanvragers met onvoldoende rechten te negeren. Assemblies moeten de Assert Any Permission That Has Been Granted security permission setting hebben.
  2. Demand – Instrueert runtime om een exception te gooien als de aanvrager niet de juiste permissions hebben.
  3. Deny – Runtime vermindert de method’s toegang door de gespecificeerde permission te verwijderen.
  4. PermitOnly – Intrueert runtime om de method’s toegang te verminderen door alle permissions te verwijderen behalve de gespecificeerde permission.

Er zijn twee declaratieve aanvragen die niet van toepassing zijn voor op imperatief:

  1. LinkDemand – Veroorzaakt runtime een exception als de directe aanvrager, maar niet alle aanvragers hoger in de stack, niet de juiste machtigingen heeft.
  2. InheritanceDemand – Instrueert runtime een exception te gooien als de assembly waarvan geerft wordt niet de juiste permissions heeft.

Om het te verduidelijken: Stel een groep voor van vier gasten die toegang hebben tot een exclusieve party. De host (de method) heeft een uitsmijter (runtime) gehuurd om ervoor te zorgen dat alleen gasten (aanroepende assemblies) met een uitnodiging (CAS permission) binnen mogen komen op de party.

Als de host InvitedGuests.LinkDemand aanroept, checkt de uitsmijter de uitnodiging van de eerste gast en laat vervolgens iedereen toe op het feest. Dit is snel, maar het kan voorkomen dat ongeauthoriseerde mensen het feest sneaky binnenkomen. Als de host InvitedQuests.Demand aanroept, checkt de uitsmijter de uitnodiging van iedere gast.. Dit proces neemt meer tijd in beslag, maar verzekerd je er wel van dat niemand stiekum kan binnenkomen.

Om het proces te versnellen om uitndigingen te checken, de eerste gast kan gebruik maken van InvitedGuests.Assert om de uitsmijter ervan te verzekeren dat alle gasten in de Group zijn uitgenodigd, aangenomen dat de uitsmijter de eerste gast genoeg vertrouwd.

Als de host zou willen dat iedereen danst op het feest (en nooit iets anders doet), dan kan de host Dancing.PermitOnly gebruiken om de uitsmijter te instrueren dat mensen op de dansvloer blijven. Als de host wil dat mensen alles doen behalve dansen, dan moet hij Dancing.Deny aanroepen.

Gebruik de volgende richtlijnen om te bepalen welke CAS methode te gebruiken:
  • Gebruik SecurityAction.PermitOnly declaraties om te bepalen welke permissies er beschikbaar zijn voor een method. Som elke permissie op die de method nodig heeft.
  • Gebruik SecurityAction.Deny om de beschikbare permissies voor elke methode te verfijnen
  • Gebruik CodeAccessPermission.PermitOnly om imperatief de permissies te verminderen als een geldeelte van een methode minder permissies nodig heeft dan de rest van de methode. Dit is vooral belangrijk als objecten worden aangeroepen die aangemaakt zijn door 3rd parties.
  • Gebruik CodeAccessPermission.Assert als het toegestaan is als partially trusted code een methode aanroepen die permissies nodig hebben die de aanroeper eventueel niet heeft.
  • Gebruik CodeAccessPermission.Demand alleen als de assembly customized functionaliteit implementeert die geen gebruik maakt van ingebouwde .NET functionaliteit, zoals unmanaged code.

Alleen SecurityAction.Demand en SecurityAction.LinkDemand gooien runtime een exception als de CAS permissie niet aanwezig is. Het verschil is dat Demand elke aanroepers checkt en LinkDemand alleen de directe aanroeper.
Vier van de zes SecurityAction enumeraties, Assert, Demand, Deny en PermitOnly hebben corresponderende CodeAccessPermission methods met dezelfde naam en functionaliteit. De SecurityAction enumeraties worden voor declaratieve (compiler) beveiliging gebruikt en de CodeAccessPermission methods worden imperatief (in code) gebruikt.
public static void CreateProgramFolder()
{
try
{
FileIOPermission fp = new FilIOPermission(FileIOPermissionAccess.Write, @"C:\Program Files\");
fp.Demand();

// logic
}
catch
{
// error handling
}
}
het voordeel van imperatief gebruik is dat exceptions op een notrmale manier kunnen worden afgehandeld. Als je dit niet wilt, gebruik dan declaratieve declaraties.

Met de System.Security.SecurityManager.IsGranted kan gekeken worden of de assembly een bepaalde CAS permission heeft:
public static void CreateProgramFolder()
{
try
{
FileIOPermission fp = new FilIOPermission(FileIOPermissionAccess.Write, @"C:\Program Files\");
fp.Demand();

if(SecurityManager.IsGranted(fp) == true)
// Assembly mag lezen
else
// Assembly mag niet lezen

}
catch
{
// error handling
}
}
Tip Gebruik RequestRefuse en RequestOptional voor assembly declaraties en Deny en PermitOnly voor methods.

Indien bepaalde permissies eerder geblokkeerd zijn in de code en deze zijn in een later stadium weer benodigd gebruik dan de System.Security.CodeAccessPermission.RevertDeny of System.Security.CodeAccessPermission.RevertPermitOnly static methods.

try
{
// some logic
}
catch
{
EventLogPermission ep = new EventLogPermission(PermissionState.Unrestricted);
ep.PermitOnly();

// Log event code goed here
CodeAccessPermission.RevertPermitOnly();
}
CAS aanvragen verbeteren de veiligheid van een assembly, maar kan de performance naar beneden halen. De Demand permissie methode is kostbaar omdat het de runtime forceert om de permissie van elke aanroeper systematisch te checken. LinkDemand is een manier om de performance manier te verbeteren, maar is niet volledig veilig. Een andere techniek is de Assert methode, welke ervoor zorgt dat de runtime de security checks passeert. Permissie objecten met de Assert methode staan in voor alle aanroepers.

Permissie sets zijn collectie van permissies die imperatief gebruikt kunnen worden op dezelfde manier als individuele permissies:
PermissionSet ps = new PermissionSet(PermissionState.None);

ps.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, @"C:\Windows"));
ps.AddPermission(new FileIOPermission(FileIOPermissionAccess.Write, @"C:\Inetpub"))
ps.AddPermission(new RegistryPermission(RegistryPermissionAccess.Write, @"HKEY_LOCAL_MACHINE\Software"));

ps.Demand();
Assert kan eenmaal per methode aangeroepen worden, gebruik daarom permissie sets als assert vaker moet worden aangeroepen.

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren