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.
§
}