Tìm kiếm nhật ký Active Directory bằng PowerShell
Vài tuần qua, tôi đã dành thời gian với Active Directory và tự động hóa các tác vụ quản lý bằng PowerShell. Nếu bạn quay lại một hoặc hai trang bài đăng, bạn sẽ thấy một số tập lệnh và chức năng mà tôi đã chia sẻ. Hôm nay, tôi muốn giải quyết một số vấn đề đã xuất hiện trong các nhận xét gần đây liên quan đến việc theo dõi các thay đổi trong Active Directory. Một câu hỏi hợp lý là “Ai đã thực hiện thay đổi?”. Tôi cũng muốn biết "Họ đã thay đổi điều gì?" Chỉ riêng PowerShell không thể có được tất cả những câu trả lời này. Và nếu bạn chạy bất kỳ cơ sở hạ tầng Active Directory nào có quy mô phù hợp, tôi hy vọng bạn sẽ đầu tư vào các công cụ quản lý cấp doanh nghiệp. Mã tôi đang chia sẻ phù hợp với những cửa hàng nhỏ không có lựa chọn nào khác ngoài việc tự làm việc của mình. Hoặc trong những tình huống bạn cần lấp đầy khoảng trống và giải quyết một vấn đề ngắn hạn.
Khai thác nhật ký sự kiện
Để có được thông tin bạn muốn về người đang thực hiện thay đổi trong Active Directory, bạn sẽ phải tìm hiểu sâu về nhật ký sự kiện. Cụ thể, bạn cần truy vấn nhật ký sự kiện Bảo mật. Và để cụ thể hơn nữa, bạn cần truy vấn nhật ký sự kiện Bảo mật trên bộ điều khiển miền có thể ghi vào Active Directory. Khi quản trị viên kích hoạt tài khoản người dùng trên DOM1, một mục nhập sẽ được tạo trong nhật ký sự kiện Bảo mật. Rõ ràng, bạn sẽ không thấy sự thay đổi trong nhật ký sự kiện Bảo mật trên DOM2.
Tiền đề của tôi và mã tôi sẽ hiển thị cho bạn, giả sử cài đặt nhật ký sự kiện mặc định trên máy chủ Windows. Nếu bạn đang chuyển tiếp nhật ký hoặc quản lý chúng bằng giải pháp của bên thứ ba, bạn sẽ cần tính đến điều đó khi xem mã của tôi. Thông tin tôi sắp cho bạn xem có trong nhật ký sự kiện Bảo mật và dành riêng cho máy chủ. Cách bạn quản lý các nhật ký này tùy thuộc vào bạn.
Trước khi tôi đào sâu hơn một lời cảnh báo nhanh chóng. Mỗi tổ chức đều có chính sách và quy trình riêng để quản lý nhật ký sự kiện. Bạn chỉ có thể truy vấn các thay đổi liên quan đến Active Directory nếu thông tin chưa bị xóa khỏi nhật ký sự kiện Bảo mật. Điều này có nghĩa là bạn có thể cần đảm bảo tệp nhật ký của mình đủ lớn để đáp ứng nhu cầu của bạn. Trong miền thử nghiệm của mình, tôi đã chạy lệnh này để tăng kích thước lên 1GB.
limit-eventlog -LogName security -ComputerName dom2,dom1 -MaximumSize 1024MBSự kiện quản lý người dùng
Tôi sẽ tập trung vào các sự kiện quản lý người dùng. Mỗi loại sự kiện được kết nối với một ID sự kiện. Đây là bảng băm gian lận mà tôi sử dụng.
# a hashtable of user management event IDs for the Security event log
$ADEvent = @{
UserChanged = 4738
UserCreated = 4720
UserDeleted = 4726
UserEnabled = 4722
UserDisabled = 4725
}Khi quản lý tài khoản người dùng AD, bạn có thể nhận được nhiều mục nhật ký cho cùng một hoạt động. Ví dụ: nếu bạn tạo một tài khoản người dùng và kích hoạt nó, rất có thể bạn sẽ thấy sự kiện UserCreated và UserEnabled. Có lẽ cũng là một UserChanged. Ghi nhớ nó trong tâm trí.
Để truy vấn nhật ký sự kiện, tôi khuyên bạn nên tìm hiểu cách sử dụng Get-WinEvent. Nó cung cấp khả năng truy vấn linh hoạt hơn, nhanh hơn một chút (tôi nghĩ vậy) và khi bạn sử dụng PowerShell 7, đây là công cụ duy nhất bạn có. Tôi tin tưởng bạn sẽ đọc trợ giúp và ví dụ. Trong lúc này, đây là một mẫu.
Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom1Đây là truy vấn cho tất cả sự kiện tạo người dùng trên DOM1 đã được ghi lại kể từ ngày 1 tháng 2 năm 2021.
Hãy đi sâu vào chi tiết tin nhắn.
Mục nhập nhật ký sự kiện sẽ hiển thị Chủ đề, tài khoản chịu trách nhiệm cho hoạt động và Mục tiêu. Trong trường hợp này, có vẻ như Company\Administrator đã tạo Company\L.Kuja. Tôi không biết tài khoản đó được tạo ở đâu nhưng tôi luôn có thể tra cứu tài khoản đó bằng Get-ADUser.
Trong khi tôi đưa ra điều này, tôi cũng muốn chỉ ra danh sách thuộc tính. Khi tài khoản người dùng được sửa đổi, đây là những thuộc tính duy nhất được ghi lại trong nhật ký sự kiện. Nếu tôi thay đổi Bộ phận hoặc Chức danh của người dùng, điều đó sẽ không được ghi lại trong nhật ký sự kiện Bảo mật. Nếu loại dấu vết kiểm tra này quan trọng đối với bạn thì đó là lý do tại sao bạn tìm đến các sản phẩm quản lý của bên thứ ba.
Nhận-ADUserAudit
Lưu ý đến những hạn chế này, tôi đã viết một hàm PowerShell có tên Get-ADUserAudit. Nó có các tham số để tạo tìm kiếm trên một hoặc nhiều bộ điều khiển miền cho các loại sự kiện quản lý người dùng khác nhau đã được ghi lại kể từ một thời điểm nhất định.
Get-ADUserAudit -event created,deleted -since "2/1/2021"
Hành vi mặc định là tìm kiếm tất cả các bộ điều khiển miền bản sao.
Hàm ghi một đối tượng tùy chỉnh vào đường dẫn có chế độ xem định dạng tùy chỉnh mặc định. Hãy để tôi giải thích ngắn gọn về đầu ra. Các thuộc tính DomainController,Since và EventType phải hiển nhiên. Thuộc tính Mục tiêu là tập hợp tất cả tài khoản người dùng đã được xác định cho một sự kiện cụ thể. TargetCount là một cách nhanh chóng để xem có bao nhiêu tài khoản người dùng. Nói cách khác, kể từ ngày 1 tháng 2, 5 tài khoản người dùng đã được tạo (hoặc ít nhất đã đăng nhập) trên DOM1. Quản trị viên hiển thị tất cả tài khoản quản trị viên được liên kết với sự kiện. Vì vậy, trong cùng thời gian đó, Administrator, AprilS và ArtD đã tạo tài khoản. Kết quả sẽ không cho bạn biết quản trị viên nào đã tạo tài khoản người dùng nào. Bạn sẽ phải xem lại nhật ký sự kiện để lấy thông tin đó.
Tất nhiên, bạn có thể tùy chỉnh kết quả theo cách bạn muốn.
Get-ADUserAudit -event created,deleted,enabled,disabled -outvariable a | sort-object eventtype | format-table -GroupBy eventtype -Property since,domaincontroller,targetcountHoặc đây là một cách để tóm tắt các sự kiện.
$a | group-object eventtype -ov b | select-object @{Name="Since";Expression={$a[0].Since}},Name,@{Name="Total";Expression = { ($_.group.targetcount | measure-object -sum).sum}}$A là kết quả đã lưu từ lệnh trước đó của tôi.
Nếu đây là thứ tôi muốn chạy thường xuyên, tôi sẽ tạo một tập lệnh điều khiển để lưu một số thao tác gõ. Tôi thậm chí có thể tiến xa hơn nữa, vì tôi không thể tự giúp mình và thiết lập nó như một công việc đã lên lịch để tạo một phiên bản HTML và gửi nó qua email.
Mã ở đâu?
Nếu bạn muốn xem tôi đã thực hiện tất cả những điều này như thế nào hoặc lấy mã để bạn có thể tự mình dùng thử, bạn có thể tải xuống các tệp từ ý chính Github này. Lưu ý liên quan, bạn cũng có thể quan tâm đến lệnh Convert-EventLogRecord, một phần của mô-đun PSScriptTools. Lệnh này giúp phân tích thông tin từ bản ghi nhật ký sự kiện dễ dàng hơn.
Get-WinEvent -FilterHashtable @{Logname = 'Security';ID=4720;Starttime="2/1/2021"} -ComputerName dom2 |
Convert-EventLogRecord |
Format-table -GroupBy Computername -Property ID,TimeCreated,
@{Name="Admin";Expression={"$($_.SubjectDomainName)\$($_.SubjectUsername)"}},
@{Name="Account";Expression = { (Get-ADuser $_.samaccountname).DistinguishedName }}
Bây giờ tôi có thể thấy rõ quản trị viên nào đã tạo tài khoản nào.
Hãy cho tôi biết suy nghĩ của bạn hoặc nếu điều này hữu ích.






