Sdílet prostřednictvím


Kód transparentní pro zabezpečení, úroveň 1

Transparentnost pomáhá vývojářům psát bezpečnější knihovny rozhraní .NET Framework, které poskytují funkcionalitu částečně důvěryhodnému kódu. Transparentnost první úrovně byla představena v rozhraní .NET Framework verze 2.0 a byla primárně používá pouze v rámci společnosti Microsoft. Počínaje rozhraním .NET Framework verze 4můžete použít transparentnost druhé úrovně. Transparentnost první úrovně však byla zachována, takže můžete identifikovat starší verzi kódu, který musí běžet se starší verzí pravidel zabezpečení.

Důležitá poznámkaDůležité

Měli byste specifikovat transparentnost první úrovně pouze pro kompatibilitu; to znamená, specifikovat první úroveň pouze pro kód, který byl vyvinut v rozhraní .NET Framework 3.5 nebo starším, které používá atribut AllowPartiallyTrustedCallersAttribute nebo nepoužívá model transparentnosti. Transparentnost první úrovně je například možné použít pro sestavení rozhraní .NET Framework 2.0, která umožňují volání od částečně důvěryhodných volajících (APTCA).Pro kód, který je vyvinutý pro rozhraní .NET Framework 4 vždy použijte transparentnost druhé úrovně.

Toto téma obsahuje následující oddíly:

  • Model transparentnosti první úrovně

  • Atributy transparentnosti

  • Příklady transparentnosti zabezpečení

Model transparentnosti první úrovně

Když používáte transparentnost první úrovně, používáte model zabezpečení, který odděluje kód na metody transparentní pro zabezpečení, bezpečné a kritické pro zabezpečení a kritické pro zabezpečení.

Jako transparentní pro zabezpečení můžete označit celé sestavení, některé třídy v sestavení nebo některé metody ve třídě. Transparentní kód pro zabezpečení nemůže zvýšit oprávnění. Toto omezení má tři důsledky:

  • Transparentní kód pro zabezpečení nemůže provést akce Assert.

  • Každý požadavek na propojení, který by byl splněn transparentním kódem pro zabezpečení se stane úplným požadavkem.

  • Jakýkoliv nebezpečný (neověřitelný) kód, který musí být spouštěn v transparentním kódu pro zabezpečení způsobuje úplný požadavek pro oprávnění zabezpečení UnmanagedCode.

Tato pravidla jsou uplatněna během provádění modulem CLR (Common Language Runtime). Transparentní kód pro zabezpečení předává všechny požadavky na zabezpečení kódu, který volá zpět svým volajícím. Vyžaduje, aby tok skrz transparentní kód pro zabezpečení nemohl zvýšit oprávnění. Pokud málo důvěryhodná aplikace volá transparentní kód pro zabezpečení a vyvolává žádost o vysoká oprávnění, tak požadavek poputuje zpět k málo důvěryhodnému kódu a selže. Transparentní kód pro zabezpečení nemůže žádost zastavit, protože nemůže provádět assert akce. Stejný transparentní kód pro zabezpečení volaný z plně důvěryhodného kódu vyústí v úspěšnou žádost.

Kritický pro zabezpečení je opakem transparentního pro zabezpečení. Kód kritický pro zabezpečení běží jako plně důvěryhodný a může provádět všechny privilegované operace. Kritický a bezpečný kód pro zabezpečení je privilegovaný kód, který byl prostřednictvím rozsáhlého auditu zabezpečení potvrzen, že neumožňuje částečně důvěryhodným volajícím používat prostředky, ke kterým nemají oprávnění k přístupu.

Je nutné explicitně aplikovat transparentnost. Většina vašeho kódu, které zpracovává manipulaci s daty a logiku může být obvykle označena jako transparentní pro zabezpečení, zatímco menší množství kódu, které provádí zvýšení oprávnění je označeno jako kritické pro zabezpečení nebo kritické a bezpečné pro zabezpečení.

Důležitá poznámkaDůležité

Transparentnost první úrovně je omezena na rozsah platnosti sestavení; není vynucena mezi sestaveními.Transparentnost první úrovně byla primárně použita v rámci společnosti Microsoft pro účely auditu zabezpečení.K typům a členům kritickým pro zabezpečení může v rámci sestavení první úrovně přistupovat transparentní kód pro zabezpečení v jiných sestaveních.Je důležité provést požadavky na propojení pro úplnou důvěryhodnost ve všech těch typech a členech první úrovně, které jsou kritické pro zabezpečení.Typy a členy bezpečné a kritické pro zabezpečení musí také potvrdit, že volající mají oprávnění pro chráněné prostředky, ke kterým přistupují pomocí typů a členů.

Z důvodu zpětné kompatibility se staršími verzemi rozhraní .NET Framework jsou všechny členy, které nejsou anotovány pomocí atributů transparentnosti považovány za bezpečné a kritické pro zabezpečení. Všechny typy, které nejsou anotovány, jsou považovány za transparentní. Neexistují žádná pravidla statické analýzy pro ověření transparentnosti. Proto možná budete potřebovat ladit chyby transparentnosti v době běhu.

Atributy transparentnosti

Následující tabulka popisuje tři atributy, které lze použít k anotování vašeho kódu pro transparentnost.

Atribut

Popis

SecurityTransparentAttribute

Povoleno pouze na úrovni sestavení. Identifikuje všechny typy a členy v sestavení jako transparentní pro zabezpečení. Sestavení nemůže obsahovat žádný kód kritický pro zabezpečení.

SecurityCriticalAttribute

Při použití na úrovni sestavení bez vlastnosti Scope, automaticky identifikuje všechen kód v sestavení jako transparentní pro zabezpečení, ale označuje, že sestavení může obsahovat kritický kód pro zabezpečení.

Při použití na úrovni třídy, identifikuje třídu nebo metodu jako kritickou pro zabezpečení, členy této třídy ale ne. Chcete-li, aby všechny členy byly kritické pro zabezpečení, nastavte vlastnost Scope na hodnotu Everything.

Při použití na úrovni člena, se atribut vztahuje pouze na tento člen.

Třída nebo člen označený jako kritický pro zabezpečení může provádět zvyšování oprávnění.

Důležitá poznámkaDůležité
V transparentnosti první úrovně, jsou typy a členy kritické pro zabezpečení zpracovávány jako bezpečné a kritické pro zabezpečení, když jsou volány z venku sestavení.Měli byste chránit typy a členy kritické pro zabezpečení pomocí požadavků na propojení pro úplnou důvěryhodnost, abyste zabránili neoprávněnému zvýšení úrovně oprávnění.

SecuritySafeCriticalAttribute

Identifikuje kritický kód pro zabezpečení, který v sestavení může být přístupný transparentním kódem pro zabezpečení. Jinak, kód transparentní pro zabezpečení nemůže ve stejném sestavení přistupovat k soukromým nebo interním členům kritickým pro zabezpečení. Tím by ovlivnil kód kritický pro zabezpečení a umožnil neočekávané zvýšení oprávnění. Kód bezpečný a kritický pro zabezpečení by měl projít přísným auditem zabezpečení.

PoznámkaPoznámka
Typy a členy bezpečné a kritické pro zabezpečení musí ověřit oprávnění volajících, aby určili, zda má volající oprávnění pro přístup k chráněným prostředkům.

Atribut SecuritySafeCriticalAttribute umožňuje kódu transparentnímu pro zabezpečení přistupovat ve stejném sestavení k členům kritickým pro zabezpečení. Považujte kód transparentní pro zabezpečení a kritický pro zabezpečení jako oddělený do dvou sestavení. Kód transparentní pro zabezpečení by neměl být schopen vidět soukromé nebo interní členy kódu kritického pro zabezpečení. Navíc kód kritický pro zabezpečení je obecně auditovaný pro přístup k jeho veřejnému rozhraní. Neočekávali byste, že by soukromé nebo interní stavy byly přístupné mimo sestavení, chtěli byste je zachovat izolované. Atribut SecuritySafeCriticalAttribute spravuje izolaci stavu mezi kódem transparentním pro zabezpečení a kritickým pro zabezpečení, zároveň poskytuje možnost přepsat izolaci, když je to nutné. Kód transparentní pro zabezpečení nemůže přistupovat k soukromému nebo internímu kódu kritickému pro zabezpečení, pokud tyto členy nebyly označeny pomocí SecuritySafeCriticalAttribute. Před použitím SecuritySafeCriticalAttribute, zkontrolujte daný člen zda byl veřejně vystaven.

Anotace s rozsahem na sestavení

Následující tabulka popisuje účinky používání atributů zabezpečení na úrovni sestavení.

Atribut sestavení

Stav sestavení

Žádný atribut v částečně důvěryhodném sestavení

Všechny typy a členy jsou transparentní.

Žádný atribut v plně důvěryhodném sestavení (v globální mezipaměti sestavení (GAC) nebo identifikován jako plně důvěryhodný v AppDomain)

Všechny typy jsou transparentní a všechny členy jsou bezpečné a kritické pro zabezpečení.

SecurityTransparent

Všechny typy a členy jsou transparentní.

SecurityCritical(SecurityCriticalScope.Everything)

Všechny typy a členy jsou kritické pro zabezpečení.

SecurityCritical

Všechen kód je automaticky transparentní. Jednotlivé typy a členy však mohou mít jiné atributy.

Příklady transparentnosti zabezpečení

Chcete-li použít pravidla transparentnosti pro rozhraní .NET Framework 2.0 (transparentnost první úrovně), použijte následující anotaci sestavení:

[assembly: SecurityRules(SecurityRuleSet.Level1)]

Pokud chcete udělat celé sestavení transparentní, aby indikovalo, zda sestavení neobsahuje žádný kritický kód a žádným způsobem nezvyšuje oprávnění, můžete explicitně přidat transparentnost k sestavení pomocí následujícího atributu:

[assembly: SecurityTransparent]

Chcete-li míchat kritický a transparentní kód ve stejném sestavení, začněte označením sestavení pomocí atributu SecurityCriticalAttribute, abyste ukázali, že sestavení může obsahovat kritický kód jako následující:

[assembly: SecurityCritical]

Pokud chcete provádět akce kritické pro zabezpečení, musíte explicitně označit kód, který provede kritické akce pomocí jiného atributu SecurityCriticalAttribute, jak ukazuje následující příklad kódu:

[assembly: SecurityCritical]
Public class A
{
    [SecurityCritical]
    private void Critical()
    {
        // critical
    }

    public int SomeProperty
    {
        get {/* transparent */ }
        set {/* transparent */ }
    }
}
public class B
{    
    internal string SomeOtherProperty
    {
        get { /* transparent */ }
        set { /* transparent */ }
    }
}

Předchozí kód je transparentní s výjimkou metody Critical, která je explicitně označena jako kritická pro zabezpečení. Transparentnost je výchozí nastavení, dokonce i s atributem úrovně sestavení SecurityCriticalAttribute.

Viz také

Koncepty

Transparentní kód pro zabezpečení, úroveň 2

Změny zabezpečení v rozhraní .NET Framework 4