Chương 13 : Bảo mật
Mục tiêu chính của Microsoft .NET Framework là làm cho việc lập trình trở nên an toàn
hơn—đặc biệt lưu tâm đến việc sử dụng mobile code
1[1][5]
và các hệ thống phân tán. Hầu
hết các hệ điều hành hiện đại (bao gồm Microsoft Windows) đều hỗ trợ bảo mật dựa-trên-
người-dùng (User-Based Security), cho phép bạn kiểm soát các hành động và các tài
nguyên mà một người dùng truy xuất đến. Tuy nhiên, do sự phát triển của mạng máy
tính, đặc biệt là Internet, sự bảo mật nếu chỉ dựa vào định danh của người dùng trên hệ
thống là chưa đủ. Khi quan tâm đến bảo mậ
t, mã lệnh không nên tự động nhận mức tin
cậy như mức tin cậy mà bạn đã ấn định cho người đang chạy mã lệnh này.
.NET Framework kết hợp hai mô hình bảo mật bổ sung lẫn nhau (thực hiện nhiều vấn đề
liên quan đến bảo mật người dùng và mã lệnh):
• CAS (Code Access Security—Bảo mật truy xuất mã lệnh)
• RBS (Role-Based Security—Bảo mật dựa-trên-vai-trò)
CAS và RBS không thay th
ế hay sao lại các phương tiện bảo mật do hệ điều hành nằm
dưới cung cấp. Chúng là các cơ chế độc lập nền, cấp thêm các khả năng bảo mật để nâng
cao tính bảo mật tổng thể trong các giải pháp được-quản-lý.
CAS sử dụng các thông tin về nguồn gốc của một assembly đã được thu thập lúc thực
thi—đây là chứng cứ (evidence)—để xác định xem mã lệnh có th
ể truy xuất các hành
động và tài nguyên nào—đây là quyền (permission). Chính sách bảo mật của .NET
Framework—một tập hợp phân cấp các quy tắc cấu hình—định nghĩa phép ánh xạ giữa
chứng cứ và quyền. Thư viện lớp .NET Framework sử dụng các yêu cầu quyền
(permission demand hay permission request) để bảo vệ các chức năng quan trọng nhất
của nó không bị truy xuất trái phép. Một yêu cầu buộc bộ
thực thi bảo đảm rằng: nếu
muốn gọi một phương thức được-bảo-vệ thì mã lệnh phải có một quyền cụ thể nào đó.
Tích hợp RBS với các tài khoản người dùng Windows và xác định xem một người
dùng có là thành viên của một nhóm Windows nào đó hay không (mục 13.13).
Kiểm soát việc truy xuất đến các chức năng của ứng dụng dựa trên người dùng hiện
hành và các vai trò mà người dùng này là một thành viên (mục 13.14).
Giả nhận một người dùng Windows để thực hiện các tác vụ hệ điều hành trên danh
nghĩa người dùng đó (mục 13.15).
Các mục liên quan đến RBS và CAS trong chương này trình bày một số công việc thông
thường mà bạn sẽ cần thực hiện trong các ứng dụng, nhưng chúng chỉ mô tả một phần
nhỏ trong các khả năng bảo mật của .NET Framework. Để hiểu rõ hơn, bạn hãy tham
khảo một quyển sách khác chuyên về bảo mật trong .NET Framework.
1.1
Cho phép mã lệnh có-độ-tin-cậy-một-phần
sử dụng assembly tên mạnh của bạn
V
VBạn cần viết một assembly chia sẻ sao cho nó là khả truy xuất đối với mã lệnh
có-độ-tin-cậy-một-phần (theo mặc định, bộ thực thi không cho phép mã lệnh
có-độ-tin-cậy-một-phần truy xuất các kiểu và các thành viên nằm trong một
assembly tên mạnh).
#
#Áp dụng đặc tính System.Security.AllowPartiallyTrustedCallersAttribute cho
assembly chia sẻ của bạn.
bạn không cần áp đặt một hạn chế bao trùm để ngăn mã lệnh có-độ-tin-cậy-
một-phần sử dụng assembly của bạn. Tuy nhiên, đối với một assembly bất kỳ,
không thể chứng minh rằng không có lỗ h
ổng bảo mật nào để mã nguy hiểm có
thể lợi dụng. Do đó, bạn nên xem xét cẩn thận nhu cầu cho phép mã lệnh có-
độ-tin-cậy-một-phần truy xuất assembly tên mạnh trước khi áp dụng đặc tính
AllowPartiallyTrustedCallersAttribute.
Bộ thực thi ngăn mã lệnh có-độ-tin-cậy-một-phần truy xuất các assembly tên mạnh bằng
cách đặt LinkDemand vào tập quyền FullTrust trên mọi thành viên công-khai (public) và
được-bảo-vệ (protected) của mỗi kiểu khả-truy-xuất-công-khai đượ
c định nghĩa trong
assembly. Điều này có nghĩa là chỉ những assembly được cấp các quyền tương đương với
tập quyền FullTrust thì mới có thể truy xuất các kiểu và thành viên trong assembly tên
mạnh. Việc áp dụng AllowPartiallyTrustedCallersAttribute vào assembly tên mạnh báo
với bộ thực thi không buộc LinkDemand có hiệu lực trên các thành viên và các kiểu bên
trong.
#
Bộ thực thi chịu trách nhiệm buộc các hoạt động bảo mật ngầm LinkDemand
có hiệu lực để bảo vệ các assembly tên mạnh; C# assembler không sinh ra các
lệnh khai báo LinkDemand lúc biên dịch.
Đoạn mã dưới đây trình bày một ứng dụng có sử dụng đặc tính
AllowPartiallyTrustedCallersAttribute. Chú ý rằng, bạn phải sử dụng tiền tố assembly: để
báo với trình biên dịch rằng đích của đặc tính này là assembly (còn được gọi là đặc tính
toàn cục—global attribute). Ngoài ra, không cần thêm phần Attribute vào tên của đặc
tính—mặc dù bạn có thể thêm vào nếu muốn. Vì bạn nhắm đến assembly nên đặc tính
này phải được đặt sau các lệnh using mức trên, nhưng trước các khai báo không gian tên
và kiểu.
using System.Security;
[assembly:AllowPartiallyTrustedCallers]
Thiết lập thuộc tính SecurityEnabled của lớp
System.Security.SecurityManager là false và lưu lại bằng phương thức
SecurityManager.SavePolicy. Bạn cũng có thể sử dụng công cụ Code Access
Security Policy (Caspol.exe) và thực thi lệnh caspol –s off.
CAS là phần then chốt trong mô hình bảo mật của bộ thực thi .NET, và cũng là phần đặc
trưng của nền tảng .NET mà nhiều nền tảng khác không có. Mặc dù CAS được xây dựng
với tiêu chí đảm b
ảo hiệu năng thực thi cao nhất và đã được sử dụng một cách cẩn trọng
trong thư viện lớp .NET, nhưng vẫn có một chi phí cho mỗi yêu cầu bảo mật (security
demand) và stack walk (kết quả) mà bộ thực thi phải thực hiện.
Đôi lúc, bảo mật mức-mã-lệnh có thể không là điều bạn bận tâm, hoặc nhu cầu hiệu năng
có thể vượt quá nhu cầu CAS. Trong các trường hợp này, bạn có thể vô hiệu hoàn toàn
CAS và loại bỏ chi phí cho việc kiểm tra bảo mật mức-mã-lệnh. Vô hiệu CAS có tác dụng
trao cho mã lệnh khả năng thực hiện bất kỳ hành động nào mà .NET Framework hỗ trợ
(tương đương với t
ập quyền FullTrust), bao gồm khả năng nạp mã lệnh khác, gọi các thư
viện nguyên sinh, và sử dụng con trỏ để trực tiếp truy xuất bộ nhớ.
#
Bạn chỉ nên vô hiệu CAS vì các lý do hiệu năng sau khi đã tiêu hết tất cả các
chừng mực có thể khác để đạt được các đặc điểm hiệu năng mà ứng dụng của
bạn đòi hỏi. Việc lập profile cho mã lệnh thường sẽ nhận biết những vùng mà
bạn có thể cải thiện đáng kể hiệu năng nhưng không phải vô hiệu CAS. Ngoài
ra, bạn c
ần bảo đảm các tài nguyên hệ thống đã được bảo vệ bằng các cơ chế
bảo mật của hệ điều hành (như Windows ACLs) trước khi vô hiệu CAS.
Caspol.exe là một tiện ích được cấp cùng với .NET Framework, cho phép bạn cấu hình
chính sách bảo mật truy xuất mã lệnh từ dòng lệnh. Khi bạn nhập lệnh caspol –s off hoặc
caspol –s on, tiện ích này sẽ xác lập thuộc tính SecurityEnabled của lớ
p