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