miércoles, 20 de julio de 2016

Control de cambios en grupos del AD ampliado.

Hace unos días hice un post parecido a lo que aquí explicaré, el post es:

El resultado es similar pero el código es bastante diferente.

La finalidad del post es que nuestro script esté atento si alguno de nuestros grupos críticos de nuestro AD ha sido alterado, avisándonos mediante un email. Básicamente compara si se ha quitado o añadido algún miembro en los grupos que monitoricemos.

Lo que explicaré aquí será unas modificaciones un script que he encontrado en


Monitorizará los cambios de todos los grupos que pongamos en la variable [Array]$strCriticalGroups. 


[Array]$strCriticalGroups = "Admins. del dominio","Controladores de dominio"

Yo planifico este script para que se ejecute cada hora, por si se me cuela un hacker intentar darme cuenta lo antes posible, sino con una vez al día creo que sería lo aconsejable.


El script original es


# Active Directory Group Notification Reporting Script
# Author: Andy Grogan
# www.telnetport25.com
# Credits: sendMail function based upon code from the 
# Windows PowerShell Team: 
# http://blogs.msdn.com/b/powershell/archive/2009/10/30/sending-automated-emails-with-send-mailmessage-convertto-html-and-the-powershellpack-s-taskscheduler-module.aspx

$ADWSDC = "prod-dc-01"
$SMTPServer = "172.31.253.140"
$MessageFrom = "infoSec@prepad.local"
$MessageTo = "administrator@prepad.local"

Import-Module ActiveDirectory
[Array]$strCriticalGroups = "Enterprise Admins","Domain Admins","Exchange Servers"

function sendMail($strBody){

    $ErrorActionPreference = "Stop"                        
        try {                        
            $messageParameters = @{                        
                Subject = "Domain Group Notification Report Update"                        
                Body = $strBody                        
                From = $MessageFrom                        
                To = $MessageTo
                SmtpServer = $SMTPServer                        
            }                        
            Send-MailMessage @messageParameters -BodyAsHtml                        
        } catch {                        
            $_ |                         
                Out-File x:\grpMonSMTPerr.txt -Append -Width 1000                        
        }
}

$messBody += "<p>Please find enclosed your Group Monitoring Report: </p>"

foreach($grp in $strCriticalGroups){

    $GroupMembers = Get-ADGroupMember $grp -Server $ADWSDC
    $messBody += "<h1>" + $grp + "</h1>" + "<br>"
    foreach($member in $GroupMembers){
        $messBody += $member.Name + "<br>"
    }
    
}
sendMail $messBody
En mi adaptación se añade lo siguiente:

- Solo enviará email si hay cambios con la última ejecución del script.

- Adjuntará 3 ficheros al email con los resultados de la última ejecución, la penúltima ejecución y la diferencia.


La adaptación que he propuesto:


#Nuestro Controlador de Dominio
$ADWSDC = "mi_dc01"

$SMTPServer = "191.126.226.9"

$MessageFrom = "Micuenta@midominio.local"
$MessageTo = "destinatario@sudominio.com"
$messBody = ""

Import-Module ActiveDirectory

#Grupos que nos interesa monitorizar
[Array]$strCriticalGroups = "Admins. del dominio","Controladores de dominio"

function sendMail($strBody){


    $ErrorActionPreference = "Stop"                        

        try {                        
            $messageParameters = @{                        
                Subject = "AD. Modificacion de Grupos administrativos de AD"                        
                Body = $strBody                        
                From = $MessageFrom                        
                To = $MessageTo
                SmtpServer = $SMTPServer   
Attachments = $FileResult,$FileToday, $FileYesterday                   
            }                        
            Send-MailMessage @messageParameters -BodyAsHtml                   
        } catch {                        
            $_ |                         
                Out-File c:\grpMonSMTPerr.txt -Width 1000                        
        }
}

$messBody += "<p>Please find enclosed your Group Monitoring Report: </p>"


foreach($grp in $strCriticalGroups){


    $GroupMembers = Get-ADGroupMember $grp -Server $ADWSDC

    $messBody += "<h1>" + $grp + "</h1>" + "<br>"
    foreach($member in $GroupMembers){
        $messBody += $member.Name + "<br>"
    }
    
}

#Localización de carpeta y ficheros de trabajo

$FileYesterday = "C:\Script\Control grupos\_FileYesterday.txt"
$FileToday  = "C:\Script\Control grupos\_FileToday.txt"
$FileResult = "C:\Script\Control grupos\_FileResult.txt"


#Copia el fichero de ayer que esta en FileToday al nuevo nombre con el que trabajar FileYesterday

if (Test-Path $FileToday) {
if (Test-Path $FileYesterday ) { del $FileYesterday }
copy $FileToday $FileYesterday 

#borrarmos el fichero que el que hoy trabajaremos

del $FileToday
}
else
{
# Es la primra ejecución no tenemos datos, creamos el fichero FileYerterday vacio para luego poder comparar.
$messBody | Out-File $FileYesterday 
}

#Guarda la información de hoy en el fichero FileToday

$messBody | Out-File $FileToday


#compara el dia anterior con hoy

compare-object (get-content $FileToday) (get-content $FileYesterday) | Format-List | Out-File $FileResult -width 1000

#si el resultado de la comparacion genera un fichero superior a 0.2kb envia email

if( (get-item $FileResult).length -gt 0.2KB) { sendMail $messBody }


La salida en el cuerpo del email sería algo parecido a: 



El fichero adjunto de diferencias será algo así:

GoN Jul2016

No hay comentarios: