Bảo mật ASP.NET
Bảo mật vốn là chủ đề cực kỳ phức tạp và bảo mật trong ASP.NET cũng
không phải ngoại lệ. Các lập trình viên .NET chắc hẳn cũng đã quen
thuộc với những khó khăn gặp phải khi tìm kiếm tài liệu tiếng Việt trong
lĩnh vực này. Hôm nay, Quản Trị Mạng xin giới thiệu nôi dung chương 9,
chương về Bảo mật ASP.NET trong cuốn “ASP.NET in a Nutshell” của
hai tác giả Andrew Duthie và Matthew MacDonald, nhà xuất bản
O’Reilly.
Trong chương này, chúng ta sẽ đề cập đến một số phương thức giúp đảm bảo
an toàn cho các ứng dụng ASP.NET. Để nhấn mạnh vào nội dung trọng tâm
của chương, chúng ta sẽ không bàn về bảo mật mạng, bảo mật máy chủ và
bảo mật cơ sở hạ tầng ASP.NET. Nói như thế không có nghĩa là các chủ đề
đó không quan trọng. Ngược lại, nếu không cấu hình hỗ trợ bảo mật phù hợp
cho máy chủ và cơ sở hạ tầng mạng, những gì cố gắng thực hiện để đảm bảo
an toàn cho ứng dụng ASP.NET thông qua các công cụ .NET Framework
cung cấp sẽ trở nên vô ích. Tuy nhiên, nằm trong phạm vi giới hạn của một
chương nên chúng ta chỉ đi sâu vào vấn đề bảo mật các chương trình ứng
dụng ASP.NET.
, ngoại trừ một điểm là có thêm một ô textbox (để kiểm chứng mật khẩu) và ba điều khiển kiểm tra tính hợp lệ: Một điều khiển CompareValidator để xác định xem giá trị trong ô Password và PasswordConfirm có khớp với nhau hay không. Một điều khiển RequiredFieldValidator để xác nhận người dùng đã nhập địa chỉ e-mail, vì thế chúng ta không có giá trị e-mail null trong file XML. Một điều khiển RequiredFieldValidator để đảm bảo rằng người dùng đã nhập mật khẩu để không có giá trị mật khẩu null trong file XML. Nếu muốn đảm bảo thêm cho e-mail nhập vào là hợp lệ, chúng ta có thể sử dụng hàm RegularExpressionValidator. Trong trình điều khiển sự kiện Register_Click, đầu tiên nó sẽ kiểm tra để đảm bảo trang web là hợp lệ nhằm giúp vi xử lý tránh phải lãng phí thời gian làm việc với dữ liệu không hợp lệ. Nếu trình duyệt của người dùng hỗ trợ DHTML, trang web thậm chí sẽ không được đưa lên cho đến khi các yêu cầu của điều khiển hợp lệ được đáp ứng. Nếu trang web hợp lệ, một biến DataSet cục bộ sẽ được khai báo và được cấp phát không gian bộ nhớ trên file Users.xml. Sau đó là kiểm tra xem địa chỉ e- mail người dùng nhập vào có tồn tại trên file không. Nếu không, thuộc tính Text của điều khiển Label ASP.NET sẽ được dùng để yêu cầu người dùng nhập một địa chỉ e-mail khác. Nếu e-mail đó không tồn tại, một DataRow mới sẽ được tạo, chứa địa chỉ e- mail đã chọn của người dùng cùng với bản băm của mật khẩu, thêm hàng mới vào dataset và ghi dataset trở lại file XML (như ví dụ bên dưới). Kỹ thuật này không kiểm soát trùng hợp, vì thế nếu ai đó thay đổi nội dung của file XML trong khi nó đang được đọc hoặc ghi dữ liệu vào thì các thay đổi sẽ bị ghi đè. Dim NewUser As DataRow NewUser = LoginDS.Tables(0).NewRow( ) NewUser("Email") = Email.Text NewUser("Password") = _ FormsAuthentication.HashPasswordForStoringInConfigFile( _ Password.Text, "SHA1") LoginDS.Tables(0).Rows.Add(NewUser) LoginDS.WriteXml(Server.MapPath("Users.xml")) Chú ý: Để ghi file Users.xml thành công, tài khoản bên dưới bộ thực thi ASP.NET đang chạy phải truy cập được vào file. Sau khi ghi thông tin của người dùng mới vào Users.xml, chúng ta sẽ đưa người dùng tới trang mô tả trong tham số xâu truy vấn: Response.Redirect(Request.QueryString("Page")) 9.1.2.2. Thoát (Log-out) Nhiều khi chúng ta phải làm việc với thông tin nhạy cảm trong ứng dụng từ các máy công cộng. Trong những trường hợp như vậy, chúng ta cần cung cấp cho người dùng một số cách log-out nhằm ngăn người khác truy cập thông tin riêng tư hoặc truy cập tài nguyên ứng dụng thông qua tài khoản của họ. Trong thẩm định Forms điều này khá đơn giản. Chúng ta có thể gọi phương thức tĩnh SignOut của lớp FormsAuthentication như ở ví dụ 9-4. Khi đó người dùng sẽ được chuyển đến file Logout.aspx để hoàn chỉnh quá trình log- out. Chúng ta cũng có thể tạo một điều khiển người dùng chứa một nút mà khi kích vào nó sẽ gọi ra phương thức SignOut và thêm điều khiển người dùng cho tất cả các trang được bảo vệ của ứng dụng. Ví dụ 9-4. Logout.aspx Logout Page Sub Page_Load(Sender As Object, e As EventArgs) FormsAuthentication.SignOut( ) Message.Text = "You have been logged out." End Sub Ví dụ 9-5 thể hiện nội dung của file Users.xml. Ví dụ 9-5. Users.xml andrew@aspnetian.com 816010E041FA485C6E2383C649343D3A0CAD4D25</Passwo rd> 9.1.3. Thẩm định Passport Thẩm định Passport cho phép một người dùng có một mật khẩu duy nhất trong khi có thể đăng nhập (địa chỉ e-mail được gắn với tài khoản Passport của họ) vào nhiều ứng dụng hay website. Điều này giúp đơn giản quá trình đăng nhập của người dùng và giảm bớt công việc quản trị khi bảo trì tài khoản người dùng. Để sử dụng được thẩm định Passport trong ASP.NET chúng ta phải download và cài đặt Passport SDK. Sau khi cài đặt Passport SDK, chúng ta cần cấu hình theo cấu trúc tương ứng. Cuối cùng là cấu hình ứng dụng ASP.NET để sử dụng thẩm định Passport, như đoạn mã bên dưới: <!-- Other configuration elements --> Phần tử và thuộc tính redirectUrl là tuỳ ý và được dùng để mô tả một URL nôi bộ để chuyển hướng nếu người dùng đưa ra yêu cầu đăng nhập không sử dụng tài khoản các Passport của họ. Nếu được bỏ qua, người dùng đăng nhập không sử dụng tài khoản Passport sẽ được chuyển tới trang đăng nhập trên một server login Passport. 9.2. Cấp phép (Authorization) Cấp phép là quá trình xác định xem liệu người dùng đã được nhận dạng trong quá trình thẩm định có được phép truy cập tài nguyên họ đang yêu cầu không hay phải thực hiện thêm hành động nào khác (ví dụ như update dữ liệu cho cơ sở dữ liệu rồi mới được truy cập). Quá trình thẩm định trả lời cho câu hỏi: “Bạn là ai?”, còn quá trình cấp phép trả lời cho câu hỏi: “Bạn có được phép làm điều đó hay không?”. Cấp phép trong ASP.NET có ba hình thức: cấp phép sử dụng Danh sách điều khiển truy cập (ACL), cấp phép sử dụng đưòng dẫn URL và cấp phép programmatic. 9.2.1. Cấp phép ACL Danh sách điều khiển truy cập (ACL) được dùng trong Windows NT, Windows 2000, Windows XP và Windows Sever 2003 để kiểm soát truy cập tài nguyên hệ thống như các tệp, thư mục trong hệ thống file NTFS. Bạn có thể gán một số tài nguyên nhất định vào ACL cho tài khoản người dùng hoặc một nhóm người dùng Windows để cho phép họ truy cập tài nguyên hoặc xác định kiểu truy cập (đọc, ghi, thay đổi…) được phép dùng. Thẩm định ACL chủ yếu được dùng với thẩm định Windows trong ASP.NET. IIS sử dụng nhân dạng người dùng đã qua thẩm định để thực hiện các kiểm tra ACL và cũng có thể đưa ra các yêu cầu về tài nguyên được bảo vệ bởi ACL. bằng cách dùng ngữ cảnh bảo mật của người dùng, nếu impersonation được cho phép. Để bảo vệ một file dùng ACL, kích phải chuột lên file trong Windows Explorer và chọn Properties. Tiếp theo, bấm chọn thẻ Security để xem người dùng, nhóm người dùng và đặc quyền hiện thời có trên file. Sử dụng các nút Add và Remove để thêm hoặc bớt tài khoản người dùng, nhóm người dùng và đánh dấu hoặc bỏ dấu ở các ô trong phần Permissions để thay đổi đặc quyền cho người dùng. (Trong Windows XP, thẻ Security có thể không xuất hiện trên hộp thoại Properties của file hay folder nếu chức năng Simple File Sharing được bật. Để xem liệu thành phần này có đang được bật hay không, vào Tools > Folder Options trong Windows Explorer. Sau đó chọn thẻ View, vào phần Advanced Settings, bỏ dấu chọn trong ô "Use simple file sharing (recommended)" đi là được). Một trong những việc cần làm đầu tiên trong là loại bỏ nhóm Everyone ra khỏi thư mục, do nhóm này cho phép bất kỳ ai truy cập máy tính cũng có thể truy cập file này. Khi loại bỏ một số tài khoản đặc biệt (như SYSTEM) khỏi các danh sách ACL chúng ta cần thận trọng. Một số file hệ điều hành đòi hỏi phải có tài khoản SYSTEM mới được phép truy cập để thực hiện các chức năng của hệ điều hành. Vì thế loại bỏ những đặc quyền này có thể là nguyên nhân gây ra nhiều vấn đề nghiêm trọng. thậm chí dẫn đến không khởi động được hệ điều hành. 9.2.2. Cấp phép URL Chế độ cấp phép URL sử dụng các yếu tố và của phần tử cấu hình để kiểm soát truy cập file, thư mục bên trong ứng dụng, giống như trong ví dụ ở thẩm định Forms. Truy cập có thể được cho phép hoặc bị từ chối dựa trên tên người dùng (username), vai trò (role) và phương thức HTTP dùng để yêu cầu tài nguyên. Do đó, lấy ví dụ, nếu cho phép người dùng Marcie truy cập tất cả tài nguyên trong ứng dụng theo tất cả phương thức yêu cầu của HTTP, nhưng cấm người dùng Charles thực hiện yêu cầu POST, chúng ta sẽ phải thêm phần vào sau file web.config ở mức gốc của ứng dụng (hoặc có thể thêm phần vào file web.config trong một thư mục con để ghi đè hoặc thêm các thiết lập): Như trên hình 9-1, chúng ta có thể dùng thẻ với thuộc tính path cho điều khiển truy cập của một file hay folder cụ thể: Do thẻ trong file web.config đòi hỏi cặp thẻ riêng của nó nên thẻ luôn xuất hiện bên trong các thẻ và nhưng bên ngoài các thẻ và . Chúng ta có thể định nghĩa ít hay nhiều thẻ khác nhau tuỳ ý. Mỗi thể có thể chứa những giới hạn cấp phép URL riêng. Để mô tả miền thay cho các tài khoản hay nhóm cục bộ, chúng ta có thể sử dụng định dạng domainname\ userorgroupname khi mô tả tên trong và . Có hai ký tự đặc biệt: “*” cho phép tất cả người dùng, “?” là chỉ những người dùng nặc danh (không qua thẩm định). Cuối cùng, có thể mô tả nhiều người dùng hoặc nhóm người dùng cùng một lúc trong và bằng dấu phẩy. 9.2.3 Cấp phép Programmatic (programmatic authorization) Chúng ta có thể thực hiện các kiểm tra programmatic tại thời gian chạy bằng cách xác định xem liệu người dùng có được phép thực hiện một hành động nào đó hay không. Công cụ chủ yếu để thực hiện điều này là phương thức IsInRole, được định nghĩa bởi giao diện IPrincipalvà có thể truy cập từ thuộc tính User của lớp Page. Cũng như với cấp phép ACL, phương thức này hữu ích nhất khi dùng với cơ chế thẩm định Windows và khi muốn kiểm tra xem liệu liệu người dùng đã qua thẩm định thuộc nhóm Windows nào, như nhóm manager (quản lý) chẳng hạn. Chúng ta có thể lấy ví dụ minh hoạ cho việc sử dụng IsInRole như bên dưới: If Page.User.IsInRole("Managers") Then 'perform some action restricted to managers Else Message.Text = "You must be a manager to perform this action" End If Bạn đọc thân mến, có thể thấy rõ bảo mật ứng dụng trong ASP.NET tập trung làm rõ hai vấn đề thẩm định (authentication) và cấp phép (authorization). Song ngoài hai khái niệm chính này chúng ta cũng cần biết đến một số yếu tố đáng quan tâm khác mà có dịp chúng tôi sẽ tiếp tục chuyển tới các bạn vào một ngày gần nhất. Hy vọng các bạn đã có được một tài liệu tham khảo hữu ích từ phần bài dịch này của tác giả. Trong quá trình dịch không thể tránh khỏi một số sai sót, mong các bạn góp ý để giúp tác giả sửa chữa nhằm phục vụ bạn đọc một tác phẩm hay hơn và chính xác hơn.
File đính kèm:
- Bảo mật ASP.NET.pdf