Főbb biztonsági fogalmak
Feljegyzés
Ez a cikk a Windowsra vonatkozik.
A ASP.NET Core-ról további információt a ASP.NET Core Security áttekintésében talál.
A .NET szerepköralapú biztonságot nyújt a mobilkódokkal kapcsolatos biztonsági problémák kezeléséhez, valamint olyan támogatás biztosításához, amely lehetővé teszi az összetevők számára, hogy meghatározzák, hogy a felhasználók milyen műveletekre jogosultak.
Típusbiztonság és biztonság
A típusbiztos kód csak a hozzáférésre jogosult memóriahelyeket éri el. (Ebben a vitafórumban a típusbiztonság kifejezetten a memóriatípus biztonságára vonatkozik, és tágabb értelemben nem tévesztendő össze a típusbiztonsággal.) A típusbiztos kód például nem tudja beolvasni egy másik objektum privát mezőiből származó értékeket. Csak jól definiált, engedélyezett módon fér hozzá a típusokhoz.
Az igény szerinti (JIT-) fordítás során egy opcionális ellenőrzési folyamat megvizsgálja a JIT által natív gépi kódba lefordítandó metódus metaadatait és közös köztes nyelvét (CIL) annak ellenőrzéséhez, hogy biztonságosak-e. Ez a folyamat kimarad, ha a kód rendelkezik engedéllyel az ellenőrzés megkerülésére. Az ellenőrzéssel kapcsolatos további információkért lásd a felügyelt végrehajtási folyamatot.
Bár a típusbiztonság ellenőrzése nem kötelező a felügyelt kód futtatásához, a típusbiztonság kulcsfontosságú szerepet játszik a szerelvény elkülönítésében és a biztonsági kényszerítésben. Ha a kód típusa biztonságos, a közös nyelvi futtatókörnyezet teljesen el tudja különíteni a szerelvényeket egymástól. Ez az elkülönítés biztosítja, hogy a szerelvények ne befolyásolhassák hátrányosan egymást, és növelik az alkalmazások megbízhatóságát. A típusbiztos összetevők akkor is biztonságosan futtathatók ugyanabban a folyamatban, ha különböző szinteken megbízhatók. Ha a kód nem biztonságos, nemkívánatos mellékhatások léphetnek fel. A futtatókörnyezet például nem tudja megakadályozni, hogy a felügyelt kód natív (nem felügyelt) kódba hívható be, és rosszindulatú műveleteket hajt végre. Ha a kód típusa biztonságos, a futtatókörnyezet biztonsági kényszerítési mechanizmusa biztosítja, hogy csak akkor fér hozzá a natív kódhoz, ha erre engedéllyel rendelkezik. A nem biztonságos típusú kódokat a megadott számtaggal SkipVerification kell megadni SecurityPermission a futtatáshoz.
Feljegyzés
A Code Access Security (CAS) elavult a .NET-keretrendszer és a .NET összes verziójában. A .NET legújabb verziói nem tartják tiszteletben a CAS-megjegyzéseket, és cas-okkal kapcsolatos API-k használata esetén hibákat okoznak. A fejlesztőknek alternatív módot kell keresnie a biztonsági feladatok elvégzésére.
Rendszerbiztonsági tag
A rendszerbiztonsági tag egy felhasználó identitását és szerepkörét jelöli, és a felhasználó nevében jár el. A .NET szerepköralapú biztonsága háromféle rendszernevet támogat:
Az általános tagok olyan felhasználókat és szerepköröket jelölnek, amelyek függetlenek a Windows felhasználóitól és szerepköreiétől.
A Windows-tagok a Windows-felhasználókat és a szerepköreiket (vagy azok Windows-csoportjait) képviselik. A Windows-tagok megszemélyesíthetnek egy másik felhasználót, ami azt jelenti, hogy az egyszerű felhasználó hozzáférhet egy erőforráshoz a felhasználó nevében, miközben megjeleníti az adott felhasználóhoz tartozó identitást.
Az egyéni tagok az adott alkalmazáshoz szükséges módon bármilyen módon meghatározhatók. Kiterjeszthetik a megbízó identitásának és szerepköreinek alapfogalmait.
További információ: Egyszerű és identitásobjektumok.
Hitelesítés
A hitelesítés a rendszerbiztonsági tagok személyazonosságának felderítésére és ellenőrzésére szolgál a felhasználó hitelesítő adatainak vizsgálatával és a hitelesítő adatok hitelesítésével egy adott szolgáltatóval szemben. A hitelesítés során beszerzett információk közvetlenül felhasználhatók a kóddal. A .NET szerepköralapú biztonság használatával is hitelesítheti az aktuális felhasználót, és meghatározhatja, hogy engedélyezi-e az egyszerű felhasználó számára a kód elérését. Tekintse meg a WindowsPrincipal.IsInRole metódus túlterheléseit, például, hogyan hitelesítheti az egyszerűt adott szerepkörök esetében. A túlterhelés használatával WindowsPrincipal.IsInRole(String) például megállapíthatja, hogy az aktuális felhasználó tagja-e a Rendszergazda istrators csoportnak.
Ma számos hitelesítési mechanizmust használnak, amelyek közül sok a .NET szerepköralapú biztonságával használható. A leggyakrabban használt mechanizmusok egyike az alapszintű, a kivonatoló, a Passport, az operációs rendszer (például az NTLM vagy a Kerberos) vagy az alkalmazás által meghatározott mechanizmusok.
Példa
Az alábbi példa megköveteli, hogy az aktív tag rendszergazda legyen. A name
paraméter az null
, amely lehetővé teszi, hogy a rendszergazdai jogosultságú felhasználók kielégítse az igényeket.
Feljegyzés
Windows Vista rendszerben a felhasználói fiókok felügyelete (UAC) határozza meg a felhasználó jogosultságait. Ha tagja a beépített Rendszergazda istrators csoportnak, két futásidejű hozzáférési jogkivonatot kap: egy standard felhasználói hozzáférési jogkivonatot és egy rendszergazdai hozzáférési jogkivonatot. Alapértelmezés szerint a szokásos felhasználói szerepkörben van. Ahhoz, hogy végrehajtsa azt a kódot, amely megköveteli, hogy rendszergazda legyen, először emelje a jogosultságokat a standard felhasználóról a rendszergazdai jogra. Ezt az alkalmazás indításakor megteheti úgy, hogy a jobb gombbal az alkalmazás ikonra kattint, és jelzi, hogy rendszergazdaként szeretne futni.
using namespace System;
using namespace System::Security;
using namespace System::Security::Permissions;
using namespace System::Security::Policy;
using namespace System::Security::Principal;
int main(array<System::String ^> ^args)
{
System::String^ null;
AppDomain::CurrentDomain->SetPrincipalPolicy(PrincipalPolicy::WindowsPrincipal);
PrincipalPermission^ principalPerm = gcnew PrincipalPermission(null, "Administrators" );
principalPerm->Demand();
Console::WriteLine("Demand succeeded");
return 0;
}
using System;
using System.Threading;
using System.Security.Permissions;
using System.Security.Principal;
class SecurityPrincipalDemo
{
public static void Main()
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
PrincipalPermission principalPerm = new PrincipalPermission(null, "Administrators");
principalPerm.Demand();
Console.WriteLine("Demand succeeded.");
}
}
Imports System.Threading
Imports System.Security.Permissions
Imports System.Security.Principal
Class SecurityPrincipalDemo
Public Shared Sub Main()
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
Dim principalPerm As New PrincipalPermission(Nothing, "Administrators")
principalPerm.Demand()
Console.WriteLine("Demand succeeded.")
End Sub
End Class
Az alábbi példa bemutatja, hogyan határozható meg az egyszerű személy identitása és a rendszerbiztonsági tag számára elérhető szerepkörök. Ennek a példának az egyik alkalmazása lehet annak ellenőrzése, hogy az aktuális felhasználó olyan szerepkörben van-e, amelyet engedélyez az alkalmazás használatához.
public:
static void DemonstrateWindowsBuiltInRoleEnum()
{
AppDomain^ myDomain = Thread::GetDomain();
myDomain->SetPrincipalPolicy( PrincipalPolicy::WindowsPrincipal );
WindowsPrincipal^ myPrincipal = dynamic_cast<WindowsPrincipal^>(Thread::CurrentPrincipal);
Console::WriteLine( "{0} belongs to: ", myPrincipal->Identity->Name );
Array^ wbirFields = Enum::GetValues( WindowsBuiltInRole::typeid );
for each ( Object^ roleName in wbirFields )
{
try
{
Console::WriteLine( "{0}? {1}.", roleName,
myPrincipal->IsInRole( *dynamic_cast<WindowsBuiltInRole^>(roleName) ) );
}
catch ( Exception^ )
{
Console::WriteLine( "{0}: Could not obtain role for this RID.",
roleName );
}
}
}
using System;
using System.Threading;
using System.Security.Permissions;
using System.Security.Principal;
class SecurityPrincipalDemo
{
public static void DemonstrateWindowsBuiltInRoleEnum()
{
AppDomain myDomain = Thread.GetDomain();
myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
Console.WriteLine("{0} belongs to: ", myPrincipal.Identity.Name.ToString());
Array wbirFields = Enum.GetValues(typeof(WindowsBuiltInRole));
foreach (object roleName in wbirFields)
{
try
{
// Cast the role name to a RID represented by the WindowsBuildInRole value.
Console.WriteLine("{0}? {1}.", roleName,
myPrincipal.IsInRole((WindowsBuiltInRole)roleName));
Console.WriteLine("The RID for this role is: " + ((int)roleName).ToString());
}
catch (Exception)
{
Console.WriteLine("{0}: Could not obtain role for this RID.",
roleName);
}
}
// Get the role using the string value of the role.
Console.WriteLine("{0}? {1}.", "Administrators",
myPrincipal.IsInRole("BUILTIN\\" + "Administrators"));
Console.WriteLine("{0}? {1}.", "Users",
myPrincipal.IsInRole("BUILTIN\\" + "Users"));
// Get the role using the WindowsBuiltInRole enumeration value.
Console.WriteLine("{0}? {1}.", WindowsBuiltInRole.Administrator,
myPrincipal.IsInRole(WindowsBuiltInRole.Administrator));
// Get the role using the WellKnownSidType.
SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
Console.WriteLine("WellKnownSidType BuiltinAdministratorsSid {0}? {1}.", sid.Value, myPrincipal.IsInRole(sid));
}
public static void Main()
{
DemonstrateWindowsBuiltInRoleEnum();
}
}
Imports System.Threading
Imports System.Security.Permissions
Imports System.Security.Principal
Class SecurityPrincipalDemo
Public Shared Sub DemonstrateWindowsBuiltInRoleEnum()
Dim myDomain As AppDomain = Thread.GetDomain()
myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)
Dim myPrincipal As WindowsPrincipal = CType(Thread.CurrentPrincipal, WindowsPrincipal)
Console.WriteLine("{0} belongs to: ", myPrincipal.Identity.Name.ToString())
Dim wbirFields As Array = [Enum].GetValues(GetType(WindowsBuiltInRole))
Dim roleName As Object
For Each roleName In wbirFields
Try
' Cast the role name to a RID represented by the WindowsBuildInRole value.
Console.WriteLine("{0}? {1}.", roleName, myPrincipal.IsInRole(CType(roleName, WindowsBuiltInRole)))
Console.WriteLine("The RID for this role is: " + Fix(roleName).ToString())
Catch
Console.WriteLine("{0}: Could not obtain role for this RID.", roleName)
End Try
Next roleName
' Get the role using the string value of the role.
Console.WriteLine("{0}? {1}.", "Administrators", myPrincipal.IsInRole("BUILTIN\" + "Administrators"))
Console.WriteLine("{0}? {1}.", "Users", myPrincipal.IsInRole("BUILTIN\" + "Users"))
' Get the role using the WindowsBuiltInRole enumeration value.
Console.WriteLine("{0}? {1}.", WindowsBuiltInRole.Administrator, myPrincipal.IsInRole(WindowsBuiltInRole.Administrator))
' Get the role using the WellKnownSidType.
Dim sid As New SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, Nothing)
Console.WriteLine("WellKnownSidType BuiltinAdministratorsSid {0}? {1}.", sid.Value, myPrincipal.IsInRole(sid))
End Sub
Public Shared Sub Main()
DemonstrateWindowsBuiltInRoleEnum()
End Sub
End Class
Engedélyezés
Az engedélyezés annak meghatározására szolgál, hogy a rendszerbiztonsági tag végrehajthat-e egy kért műveletet. Az engedélyezés a hitelesítés után történik, és az egyszerű identitásra és szerepkörökre vonatkozó információk alapján határozza meg, hogy az egyszerű felhasználó milyen erőforrásokhoz férhet hozzá. A .NET szerepköralapú biztonság használatával implementálhatja az engedélyezést.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: