Code Access Security (CAS) programmatisch angewandt (Teil 2)


Trusted Publisher einrichten

 

Der Vorteil eines sog. Trusted Publishers liegt in der Tatsache, daß dieser nur einmal eingerichtet werden muß und beliebige Assemblies bzw. Lösungen diesen verwenden können, sofern sie denn mit der Signature des Publishers signiert wurden. Diese Signatur ist i.d.R. ein digitales Zertifikat (vom unternehmensinternen Certificate Server oder – bei Trust Relationships zwischen Unternehmen – von einer Internet Authorität wie VeriSign oder Thawte) oder eben auch ein Strong Name.

 

 

Beispiel 2: Basierend auf einem Strong Name

 

Ein Strong Name (wird erzeugt mit dem .NET Framework SDK Tool sn.exe) enthält einen Public Key, der für das Erkennen der Identität auf der Gegenseite notwendig ist und weitergegeben werden kann. Das komplette Strong Name File sollte man besser an einem sicheren Ort aufbewahren, denn es enthält auch den Private Key, der für das Signieren von Assemblies notwendig ist. Um Assemblies zu signieren, sollte man Delay-Signing verwenden und die Signierung erst nach Beendigung der Testphase (direkt vor dem Roll Out) auf einem separaten PC durchführen. So muß nicht jeder Entwickler an seinem Arbeitsplatz mit dem Strong Name versorgt werden und eine weitere Sicherheitslücke ist geschlossen.

 

Ausgehend von Beispiel 1 müssen wir hier die MembershipCondition umbauen, so daß ein Strong Name als Basis akzeptiert wird. Das Framework bietet natürlich eine StrongNameMembershipCondition an, die wir hier verwenden. Ich möchte, daß nur der Strong Name als Beweis hergezogen wird und nicht auch noch Assembly-Name und –Version, weswegen ich hier beides leer lasse:

 

    Dim snName As String = vbNullString          

    Dim snVersion As System.Version      

       

    Dim snMSCond As StrongNameMembershipCondition = _

      New StrongNameMembershipCondition(snPKB, snName, snVersion)

 

 

Die StrongNameMembershipCondition erwartet als ersten Parameter einen StrongNamePublicKeyBlob, eine Klasse, die wiederum ein Byte-Array erwartet, welches den Public Key enthält. Wie kommt man nun an diesen?

 

Mit dem Framework Tool secutil.exe kann man einen Public Key aus einer signierten Assembly extrahieren:

 

    secutil.exe –s MyASM.dll

 

Einfach das Ergebnis in eine Datei umleiten. Diese sieht dann folgendermaßen aus:

 

Microsoft (R) .NET Framework SecUtil 1.1.4322.573

Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

 

Public Key = { 0, 36, 0, 0, 4, 128, 0, 0, 148, … , 119, 179, 100, 126, 216, 230 }

Name = MyNotepad

Version = 2.0.0.0

Success

 

Der Eintrag hinter Public Key ist bereits hervorragend geeignet, in VB.NET als ByteArray zu dienen:

 

    Dim snPK() As Byte = {0, 36, 0, 0, 4, … 100, 126, 216, 230}

    Dim pkBlob As StrongNamePublicKeyBlob = New StrongNamePublicKeyBlob(snPK)

 

Den so erzeugten Public Key Blob kann man dann direkt in dem Konstruktor der StrongNameMemberShipCondition stecken:

 

    Dim snMSCond As StrongNameMembershipCondition = _

      New StrongNameMembershipCondition(pkBlob, snName, snVersion)

 

Dann nur noch die Codegroup erzeugen und den Rest wie in Beispiel 1:

 

    Dim NewCodeGroup As UnionCodeGroup = New UnionCodeGroup(snMSCond, New PolicyStatement(permSet))

 

Testen können wir das Ganze mal mit einer Exe, welche mit dem Strong Name signiert und von einem WebShare gestartet wurde. Die Exe sollte versuchen, auf die Datei C:\Test.ini zuzugreifen, sofern der Pfad so beibehalten wurde wie in Beispiel 1 vorgeschlagen. Ist die Policy nicht angelegt, so sollte eine Security Exception geworfen werden.

 

 

Im nächsten Teil beschäftigen wir uns damit, wie wir das Ganze als Custom Action in einem Windows Installer Paket einbauen können.

Comments (0)

Skip to main content