Warnung:
Neuere Versionen von .Net und .Net Core haben "Code Access Security" (CAS) entfernt und / oder geändert, seit diese Frage gestellt wurde.
Ursprüngliche Frage:
Ich bin gerade dabei, für die Prüfung 70-536 .NET Framework - Application Development Foundation zu studieren , da ich .net seit vielen Jahren programmiere. Dies sollte nicht schwer sein!
Ich muss jedoch etwas über „Code Access Security“ (CAS) lernen. Da ich es nie verwenden oder konfigurieren musste, habe ich mich gefragt, ob jemand anderes eine echte Verwendung dafür gefunden hat.
Bitte geben Sie Beispiele dafür, wann Sie CAS verwendet haben und es eher Teil der Lösung als des Problems war.
(Bisher hatte alles andere eine Beziehung zu der Aufgabe, die ich in meinen Jahren der .NET-Programmierung zu erledigen hatte.)
Verwandte Fragen:
- Warum sollte CAS (Code Access Security) verwendet werden? - Abgesehen von der Verwendung durch Microsoft gibt es nur sehr wenige Beispiele aus der Praxis.
- Jemand, der Code Access Security wirklich verwendet, um seine Assemblys und / oder Methoden zu schützen?
- Was ist Codezugriffssicherheit in .NET - Definiert CAS gut, gibt aber keine wirklichen Beispiele.
- . NET Code Access Security: Nützlich oder einfach zu kompliziert?
Ergebnisse bisher.
CAS ist nützlich, wenn Sie Code von Drittanbietern hosten. Beispielsweise kann ein Webhosting-Unternehmen damit verhindern, dass der Asp.net-Code seines Kunden die Server beschädigt. (Office nutzt es auch, wenn .NET als Ersatz für VBA verwendet wird.)
Das einzige detaillierte Beispiel für die Verwendung außerhalb einer Microsoft-Anwendung ist:
In einem kürzlich von mir durchgeführten Projekt hatte ich etwas Ähnliches: Erlauben Sie dem Benutzer, eine Bibliothek hochzuladen und auf Leistung zu testen ("Wer macht den besten Algorithmus"). Unnötig zu erwähnen, dass wir dort dringend CAS brauchten.
CAS scheint nützlich zu sein, um eine JITDC-Zertifizierung zu erhalten, die vom US-Verteidigungsministerium stammt. Ich weiß jedoch nicht, ob CAS einen echten Wert hatte oder ob es sich nur um ein Kästchen handelte.
(Wenn Sie einen Host umgehen müssen, der CAS verwendet, und auf diesem Computer Administratorrechte haben, können Sie Ihre Assemblys einfach in den GAC einfügen.)
Mit Blick auf die Zukunft ist CAS in .net 4 etwas weniger komplex .
Zumindest sieht es so aus, als würden die neuen Microsoft-Prüfungen keine "Grund" -Prüfung haben, die CAS enthält. Ich weiß nicht, ob es in die neuen Winforms / WPF-Prüfungen kommt.
quelle
Antworten:
In der "realen Welt" stoße ich häufig auf Codezugriffssicherheit, oft dann, wenn ich es am wenigsten erwarte. In gewisser Weise wäre SilverLight eine hervorragende Anwendung in der Praxis, wenn SilverLight sich am Ende nicht dafür entschieden hätte, CAS überhaupt nicht einzusetzen .
Hosting-Anbieter
An den Stellen, an denen Sie es in Aktion sehen, wird eine gesicherte Umgebung benötigt: ASP.NET selbst natürlich, aber ASP.NET-Hosting-Anbieter verwenden ein modifiziertes Sicherheitsmodell , um das Eindringen in ihre wertvollen Systeme zu verhindern. Ich weiß, dass Webhost4Life dies verwendet (keine Informationen auf ihrer Website darüber, aber ich habe mit ihnen gearbeitet, es ist wirklich da). Weitere ASP.NET-Hosting-Anbieter tun dasselbe, sind sich aber auch nicht ganz sicher : Thread auf godaddy.com , der das CAS nicht ändern möchte (und keine Klarheit darüber, was unterstützt wird und was nicht) oder diese verwandte Diskussion zu 1 & 1 . Einige Cloud-Hosting-Sites (Rackspacecloud) gingen noch einen Schritt weiter und "arbeiteten mit Microsoft für eine modifizierte vollständige Vertrauensstufe", was auch immer das sein mag.
Kurz gesagt: Wenn Sie einen ASP.NET-Host finden, haben diese höchstwahrscheinlich CAS verwendet, um Sie daran zu hindern, Dinge zu tun, die Sie nicht tun sollen. Sie können es sogar verwenden, um zwischen "einfachem" (viele Einschränkungen) Hosting und "Enterprise" (wenige Einschränkungen) Hosting zu unterscheiden, was CAS eine ganz andere Bedeutung verleiht.
Andere Anwendungen von CAS
Soviel zu einigen realen Situationen, denen ich selbst begegnet bin. In einem kürzlich von mir durchgeführten Projekt hatte ich etwas Ähnliches: Erlauben Sie dem Benutzer, eine Bibliothek hochzuladen und auf Leistung zu testen ("Wer macht den besten Algorithmus"). Unnötig zu erwähnen, dass wir dort dringend CAS brauchten. Andere Beispiele oder interessante Ressourcen:
In jeder Situation, in der Sie einfach selbst die volle Kontrolle haben, Ihre eigene App und Ihren eigenen Code erstellen (oder erstellen lassen) und die vollständige Kontrolle über Ihr System haben, werden Sie CAS nicht allzu oft benötigen. Es ist eher etwas, das Sie in dem Moment verwenden würden, in dem Sie Code aus weniger vertrauenswürdigen Quellen ausführen können (was im Grunde alles ist, was Sie nicht vollständig kontrollieren können).
CAS gegen ClickOnce
Die Standard-CAS-Einstellungen beschränken die Funktionen von Code, der von einer Netzwerkfreigabe oder anderen nicht lokalen Quellen ausgeführt wird. Dies ist sinnvoll, aber die strengen Einschränkungen machen es schwierig, ein zentrales Repository für verteilte Anwendungen zu haben. .NET 2.0 führte ClickOnce ein, das die Sicherheit erhöhen sollte ( Diskussion hier ).
ClickOnce selbst verwendet CAS , um zu verhindern, dass das Installationsprogramm Systemfunktionen aufruft. Als solches glaube ich, dass es wohl die bekannteste Anwendung ist, die auf CAS basiert .
Der Punkt ist: Sie müssen CAS verstehen, um etwas erstellen zu können, das direkt von einer Freigabe ausgeführt werden kann, oder Sie ignorieren alles und verwenden ClickOnce.
Microsoft-Umfrage zu CAS
Im Jahr 2005 hat Microsoft eine Umfrage durchgeführt , um herauszufinden, warum CAS so unbeliebt ist, in der Hoffnung, es zu verbessern, um es besser anwendbar zu machen. Leider konnte ich die tatsächlichen Umfrageergebnisse nicht finden, abgesehen von diesem Beitrag, in dem detailliert beschrieben wird, warum CAS nicht ausreichend genutzt wird.
CAS in einer anderen Welt
Dieser Beitrag weist jedoch auf eine faszinierende Nische hin: CAS für eine andere Welt: Unix / Linux. Sie nennen es nicht CAS, sondern BitFrost . Wie ist das für eine reale Anwendung: das Projekt "Ein Laptop pro Kind" , bei dem BitFrost als Ersatz für das traditionelle Unix-Sicherheitsmodell verwendet wird.
Update: Abschnitt über CAS unter Unix / Linux als BitFrost und Abschnitt über die Umfrage.
Update: CAS vs ClickOnce-Abschnitt hinzugefügt
Update: Liste der Ressourcen mit CAS hinzugefügt (und Entschuldigung für all diese Updates in Folge!)
quelle
Technisch gesehen ist es sehr nützlich, da es eine sehr feinkörnige Berechtigungsspezifikation ermöglicht. Dies ist sowohl gut für Sie (da es theoretisch das Ausnutzen von Sicherheitslücken erheblich erschwert - selbst wenn ein Angreifer die volle Kontrolle über Ihre App erlangt, ist er immer noch in der CAS-Sandbox gesperrt) als auch für Ihren Kunden (da er genau sehen kann, was Sie tun) Anwendung kann ihre eigene Sicherheitsüberprüfung durchführen.
In der Praxis ist es meistens bedeutungslos. Ich denke, es ist zu komplex, zu wenig unterstützt von den verfügbaren Entwicklertools und die meisten Benutzer kümmern sich sowieso nicht darum.
Es gibt natürlich Ausnahmen (Regierungen und Kunden, die .net / CAS wirklich kennen) und ich würde gerne sagen, dass CAS absolut nützlich und obligatorisch ist, aber die Realität spricht eine klare Sprache.
quelle
Hinweis für den Leser: siehe die beiden folgenden Kommentare; Es hört sich so an, als würde ich versehentlich die Definition von CAS aufblasen, um (fälschlicherweise) RBS einzuschließen. Ich werde die Antwort hier als Referenz belassen, aber die Unterscheidung beachten.
CAS hat zwei Probleme. das , was Sie sehen , die meisten werden in dieser Prüfung ist es, alle Nuancen für Code anderer Code aufrufen, die möglicherweise für die teilweise Vertrauen nützlich sein, aber die meiste Zeit ist es einfach ein Schmerz - und noch schlimmer: wenn Ihr Code hat volles Vertrauen ( was das meiste / zu viel tut) nichts davon wird tatsächlich ausgeführt (es wird komplett übersprungen).
Der nützliche Teil des
CASRBS ist Haupt Erlaubnis, das ist gebraucht; Natürlich sollte Ihre Benutzeroberfläche den Zugriff auf Funktionen überprüfen, aber Sie können (in Ihre Low-Down-Logik) Folgendes einfügen:[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")] static void DeleteOrder(int id) { ... }
Dies wird auch in vollem Vertrauen durchgesetzt; Sie können Ihren eigenen Principal (an den Benutzer gebunden) definieren, indem Sie ihn implementieren
IPrincipal
(sieheIsInRole()
). Und da Principals in den meisten Umgebungen (Winforms, Webforms, MVC, WCF usw.) unterstützt werden, kann dies eine sehr flexible Möglichkeit bieten, die Sicherheit auf der Geschäftsebene zu überprüfen, ohne auf das spezifische Sicherheitsmodell verweisen zu müssen . Beachten Sie, dass die obige Prüfung in jeder Umgebung funktioniert .Sie können dies möglicherweise auch verwenden, um Ihre Benutzeroberfläche zu steuern. Ich hatte einen Usenet-Beitrag, der Winforms-Steuerelemente basierend auf dem Prinzip aktiviert / deaktiviert hat (mithilfe von Laufzeit-Eigenschaften, um die Rolle pro Steuerelement anzugeben, ein bisschen wie
ToolTip
usw.) - ich kann es jedoch momentan nicht finden (bearbeiten: vielleicht dieses ).quelle
Das Verständnis von Code Access Security ist, dass es für einen Anwendungsentwickler nur von geringem Nutzen ist, außer zu verstehen, wie es verwendet wird und auf welcher Berechtigungsstufe für APIs Sie möglicherweise aufrufen. Die einzige Ausnahme, die ich wirklich nützlich gefunden habe, ist ein CAS namens PrincipalPermission. Es erlaubt grundsätzlich nicht, dass bestimmter Code ausgeführt wird, wenn für den aktuellen Principal nicht die richtige Rolle definiert ist. Siehe diesen Beitrag darauf:
http://www.coderjournal.com/2008/03/securing-mvc-controller-actions/
Die Entwickler, die wirklich auf CAS achten müssen und wie es in ihrer Anwendung implementiert werden soll, sind die Entwickler der Framework- und Codebibliothek. Weil es bestimmte Vertrauensstufen gibt, die Sie benötigen, damit Ihre Anwendung funktioniert, insbesondere wenn Sie mit nicht verwalteten Ressourcen wie Dateien, Netzwerkströmen, seriellen Schnittstellen usw. arbeiten. Oder wenn Sie den Code für diese nicht verwaltete Ressource wie eine bestimmte erstellen Server oder jede Art von Zugriff auf Ihre Assemblys auf niedriger Ebene, für die Sie eine gewisse Codezugriffssicherheit erstellen möchten, damit Benutzer nicht etwas ausführen dürfen, das ihnen strikt verweigert wurde.
Es hilft nicht, dass Microsoft nicht wirklich großartige Arbeit geleistet hat, um zu erklären, wie CAS in der täglichen Anwendung verwendet werden sollte. Das ist also wirklich der Grund für die mangelnde Nutzung. CAS ist jedoch einer der vielen Gründe, warum .NET eine so sichere Sprache ist und viel weniger Probleme hat als seine Konkurrenten.
quelle
Ich war der Entwicklungsleiter eines Projekts zur Erlangung der JITC-Zertifizierung (US-Verteidigungsministerium) für eine .NET-basierte Lösung, und die CAS-Einstellungen wurden während der Zertifizierungstests sehr genau überprüft.
Wie die meisten anderen Zertifizierungsanforderungen konnte der Code nur die zum Arbeiten erforderlichen Berechtigungen verwenden und nicht mehr.
Wenn Sie Sicherheitszertifizierungen erhalten möchten, kann CAS auf jeden Fall wichtig sein.
quelle
Eine Sache, die Sie wissen sollten, ist, dass die Codezugriffssicherheit als Manipulationsschutzmethode ziemlich kaputt ist. Sehen:
quelle
Obwohl ich es nie benutzt habe, war mein Verständnis von CAS, dass es auch verwendet werden kann, um die objektorientierte Konstruktionsmechanik zu erweitern. Angenommen, Sie entwickeln ein umfangreiches Datenzugriffspaket für eine Bank, die Datenbankzugriff und Caching implementieren muss. Obwohl sie angesichts der hypothetischen Größe des Projekts Teil desselben Bereitstellungspakets sind, sollte die Logik in separaten Assemblys implementiert werden, da es sich um ausreichend unterschiedliche Problemgruppen handelt, die von unterschiedlichen externen Kräften abhängen (Datenbankinfrastruktur vs. Verbrauchernutzung).
Der Caching-Code muss jedoch möglicherweise auf einige vertrauliche Klassen oder Methoden in der Datenzugriffsassembly zugreifen, auf die Benutzer des Gesamtpakets keinen Zugriff haben sollten. Daher können diese Datenzugriffsklassen und -methoden nicht einfach sein
public
. Geschützte Methoden in der Datenzugriffsassembly mit Unterklassen in der Caching-Assembly können einige Fälle umgehen, aber häufig handelt es sich um einen Vererbungsmissbrauch. Es könnte einfach eleganter sein,public
LinkDemands für Anrufer zu hinterlassen, um eine benutzerdefinierte Berechtigung (z. B.DataPackagePermisson
) zu erhalten, die Administratoren nur der Caching-Assembly erteilen würden.quelle
Wir haben CAS für unsere Anwendungen verwendet, was nicht wirklich zu schwierig war, da wir nur versucht hatten, die nicht autorisierte Codeausführung zu stoppen. Bei der Verwendung unserer Software von der lokalen Netzwerkfreigabe sind einmal Probleme aufgetreten, aber eine Cas-Richtlinie hat das Problem behoben.
Seit dem Update von .NET3.5 gab es keine Probleme mehr, da Code im lokalen Netzwerk jetzt wie lokaler Code behandelt wird.
quelle