Аудит DNS серверов на Windows Server 2008 R2 через Powershell
В данной статье я расскажу как с помощью Powershell проводить аудит DNS серверов на Windows Server 2008 R2.
В средних и крупных организациях, где более одного системного администратора, важно контролировать изменения DNS. Особенно это актуально для статических записей.
Для реализации данной задачи нам понадобятся 2 Powershell скрипта.
Первый скрипт будет собирать данные по статическим записям DNS, и хранить их 2-е недели.
Выглядеть он будет так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Указываем сервер DNS $ServerName = "DC.domain.local" # Указываем DNS зоны $ContainerName = "domain.local" $ContainerName1 = "dev.local" $ContainerName2 = "domain.com" $ContainerName3 = "site.ru" # Указываем путь где будем хранить данные $comparaPath1 = "C:\Powershell_Scripts\DNS-DHCP-Compare\DNScomp.txt" Remove-Item $comparaPath1 # Получаем данные через WMI и сохраняем Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_AType" ` -Filter "ContainerName='$ContainerName' AND TimeStamp=0" | Select-Object OwnerName,IPAddress, @{n="TimeStamp";e={"Static"}} | ft -AutoSize > $comparaPath1 Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_AType" ` -Filter "ContainerName='$ContainerName1' AND TimeStamp=0" | Select-Object OwnerName,IPAddress, @{n="TimeStamp";e={"Static"}} | ft -AutoSize >> $comparaPath1 Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_AType" ` -Filter "ContainerName='$ContainerName2' AND TimeStamp=0" | Select-Object OwnerName,IPAddress, @{n="TimeStamp";e={"Static"}} | ft -AutoSize >> $comparaPath1 Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_AType" ` -Filter "ContainerName='$ContainerName3' AND TimeStamp=0" | Select-Object OwnerName,IPAddress, @{n="TimeStamp";e={"Static"}} | ft -AutoSize >> $comparaPath1 # Пример какие еще типы записей можно использовать <# other records types are: MicrosoftDNS_AType – Address or Host records MicrosoftDNS_CNAMEType – Alias records MicrosoftDNS_MXType – Mail Exchanger records MicrosoftDNS_NSType – Name Server records MicrosoftDNS_SRVType – Service records MicrosoftDNS_PTRType – Pointer records (Reverse Lookup zone) #> |
Теперь нам понадобится второй скрипт, который будет сравнивать данные и показывать изменения в статических записях DNS. Выполняться скрипт будет каждую неделю.
Скрипт будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# Указываем сервер DNS $ServerName = "DC.domain.local" # Указываем DNS зоны $ContainerName = "domain.local" $ContainerName1 = "dev.local" $ContainerName2 = "domain.com" $ContainerName3 = "site.ru" # Указываем пути где будем хранить данные $comparaPath1 = "C:\Powershell_Scripts\DNS-DHCP-Compare\DNScomp.txt" $comparaPath2 = "C:\Powershell_Scripts\DNS-DHCP-Compare\DNScomp1.txt" $Outcompare = "C:\Powershell_Scripts\DNS-DHCP-Compare" $DnsLog = "C:\Powershell_Scripts\DNS-DHCP-Compare\DNS_LOG.txt" Remove-Item $comparaPath2 Remove-Item $DnsLog # Получаем данные через WMI и сохраняем Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_AType" ` -Filter "ContainerName='$ContainerName' AND TimeStamp=0" | Select-Object OwnerName,IPAddress, @{n="TimeStamp";e={"Static"}} | ft -AutoSize > $comparaPath2 Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_AType" ` -Filter "ContainerName='$ContainerName1' AND TimeStamp=0" | Select-Object OwnerName,IPAddress, @{n="TimeStamp";e={"Static"}} | ft -AutoSize >> $comparaPath2 Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_AType" ` -Filter "ContainerName='$ContainerName2' AND TimeStamp=0" | Select-Object OwnerName,IPAddress, @{n="TimeStamp";e={"Static"}} | ft -AutoSize >> $comparaPath2 Get-WMIObject -Computer $ServerName -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_AType" ` -Filter "ContainerName='$ContainerName3' AND TimeStamp=0" | Select-Object OwnerName,IPAddress, @{n="TimeStamp";e={"Static"}} | ft -AutoSize >> $comparaPath2 #Сохраняем конфиги в переменные $conf1 = get-content $comparaPath1 $conf2 = get-content $comparaPath2 # устанавливаем дату $Date = (Get-Date -format "MM-dd-yyyy") Remove-Item $Outcompare\DNS-Report-$Date.txt # Сравниваем данные из первого скрипта с данными второго Compare-Object $conf1 $conf2 -IncludeEqual | sort SideIndicator -Descending | ft -AutoSize >$Outcompare\DNS-Report-$Date.txt # Получаем лог последней автоматической очистки DNS Get-EventLog -ComputerName DC 'DNS Server' -Newest 10 | Where-Object {$_.eventid -eq 2501} | ft Message -AutoSize -Wrap > $DnsLog Get-EventLog -ComputerName DC 'DNS Server' -Newest 10 | Where-Object {$_.eventid -eq 2501} | ft @{Name='Время последнего запуска'; e={ ($_.TimeGenerated)}} -AutoSize -Wrap >> $DnsLog # Пишем дополнительную строку в лог echo 'Отчет по изменениям в DNS во вложенном файле' >> $DnsLog # формируем строки для тела письма get-content $DnsLog | select -Skip 1 | set-content "$DnsLog-temp" move "$DnsLog-temp" $DnsLog -Force get-content $DnsLog | select -Skip 1 | set-content "$DnsLog-temp" move "$DnsLog-temp" $DnsLog -Force get-content $DnsLog | select -Skip 1 | set-content "$DnsLog-temp" move "$DnsLog-temp" $DnsLog -Force # Создаем тело письма $body1 = Get-Content $DnsLog | Out-String # Отправляем уведомление на Email Send-MailMessage -From admin@domain.local -To sysadminmail@domain.local -Attachments $Outcompare\DNS-Report-$Date.txt -Subject "Отчет по DNS серверам" -Encoding ([System.Text.Encoding]::UTF8) -Body $body1 -SmtpServer mailserver.domain.local Remove-Item $Outcompare\DNS-Report-$Date.txt |
Теперь осталось добавить эти 2 скрипта в планировщик задач.
Соответственно первый скрипт выполняется раз в 2-е недели, а второй каждую неделю.
Второй скрипт будет отправлять уведомление на email со следующим содержанием:
Тема письма — Отчет по DNS серверам
Тело письма (пример) :
DNS-сервер завершил цикл очистки.
Просмотрено зон = 31,
Просмотрено узлов = 1395,
Очищено узлов = 0,
Очищено записей = 0.Цикл продолжался 0 секунд.
Следующий цикл очистки запланирован через 168 часов.
Если при выполнении цикла очистки произошла ошибка, код ошибки содержится в дан
ных события.
DNS-сервер завершил цикл очистки.
Просмотрено зон = 31,
Просмотрено узлов = 1395,
Очищено узлов = 1,
Очищено записей = 1.Цикл продолжался 0 секунд.
Следующий цикл очистки запланирован через 168 часов.
Если при выполнении цикла очистки произошла ошибка, код ошибки содержится в дан
ных события.
DNS-сервер завершил цикл очистки.
Просмотрено зон = 31,
Просмотрено узлов = 1393,
Очищено узлов = 0,
Очищено записей = 0.Цикл продолжался 0 секунд.
Следующий цикл очистки запланирован через 168 часов.
Если при выполнении цикла очистки произошла ошибка, код ошибки содержится в дан
ных события.
DNS-сервер завершил цикл очистки.
Просмотрено зон = 31,
Просмотрено узлов = 1385,
Очищено узлов = 3,
Очищено записей = 3.Цикл продолжался 0 секунд.
Следующий цикл очистки запланирован через 168 часов.
Если при выполнении цикла очистки произошла ошибка, код ошибки содержится в дан
ных события.
DNS-сервер завершил цикл очистки.
Просмотрено зон = 30,
Просмотрено узлов = 1420,
Очищено узлов = 0,
Очищено записей = 0.Цикл продолжался 0 секунд.
Следующий цикл очистки запланирован через 168 часов.
Если при выполнении цикла очистки произошла ошибка, код ошибки содержится в дан
ных события.Время последнего запуска
————————
19.02.2015 23:01:53
12.02.2015 23:00:26
05.02.2015 22:59:17
29.01.2015 22:57:54
22.01.2015 22:57:14Отчет по изменениям в DNS во вложенном файле
Во вложении будет файл со следующим содержимым:
1 2 3 4 5 |
InputObject SideIndicator ----------- ------------- site1.local 10.13.1.1 Static => site1.dev.local 10.14.1.1 Static == site1.ru 10.12.1.1 Static <= |
Знак => означает что запись была добавлена.
Знак <= означает что запись была удалена.
На этом все. Желаю удачной настройки! =)
Добавить комментарий