Trao đổi với tôi

http://www.buidao.com

2/6/10

[Security] Security Watch Subjects và các nguyên tắc bảo mật

Ở mức cơ bản nhất, mọi thứ trong bảo mật có thể qui về chủ thể và khách thể. Khách thể là những thứ bạn bảo vệ và chủ thể là những thứ bạn cần bảo vệ khỏi chúng.
Hai đối tượng này được dùng trong chứng nhận (cho biết bạn là ai), cấp phép (cho truy cập đến một cái gì đó), và kiểm tra (theo dấu ai đã truy cập cái gì). Về cơ bản thì những khái niệm này cũng đơn giản, như hình 1.

Hình ảnh
Hình 1 một người dùng đang cố gắng đọc 1 file.

Chủ thể là những gì làm việc, còn khách thể là những thứ mà chủ thể làm việc với. Ngoài ra, thỉnh thoảng những khách thể này là chủ thể của những khách thể khác.
Windows hỗ trợ những ngữ nghĩa học vô cùng phong phú khi nói về bảo mật và đã mở rộng rất nhiều những định nghĩa về khách thể và chủ thể. Một chủ thể có thể không chỉ là một người dùng, và mô tả còn phức tạp hơn là nhận diện người dùng cơ bản.
Trong cách nói của Windows, một nguyên tắc bảo mật không chỉ bao quanh những chủ thể điển hình (mà bạn thường nghĩa là một người dùng) mà còn cả các nhóm và các máy tính. Một nguyên tắc bảo mật là bất cứ thứ gì có thể được gán một nhận diện bảo mật (SID) và được cho quyền truy cập một số thứ.
Trong cài đặt Security Watch, tôi sẽ giới thiệu về những chủ thể được nói đến và sử dụng trong Windows.

The Subject/Object/Action Tuple

Quản lý bảo mật thường hạ xuống đến subject/object/action tuple. Chủ thể là một nhân vật đang cố gắng thực hiện một số hành động nào đó trên một khách thể. Ví dụ, một người dùng có thể cố gắng để truy cập vào một file, như hình 1. Khi một người dùng cố gắng đọc file, hệ điều hành cần kiểm tra liệu các cho phép có được cài đặt trên khách thể (file) cho phép chủ thể (người dùng) thực hiện hoạt động (đọc) trên đối tượng xác định đó không. Nếu cho phép có, yêu cầu truy cập thành công. Nếu cho phép không có, yêu cầu truy cập bị từ chối. Điều này cũng đơn giản thôi.
Case Matters
Trong ngôn ngữ Windows, khi bạn nhìn thấy các từ "Administrator" or "Administrators" với chữ "A" hoa, điều này thường chỉ một người dùng hay một nhóm. Khi bạn thấy nó được đánh tất cả bằng chữ thường -"administrator" - thì nó chỉ một tài khoản người dùng hay một người có đặc quyền quản trị. Cũng tương tự như vậy với các chức danh khác, như "Guest" và "guest."

Các dạng nguyên tắc bảo mật

Chủ thể - hay các nguyên tắc bảo mật, và từ nay tôi sẽ nói đến chúng - trong một hệ thống dựa trên Windows, và bởi một phần mở rộng mạng dựa trên Windows, có thể không chỉ là một người dùng. Tuy nhiên, người dùng vẫn còn là một khái niệm cơ bản nhất.

Người dùng: một người dùng là một thực thể log on vào một máy tính. Về cơ bản, tất cả các nguyên tắc bảo mật ít nhất đều có liên quan đến người dùng. Trong Windows, có hai dạng người dùng: local và domain. Người dùng local được xác định nghĩa trong cơ sở dữ liệu Security Accounts Manager (SAM) local. Mỗi máy tính dựa trên Windows có một SAM local, chứa những người dùng trên máy đó.

Thông thường mọi người vẫn nghĩ rằng domain controllers (DCs) không có SAM local và do đó mà không có người dùng local. Tuy nhiên, điều này là không chính xác. Dẫu cho một DC có SAM local, nhưng tài khoản trên SAM của nó chỉ có thể dùng trong Directory Services Restore Mode.

SAM local luôn chứa ít nhất 2 tài khoản người dùng: Administrator và Guest, và tài khoản Guest thì bị tắt mặc định.

Trong tất cả các phiên bản của Windows Server 2008 (ngoại trừ Windows Small Business Server 2008), tài khoản Administrator được mở mặc định và bạn phải dùng tài khoản này lần đầu tiên bạn đăng nhập vào máy tính. Trong Windows Vista, tài khoản Administrator bị tắt mặc định và chỉ có thể dùng trong những trường hợp rất hạn chế.

Dẫu là thế nào, bạn cũng nên tạo ít nhất 2 tài khoản cho mỗi người sẽ quản lý một máy tính cho sẵn. Nếu bạn là chủ thể cho phần lớn các loại nguyên tắc, thì đây là một yêu cầu. Với mỗi người dùng, một tài khoản nên là tài khoản quản trị cá nhân của người dùng đó. Tài khoản khác là tài khoản cá nhân không quản trị của người dùng cho các công việc không cần quyền quản trị.

Users Who Are Not Local Are Domain Users: Những người dùng này được định nghĩa trên DC cho domain. Điểm khác biệt giữa tài khoản local và domain chủ yếu là phạm vi của tài khoản. Tài khoản domain có thể dùng trên bất kỳ máy nào trong domain còn tài khoản local chỉ có giá trị trên máy tính mà chúng được định nghĩa. Ngoài ra, tài khoản domain có thể có một số lớn các thuộc tính tương ứng với chúng khi so sánh với tài khoản local.

Hình ảnh
Hình 2 cửa sổ thuộc tính cho một tài khoản local

Hình ảnh
Hình 3 Cửa sổ thuộc tính cho một tài khoản domain

Tài khoản domain có một nhóm nhiều các ngữ nghĩa học, chứa nhiều phân bổ khác nhau trong một môi trường, như là số điện thoại, các mối quan hệ quản lý, các tài khoản email. Tài khoản domain còn hữu dụng hơn trong một mạng bởi vì chúng có thể dùng và gán cho phép lên các máy tính trong cả mạng. Thêm vào đó, định nghĩa các tài khoản trong domain làm đơn giản hoá việc quản lý vì bây giờ bạn chỉ cần duy trì các tài khoản ở một nơi.
Computers A: máy tính là một dạng người dùng khác. Trong Active Directory, nó đặc biệt đúng và được khai sinh bởi hình mẫu kế thừa. Cấu trúc kế thừa dẫn đến một máy tính được outline như (hình 4).

Hình ảnh

Hình 4 hệ thống kế thừa trong Active Directory thể hiện mối quan hệ người dùng và máy tính

Cũng có vài thứ thú vị được miêu tả trong hình 4. Đầu tiên, như bạn có thể thấy, tất cả các lớp trong Active Directory đều bắt nguồn từ một lớp gốc gọi là Top. Thực tế, ngay cả Top cũng được xem là subsclass của Top. Thứ hai, lớp User bắt nguồn từ lớp organizationalPerson. Nói cách khác, cách nói theo khách thể, một Computer là một dạng người dùng. Nhân hoá máy tính theo cách này cũng là điều hợp lý, mặc dù bởi vì máy tính cần được xem như là một chủ thể và có tất cả những phân bổ như là một con người.
Chủ thể Groups, như bạn nhớ lại, là đối tượng đang cố gắng truy cập vào một khách thể. Hệ điều hành nhận diện cố gắng truy cập này bằng cách kiểm tra quyền cho phép của khách thể. Từ đầu, các nhà thiết kế OS nhận ra rằng sẽ khó rất cồng kềnh khi gán quyền cho phép lên mỗi khách thể đơn lẻ cho mỗi người dùng đơn lẻ dùng nó. Để giải quyết vấn đề, các nhà thiết kế cho phép người dùng trở thành thành viên của một nhóm. Điều này giúp bạn gán cho phép lên cả nhóm tức là nhiều người dùng.

Một nhóm có thể không phải là một người dùng, nhưng một nhóm vẫn là một dạng nguyên tắc bảo mật bởi vì nó có thể có kí hiệu nhân diện của nó, cũng giống như người dùng và máy tính. Trong Windows, một người dùng có thể là thành viên của nhiều nhóm và một khách thể có thể có quyền cho phép gán cho nhiều nhóm. Các nhóm được lồng vào cũng được cho phép, với một số hạn chế.

Non-domain controller có hai dạng nhóm, nhóm built-in và nhóm local đã được người quản lý định nghĩa. Tuy nhiên, trong Active Directory, bạn sẽ nhìn thấy 6 dạng khác nhau của các nhóm bảo mật: nhóm built-in Domain Local, nhóm built-in Global, nhóm built-in Universal, nhóm user-defined Domain Local, nhóm user-defined Global, và nhóm user-defined Universal.

Nhóm Domain Local chỉ có thể gán cho phép đến các tài nguyên trong domain nơi chúng được định nghĩa. Tuy nhiên, chúng có thể chứa những người dùng, các nhóm universal và global từ bất kỳ domain hay forest nào tin cậy, và nhóm Domain Local từ domain của chính chúng.

Nhóm Global chỉ có thể chứa những người dùng và các nhóm global từ domain mà nó đã được định nghĩa, nhưng nó có thể được gán cho phép đến các tài nguyên trên bất kỳ domain nào trong forest mà domain là một phần của bất kỳ forest nào đáng tin.

Nhóm Universal có thể chứa người dùng và các nhóm Universal và Global từ bất kỳ domain nào. Nhóm Universal có thể được gán cho phép đến các tài nguyên trong bất kỳ domain hay forest nào đáng tin. Nói cách khác, một nhóm Universal là một dạng lai giữa nhóm Domain Local và Global.

Khi một workstation có hai dạng nhóm mặc định - Administrators và Guests - một domain sẽ có một số lớn có liên hệ, của tất cả 3 dạng. Hình 5 cho thấy các nhóm mặc định trong domain. Tất cả được chỉ định là Security Groups, có nghĩa là chúng có thể được gán cho phép. (Không nên nhầm lẫn nhóm Security với nhóm Distribution do Microsoft Exchange Server sử dụng cho nhóm người dùng vào danh sách email. Cả hai đều được định nghĩa trong Active Directory). Các nhóm local tồn tại trên tất cả các máy tính dựa trên Windows đều được định nghĩa trong Active Directory.

Hình ảnh
Hình 5 các nhóm mặc định định nghĩa trong Users chứa trong Active Directory

Cũng như với DC, một số non-DC cũng chứa một số lớn các nhóm. Hình 6 cho thấy 16 nhóm built-in trên một máy tính kiểm tra. Con số chính xác của các nhóm trên các máy tính sẽ khác nhau tuỳ thuộc vào role bạn cài đặt trên máy tính đó

Hình ảnh
Hình 6 các nhóm built-in trong một non-DC

Nếu bạn đang cố gắng gán cho phép cho một khách thể, từ những nhóm này bạn có thể thấy được nhiều điều hơn nữa. Thực tế, trong một DC cơ bản, bạn sẽ nhìn thấy ít hơn 63 nhóm và các nguyên tắc bảo mật built-in, như hình 7.

Rất nhiều trong số 63 nhóm này đã thể hiện trong hình 7 là những khái niệm khó hiểu, mơ hồ thỉnh thoảng được gọi là "kí hiệu nhân diện đặc biệt", đại diện cho một nhóm các nguyên tắc bảo mật động. Chúng cũng thường được gọi là Logon Groups.

Các nhóm Logon Groups là những nhóm đại diện cho mặt động của một nguyên tắc bảo mật, như là cách người dùng hay các nguyên tắc bảo mật khác được đăng nhập. Ví dụ, nhóm INTERACTIVE như hình 7 chứa tất cả các người dùng đăng nhập vào console của máy tính và thông qua Terminal Services. Bằng định nghĩa, một người dùng có thể chỉ có thể là thành viên của một trong số những nhóm này vào một thời điểm và tư cách thành viên của chúng được gán vào lúc đăng nhập. Bạn có thể không kiểm soát được ai sẽ là thành viên của những nhóm này.

Hình ảnh
Hình 7 một DC cơ bản có nhiều hơn 63 nhóm và các nguyên tắc bảo mật built-in

Bình thường còn có những nhóm khác. Cụ thể là nhóm Everyone và nhóm Authenticated Users. Nhóm Everyone chứa các ngụ ý tên, mỗi người dùng truy cập vào máy tính này - với ngoại lệ là, khởi động với Windows XP, thì những người dùng hoàn toàn vô danh và không chứng nhận không được tính vào. Nói cách khác, người dùng NULL vô danh không có trong Everyone hay trên bất kỳ hệ điều hành dựa trên Windows nào. Mặc dù vậy Guest lại có.

Nhóm Authenticated Users, trong khí được di trú nhiều, chỉ chứa những người dùng thật sự được chứng nhận. Do đó, guest không có trong Authenticated Users. Đó là khác biệt duy nhất giữa hai nhóm này. Nhưng vì tài khoản guest tồn tại trong hệ điều hành bị tắt đi, không có khác biệt về chức năng nào giữa Authenticated Users và Everyone trừ khi bạn thao tác bằng tay để mở lại tài khoản Guest, trong trường hợp này, có thể là bạn muốn Guest có thể truy cập các tài nguyên, và do đó cần để nguyên nhóm Everyone.

Dù vậy, nhiều quản trị viên cũng phải rất lâu để chấp nhận được sự thật là " ai trên thế giới này cũng có quyền trên server của tôi" và đã quyết tâm sửa những cho phép này để giải quyết vấn đề. Thông thường thay đổi chỉ đem lại những kết quả thuộc hàng "thảm hoạ" mà thôi. Chẳng có lý gì mà cố gắng thay thế các cho phép cho Everyone bằng Authenticated Users.

Hoặc là bạn muốn guest có quyền đến máy tính của mình và bạn mở tài khoản guest, hoặc là bạn không muốn và tắt nó đi. Nếu bạn muốn guest có quyền cho phép, bạn cần cho phép cho Everyone. Còn nếu không muốn, nhóm Everyone sẽ chẳng có gì khác với Authenticated Users.

Một số người lại biện mình rằng thực hiện những thay đổi này là những thay đổi "phòng vệ chiều sâu" ("defense-in-depth"). Cũng đúng nếu bạn định nghĩa " phòng vệ chiều sâu " là "những thay đổi bạn chẳng thể nào thay đổi". Sự thật là thay đổi chỉ đem lại chút ít hay chả đem lại được củng cố gì mà còn là việc rất nguy hiểm. Cứ để mặc định là tốt nhất.

Cũng cần chỉ ra điểm khác biệt giữa Users, đó là các nhóm built-in, và Authenticated Users. Điểm khác biệt là sự thật hiển nhiên là Authenticated Users chứa mỗi người dùng có chứng nhận với máy tính, kể cả những người dùng ở các domain khác, người dùng là thành viên của một nhóm local chứ không phải là Users, và người dùng không là thành viên của bất kỳ nhóm nào cả (cũng có thể lắm chứ). Điều đó có nghĩa là nhóm Users còn hạn chế hơn Authenticated Users.

Dù vậy, tôi cũng từng thấy nhiều tổ chức phá huỷ mạng của họ khi cố gắng thay thế cho phép cho Users với cho phép cho Authenticated Users khi nỗ lực "giă tăng hệ thống". Tôi đã phải tranh cãi suốt với PCI/DSS Auditors khi nói rằng ngành công nghiệp thanh toán bằng thẻ yêu cầu bạn phải thay thế tất cả cho phép của Users bằng Authenticated Users.

Điều này đơn giản là sai bét

Tôi cũng đã bảo vệ các tổ chức khắp nơi trên thế giới khỏi những tay cố vấn xem sự thay thế wholesale access control list (ACL) là một cách tuyệt vời để lấp đầy túi tiền. Không cần nói rằng, bạn có thể biết trước rằng nỗ lực để thay thế wholesale của User hay Everyone bằng Authenticated Users là một thất bại thảm hại về cả phương diện bảo mật và sự ổn định.

Các dịch vụ

Windows Vista và Windows Server 2008 hỗ trợ một dạng mới của Security Principal: một dịch vụ. Để hiểu những chức danh này có giá trị ra sao, hãy xem những cuộc tranh luận đang diễn ra về tường lửa host-based. Nhiều người, được những nhà cung cấp sản phẩm ủng hộ một cách nhiệt tình, cho rằng các tường lửa host-based phải có các bộ lọc outbound thì mới có giá trị vì nó bảo vệ phần còn lại của mạng khỏi những máy tính đã bị thoả hiệp. Còn ý kiến phản đối thì chỉ ra rằng nếu một máy tính bị thoả hiệp, malware đã có trên máy tính và do đó nó sẽ có khả năng qua mặt và tắt toàn bộ tường lửa host-based .
Để hiểu về vấn đề này, hãy xem xét 2 dịch vụ chạy cùng Security Principal. Dịch vụ A được cho phép giao tiếp thông qua tường lửa, còn dịch vụ B thì không. Nếu dịch vụ B bị thoả hiệp, những kẻ tấn công có thể vượt qua những hạn chế đơn giản bằng cách chiếm lấy một quá trình đang chạy khác như là Security Principal này, dịch vụ A, ví dụ, và tất cả các giao tiếp từ quá trình.

Để giải quyết vấn đề này, Microsoft cần một cách để áp dụng cho phép cho một quá trình, hay cụ thể hơn, cho một dịch vụ. Vì mục đích này, các dịch vụ trở thành các nguyên tắc bảo mật trong chính quyền hạn của chúng. Và kết quả là, mỗi dịch vụ giờ đây đã có kí hiệu nhân diện có thể dùng để áp dụng các cho phép với chúng. Bạn có thể chạy lệnh "sc showsid" để xem dịch vụ SID cho bất kì dịch vụ nào.

Với Service SIDs, bạn có thể hạn chế truy cập đến các tài sản cụ thể, cũng như chỉ hạn chế truy cập cho những người dùng cụ thể. Thay đổi này làm bộ lọc outbound tường lửa óc ý nghĩa, trong một số trường hợp. Bản chất của điều này nằm ngoài phạm vi của bài này, nhưng nếu bạn muốn tìm hiểu thêm, nên đọc bài báo tôi viết về tường lửa Windows Vista trong số báo ra tháng 6-2008 của TechNet Magazine.
RefLink: http://ceh.vn/ceh3/index.php?option=com_content&view=article&id=115:security-watch-subjects-va-cac-nguyen-tc-bo-mt&catid=16:tin-bo-mt&Itemid=105