Bảo mật phần 2

Chia sẻ: Nghia Bui Tuan | Ngày: | Loại File: PDF | Số trang:7

0
60
lượt xem
6
download

Bảo mật phần 2

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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.

Chủ đề:
Lưu

Nội dung Text: Bảo mật phần 2

  1. 1.1 Bảo đảm bộ thực thi cấp cho assembly một số quyền nào đó 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.
  2. • 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.
  3. 1.2 Giới hạn các quyền được cấp cho assembly 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
  4. 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ì đó... } }
  5. 1.3 Xem các yêu cầu quyền được tạo bởi một assembly 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ì đó... }
  6. } Thực thi lệnh permview PermissionViewExample.exe sẽ sinh ra kết xuất như sau. Mặc dù không mấy thân thiện nhưng bạn vẫn có thể đọc kết xuất để xác định các yêu cầu quyền được tạo bởi assembly. Mỗi kiểu trong ba kiểu yêu cầu quyền—tối thiểu, tùy chọn, và loại trừ—được liệt kê dưới một tiêu đề riêng và được kết cấu ở dạng XML của một đối tượng System.Security.PermissionSet. Microsoft (R) .NET Framework Permission Request Viewer. Version 1.1.4322.510 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. minimal permission set: optional permission set: refused permission set: 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. 1.4 Xác định mã lệnh có quyền nào đó lúc thực thi hay không
  7. 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. Tạo và cấu hình quyền mà bạn muốn kiểm tra rồi truyền nó cho phương thức tĩnh IsGranted của lớp System.Security.SecurityManager. Sử dụng yêu cầu quyền tối thiểu, bạn có thể bảo đảm rằng bộ thực thi cấp cho assembly tập các quyền đã được chỉ định; nếu mã lệnh của bạn đang chạy, bạn có thể chắc rằng nó có các quyền tối thiểu đã được yêu cầu. Tuy nhiên, bạn có thể muốn hiện thực một chức năng có tính “cơ hội” sao cho ứng dụng có thể cung cấp chức năng đó chỉ khi bộ thực thi cấp cho assembly của bạn các quyền phù hợp. Cách tiếp cận này được chính thức hóa một phần bằng các yêu cầu quyền tùy chọn, cho phép bạn định nghĩa một tập các quyền mà mã lệnh của bạn có thể tận dụng nếu chính sách bảo mật cấp chúng, nhưng lại không thiết yếu đối với sự vận hành thành công của mã lệnh (mục 13.5 đã trình bày chi tiết về các yêu cầu quyền tùy chọn). Vấn đề đối với các yêu cầu quyền tùy chọn là bộ thực thi không có khả năng báo cho assembly rằng nó đã cấp những quyền nào. Bạn có thể sử dụng một thao tác được-bảo-vệ và thất bại một cách êm xuôi khi lời gọi này dẫn đến ngoại lệ System.Security.SecurityException. Tuy nhiên, sẽ hiệu quả hơn khi xác định xem bạn có các quyền cần thiết hay không. Sau đó, bạn có thể xây dựng logic vào trong mã lệnh để tránh gọi phải các thành viên được-bảo-vệ mà sẽ gây ra stack walk và dựng nên các ngoại lệ bảo mật. Đoạn mã dưới đây trình bày cách sử dụng phương thức IsGranted để xác định xem assembly hiện tại có quyền ghi vào thư mục C:\Data hay không. Bạn có thể tạo một lời gọi như thế mỗi khi bạn cần kiểm tra quyền, nhưng sẽ hiệu quả hơn nếu sử dụng một giá trị luận lý để thiết lập một cờ cấu hình cho biết có cho phép người dùng lưu file hay không. // Định nghĩa một biến luận lý cho biết assembly có quyền // truy xuất ghi đối với thư mục C:\Data hay không. bool canWrite = false; // Tạo và cấu hình một đối tượng FileIOPermission mô tả quyền // truy xuất ghi đối với thư mục C:\Data. System.Security.Permissions.FileIOPermission fileIOPerm = new System.Security.Permissions.FileIOPermission( System.Security.Permissions.FileIOPermissionAccess.Write, @"C:\Data"); // Kiểm tra assembly hiện tại có quyền đã được chỉ định hay không. canWrite = System.Security.SecurityManager.IsGranted(fileIOPerm);
Đồng bộ tài khoản