544
Chương 13: Bảo mật
dụng trong ngữ cảnh của một tài khoản Windows khác. Điều này đúng trong trường hợp các
ứng dụng phía server cần xử lý phiên giao dịch dựa trên danh nghĩa của các người dùng kết
nối đến server. Thông thường, một ứng dụng server chạy trong ngữ cảnh của tài khoản
Windows được tạo riêng cho ứng dụng—đây là tài khoản dịch vụ (service account). Tài khoản
dịch vụ này sẽ có các quyền tối thiểu để truy xuất các tài nguyên hệ thống, làm cho ứng dụng
hoạt động như thể đó là người dùng đã kết nối cho phép ứng dụng truy xuất các hoạt động và
tài nguyên phù hợp với quyền hạn của người dùng đó. Khi một ứng dụng nắm lấy định danh
của một người dùng khác, đây là sự giả nhận (impersonation). Nếu được hiện thực đúng, sự
giả nhận sẽ đơn giản hóa việc quản trị bảo mật và thiết kế ứng dụng, trong khi vẫn duy trì việc
giải trình người dùng.
Như đã thảo luận trong mục 13.14, Windows access token và .NET principal của
một tiểu trình là các thực thể riêng biệt và có thể mô tả những người dùng khác
nhau. Kỹ thuật giả nhận được mô tả trong mục này chỉ thay đổi Windows access
token của tiểu trình hiện hành, chứ không thay đổi principal của tiểu trình này.
Để thay đổi principal của tiểu trình, mã lệnh của bạn phải có phần tử
ControlPrincipal
của
SecurityPermission
và gán một đối tượng
System.Security.Principal.IPrincipal
mới vào thuộc tính
CurrentPrincipal
của
System.Threading.Thread
hiện hành.
Lớp
System.Security.Principal.WindowsIdentity
cung cấp các chức năng mà thông qua đó,
bạn có thể thực hiện sự giả nhận. Tuy nhiên, quá trình này tùy thuộc vào ứng dụng của bạn
đang chạy trên phiên bản Windows nào. Trên Windows Server 2003 trở về sau, lớp
WindowsIdentity
hỗ trợ các phiên bản nạp của chồng phương thức khởi dựng, cho phép tạo ra
các đối tượng
WindowsIdentity
dựa trên tên tài khoản của người dùng cần giả nhận. Trên tất
cả các phiên bản Windows trước đó, trước hết bạn phải thu lấy
System.IntPtr
chứa tham
chiếu đến Windows access token mô tả người dùng cần giả nhận. Để thu lấy tham chiếu này,
bạn cần sử dụng một phương thức nguyên sinh như
LogonUser
của Win32 API.
Vấn đề chủ yếu khi thực hiện sự giả nhận trên Windows 2000 và Windows NT là
một tài khoản phải có đặc quyền SE_TCB_NAME thì mới có thể thực thi
LogonUser
. Điều này đòi hỏi bạn cấu hình chính sách bảo mật của Windows và
cấp cho tài khoản quyền “Act as part of operating system” (mức tin cậy rất cao).
Bạn đừng bao giờ trực tiếp cấp đặc quyền SE_TCB_NAME cho các tài khoản
người dùng.
Một khi đã có đối tượng
WindowsIdentity
mô tả người dùng cần giả nhận, bạn hãy gọi
phương thức
Impersonate
của nó. Từ lúc này, tất cả các hành động mà mã lệnh của bạn thực
hiện đều diễn ra trong ngữ cảnh của tài khoản Windows đã được giả nhận. Phương thức
Impersonate
trả về đối tượng
System.Security.Principal.WindowsSecurityContext
, đối
tượng này mô tả tài khoản tích cực trước khi giả nhận. Để trở về tài khoản cũ, bạn cần gọi
phương thức
Undo
của đối tượng
WindowsSecurityContext
này.
Ứng dụng dưới đây trình bày sự giả nhận của một người dùng Windows. Ứng dụng này cần
hai đối số dòng lệnh: tên tài khoản của người dùng cần giả nhận và password của tài khoản.