Аудит DNS серверов на Windows Server 2008 R2 через Powershell

Дата: 27.02.2015 Автор Admin

В данной статье я расскажу как с помощью Powershell проводить аудит DNS серверов на Windows Server 2008 R2.

В средних и крупных организациях, где более одного системного администратора, важно контролировать изменения DNS. Особенно это актуально для статических записей.
Для реализации данной задачи нам понадобятся 2 Powershell скрипта.
Первый скрипт будет собирать данные по статическим записям DNS, и хранить их 2-е недели.

Выглядеть он будет так:

# Указываем сервер 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. Выполняться скрипт будет каждую неделю.

Скрипт будет выглядеть так:

# Указываем сервер 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 во вложенном файле

 

Во вложении будет файл со следующим содержимым:

InputObject SideIndicator
----------- -------------
site1.local     10.13.1.1 Static =>
site1.dev.local 10.14.1.1 Static ==
site1.ru        10.12.1.1 Static <=

Знак => означает что запись была добавлена.
Знак <= означает что запись была удалена.

На этом все. Желаю удачной настройки! =)

 


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *