521 Chương 13: Bảo mật nắm được các mặt hạn chế của một thư viện mà bạn muốn gọi từ mã lệnh của bạn. Sử dụng công cụ Permissions View ( Permview.exe —được cấp cùng với . NET Framework SDK ). l%2&.6.e$8&*N&IN9''; .Sgcode access permission requirementsh(.&'.&*)=i@*' l'G(.&'=$';Q:) &*lD8&*N&I(.&'*&VK9'4O) ' = . &i * I g@ )3 I * System.Security.SecurityException h P4Permview.exe.MIM.49F8&*F;(. '>N9'&gdeclarative permission requesth$*&>.(.&'E &t.'>NDgminimum requesth8'>Ne'0goptional requesth8'>N *Qgrefusal requesthu2)8)<'&.ND8.'>Ne' 08.'>N*Q\ using System.Net; using System.Security.Permissions; // Yêu cầu quyền tối thiểu: SocketPermission. [assembly:SocketPermission(SecurityAction.RequestMinimum, Unrestricted = true)] // Yêu cầu quyền tùy chọn: SecurityPermission. [assembly:SecurityPermission(SecurityAction.RequestOptional, Unrestricted = true)] // Yêu cầu loại trừ quyền: FileIOPermission. [assembly:SecurityPermission(SecurityAction.RequestRefuse, Unrestricted = true)] public class PermissionViewExample { public static void Main() { // Làm gì đó } } 7= permview PermissionViewExample.exe @ I;"!)e 4.'<&*3F0I;;i'>N9'$ *&C(.&'"#&'>N9'ED8e'08*QE $ > ) .> > $ I C )* XML . D$ System.Security.PermissionSet 522 Chương 13: Bảo mật Microsoft (R) .NET Framework Permission Request Viewer. Version 1.1.4322.510 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. minimal permission set: <PermissionSet class="System.Security.PermissionSet" version="1"> <IPermission class="System.Net.SocketPermission, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/> </PermissionSet> optional permission set: <PermissionSet class="System.Security.PermissionSet" version="1"> <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/> </PermissionSet> refused permission set: <PermissionSet class="System.Security.PermissionSet" version="1"> <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/> </PermissionSet> Bằng cách chỉ định đối số /decl khi chạy tiện ích Permview.exe , bạn có thể xem tất cả các lệnh bảo mật khai báo ( declarative security statement ) nằm trong một assembly. Việc này cho thấy rõ những gì assembly thực hiện bên trong và cho phép bạn cấu hình chính sách bảo mật một cách phù hợp. Tuy nhiên, Permview.exe không hiển thị các thao tác bảo mật bắt buộc ( imperative security operation ) nằm trong một assembly. Hiện không có cách nào để trích và tổng kết các thao tác bảo mật bắt buộc được thực thi bên trong một assembly. 7. 7. Xác đ nh mã l nh có quy n nào đó lúc th c thi hay khôngị ệ ề ự Xác đ nh mã l nh có quy n nào đó lúc th c thi hay khôngị ệ ề ự Bạn cần xác định assembly của bạn có một quyền cụ thể nào đó lúc thực thi hay không. 523 Chng 13: Bo mt To v cu hỡnh quyn m bn mun kim tra ri truyn nú cho phng thc tnh IsGranted ca lp System.Security.SecurityManager . |O)'>N9'D8&*Făàãàộ&=(.&'6 9'S$JiTI.S&**'8&*F/5FF 9'DS$'>N7'>8&*F.D=.:vF2 +M-:)F:vFJ&=(.&' &*9'Ơẫ$PI6'$2:F.N&5'> N9'e'08X&*iq.69' S&*F ỉ)I2&.6G8ạƠễƠĐÔĐÊầ-đố-ỉƠ Ơ Ơ ƠễêẻƠg.Z^`S%&'I'>N9'e'0h uD'>N9'e'0&=4Fv& (.&'5FSK9'L*FO).Ơêã$z&z &* . >. ;4 0 Ô )3 I * System.Security.SecurityException 7'>8@9M;i;(.&*F 9'NI'4|F8&*FéèÔố- ã.S 0Ơà>$z&z.@<' )=>*& .6l*.S)<'%&'O)M: IsGranted ;i;(. (.&'*F9'.C:\Data'4L*F*. 0 I.#&*N.9'8@9MIO)i6 BI6. %&IFX )ef('4 // nh ngha mt bin lun lý cho bit assembly cú quyn // truy xut ghi i vi th mc C:\Data hay khụng. bool canWrite = false; // To v cu hỡnh mt i tng FileIOPermission mụ t quyn // truy xut ghi i vi th mc C:\Data. System.Security.Permissions.FileIOPermission fileIOPerm = new System.Security.Permissions.FileIOPermission( System.Security.Permissions.FileIOPermissionAccess.Write, @"C:\Data"); // Kim tra assembly hin ti cú quyn ó c ch nh hay khụng. canWrite = System.Security.SecurityManager.IsGranted(fileIOPerm); 8. 8. H n ch ai ú th a k cỏc l p c a b n H n ch ai ú th a k cỏc l p c a b n v chộp ố cỏc thnh viờn l p v chộp ố cỏc thnh viờn l p Bn cn kim soỏt nhng ai cú th tha k cỏc lp ca bn thụng qua s tha k ( inheritance ) v mt lp dn xut cú th chộp ố nhng thnh viờn no. 524 Chương 13: Bảo mật Sử dụng các lệnh bảo mật khai báo ( declarative security statement ) để áp dụng thành viên SecurityAction.InheritanceDemand vào phần khai báo của các lớp và các thành viên bạn cần bảo vệ. P.)f( sealed 8 public 8 private 8 virtual X&*.v 'QI&*X1>F7'>8 .)f('4*84Fv00*K.S FQI.!X1>Fu2)8&*.DJK .S)4''&*I%.FQI908 !JK.S$*Q.'&%.FQIM: FL5) InheritanceDemand &'>8&*FJ i9'gG=h..F%.FQI&*!X 1>FH589'.9'(.&' .'$&F "!)e&*F'>N&…9''69' InheritanceDemand 8 4 '>N9'i)gidentity permissionhY'i).4 ::gevidenceh).(.&' &=HI.(.&' ::FG*8&=@=(.&''9'i)e $Y' i ) X &* O ) & .6 &/ & & gimperativedeclarativesecuritystatementh =I9'Ii&.6gsecurity decisionhv:>i).Sgcode identityh.4N=ID $::LZ^zZ>9'i)$*.#:: g::>4> System.Security.Policy 89'i )>4> System.Security.Permissions h Bảng 13.1 Các lớp chứng cứ và các quyền định danh Lớp chứng cứ Quyền định danh ApplicationDirectory w4 Hash w4 Publisher PublisherIdentityPermission Site SiteIdentityPermission StrongName StrongNameIdentityPermission Url UrlIdentityPermission Zone ZoneIdentityPermission Bộ thực thi gán các quyền định danh cho một assembly dựa trên chứng cứ do assembly này đưa ra. Bạn không thể gán thêm quyền định danh cho một assembly thông qua việc cấu hình chính sách bảo mật. L*O)G&.6&gdeclarativesecurity syntaxh=. InheritanceDemand 8>&*O)&!2gattribute counterparth 9'.&*.D'>N79'F.&!2* 525 Chương 13: Bảo mật & .6 &E& t. InheritanceDemand u2 )8 & ! 2 PublisherIdentityPermission PublisherIdentityPermissionAttribute 8 &! 2 StrongNameIdentityPermission StrongNameIdentityPermissionAttribute E 9'&!2Ge(9'!>> e4> l.K.SFQI&*8S') InheritanceDemand &l*.S)<'%&'.$&&5 InheritanceDemand 7(F8JK&>(.&'$B&C&(z(f( g5. f( pubcert.cerh%.FQI InheritanceDemandExample H)f( pubcert.cer $0G&>)i84:=NI$/ (.&' [PublisherIdentityPermission(SecurityAction.InheritanceDemand, CertFile = @"I:\CSharp\Chuong13\pubcert.cer")] public class InheritanceDemandExample { § } l.K.SFX1>F8&*S') InheritanceDemand &>{X*.S)<'8JK$ 69' FullTrust %.FX1M: SomeProtectedMethod [PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")] public void SomeProtectedMethod () { § } 9. 9. Ki m tra ch ng c c a m t assemblyể ứ ứ ủ ộ Ki m tra ch ng c c a m t assemblyể ứ ứ ủ ộ Bạn cần kiểm tra chứng cứ mà bộ thực thi đã gán cho một assembly. Thu lấy đối tượng System.Reflection.Assembly mô tả assembly mà bạn quan tâm. Lấy tập hợp System.Security.Policy.Evidence từ thuộc tính Evidence của đối tượng Assembly , rồi truy xuất các đối tượng chứng cứ bên trong bằng phương thức GetEnumerator , GetHostEnumerator , hay GetAssemblyEnumerator của lớp Evidence . y Evidence .4.6$D$::72Jz0 Evidence Assembly .D$6$ Evidence :D$::.& =S(.&'(.&''$* 768 Evidence :6$8.4::\:: ::(.&'P:: &t.D$::$(.&' &C&='.SS*(.&'g.S'6'hP:: (.&' .4D$::e'&I$G(.&'G*)=y Evidence =&M:<'>D$::&>\ • GetEnumerator 526 Chương 13: Bảo mật • GetHostEnumerator • GetAssemblyEnumerator RM: GetEnumerator . System.Collections.IEnumerator )e> D$::&>6$ Evidence RM: GetHostEnumerator GetAssemblyEnumerator . IEnumerator >JD$::Q 6$M: u2 ) )<'%&'i :: ::(.&' . (.&' PG B 58 : : x X 1 M : Object.ToString &)r*D$::"!)eF>9 4G2)'?i::..(.&'@F$*Q &> M % &* W.( g Microsoft ASP.NET ' Microsoft Internet Explorer runtime hosthF=B>.:: F*.(.&' using System; using System.Reflection; using System.Collections; using System.Security.Policy; public class ViewEvidenceExample { public static void Main(string[] args) { // Nạp assembly đã được chỉ định. Assembly a = Assembly.LoadFrom(args[0]); // Thu lấy tập hợp Evidence từ assembly đã được nạp. Evidence e = a.Evidence; // Hiển thị chứng cứ host. IEnumerator x = e.GetHostEnumerator(); Console.WriteLine("HOST EVIDENCE COLLECTION:"); while(x.MoveNext()) { Console.WriteLine(x.Current.ToString()); } // Hiển thị chứng cứ assembly. x = e.GetAssemblyEnumerator(); Console.WriteLine("ASSEMBLY EVIDENCE COLLECTION:"); while(x.MoveNext()) { 527 Chương 13: Bảo mật Console.WriteLine(x.Current.ToString()); } } } 7::x)NET Framework&&I8&*4's iG&=S*tG(.&'H8&* 4>.'*&V(.G>.6$&5 IEnumerator 8I 48M: MoveNext @X.* System.InvalidOperationException 10. 10. X lý ch ng c khi n p m t assembly ử ứ ứ ạ ộ X lý ch ng c khi n p m t assembly ử ứ ứ ạ ộ Bạn cần xử lý chứng cứ khi nạp một assembly để tác động đến các quyền mà bộ thực thi cấp cho assembly. Tạo các đối tượng chứng cứ mà bạn muốn gán cho assembly, sau đó thêm chúng vào một thể hiện của lớp System.Security.Policy.Evidence , rồi truyền tập hợp Evidence cho phương thức dùng để nạp assembly. P::g$I.K&C.(.&'hiqi)gidentityh(.&' ;i&=9'(.&'L*(.&'gAssemblyLoaderh i.2;i::%.(.&'8. 6'gASP.NET'Internet Explorer runtime hosth?F: :.(.&'"S&*F::*.(.&'I.S 'FNO ControlEvidence SecurityPermission Nếu bạn nạp một assembly vào một miền ứng dụng hai lần nhưng gán chứng cứ khác vào assembly này mỗi lần như thế, bộ thực thi sẽ ném ngoại lệ System.IO.FileLoadException . PFM:=::*.(.&'"!.. M:' F6.6$ Evidence .DDE Evidence .&:D$::L*!QD$::.&* .D (.&' .6 $ Evidence 'F M:* (.&'HI&*::.;::$&C&*(.&'8 ::.@'I::?LZ^z]>M: G=I'I*.(.&'"#M:.' >&*t6.6$ Evidence Bảng 13.2 Các lớp và các phương thức của chúng cho phép bạn gán chứng cứ cho một assembly Lớp/Phương thức Mô tả y System.Activator PM:'CI.:) CreateInstance CreateInstanceFrom 7* . . : ) Q (.&'$Ji 528 Chương 13: Bảo mật y System.AppDomain PM:'CI.:) $.4&CD$ AppDomain gM:$ 0>Fh CreateInstance CreateInstanceAndUnwrap CreateInstanceFrom CreateInstanceFromAndUnwrap 7*.Q(.&'$Ji DefineDynamicAssembly 7* . D $ System.Reflection.Emit. AssemblyBuilder 8&*FO)F* .(.&'& ExecuteAssembly H*=.(.&'F.6S$ iqgM: Main h Load H*(.&'$Ji y System.Reflection.Assembly PM:'CI.:) Load LoadFile LoadFrom LoadWithPartialName H*(.&'$Ji l*.S)<'%&'O)M: Assembly.Load *.(.&' .:)70 Load 8*.S'*.6$ Evidence O)M: AddHost F>.D$:: Site Zone g >4> System.Security.Policy h // Tạo các đối tượng chứng cứ Site và Zone mới. System.Security.Policy.Site siteEvidence = new System.Security.Policy.Site("www.microsoft.com"); System.Security.Policy.Zone zoneEvidence = new System.Security.Policy.Zone(System.Security.SecurityZone.Trusted); // Tạo một tập hợp Evidence mới. System.Security.Policy.Evidence evidence = new System.Security.Policy.Evidence(); // Thêm các đối tượng chứng cứ Site và Zone vào tập hợp Evidence // bằng phương thức AddHost. 529 Chương 13: Bảo mật evidence.AddHost(siteEvidence); evidence.AddHost(zoneEvidence); // Nạp assembly có tên là "SomeAssembly" và gán các đối tượng Site và // Zone cho nó. Các đối tượng này sẽ chép đè các đối tượng Site và Zone // do bộ nạp assembly gán. System.Reflection.Assembly assembly = System.Reflection.Assembly.Load("SomeAssembly", evidence); 11. 11. X lý b o m t b th c thi b ng ch ng c c a mi n ng d ng ử ả ậ ộ ự ằ ứ ứ ủ ề ứ ụ X lý b o m t b th c thi b ng ch ng c c a mi n ng d ng ử ả ậ ộ ự ằ ứ ứ ủ ề ứ ụ Bạn cần buộc một giới hạn trên ( upper limit ) lên các quyền đang có hiệu lực với tất cả các assembly được nạp vào một miền ứng dụng cụ thể. Cấu hình chính sách bảo mật để cấp các quyền phù hợp dựa trên chứng cứ mà bạn dự định gán cho miền ứng dụng. Khi tạo miền ứng dụng bằng phương thức tĩnh CreateDomain của lớp System.AppDomain , bạn hãy cung cấp một tập hợp System.Security.Policy.Evidence chứa các đối tượng chứng cứ của miền ứng dụng. Sau đó, nạp các assembly mà bạn muốn giới hạn các quyền của chúng bên trong miền ứng dụng này. lG&=9'(.&')=>::.(.&''G *8&=?9'.:))=>::GL =4::.:)(F(.&' %4F%::F=7'F8.S*.:) ::N Bộ thực thi chỉ sử dụng các mức chính sách công ty ( enterprise ), máy ( machine ), và người dùng ( user ) để tính các quyền của một miền ứng dụng; các chính sách bảo mật của các miền ứng dụng hiện có không giữ vai trò gì cả. Mục 13.12 sẽ thảo luận chính sách bảo mật miền ứng dụng. P.:)4F::DDMI&.6';.S &=P.:)$::F.z()=>2 &.6F.k90<'>N&.6CAS w9%=:);'>9.&>.:)8&=* 'I>w.'>N&.6<'>.Š8&' I.:)$;OBD&E&=z (I&&.F:9'$'>Nl'q 9'..:)CI.S$*.: )¢¥è’‘›§8.:)I6.*>>v.S $*F "2)90O)::.:)Microsoft Internet Explorer Internet Explorer*..:).#(.F)Š).$z 9zBQF7.$)Š)Q.(E? (.&'.G*E*'e.:)wInternet Explorer*. 530 Chương 13: Bảo mật :).(8F:: System.Security.Policy.Site .:) 'l'&.58I.$)Š)*.(.&'g'Q q&h8(.&''&i&&C9'$. :))=>:: Site 2&.6 Trừ khi bạn gán chứng cứ cho miền ứng dụng một cách tường minh khi tạo nó, miền ứng dụng này không ảnh hưởng gì đến các yêu cầu bảo mật ( security demand ). l::..:)8&*S'*.6$ Evidence >.D $::NIF&5M: Evidence.AddHost w*.:) .8&*'6$ Evidence .>&*tM: q CreateDomain ‘ ꣓‘›œÓ–¥‘²¥Ì–‘˜•µ•‘’¥Å–¥‘À“’¥‘›¥©È–˜‘¹ë‘’±ª‘¨¿‘›¥è’‘›¥•‘ÀۑГ’‘¯¶–¥ z(.:) ‚))<'%&'::..:)7F8:) *.SQ.&(..:)&(’š‘›¥³L5 .:):: System.Security.Policy.Publisher .4&(N ..82)'*Iv.S$*.:)|O) 2&.68&*F.S&(.69'=*M;: .:6'&*!&( using System; using System.Security.Policy; using System.Security.Cryptography.X509Certificates; public class AppDomainEvidenceExample { public static void Main() { // Tạo một miền ứng dụng mới cho mỗi publisher mà ứng dụng này // sẽ nạp mã lệnh của nó. Truyền cho phương thức CreateAppDomain // tên công ty, và tên của file chứa chứng chỉ X.509v3 // của công ty này. AppDomain appDom1 = CreateAppDomain("Litware", "litware.cer"); AppDomain appDom2 = CreateAppDomain("Fabrikam", "fabrikam.cer"); // Nạp mã lệnh từ các publisher vào miền ứng dụng phù hợp // để thực thi. § } . một cách phù hợp. Tuy nhiên, Permview.exe không hiển thị các thao tác bảo mật bắt buộc ( imperative security operation ) nằm trong một assembly. Hiện không có cách nào để trích và tổng kết các. thực thi chỉ sử dụng các mức chính sách công ty ( enterprise ), máy ( machine ), và người dùng ( user ) để tính các quyền của một miền ứng dụng; các chính sách bảo mật của các miền ứng dụng hiện. mật evidence.AddHost(siteEvidence); evidence.AddHost(zoneEvidence); // Nạp assembly có tên là "SomeAssembly" và gán các đối tượng Site và // Zone cho nó. Các đối tượng này sẽ chép đè các đối tượng Site và Zone // do bộ nạp assembly gán. System.Reflection.Assembly