531 Chương 13: Bảo mật !OPK)c4"O !OS0 '"ƒ%P'c&gVV‹"6T K)c&gVV'A‹"6T= P‹v&`_a Z'!S0Tƒ‘ "fO'K)c4& ' HX'HX*'D ''A+ @OP"Vfv`_a'=4%‹v&`_a Z ’'="f‹"& v`_a'='9 v`_a'=&'A''A*'A+ @O'4%"Vfv`_a'=& ''? )9B'*'+ @OP8f? )4& ? ) )9B? )*+ @6' !8f? )& )&H))<*'? )+ ¼½—˜¡¾”˜¡™¿ž˜ÀžÁ˜ÂÞÁ˜¡Ä™˜ÅÄ™˜Æǘ•ÈÇ? ) œ•ÀŸ˜œ•ÀžÁ˜œÀ˜'Åɘ”Ê˘ſ˜¡™¿ž˜ÀžÁ˜ÂÞÁ ÅÌŸ˜ÍÎÈœ˜”½—˜ÊŸ& ''HX&'X*D )+ . . 12. 12. X lý b o m t b th c thiử ả ậ ộ ự X lý b o m t b th c thiử ả ậ ộ ự b ng chính sách b o m t c a mi n ng d ngằ ả ậ ủ ề ứ ụ b ng chính sách b o m t c a mi n ng d ngằ ả ậ ủ ề ứ ụ Bạn cần kiểm soát (bằng mã lệnh) các quyền được cấp cho các assembly. Cấu hình (bằng mã lệnh) chính sách bảo mật của miền ứng dụng mà bạn đã nạp các assembly vào đó. 532 Chương 13: Bảo mật P2&.6gsecurity policyh&t.&D.:2\4'genterpriseh8.' gmachineh8 )eguserh8.:)gapplication domainhL=9'Ii K9'.(.&'&5;i69'$&C.# .:2t2XgXAND 6Bh&D69'P9'5. 6z(De(.&' Ngay cả khi các mức chính sách công ty, máy, hay người dùng chỉ định code group LevelFinal (chỉ thị bộ thực thi không đánh giá các mức chính sách thấp hơn), bộ thực thi luôn sử dụng mức chính sách của miền ứng dụng để tính grant- set của một assembly. PJ .: 4 '8 .'8 )e $ % q &5 Administrative Toolsu%.:)4t*&>K&=> 4%q2.:)$l%2&.6 ..:)8&**..:2g&5.ShtF. :) {<')=..:2&5.SF.4<)8e' : * 2 & .6 . &* N )r y &'&&- .4..:2&.6L>.#D $ - 8&**)=.G<)(8iq >869'8!2.#)(PF $O)*)=.:286'$9*. 9''y6%&.6NET8S6<'84I .#'%&';<')=..:2&5.S Thông thường, bạn sẽ phát triển một công cụ trợ giúp việc tạo một mức chính sách và ghi định nghĩa mức chính sách ra file; sau đó, bạn có thể nạp định nghĩa này từ đĩa khi cần. Lớp PolicyLevel có hai phương thức nhằm đơn giản hóa quá trình này: ToXml đưa một đối tượng PolicyLevel về dạng dễ lưu trữ, và FromXml xây dựng lại một đối tượng PolicyLevel từ dạng đã được lưu trữ. "SFD$ - .42&.6..D8&*F F..:)7'.I &HX I.:). &* .D %8 ' D $ - M : HX&HX "S&*FNO 'X '' % . F 0 HX L* J F 0 HX .N>.#.:)TI&*0 HX N :8F@X.* &'&&?G L*4D$ - ..:)* (.&'.:)'P(.&'$*&*I62 &.6.:)Fz(J)=>.:2\4'8.'8 )eP2.:)J)(.&'$*F $%74 8&*O)v'*(.&'jz z6'.:).4&i&&C2.:) 533 Chương 13: Bảo mật ‚))<'%&'9%*..:2F..: )":2'9')=>&(.(.&'E$ :: &'&&' &' &'& &'&''&v`_a'= HX?G )1*+ @OPK)c4*"O$ !"ƒ+& HX)9HX&'X*:):+ >O$ !K)c!OC/V '!PMW$e8K)c& • QRW$e8"VfHX& X*)+ >O$ !K)c"fe 0& • . !QRW$e8T"Vf HX"f'Kƒ&W$e8‘$$ sKC$x)N'6'T &>I%$' /)C/"f QsK!e& ' )X*HX)+ @OP- 4K)c& - 9- &'HX- *+ @OPA'1)n'4)2!UVT0 V†Q)'&QR'! 534 Chương 13: Bảo mật ƒ'2C4 4Qe)&gK!Š!Qe $"KCM"7 4P'k'x W$K)c& &()n'9BA'1)n'* BH1')*+D B*&n>)'*:>:++ + @O8$)'"G$"$sK!‘"fQ P)P'O'&}R)'V !PA'1)n'D6s$'R†eW$ ‹'2'6$'"JCRQ '2C4"76&1x)'"fO 4"iW ?G "e"e'’C/Q6sK !%$)'C$& @O)'Q8sKA@'$ "f$!M1'=& v`_a'='='9 v`_a'=&'A''A*:'=&':+ &()n'&H)))*B)n'* B'1')*'='+D B*&n>)'*:A@':+D H'&?G + ++ @O)'Q8sK^'$ "f$!M-B'D^& v`_a'=B''9 v`_a'=&'A''A*:B'&':+ &()n'&H)))*B)n'* B'1')*B''+D B*&n>)'*:^':+D H'&?G + 535 Chương 13: Bảo mật ++ @O)'Q8sK?G$ "f$!MA'CD^& v`_a'=='C'9 v`_a'=&'A''A*:='C&':+ &()n'&H)))*B)n'* B'1')*='C'+D B*&n>)'*:?G:+D H'&?G + ++ @6P)'2"Qe$ C/C4 4'!&n$'! 48sK >&}R'!!?G 6‘C/ 8sK!%$'C$De%$ W$*/D$D !)2+& &()n'&H)))*B)n'* BH1')*+D B*&n>)'*:>:+D H'&?G + ++ n$W$K)c& )&HX*+ . . 13. 13. Xác đ nh ng i dùng hi n hành có là thành viênị ườ ệ Xác đ nh ng i dùng hi n hành có là thành viênị ườ ệ c a m t nhóm Windows nào đó hay khôngủ ộ c a m t nhóm Windows nào đó hay khôngủ ộ Bạn cần xác định người dùng hiện hành của ứng dụng có phải là thành viên của một nhóm người dùng Windows nào đó hay không. Thu lấy đối tượng System.Security.Principal.WindowsIdentity mô tả người dùng hiện hành bằng phương thức tĩnh WindowsIdentity.GetCurrent . Kế tiếp, truyền đối tượng WindowsIdentity cho phương thức khởi dựng của lớp System.Security.Principal.WindowsPrincipal để thu lấy đối tượng 536 Chương 13: Bảo mật WindowsPrincipal . Cuối cùng, gọi phương thức IsInRole của đối tượng WindowsPrincipal để xác định người dùng này có nằm trong một nhóm Windows nào đó hay không. PMIRBS.NET FrameworkQ$F2v&.6)=z>z z)e 5.)49)2<'\ • &'&'&^^) • &'&'&^' p) ^^) .4=..S*'>)q= '8 ~ * . )e ! )i gservice accounth p ) ^' .4 ^^) =6k.='" kJ.=<*8)eF.=v&.6M= 8~*.F. )eWindows l2$RBS&.6 )eWindows8NET Framework <'g=) ^^) ^' h\ • &'&'&,)B^) • &'&'&,)B' y ,)B^) =) ^^) .4. )eWindowsy ,)B' = ^' .46F.Windows . )e' u%.NET RBS.$II68&*4 ';2vv )eWindows 49 ) ^^) ^' 8&*O)=ID$ ,)B^) ,)B' l;i )eF>.F.Windows F' 48>&*0M:q ,)B^)&n'' RM: '.D$ ,)B^) .4 )eWindows.% *'>)q )e'wII8*.D$ ,)B' . 'D$ ,)B^) M:C)=PDe80M : ^^( D$ ,)B' .;(. )e'F5. .F.gkhF'4 ^^( ' I )e' >F.S$Ji8$* = Bạn có thể thu lấy tham chiếu IPrincipal đến một đối tượng WindowsPrincipal bằng thuộc tính tĩnh CurrentPrincipal của lớp System.Threading.Thread . Tuy nhiên, kỹ thuật này tùy thuộc vào cấu hình chính sách principal của miền ứng dụng hiện hành; mục 13.14 sẽ thảo luận vấn đề này chi tiết hơn. RM: ^^( F&>&*t\ • R>&:6.#:>F.N.7>F.F )* qDomainNamer•qGroupNamer DF.)=z>z.F )* qMachineNamer•qGroupNamer DF.$iq&HI.D. 537 Chương 13: Bảo mật > . F. Windows x8 &* S' O ) )* F^-@^>•qGroupNamer ^^( =.F<&Kz D >F.$Ji • R>&:6.D'>g h8D'Ji. Windows Role IdentifiergRIDhRID.MI6&IF.84 4Kglanguageh=&iFglocalizationh • R> & : & 6 . > > &'&'&,)BF^( w > ' i q >.4F. Windows FÏLZ^^>>8 RID8i ,)BF^( .#F.Windowsx Bảng 13.3 Tên, RID, và giá trị WindowsBuiltInRole của các tài khoản có sẵn Tên tài khoản RID (Hex) Giá trị WindowsBuiltInRole BUILTIN\Account Operators 0x224 Hp'' BUILTIN\Administrators 0x220 H)'' BUILTIN\Backup Operators 0x227 FCp'' BUILTIN\Guests 0x222 n BUILTIN\Power Users 0x223 B'' BUILTIN\Print Operators 0x226 'p'' BUILTIN\Replicators 0x228 (' BUILTIN\Server Operators 0x225 p'' BUILTIN\Users 0x221 ' Ý Lớp WindowsIdentity cung cấp các phương thức khởi dựng nạp chồng cho phép bạn thu lấy đối tượng WindowsIdentity mô tả một người dùng nào đó (khi chạy trên Microsoft Windows Server 2003 trở về sau). Bạn có thể sử dụng đối tượng này và phương pháp được mô tả trong mục này để xác định xem người dùng đó có phải là thành viên của một nhóm Windows nào đó hay không. Nếu bạn sử dụng một trong các phương thức khởi dựng này khi chạy trên một phiên bản Windows cũ, nó sẽ ném ngoại lệ System.ArgumentException . Trên các nền Windows trước Windows Server 2003 , bạn phải sử dụng mã lệnh nguyên sinh ( native code ) để thu lấy Windows access token mô tả người dùng cần thiết. Kế đó, bạn có thể sử dụng access token này để tạo đối tượng WindowsIdentity ; mục 13.15 sẽ trình bày cách thu lấy Windows access token cho những người dùng cụ thể. ‚) ,)Bn'?G )<'%&'. )eF >.6F.Windows $>>'4PF.'$J iDD)kT&*!>.'28>.8' F^-@^> gD F.Windows xh>F. 538 Chương 13: Bảo mật &'&' ,)Bn'?G )1*'qr'+ @Q"Vf,)B^) /e)20!& ,)B^))9,)B^)&n''*+ @O"Vf,)B'/e$Ce«e8 T"Vf,)B^)"f‹"& ,)B''9B,)B'*)+ X0s$"VV)h0*6ƒ+ !C'G )20!ƒ!! 6TxƒC/& ='*'''+ &,'-*:^_.'=L.…9\.:D )&>D'D'&^^(*'++ . . . HI&**'2)' )eF> ]L >..'2F > 1H<^>? &5 WindowsGroupExample BUILTIN\Administrators BUILTIN\Users MACHINE\Accountants 8I;F\ ^1H<^>?•]L'=F^-@^>•H)''…9A ^1H<^>?•]L'=F^-@^>•'…9@' ^1H<^>?•]L'=1H<^>?•H…9@' 14. 14. H n ch nh ng ng i dùng nào đó th c thi mã l nh c a b nạ ế ữ ườ ự ệ ủ ạ H n ch nh ng ng i dùng nào đó th c thi mã l nh c a b nạ ế ữ ườ ự ệ ủ ạ Bạn cần hạn chế những người dùng nào đó truy xuất các phần tử trong mã lệnh của bạn dựa trên tên người dùng hay các vai trò mà người dùng này là thành viên. 539 Chương 13: Bảo mật Sử dụng lớp System.Security.Permissions.PrincipalPermission và bản sao đặc tính System.Security.Permissions.PrincipalPermissionAttribute của lớp này để bảo vệ các phần tử trong chương trình của bạn với các yêu cầu RBS . NET Framework#$'>NRBS &/&gimperativeRBS demandh'>NRBS &gdeclarative RBS demandhy '' #$&.6&/ &8&!2 ''H' '#$&.6 &P'>NRBS O)GD'>NCAS8'>N RBS J}>. )eF8!4 Mk. )e'>"'>NRBS &=;X>k )e 8 I G4 * '> N8 & = @ X. * &'&'?G l*.S)<'%&'G.'>N&.6&/&\ U$TP67e8P)Nk'6k k'h& )1)*+ • '''9 B''*:'>:D:(>:+ '&X)*+ • . 7>8&**.D$ '' Ji> )e> k.&*'>N8t0M: X) FL*JFJi.> )e>k.#'>NHI> )e!>k 8& …i?@V.S'>Nw9'';.S8.'>N RBS 4I9.ŠT&=J> )e k )e l*.S)<'%&'G.'>N&.6&\ U$TP67e8C$)Nk'6k k'h& q''*'H&X)D>9:'>:D (9:(>:+r )1)*+ˆ&&&ˆ. L*F''>NRBS&C.:'.:>P'>N.:z )>QF.'>N.:zz>X1 '>N.:z HF8&*F=0='>NRBS&/&'&7'>8 '>N&.6&/&X&*2$'>NRBS.S =K'>NRBS:*H8I4&Ik'> )e '>NG&>)i8&*O)'>N&/&P'>NRBS&F 6$G6.S)r6&IMH8&*F 540 Chương 13: Bảo mật ;(.'>N RBS &&54Permview.exegS$6. Z^ahP)e='>NRBS&/&'&8&*?/5&= F';>k )e‘¯“–¥‘˜•“‘'>N. e$ y &@')&@') .4.%g*'.S$z 9zBh72q ''' @') :. ^' E .4 )e.%*'>)q 'A.: 8.#%?F.Windows access tokenIE.4Windows .%*'>)q'L*N5 ^' Windows access token =>& Windows O) access token=MI&.68&=NET O) ^' '>NRBS C.::)"!)eGF.4e . )e8'4Fq446' 7(.!i82 @')&''' 4;iu%' 4>9I )eF. 8J.NVD :)O)4'8IINET 0C)=‰ ‰D 2 ''' 7 >8 .S ' 2 @')&''' 8&=. ^' 2'( <'\ Z HI.:).%=F.principal.!i8 %&=@principal'2 @')&''' 7(.!i8.:)4F principal .!iL*FI6 principal .! i . . : ) &5 0 M : @')' >.D$ &HX .4.:)&* .D % l 0 ' 8 .S &* F N O '' '' L*JFI6principal.!i .N.#.:)T 0 @')' :)3I* &'&&?G ] HI.:)4Fprincipal.!i82principal .: ) @ ; i = ^' @ $ * F @')&''' l%2principal ..:)8&*N'D$ HX .4.:)0M: ' D$ 'RM: ' 6.>> &'&'&' 8i'&ID$ ^' @$ @')&''' l0 ' 8 .S&*FNO '' '' LZ^_ >i ' Ti.!i )' ^ HI.S&*FNO '' '' 8&*F = * D $ ^' = I F 2 . ụ Bạn cần kiểm soát (bằng mã lệnh) các quyền được cấp cho các assembly. Cấu hình (bằng mã lệnh) chính sách bảo mật của miền ứng dụng mà bạn đã nạp các assembly vào đó. 532 Chương 13: Bảo. System.Security.Permissions.PrincipalPermissionAttribute của lớp này để bảo vệ các phần tử trong chương trình của bạn với các yêu cầu RBS . NET Framework#$'>NRBS &/&gimperativeRBS. tượng này và phương pháp được mô tả trong mục này để xác định xem người dùng đó có phải là thành viên của một nhóm Windows nào đó hay không. Nếu bạn sử dụng một trong các phương thức khởi