Tải bản đầy đủ (.pdf) (7 trang)

Tài liệu Bảo mật phần 2 doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (179.37 KB, 7 trang )

1.1
Bảo đảm bộ thực thi cấp cho assembly một số quyền nào đó
V
V


Bạn cần bảo đảm bộ thực thi cấp cho assembly của bạn các quyền truy xuất mã
lệnh (code access permission) mà các quyền này quyết định sự thành công trong
hoạt động của ứng dụng.
#
#


Sử dụng các yêu cầu quyền (permission request) để chỉ định các quyền truy
xuất mã lệnh mà assembly cần phải có. Bạn khai báo các yêu cầu quyền bằng
các đặc tính quyền truy xuất mã lệnh ở mức assembly.
Các yêu cầu quyền cho biết các quyền mà mã lệnh phải có thì mới có thể chạy được. Ví
dụ, nếu bạn viết một trình xem phim sao cho người dùng có thể sử dụng nó để tải và xem
phim từ một server, thật tai hạ
i nếu chính sách bảo mật của người dùng không cho phép
chương trình này mở một kết nối mạng đến server. Chương trình của bạn sẽ nạp và chạy,
nhưng khi người dùng kết nối đến server để xem phim, chương trình sẽ crash với ngoại lệ
System.Security.SecurityException. Giải pháp là đưa vào assembly yêu cầu quyền cần
thiết để có thể mở một kết nối mạng đến server (System.Net.WebPermission hay
System.Net.SocketPermission, tùy thuộc vào kiểu kết nối b
ạn cần mở).
Bộ thực thi thực hiện các yêu cầu quyền với nguyên tắc: khoan nạp mã lệnh, điều này tốt
hơn là nạp mã lệnh và thất bại sau khi thực hiện một hành động mà nó không có quyền.
Vì vậy, nếu sau quá trình phân giải chính sách bảo mật, bộ thực thi xác định được grant-
set của assembly không thể đáp ứng các yêu cầu quyền của assembly, nó sẽ không nạp
assembly và ném ngoại lệ System.Security.Policy.PolicyException.


Để khai báo một yêu c
ầu quyền, bạn phải sử dụng bản sao đặc tính (attribute
counterpart) của quyền truy xuất mã lệnh bạn cần. Tất cả các quyền truy xuất mã lệnh
đều có một bản sao đặc tính mà bạn có thể sử dụng để tạo ra các lệnh bảo mật khai báo
(declarative security statement)—bao gồm các yêu cầu quyền. Ví dụ, bản sao đặc tính
của SocketPermission là SocketPermissionAttribute, và bản sao đặc tính của
WebPermission là WebPermissionAttribute—Tất cả các quyền và các bản sao đặ
c tính
của chúng cùng theo quy ước đặt tên và là các thành viên của cùng không gian tên.
Ứng dụng PermissionRequestExample dưới đây có hai yêu cầu quyền: một cho
SocketPermission và một cho SecurityPermission. Bạn cần nhớ các điều sau:
• Bạn phải khai báo yêu cầu quyền sau bất kỳ lệnh using mức trên nào nhưng trước
bất kỳ khai báo kiểu hay không gian tên nào.
• Đặc tính phải nhắm đến assembly nên bạn phải thêm tiền tố assembly: vào tên đặc
tính.
• Không cần thêm phần Attribute vào tên đặc tính—mặc dù bạ
n có thể thêm vào nếu
muốn.
• Bạn phải chỉ định SecurityAction.RequestMinimum là đối số đầu tiên của đặc
tính—giá trị này cho biết đây là một yêu cầu quyền.
• Bạn phải cấu hình đặc tính để mô tả quyền truy xuất mã lệnh mà bạn cần bằng các
thuộc tính của đặc tính. Bạn hãy tham khảo tài liệu .NET Framework SDK để biết
thêm chi tiết về các thuộc tính do mỗi đặc tính bảo mật truy xuất mã lệnh hiện th
ực.
• Các lệnh yêu cầu quyền không được kết thúc bằng dấu chấm phẩy (;).
• Để tạo nhiều yêu cầu quyền, chỉ cần thêm nhiều lệnh yêu cầu quyền như được trình
bày trong ví dụ dưới đây:
using System.Net;
using System.Security.Permissions;


// Yêu cầu SocketPermission (cho phép mở một kết nối
// TCP đến host và port được chỉ định).
[assembly:SocketPermission(SecurityAction.RequestMinimum,
Access = "Connect", Host = "www.fabrikam.com",
Port = "3538", Transport = "Tcp")]

// Yêu cầu phần tử UnmanagedCode của SecurityPermission,
// (kiểm soát khả năng thực thi mã lệnh không-được-quản-lý).
[assembly:SecurityPermission(SecurityAction.RequestMinimum,
UnmanagedCode = true)]

public class PermissionRequestExample {
public static void Main() {
// Làm gì đó...
}
}
Nếu bạn thực thi ứng dụng PermissionRequestExample và chính sách bảo mật không cấp
cho assembly này các quyền được yêu cầu, bạn sẽ nhận được ngoại lệ PolicyException
như dưới đây và ứng dụng sẽ không thực thi. Khi sử dụng chính sách bảo mật mặc định,
điều này sẽ xảy ra nếu bạn chạy assembly từ một mạng dùng chung vì các assembly được
nạp từ Intranet không được cấp SocketPermission.
Unhandled Exception: System.Security.Policy.PolicyException:
Required permission cannot be acquired.
Khi bạn nạp một assembly từ bên trong mã lệnh (tự động hay bằng tay), và assembly này
có chứa các yêu cầu quyền mà chính sách bảo mật không đáp ứng thì phương thức mà
bạn sử dụng để nạp assembly sẽ ném ngoại lệ PolicyException, do đó bạn phải thụ lý sao
cho phù hợp.
1.2
Giới hạn các quyền được cấp cho assembly
V

V


Bạn cần hạn chế các quyền truy xuất mã lệnh được cấp cho assembly của bạn,
đảm bảo người khác và phần mềm khác không thể biến mã lệnh của bạn thành
một cơ chế mà thông qua đó để thực hiện các hành động nguy hiểm hay không
mong muốn.
#
#


Sử dụng các lệnh bảo mật khai báo (declarative security statement) để chỉ định
các yêu cầu quyền tùy chọn (optional permission request) và các yêu cầu loại trừ
quyền (permission refusal request) trong assembly của bạn. Các yêu cầu quyền
tùy chọn định nghĩa tập tối đa các quyền mà bộ thực thi sẽ cấp cho assembly.
Các yêu cầu loại trừ quyền chỉ định các quyền cụ thể mà bộ thực thi sẽ không
cấp cho assembly.
Nếu quan tâm
đến bảo mật, thật lý tưởng khi mã lệnh của bạn chỉ có các quyền truy xuất
mã lệnh cần thiết để thực hiện chức năng của nó. Điều này giảm thiểu nguy cơ người
khác và mã lệnh khác sử dụng mã lệnh của bạn để thực hiện các hành động nguy hiểm
hay không mong muốn. Vấn đề là, bộ thực thi phân giải các quyền của một assembly
bằng chính sách bảo mậ
t (do một người dùng nào đó hay người quản trị cấu hình). Chính
sách bảo mật có thể khác nhau tại mỗi nơi mà ứng dụng chạy, và bạn không thể kiểm soát
các quyền mà chính sách bảo mật ấn định cho mã lệnh của bạn.
Mặc dù bạn không thể kiểm soát chính sách bảo mật tại tất cả các nơi mà mã lệnh chạy,
nhưng .NET Framework cung cấp hai cơ chế mà thông qua đó, bạn có thể loại b
ỏ các
quyền được cấp cho assembly của bạn: yêu cầu loại trừ (refuse request) và yêu cầu tùy

chọn (optional request). Yêu cầu loại trừ cho phép bạn chỉ ra các quyền cụ thể mà bạn
không muốn bộ thực thi cấp cho assembly. Sau quá trình phân giải chính sách, nếu grant-
set của một assembly chứa bất kỳ quyền nào đã được chỉ định trong một yêu cầu loại trừ,
bộ thực thi sẽ loại bỏ quyền
đó. Yêu cầu tùy chọn định nghĩa tập tối đa các quyền mà bộ
thực thi có thể cấp cho assembly. Nếu grant-set của một assembly chứa bất kỳ quyền nào
khác với các quyền đã được chỉ định trong yêu cầu tùy chọn, bộ thực thi sẽ loại bỏ quyền
đó. Khác với yêu cầu quyền tối thiểu (đã được thảo luận trong mục 13.4), bộ thực thi sẽ
không từ ch
ối nạp assembly của bạn nếu nó không thể cấp tất cả các quyền đã được chỉ
định trong yêu cầu tùy chọn.
Bạn có thể coi yêu cầu loại trừ và yêu cầu tùy chọn là các cách chọn lựa để thu được
cùng kết quả; cách mà bạn sử dụng tùy thuộc vào số lượng quyền bạn muốn loại bỏ. Nếu
muốn loại bỏ một số ít quyền, bạn hãy chọn yêu c
ầu loại trừ. Tuy nhiên, nếu muốn loại
bỏ nhiều quyền, bạn hãy chọn yêu cầu tùy chọn (yêu cầu này gồm một số quyền bạn cần,
phần quyền còn lại sẽ tự động bị loại bỏ).
Bạn thêm các yêu cầu tùy chọn và yêu cầu loại trừ vào mã lệnh bằng các lệnh bảo mật
khai báo với cú pháp giống như các yêu cầu quyền tối thiểu đã đượ
c thảo luận trong mục
13.4. Điểm khác biệt duy nhất là giá trị của System.Security.Permissions.SecurityAction
mà bạn truyền cho phương thức khởi dựng của đặc tính quyền. Sử dụng
SecurityAction.RequestOptional để khai báo một yêu cầu tùy chọn và
SecurityAction.RequestRefuse để khai báo một yêu cầu loại trừ. Cũng giống như các yêu
cầu quyền tối thiểu, bạn phải khai báo các yêu cầu tùy chọn và yêu cầu loại trừ là các đặc
tính toàn cục bằng cách thêm tiền tố assembly: vào tên đặc tính. Ngoài ra, tất c
ả các yêu
cầu phải xuất hiện sau bất kỳ lệnh using mức trên nào nhưng trước bất kỳ khai báo kiểu
hay không gian tên nào.
Ví dụ dưới đây minh họa một yêu cầu quyền tùy chọn cho tập quyền Internet. Đây là tập

quyền được định nghĩa bởi chính sách bảo mật mặc định. Khi bộ thực thi nạp
OptionalRequestExample, nó sẽ không cấp cho assembly này bất cứ quyền nào không
nằm trong tập quyền Internet (tham khảo tài liệ
u .NET Framework SDK để biết thêm chi
tiết về các quyền trong tập quyền Internet).
using System.Security.Permissions;

[assembly:PermissionSet(SecurityAction.RequestOptional, Name = "Internet")]

public class OptionalRequestExample {

public static void Main() {

// Làm gì đó...
}
}
Trái với OptionalRequestExample, ví dụ dưới đây sử dụng một yêu cầu loại trừ để loại bỏ
quyền System.Security.Permissions.FileIOPermission (mô tả quyền truy xuất ghi đối với
ổ đĩa C):
using System.Security.Permissions;

[assembly:FileIOPermission(SecurityAction.RequestRefuse, Write = @"C:\")]

public class RefuseRequestExample {

public static void Main() {

// Làm gì đó...
}
}

1.3
Xem các yêu cầu quyền được tạo bởi một assembly
V
V


Bạn cần xem các các loại trừ và các yêu cầu quyền khai báo được tạo bên trong
một assembly để có thể cấu hình chính sách bảo mật một cách phù hợp, hoặc
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).
Để cấu hình chính sách bảo mật một cách phù hợp, bạn cần biết các nhu cầu quyền truy
xuất mã lệnh (code access permission requirements) của các assembly mà bạn dự định sẽ
chạy. Điều này đúng cho cả các thư viện và các assembly thực thi được truy xuất từ ứng
dụng của bạn. Đối với thư viện, bạn c
ần biết assembly loại bỏ những quyền nào để không
sử dụng thư viện này để thực hiện một hành động bị hạn chế (sẽ dẫn đến ngoại lệ
System.Security.SecurityException).
Công cụ Permview.exe cung cấp một cơ chế đơn giản mà thông qua đó, bạn có thể xem
các yêu cầu quyền khai báo (declarative permission request) được tạo bên trong một
assembly—bao gồm yêu cầu tối thiểu (minimum request), yêu cầu tùy chọ
n (optional
request), và yêu cầu loại trừ (refusal request). Ví dụ, lớp dưới đây khai báo một cầu tối
thiểu, một yêu cầu tùy chọn, và một yêu cầu loại trừ:
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ì đó...
}

×