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

martes, 19 de julio de 2016

Cisco. ACL acceso puerto por Mac Address

Se ha dado en el caso que tenemos que autorizar a una MacAddres (PC) el acceso a varios puertos de los switches de nuestra empresa.

Los puertos los tenemos configurados para que recuerden 2 direcciones mac la del PC y la del télefono, esto lo hacermos con el switchport port-security. El problema es que este comando no me deja poner la misma Mac en dos puertos diferentes, o por lo menos a mi. Con lo que para autorizar que una misma Mac puede moverse he tenido que hacer una ACL para cada switch con el puerto donde pueda conectarse este PC itinerante.

Comento los pasos que he seguido:

[1] Anotar las Mac autorizadas de los puertos que vamos a modificar.

Como voy a tener que quitar el "switchport port-security" lo primero que hago es anotar que Mac estaban autorizadas en los puertos que voy a tocar. Esto lo veré en la configuración del puerto con un "show running" en las línes:

switchport port-security mac-address sticky 00e1.d82a.5ba2

[2] Crear ACL con las Mac autorizadas y las que queramos añadir. Aquí pondremos la Mac del PC intinerante y de las Mac que ya estaban autorizadas.

mac access-list extended PCs_acceso
permit host 33e6.d754.c81f any
permit host 031a.a04f.21c1 any
deny   any any

[3] Quitar el switchport port-security de los puertos donde se conectará nuestro PC itinerante

no switchport port-security maximum 2
no switchport port-security
no switchport port-security mac-address sticky
no switchport port-security mac-address sticky 00e0.d80a.6ba2

[4] Añadir ACL al los puertos donde se nos conectará nuestro PC itinerante

mac access-group PCs_acceso in


REF: