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:
- Tạo một đối tượng (tập tin hoặc thư mục)
- 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).
- 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).
- Thay đổi quyền của đối tượng (áp dụng thay đổi), thay đổi lại ngay cả.
- Kiểm tra cờ (INHERITED_ACE sẽ có mặt ở đó)
- ..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.
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 ... –