Programar una tarea que se ejecute en respuesta a un evento en Windows Server 2012 R2
Estos últimos días, hemos estado dedicando algunos artículos a la automatización de tareas y a la supervisión de los sucesos que puedan haber ocurrido en nuestro sistema.
Pues bien, hoy vamos a comprobar cómo podemos combinar ambas habilidades para hacer que nuestro sistema reaccione a una determinada situación llevando a cabo una acción concreta.
Si no has leído nuestros artículos anteriores, quizás sea el momento de echarles un vistazo:
- Programar una tarea en Windows Server 2012 R2.
- Modificar la temporización de una copia de seguridad programada en Windows Server 2012 R2.
- Cómo usar el Visor de eventos de Windows Server 2012 R2.
En particular, haremos que, el sistema operativo que estamos administrando, nos envíe un correo electrónico cuando alguno de los usuarios cometa un error al autenticarse. Además, no sólo funcionará con los usuarios locales, sino que afectará también a los usuarios del dominio que dispongan de una cuenta en el servidor.
Obviamente, si un usuario comete un error al escribir su contraseña, recibiremos un correo electrónico y la cosa no tendrá mayor trascendencia. Sin embargo, si comenzamos a recibir muchos correos electrónicos en muy poco tiempo, llegaremos fácilmente a la conclusión de que alguien está intentando obtener un acceso indebido al sistema.
Como los detalles que recibiremos son bastante concretos, sabremos también el lugar preciso desde el que se está produciendo dicho intento.
Como en otras ocasiones, dado que la tarea es un poco larga, la dividiremos en diferentes fases:
- Como vamos a crear un script en PowerShell que se encargue del envío de los correos electrónicos, lo primero será cambiar su configuración predeterminada para que admita la ejecución de scripts locales. Probablemente ya sepas que esta tarea hay que hacerla sólo una vez, por lo que, si ya programas scripts en tu sistema, es casi seguro que podrás saltarte este paso.
- A continuación, crearemos una carpeta donde guardar nuestros scripts. Lo haremos en un lugar fácilmente accesible para no tener que escribir rutas muy largas en el futuro.
- Después, crearemos nuestro archivo de script, escribiremos su contenido y comprobaremos que funciona.
- Cuando lo tengamos, programaremos la tarea que ejecute el script cada vez que un usuario cometa un error de autenticación.
- Por último, comprobaremos que todo funciona correctamente.
Como ves, tenemos por delante un poco de trabajo, así es que, pasaremos a la acción…
Habilitar a PowerShell para ejecutar scripts de forma local
El primer inconveniente que encontraremos cuando tratemos de ejecutar scripts de PowerShell en Windows Server 2012 R2 es que esta posibilidad está restringida por cuestiones de seguridad. No obstante, para levantar la restricción sólo tenemos que seguir estos sencillos pasos:
Comenzamos por abrir una ventana de PowerShell.
Hacemos clic sobre el botón Inicio con el botón derecho del ratón y, en el menú de contexto que aparece, elegimos Ejecutar.
Esto hará que se abra la ventana Ejecutar. En ella, escribimos la siguiente orden:
powershell
Una vez que tengamos en pantalla la ventana de Windows PowerShell, escribiremos la siguiente orden:
Set-ExecutionPolicy RemoteSigned
El cmdlet Set-ExecutionPolicy nos permite elegir el tipo de scripts que pueden ejecutarse en nuestro sistema. Disponemos de cuatro posibles valores:
- Restricted: No permitirá la ejecución de ningún script. De este modo, PowerShell sólo puede utilizarse de forma interactiva.
- AllSigned: Únicamente pueden ejecutarse scripts firmados por un autor de confianza.
- RemoteSigned: Sólo los scripts descargados deberán estar firmados por un autor de confianza antes de poder ejecutarlos.
- Unrestricted: No habrá restricciones para la ejecución de scripts de PowerShell.
Puedes encontrar más información sobre el cmdlet Set-ExecutionPolicy en la dirección http://technet.microsoft.com/en-us/library/ee176961.aspx
Durante la ejecución, PowerShell nos avisa de que lo que estamos haciendo es cambiar el lugar desde el que podemos ejecutar scripts en el servidor y nos remite a una dirección de Internet donde Microsoft nos explica en detalle en qué consisten dichos riesgos.
Si, a pesar de todo, estamos de acuerdo con ejecutar el cmdlet, pulsamos la tecla S y después Intro o simplemente la tecla Intro, ya que es el valor predeterminado.
El cmdlet Set-ExecutionPolicy RemoteSigned sólo debe ejecutarse la primera vez que necesitemos ejecutar script de PowerShell en el sistema y, por supuesto, siempre con privilegios de Administrador.
Crear una carpeta donde guardar nuestros scripts
Ya que tenemos la consola abierta, podemos aprovechar para crear la carpeta donde guardar nuestros scripts. Por ejemplo, escribiendo lo siguiente:
mkdir c:\scripts
Donde c:\scripts es el nombre del directorio que hemos elegido. Tú puedes llamarlo de cualquier otra forma.
Crear el script y escribir su contenido
Una vez completado el trámite anterior, ya podemos comenzar con el contenido del script propiamente dicho. Podríamos hacerlo usando simplemente el Bloc de notas de Windows, pero PowerShell dispone de un entorno integrado para escribir scripts, que es mucho más fácil de utilizar, llamado PowerShell ISE (Integrated Scripting Engine).
Sin abandonar el entorno de PowerShell ISE podemos escribir comandos y cmdlets, escribir scripts, probarlos y depurarlos. Además, incluye coloreado de sintaxis, auto-completado de cmdlets, edición multilínea, y un largo etcétera.
Para ejecutarlo, hacemos clic sobre el botón Inicio con el botón derecho del ratón.
Esto hará que se abra la ventana Ejecutar. En ella, podríamos escribir la siguiente orden, para abrir la aplicación:
PowerShell_ISE
Esto haría que se abriera la interfaz con el área de trabajo en blanco, lista para comenzar a trabajar.
Sin embargo, nosotros optaremos por abrir el programa, indicando el nombre del script con el que vamos a trabajar. Como aún no existe, también estará en blanco el área de trabajo, pero ya hemos creado el archivo (aunque aún esté vacío). Sólo quedará comenzar a escribir órdenes.
Para conseguirlo, escribimos la siguiente orden:
PowerShell_ISE c:\scripts\Enviar-Eventos.ps1
Cuando se abra el entorno del programa, sólo tendremos que comenzar a escribir el siguiente script en su área de trabajo:
$from = "notificar@somebooks.es" $smtpServer = "smtp.somebooks.es" $to = "admin@somebooks.es" $subject = "Notificación de $($env:computername)" $evento = Get-EventLog -LogName "Security" -Newest 1 $body = @" Evento a revisar en $($evento.MachineName) Identificador: $($evento.EventId) Fuente: $($evento.Source) Tipo: $($evento.EntryType) Fecha / Hora: $($evento.TimeGenerated) Texto: $($evento.Message) "@ $smtpClient = New-Object System.Net.Mail.SmtpClient($smtpServer, 587) $smtpClient.EnableSsl = $true $smtpClient.Credentials = New-Object System.Net.NetworkCredential("notificar", "12345") $smtpClient.Send($from, $to, $subject, $body)
Estamos suponiendo que usamos una cuenta de correo para enviar las notificaciones (notificar@somebooks.es), con un determinado servidor SMTP (smtp.somebooks.es), un usuario (notificar) y una contraseña (12345).
Lógicamente, son datos de ejemplo, pero, en cualquier caso, es muy recomendable utilizar una cuenta diferenciada para este objetivo y no utilizar, por ejemplo, la cuenta administrador para enviar y para recibir los correos. El motivo es evidente: estamos incluyendo la contraseña en el script y, aunque es poco probable, si se viese comprometida, estaríamos poniendo en riesgo todo el correo del administrador.
Algo que debes tener en cuenta es que el valor 587 hace referencia al puerto que utiliza el protocolo SMTP para enviar correos mediante SSL (Secure Sockets Layer). Si el servidor SMTP que usamos no utiliza SSL, habría que sustituir este valor por 25 y cambiar la línea $smtpClient.EnableSsl = $true por $smtpClient.EnableSsl = $false.
La explicación detallada del funcionamiento del script no se encuentra entre los objetivos de este libro. En cualquier caso, puedes encontrar más información sobre la clase SmtpClient en la siguiente dirección: http://msdn.microsoft.com/es-es/library/system.net.mail.smtpclient%28v=vs.110%29.aspx.
En cuanto al cmdlet Get-EventLog, puedes encontrar más información en: http://technet.microsoft.com/en-us/library/hh849834.aspx
Cuando termines de escribir (o copiar) el código del script, sólo tienes que grabarlo
Si quieres, puedes probar a ejecutarlo desde la propia interfaz gráfica. Si todo es correcto, debes recibir un e-mail en la cuenta de destino con el último evento que se haya producido en la categoría Security.
En ocasiones, tu servidor de correo puede detectar que se está haciendo uso de la cuenta de e-mail desde un script y puede considerar que se trata de una situación potencialmente peligrosa. En estos casos, es probable que se bloqueen todos los envíos que se produzcan desde ese origen y no recibas las notificaciones que esperabas.
A modo de ejemplo, este es el aspecto del aviso que emite Gmail:
En estos casos, deberás modificar la configuración de tu cuenta de correo para que admita este tipo de orígenes.
Programar la tarea que debe ejecutar el script
Una vez que hemos creado el script, sólo queda vincularlo con una tarea programada que se ejecute cuando se produzca un evento. Para conseguirlo, comenzaremos por abrir el Visor de eventos..
Recuerda que el puedes encontrar el Visor de eventos dentro del menú Herramientas del Administrador del servidor.
Puedes evitar el paso por el Administrador del Servidor usando la orden eventvwr.msc. Sólo tienes que pulsar la combinación de teclas Windows + R y, en la ventana que aparece, escribir la orden.
Cuando se abra, localizaremos un evento del tipo al que queramos asociarle la tarea programada. En nuestro caso utilizaremos los eventos filtrados por la Vista personalizada que creamos en el artículo Cómo usar el Visor de eventos de Windows Server 2012 R2.
A continuación, hacemos clic sobre cualquiera de ellos con el botón derecho del ratón y, en el menú de contexto, elegimos Adjuntar tareas a este evento…
Se abrirá el Asistente para crear una tarea básica. Como puedes apreciar, la ventana del asistente es prácticamente idéntica a la que aparecía en el Programador de tareas (Puedes consultar el artículo Programar una tarea en Windows Server 2012 R2).
En este caso, el Nombre de la tarea aparece predefinido, con la información del evento del que hemos partido. Sin embargo, si queremos, podemos cambiarlo.
También disponemos de un cuadro de texto para la Descripción, que podemos rellenar, o no, según nuestro criterio.
En la programación de una tarea normal, el siguiente paso correspondería al Desencadenador. Sin embargo, en este caso, al tratarse de un evento, ya se encuentra definido y lo único que podemos hacer es comprobar que todo es correcto.
El siguiente paso corresponde a la Acción y también es prácticamente idéntico al del Programador de tareas. Ya dijimos en su momento que tanto Enviar un correo electrónico como Mostrar un mensaje se encuentran en desuso y no podremos establecer acciones de estas categorías.
A continuación, deberemos indicar el Programa o script que queremos ejecutar. En este caso, escribiremos el nombre del intérprete que debe ejecutar el script. Es decir:
powershell
En el cuadro Agregar argumentos (opcional), usaremos el atributo -File, seguido de la ruta completa hasta el script. En este caso:
-File c:\scripts\Enviar-Eventos.ps1
Después de esto, habremos llegado al final del Asistente para crear tareas básicas, por lo que el sistema nos ofrece un resumen de los valores que hemos introducido en los puntos anteriores. Si observamos algún error, podremos subsanarlo haciendo clic sobre el botón Atrás, hasta llegar al aspecto que necesitemos cambiar.
Antes de terminar, deberemos asegurarnos de marcar la casilla Abrir el diálogo Propiedades para esta tarea al hacer clic en Finalizar, porque hay un par de valores que debemos cambiar antes de dar la tarea por concluida.
Al hacerlo, se abrirá la ventana Propiedades de, seguido del nombre de la tarea. Aquí, dentro de la solapa General, deberemos asegurarnos de marcar dos opciones:
- Ejecutar tanto si el usuario inició sesión como si no.
- Ejecutar con los privilegios más altos.
Probablemente, cuando hagamos clic sobre el botón Aceptar para guardar los cambios que hayamos realizado, el sistema nos pida que nos identifiquemos como administradores.
Si todo ha ido bien, el Visor de eventos muestra un aviso indicando que ha creado una nueva tarea programada y que, si queremos modificara, deberemos acudir al Programador de tareas.
Comprobar que todo funciona correctamente
Si todo es correcto, cada vez que se produzca un evento 4625 (es decir, alguno de los usuarios ha cometido un error en su autenticación), el administrador recibirá un correo electrónico informándolo.
Como hemos dicho al principio, no será importante que alguien se confunda de forma esporádica al escribir su contraseña, pero si alguien está intentando acceder de forma no autorizada, probablemente probará con multitud de combinaciones y recibiremos un número elevado de correos de aviso.
Y esto es todo por hoy. Espero que te haya resultado interesante.