1. Trang chủ
  2. » Công Nghệ Thông Tin

Các giải pháp lập trình CSharp- P66 doc

10 231 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 2,62 MB

Nội dung

541 Chương 13: Bảo mật Thread.CurrentPrincipal . Việc này sẽ ngăn bộ thực thi gán các đối tượng IPrincipal mặc định hoặc tạo ra các đối tượng mới dựa trên chính sách principal. Bảng 13.4 Các thành viên thuộc kiểu liệt kê PrincipalPolicy Tên thành viên Mô tả NoPrincipal Không có đối tượng IPrincipal nào được tạo ra, Thread.CurrentPrincipal trả về một tham chiếu null . UnauthenticatedPrincipal Một đối tượng System.Security.Principal. GenericPrincipal rỗng được tạo ra và được gán cho Thread.CurrentPrincipal . WindowsPrincipal Một đối tượng WindowsPrincipal (mô tả người dùng Windows đã đăng nhập) được tạo ra và được gán cho Thread.CurrentPrincipal . Bất kể sử dụng phương pháp nào để thiết lập IPrincipal cho tiểu trình hiện hành, bạn cũng phải làm như thế trước khi sử dụng các yêu cầu bảo mật RBS, nếu không thông tin về người dùng ( IPrincipal ) sẽ không có hiệu lực để bộ thực thi có thể xử lý yêu cầu. Bình thường, khi chạy trên nền Windows, bạn thiết lập chính sách principal của một miền ứng dụng là PrincipalPolicy.WindowsPrincipal để thu lấy thông tin về người dùng Windows: // Thu lấy một tham chiếu đến miền ứng dụng hiện hành. AppDomain appDomain = System.AppDomain.CurrentDomain; // Cấu hình miền ứng dụng hiện hành sao cho sử dụng các // principal dựa-trên-Windows. appDomain.SetPrincipalPolicy( System.Security.Principal.PrincipalPolicy.WindowsPrincipal); File RoleBasedSecurityExample.cs (trong đĩa CD đính kèm) minh họa cách sử dụng các yêu cầu RBS bắt buộc và khai báo. Phần thứ nhất trình bày ba phương thức được bảo vệ bằng các yêu cầu RBS bắt buộc. Nếu đối tượng Thread.CurrentPrincipal không thỏa các đòi hỏi về tên người dùng và tư cách thành viên, yêu cầu sẽ ném ngoại lệ SecurityException . public static void ProtectedMethod1() { // Một yêu cầu bảo mật bắt buộc dựa-trên-vai-trò: principal // hiện hành mô tả một định danh với tên là "nnbphuong81", // các vai trò của principal là không quan trọng. System.Security.Permissions.PrincipalPermission perm = new System.Security.Permissions.PrincipalPermission (@"MACHINE\nnbphuong81", null); perm.Demand(); 542 Chương 13: Bảo mật } public static void ProtectedMethod2() { // Một yêu cầu bảo mật bắt buộc dựa-trên-vai-trò: principal // hiện tại là một thành viên của vai trò "Managers" hay // "Developers". Khi sử dụng PrincipalPermission, bạn chỉ có thể diễn // tả mối quan hệ OR. Đó là vì phương thức PrincipalPolicy.Intersect // luôn trả về một quyền rỗng trừ khi hai input là như nhau. // Tuy nhiên, bạn có thể sử dụng lôgic của mã lệnh để hiện thực // các điều kiện phức tạp hơn. Trong trường hợp này, tên của định // danh là không quan trọng. System.Security.Permissions.PrincipalPermission perm1 = new System.Security.Permissions.PrincipalPermission (null, @"MACHINE\Managers"); System.Security.Permissions.PrincipalPermission perm2 = new System.Security.Permissions.PrincipalPermission (null, @"MACHINE\Developers"); perm1.Union(perm2).Demand(); } public static void ProtectedMethod3() { // Một yêu cầu bảo mật bắt buộc dựa-trên-vai-trò: principal // hiện tại mô tả một định danh với tên là "nnbphuong81" và // là một thành viên của vai trò "Managers". System.Security.Permissions.PrincipalPermission perm = new System.Security.Permissions.PrincipalPermission (@"MACHINE\nnbphuong81", @"MACHINE\Managers"); perm.Demand(); } Phần thứ hai trình bày ba phương thức được bảo vệ bằng các yêu cầu RBS khai báo, tương đương với các yêu cầu RBS bắt buộc vừa được trình bày ở trên: 543 Chương 13: Bảo mật // Một yêu cầu bảo mật khai báo dựa-trên-vai-trò: principal hiện tại // mô tả một định danh với tên là "nnbphuong81", các vai trò của // principal là không quan trọng. [PrincipalPermission(SecurityAction.Demand, Name = @"MACHINE\nnbphuong81")] public static void ProtectedMethod1() { /* */} // Một yêu cầu bảo mật khai báo dựa-trên-vai-trò: principal hiện tại // là một thành viên của vai trò "Managers" hay "Developers". Bạn chỉ // có thể diễn tả mối quan hệ OR (không thể diễn tả mối quan hệ AND). // Tên của định danh là không quan trọng. [PrincipalPermission(SecurityAction.Demand, Role = @"MACHINE\Managers")] [PrincipalPermission(SecurityAction.Demand, Role = @"MACHINE\Developers")] public static void ProtectedMethod2() { /* */} // Một yêu cầu bảo mật khai báo dựa-trên-vai-trò: principal hiện tại // mô tả một định danh với tên là "nnbphuong81" và là một thành viên // của vai trò "Managers". [PrincipalPermission(SecurityAction.Demand, Name = @"MACHINE\nnbphuong81", Role = @"MACHINE\Managers")] public static void ProtectedMethod3() { /* */} 15. 15. Gi nh n ng i dùng Windowsả ậ ườ Gi nh n ng i dùng Windowsả ậ ườ   Bạn muốn mã lệnh của bạn chạy trong ngữ cảnh của một người dùng Windows nào đó chứ không phải tài khoản người dùng hiện đang tích cực.   Thu lấy đối tượng System.Security.Principal.WindowsIdentity mô tả người dùng Windows mà bạn cần giả nhận, rồi gọi phương thức Impersonate của đối tượng WindowsIdentity . Mỗi tiểu trình Windows đều có một access token kết giao—mô tả tài khoản Windows mà tiểu trình hiện đang chạy trên danh nghĩa của tài khoản này. Hệ điều hành Windows sử dụng access token để xác định một tiểu trình có các quyền thích đáng để thực hiện các thao tác được-bảo-vệ trên danh nghĩa của tài khoản này hay không, như đọc/ghi file, khởi động lại hệ thống, và thay đổi thời gian hệ thống. Theo mặc định, một ứng dụng được-quản-lý chạy trong ngữ cảnh của tài khoản Windows đã thực thi ứng dụng. Điều này là hoàn toàn bình thường, nhưng đôi lúc bạn muốn chạy ứng 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. 545 Chương 13: Bảo mật Ứng dụng này sử dụng hàm LogonUser của Win32 API để thu lấy Windows access token cho người dùng được chỉ định, giả nhận người dùng này, rồi trở về ngữ cảnh của người dùng cũ. Ví dụ, lệnh ImpersonationExample nnbphuong81 password sẽ giả nhận người dùng nnbphuong81 nếu người dùng đó đã tồn tại trong cơ sở dữ liệu tài khoản cục bộ. using System; using System.IO; using System.Security.Principal; using System.Security.Permissions; using System.Runtime.InteropServices; // Bảo đảm assembly có quyền truy xuất mã lệnh không-được-quản-lý // và có quyền kiểm soát principal của tiểu trình. [assembly:SecurityPermission(SecurityAction.RequestMinimum, UnmanagedCode=true, ControlPrincipal=true)] public class ImpersonationExample { // Định nghĩa các hằng số được sử dụng cùng với hàm LogonUser. const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_LOGON_INTERACTIVE = 2; // Nhập hàm Win32 LogonUser từ advapi32.dll. Chỉ định // "SetLastError = true" để có thể truy xuất các mã lỗi của Win32. [DllImport("advapi32.dll", SetLastError=true)] static extern int LogonUser(string userName, string domain, string password, int logonType, int logonProvider, ref IntPtr accessToken); public static void Main(string[] args) { // Tạo một IntPtr mới để giữ lấy access token // do hàm LogonUser trả về. IntPtr accessToken = IntPtr.Zero; // Gọi LogonUser để thu lấy access token cho người dùng // được chỉ định. Biến accessToken được truyền cho LogonUser // bằng tham chiếu và sẽ chứa tham chiếu đến Windows access token // nếu LogonUser thành công. int result = LogonUser( 546 Chương 13: Bảo mật args[0], // tên người dùng để đăng nhập ".", // sử dụng CSDL tài khoản cục bộ args[1], // password của người dùng LOGON32_LOGON_INTERACTIVE, // tạo một interactive login LOGON32_PROVIDER_DEFAULT, // sử dụng logon provider mặc định ref accessToken // nhận access token handle ); // Nếu lỗi xảy ra (LogonUser trả về zero), hiển thị lỗi và thoát. if (result == 0) { Console.WriteLine("LogonUser returned error {0}", Marshal.GetLastWin32Error()); } else { // Tạo một WindowsIdentity mới từ Windows access token. WindowsIdentity identity = new WindowsIdentity(accessToken); // Hiển thị định danh đang tích cực (trước khi giả nhận). Console.WriteLine("Identity before impersonation = {0}", WindowsIdentity.GetCurrent().Name); // Giả nhận người dùng đã được chỉ định. Đối tượng // WindowsImpersonationContext chứa các thông tin // cần thiết để trở về ngữ cảnh của người dùng cũ. WindowsImpersonationContext impContext = identity.Impersonate(); // Hiển thị định danh đang tích cực (trong lúc giả nhận). Console.WriteLine("Identity during impersonation = {0}", WindowsIdentity.GetCurrent().Name); // *************************************************************** // Thực hiện các hành động với danh nghĩa người dùng được giả nhận // *************************************************************** 547 Chương 13: Bảo mật // Trở về người dùng Windows cũ bằng đối tượng // WindowsImpersonationContext. impContext.Undo();as // Hiển thị định danh đang tích cực (sau khi giả nhận). Console.WriteLine("Identity after impersonation = {0}", WindowsIdentity.GetCurrent().Name); } } } 14 548 Chương 14:MẬT MÃ 549 550 Chương 14: Mật mã ật mã (cryptography) là một trong những mặt phức tạp nhất của quá trình phát triển phần mềm mà bất kỳ nhà phát triển nào cũng sẽ sử dụng. Lý thuyết kỹ thuật mật mã hiện đại cực kỳ khó hiểu và đòi hỏi một mức kiến thức toán học mà tương đối ít người có được. May mắn là thư viện lớp .NET Framework cung cấp các hiện thực dễ sử dụng cho hầu hết các kỹ thuật mật mã thông dụng và hỗ trợ các giải thuật phổ biến nhất. Chương này sẽ bàn về các vấn đề sau: M  Tạo số ngẫu nhiên (mục 14.1).  Tạo và xác minh các mã băm mật mã và các mã băm có khóa (mục 14.2, 14.3, 14.4, và 14.5).  Sử dụng giải thuật đối xứng và không đối xứng để mật hóa và giải mật hóa dữ liệu (mục 14.6 và 14.8).  Tìm lại, lưu trữ, và chuyển đổi các khóa mật mã (mục 14.7, 14.9, và 14.10).  Khi nghĩ cách áp dụng các kỹ thuật trong chương này vào mã lệnh, bạn nên nhớ rằng mật mã chẳng phải là cái mà bạn hiện thực đơn lẻ. Mật mã không ngang bằng với bảo mật ( security ); sử dụng mật mã chỉ là một phần nhỏ trong việc tạo một giải pháp an toàn. Đối với những ai chưa quen thuộc với mật mã, dưới đây là định nghĩa của một số từ quan trọng: • Encrypt (động từ, tạm dịch là mật hóa) là mã hóa thông tin theo cách nào đó để mọi người không thể đọc được nó, trừ những ai có khóa. • Decrypt (động từ, tạm dịch là giải mật hóa) là giải mã thông tin đã-được-mật-hóa. • Key là chuỗi các bit dùng để mật hóa và giải mật hóa thông tin. • Plaintext là text chưa-được-mật-hóa hay đã-được-giải-mật-hóa. • Ciphertext là text đã-được-mật-hóa. 1. 1. T o s ng u nhiênạ ố ẫ T o s ng u nhiênạ ố ẫ   Bạn cần tạo một số ngẫu nhiên dùng cho các ứng dụng mật mã và bảo mật.   Sử dụng một bộ tạo số ngẫu nhiên mật mã ( cryptographic random number generator ), chẳng hạn System.Security.Cryptography.RNGCryptoServiceProvider . Lớp System.Random là một bộ tạo số giả ngẫu nhiên, nó sử dụng một giải thuật toán học để mô phỏng việc tạo số ngẫu nhiên. Thực ra, giải thuật này là tất định (deterministic), nghĩa là bạn luôn có thể tính được số kế tiếp sẽ là gì dựa trên số đã được tạo trước đó. Điều này nghĩa là các số được tạo bởi lớp Random sẽ không phù hợp khi tính bảo mật được ưu tiên, chẳng hạn tạo khóa mật hóa và password. Khi cần một số ngẫu nhiên không tất định (nondeterministic) dùng trong các ứng dụng liên quan đến mật mã hay bảo mật, bạn phải sử dụng bộ tạo số ngẫu nhiên dẫn xuất từ lớp . họa cách sử dụng các yêu cầu RBS bắt buộc và khai báo. Phần thứ nhất trình bày ba phương thức được bảo vệ bằng các yêu cầu RBS bắt buộc. Nếu đối tượng Thread.CurrentPrincipal không thỏa các. viện lớp .NET Framework cung cấp các hiện thực dễ sử dụng cho hầu hết các kỹ thuật mật mã thông dụng và hỗ trợ các giải thuật phổ biến nhất. Chương này sẽ bàn về các vấn đề sau: M  Tạo số ngẫu. tạm dịch là giải mật hóa) là giải mã thông tin đã-được-mật-hóa. • Key là chuỗi các bit dùng để mật hóa và giải mật hóa thông tin. • Plaintext là text chưa-được-mật-hóa hay đã-được -giải- mật-hóa. • Ciphertext

Ngày đăng: 08/07/2014, 17:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN