2009-05-26 34 views
5

Tôi có một câu hỏi hơi mơ hồ ở đây.Cách đáng tin cậy để xác định xem các quyền ntfs đã được thừa hưởng

Điều tôi cần: Để xác định xem các quyền (hoặc, nói đúng, một ACE cụ thể của một DACL) của một tệp/thư mục đã được kế thừa.

Cách tôi cố gắng giải quyết vấn đề này: sử dụng các ràng buộc winapi cho python (mô-đun win32security, chính xác). Dưới đây là phiên bản rút gọn, điều đó chỉ làm điều đó, - nó chỉ đơn giản là lấy một đường dẫn đến một tập tin như một đối số và in ra từng ACE một, cho biết cờ nào được đặt.

#!/usr/bin/env python 
from win32security import * 
import sys 

def decode_flags(flags): 
    _flags = { 
     SE_DACL_PROTECTED:"SE_DACL_PROTECTED", 
     SE_DACL_AUTO_INHERITED:"SE_DACL_AUTO_INHERITED", 
     OBJECT_INHERIT_ACE:"OBJECT_INHERIT_ACE", 
     CONTAINER_INHERIT_ACE:"CONTAINER_INHERIT_ACE", 
     INHERIT_ONLY_ACE:"INHERIT_ONLY_ACE", 
     NO_INHERITANCE:"NO_INHERITANCE", 
     NO_PROPAGATE_INHERIT_ACE:"NO_PROPAGATE_INHERIT_ACE", 
     INHERITED_ACE:"INHERITED_ACE" 
    } 
    for key in _flags.keys(): 
     if (flags & key): 
      print '\t','\t',_flags[key],"is set!" 


def main(argv): 
    target = argv[0] 
    print target 

    security_descriptor = GetFileSecurity(target,DACL_SECURITY_INFORMATION) 

    dacl = security_descriptor.GetSecurityDescriptorDacl() 

    for ace_index in range(dacl.GetAceCount()): 
     (ace_type,ace_flags),access_mask,sid = dacl.GetAce(ace_index) 
     name,domain,account_type = LookupAccountSid(None,sid) 
     print '\t',domain+'\\'+name,hex(ace_flags) 
     decode_flags(ace_flags) 


if __name__ == '__main__': 
    main(sys.argv[1:]) 

Đủ đơn giản - nhận mô tả bảo mật, nhận DACL từ nó sau đó lặp qua ACE trong DACL. Bit thực sự quan trọng ở đây là cờ truy cập INHERITED_ACE. Nó sẽ được thiết lập khi ACE được kế thừa và không được thiết lập rõ ràng.

Khi bạn tạo thư mục/tệp, ACL của nó được điền bằng ACE theo ACE của đối tượng mẹ (thư mục), được đặt để truyền cho trẻ em. Tuy nhiên, trừ khi bạn thực hiện bất kỳ thay đổi nào đối với danh sách truy cập, cờ INHERITED_ACE sẽ KHÔNG được đặt! Nhưng các quyền được thừa hưởng ở đó và chúng hoạt động.

Nếu bạn thực hiện bất kỳ thay đổi nhỏ nào (nói, thêm mục nhập vào danh sách truy cập, áp dụng thay đổi và xóa), cờ xuất hiện một cách kỳ diệu (hành vi không thay đổi theo bất kỳ cách nào, mặc dù nó hoạt động trước và hoạt động sau đó)! Điều tôi muốn là tìm nguồn gốc của hành vi này của cờ INHERITED_ACE và, có thể tìm một cách khác cách đáng tin cậy để xác định xem ACE có được kế thừa hay không.

Làm thế nào để tái sản xuất:

  1. Tạo một đối tượng (tập tin hoặc thư mục)
  2. Kiểm tra quyền trong windows explorer, thấy rằng họ đã được tuyên truyền từ đối tượng phụ huynh (sử dụng, ví dụ, tab an ninh của tập tin hộp thoại thuộc tính của cửa sổ thám hiểm).
  3. Kiểm tra cờ bằng cách sử dụng, ví dụ: tập lệnh tôi đang sử dụng (INHERITED_ACE sẽ KHÔNG được đặt trên bất kỳ ACE nào).
  4. Thay đổi quyền của đối tượng (áp dụng thay đổi), thay đổi lại ngay cả.
  5. Kiểm tra cờ (INHERITED_ACE sẽ có mặt ở đó)
  6. ..shake đầu của bạn trong sự hoài nghi (Tôi biết tôi đã làm)

Xin lỗi vì một bài hơi dài, hy vọng điều này làm cho ít nhất một chút giác quan.

+0

Tôi đã cập nhật câu trả lời của mình. Điều này có vẻ là một vấn đề với libs Python ... –

Trả lời

0

On Win XP Home Edition của tôi mã này dường như không làm việc ở tất cả :-)

tôi nhận được đống này dấu vết:

Traceback (most recent call last):
File "C:\1.py", line 37, in main(sys.argv[1:])
File "C:\1.py", line 29, in main for ace_index in range(dacl.GetAceCount()):

AttributeError: 'NoneType' object has no attribute 'GetAceCount'

Bạn có thể chỉ cố gắng "di chuyển" các DACL được lấp đầy? Ý tôi là, nếu bạn biết nó sẽ hoạt động sau khi bạn thực hiện một thay đổi nhỏ trong nó ... làm một thay đổi nhỏ lập trình, thêm một ACE sơ khai và loại bỏ nó. Bạn có thể?

CẬP NHẬT. Tôi đã thực hiện một thử nghiệm với một chương trình C# trên máy tính của tôi (với Win XP Prof) và tôi phải cho bạn biết rằng cách .net để nhận được thông tin bảo mật này thực sự hoạt động. Vì vậy, khi tôi tạo một tập tin mới, chương trình C# của tôi phát hiện rằng các ACE được thừa kế, trong khi mã python của bạn thì không.

Dưới đây là sản phẩm mẫu chạy của tôi:

C:>csharp_tricks.exe 2.txt

FullControl --> IsInherited: True

FullControl --> IsInherited: True

ReadAndExecute, Synchronize --> IsInherited: True


C:>1.py 2.txt

2.txt

BUILTIN\Administrators 0x0

NT AUTHORITY\SYSTEM 0x0

BUILTIN\Users 0x0

My C# lớp:

public class InheritedAce 
{ 
    public static string GetDACLReport(string path) 
    { 
     StringBuilder result = new StringBuilder(); 
     FileSecurity fs = new FileSecurity(path, AccessControlSections.Access); 
     foreach (var rule in fs.GetAccessRules(true, true, typeof(SecurityIdentifier)).OfType<FileSystemAccessRule>()) 
     { 
      result.AppendFormat("{0} --> IsInherited: {1}", rule.FileSystemRights, rule.IsInherited); 
      result.AppendLine(); 
     } 

     return result.ToString(); 
    } 
} 

Vì vậy, nó có vẻ là một lỗi trong các thư viện python an ninh PyWin32. Có lẽ họ không phải làm tất cả các hệ thống cần thiết gọi ...

+0

Vâng, điều này chắc chắn sẽ không làm việc trong phiên bản nhà - quyền ntfs bị vô hiệu hóa ở đó, theo như tôi biết (vì vậy bạn đang nhận được Không là kết quả của GetSecurityDescriptorDacl). Bạn đang, có lẽ, chính xác trong đề nghị của bạn, rằng tôi chỉ nên sử dụng một ACE sơ khai để sắp xếp sửa chữa các DACLs. Tuy nhiên, hãy xem xét một thực tế, rằng tôi cần phải chạy loại mã trên một máy chủ tập tin lớn của công ty (suy nghĩ, hàng triệu đối tượng). Nếu tôi (hoặc bạn) sai trong giả định của tôi thì sao? Điều gì nếu một cái gì đó bị rối tung lên? Tôi sẽ không thực hiện viết trên loại dữ liệu này trừ khi nó là hoàn toàn không thể tránh khỏi. – shylent

+0

Tôi không thể tin rằng câu trả lời của bạn thực sự đã bị người khác bỏ rơi. Dù sao, cảm ơn rất nhiều cho nỗ lực của bạn. Tôi không có cách nào để kiểm tra xem đề xuất của bạn là chính xác (không có môi trường), nhưng tuy nhiên, nó trông khá vững chắc với tôi. Tôi sẽ làm việc xung quanh vấn đề này bằng cách kiểm tra ACE chống lại danh sách truy cập đối tượng cha mẹ. Cảm ơn vì nỗ lực, bạn đã kiếm được số tiền thưởng này :) – shylent

+0

Vâng, ACE có thể được sao chép sang các nút con, không được kế thừa ... Nhưng nếu nó phù hợp với nhu cầu của bạn, tôi thấy không có vấn đề gì :-) có thể có thể gửi một lỗi để phát triển python ... –

1

Bạn có thể sử dụng .Net framework

System.Security.AccessControl 

này bao gồm ACL và DACL và SACL.

+0

Sử dụng .Net là ngoài câu hỏi, thật không may. Dù bằng cách nào, khi kiểm tra các mục msdn trên System.Security.AccessControl, tôi đã kết luận rằng, trong tính thiết yếu, nó không cung cấp chức năng bổ sung nào trên API C (ít nhất không phải trong khu vực mà tôi quan tâm), - câu hỏi của tôi là không phải về cách truy xuất các cờ kế thừa, - đó là tầm thường, mà đúng hơn là về sự không nhất quán của cờ INHERITED_ACE. – shylent

1

Tôi nghĩ rằng các poster ban đầu là hành vi nhìn thấy chi tiết trong

This newsgroup posting

Lưu ý rằng những cờ hiệu kiểm soát thiết lập trên thùng sơn có thể thay đổi chỉ đơn giản bằng bỏ chọn và đánh dấu lại hộp kế thừa trong GUI.

Lưu ý thêm rằng chỉ cần thêm ACE vào DACL bằng các công cụ của Microsoft cũng sẽ thay đổi cờ điều khiển.

Lưu ý thêm rằng GUI, cacls và icacls KHÔNG thể dựa vào khi nói đến thừa kế do nhiều lỗi tinh vi như được thảo luận trong bài đăng trên nhóm tin tức.

Dường như cách "cũ" của việc kiểm soát thừa kế là sử dụng cờ điều khiển trên vùng chứa kết hợp với cờ ACE liên quan kế thừa.

Cách "mới" không sử dụng cờ điều khiển trên vùng chứa và thay vào đó sử dụng các ACE trùng lặp; một để kiểm soát truy cập vào đối tượng và một đối tượng thứ hai để kiểm soát những gì được thừa hưởng bởi các đối tượng con. NHƯNG, có vẻ như các công cụ hiện có của Microsoft (ví dụ Vista) không thể hoạt động theo cách "mới", vì vậy khi bạn thực hiện một thay đổi đơn giản bằng cách sử dụng các công cụ, nó sẽ theo cách cũ của việc sử dụng cờ điều khiển trên thùng đựng hàng.

Nếu bạn tạo một phân vùng mới trên Vista, sau đó tạo ra một thư mục mới, sau đó nhìn vào lá cờ và ACE, nó sẽ giống như thế này

ControlFlags : 0x8004 
Owner : BUILTIN\Administrators 
Group : WS1\None 
S-1-5-32-544 : BUILTIN\Administrators : 0x0 : 0x0 : 0x1F01FF 
S-1-5-32-544 : BUILTIN\Administrators : 0x0 : 0xB : 0x10000000 
S-1-5-18 : NT AUTHORITY\SYSTEM : 0x0 : 0x0 : 0x1F01FF 
S-1-5-18 : NT AUTHORITY\SYSTEM : 0x0 : 0xB : 0x10000000 
S-1-5-11 : NT AUTHORITY\Authenticated Users : 0x0 : 0x0 : 0x1301BF 
S-1-5-11 : NT AUTHORITY\Authenticated Users : 0x0 : 0xB : 0xE0010000 
S-1-5-32-545 : BUILTIN\Users : 0x0 : 0x0 : 0x1200A9 
S-1-5-32-545 : BUILTIN\Users : 0x0 : 0xB : 0xA0000000 

Lưu ý ControlFlags và ACE trùng lặp.

Các vấn đề liên quan