martes, 8 de marzo de 2016

NAGIOS. WMI. Permisos en hosts para verificar servicios Windows sin usuario administrador



En este post explicaré como poder mirar el estatus de un servicio Windows desde Nagios, sin que el usuario que lo consulte tenga permisos de administrador. Todos mis hosts windows los monitorizo por WMI.

Nota: Antes de probar este procedimiento lee muy atento todo el artículo.
 
Primero empezaremos por una solución rápida. Solucionar problemas del tipo



Ejecutamos como administrador: %windir%\system32\wbem\wmiadap.exe /f
 
 "Este comando analiza todas las bibliotecas de rendimiento del sistema y actualiza las clases de contador de rendimiento. Para obtener más detalles, consulte la Documentación de instrumentación de administración de Windows ."

Seguidamente ejecutaremos el comando: lodctr /R


Si con lo anterior no se soluciona pasamos a la parte más manual y delicada

Para que esto funcione previamente hay que configurar una cuenta en el hosts de la manera que Nagios indica: http://gonsystem.blogspot.com.es/2016/02/monitorizacion-nagios-y-wmi-anadir.html

Hay que tener privilegios administrativos para que se ejecuten los siguientes commandos:

La información que nos va a dar los comandos siguientes puede ser diferente en cada servidor.

[0] Nos conectamos al servidor y abrimos un CMD con privilegios de administrador.

[1] Buscamos la cadena de SID de nuestro usuario “nagiosuser”

 wmic useraccount where name='nagiosuser' get sid


S-1-5-21-3406756-423087055-1055211938-23112

[2] consultamos la cadena actual de permisos “scmanager”

Sc sdshow scmanager


D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)

[3 ] La documentación que encuentro en Internet pone que añadamos el comando siguiente sustituyendo <SID> por el número SID que hemos obtenido en el paso 1. 

sc sdset SCMANAGER D:(A;;CCLCRPRC;;;<SID>)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)  ->recomendada

Como es un tema delicado y estamos tocando servidores he probado una pequeña variación, se trata de mantener toda la cadena que hemos obtenido en el punto 2 y añadir los permisos de mi usuario, en lugar de sustituir algo que ya exista.

Me he encontrado casos en los que no tiene acceso nuestro usuario para ver el estado de TODOS los servicios que queremos monitorizar, con lo que he añadido un permiso más, se trata de "LO"

sc sdset SCMANAGER D:(A;;CCLCRPRCLO;;;<SID>)

Que nos concede lo siguiente:

LO – SERVICE_INTERROGATE – ask the service its current status

Con lo que haría:

El comando: sc sdset SCMANAGER

Mi cadena optenida paso 1 -> (A;;CCLCRPRCLO;;;S-1-5-21-3406756-423087055-1055211938-23112)

Cojo la configuración recomendada y le añado mi SID

La cadena del hosts optenida paso 2 -> D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)

El resultado:
sc sdset SCMANAGER D:(A;;CCLCRPRCLO;;;S-1-5-21-3406756-423087055-1055211938-23112)(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)


Importante que no se añada ni un espacio en blanco que no sean las cadenas que hemos obtenido.

Si al final sale un problema, una posible solución es http://woshub.com/granting-remote-access-on-scmanager-to-non-admin-users/


Ahora comprobamos nuestro Nagios, en este caso miraremos el "spooler" que es el servicio de imprEsión de Windows, con los permisos dados podríamos mirar cualquiera






Si hay problemas y queremos dejar como estaba el servidor bastaría con insertar el resultado original del "Sc sdshow scmanager"

Para entender un poco lo que hemos hecho....

Lo que hemos hecho es dar derechos al usuario usernagios para acceder de forma remota a scmanger.

El comando SC solo funciona para el control a distancia de servicios. Todos los permisos que se pueden dar son los siguientes:

  F : Full Control
  R : Generic Read
  W : Generic Write
  X : Generic eXecute
  L : Read controL
  Q : Query Service Configuration
  S : Query Service Status
  E : Enumerate Dependent Services
  C : Service Change Configuration
  T : Start Service
  O : Stop Service
  P : Pause/Continue Service
  I : Interrogate Service
  U : Service User-Defined Control Commands


La primera letra representa Permitir (A) lo contrario de Denegar que se representa por una (D). Cada par de letras representa un permiso específico:

CC – SERVICE_QUERY_CONFIG – ask the SCM for the service’s current configuration
LC – SERVICE_QUERY_STATUS – ask the SCM for the service’s current status
SW – SERVICE_ENUMERATE_DEPENDENTS – list dependent services
LO – SERVICE_INTERROGATE – ask the service its current status
CR – SERVICE_USER_DEFINED_CONTROL – send a service control defined by the service’s authors
RC – READ_CONTROL – read the security descriptor on this service.

Permisos adicionales:

RP – SERVICE_START – start the service
WP – SERVICE_STOP – stop the service
DT – SERVICE_PAUSE_CONTINUE – pause / continue the service

Las dos últimas letras definen la entidad de seguridad asignado a estos permisos:

AU – Authenticated Users

Posibles alias:

“AO” Account operators
“RU” Alias to allow previous Windows 2000
“AN” Anonymous logon
“AU” Authenticated users
“BA” Built-in administrators
“BG” Built-in guests
“BO” Backup operators
“BU” Built-in users
“CA” Certificate server administrators
“CG” Creator group
“CO” Creator owner
“DA” Domain administrators
“DC” Domain computers
“DD” Domain controllers
“DG” Domain guests
“DU” Domain users
“EA” Enterprise administrators
“ED” Enterprise domain controllers
“WD” Everyone
“PA” Group Policy administrators
“IU” Interactively logged-on user
“LA” Local administrator
“LG” Local guest
“LS” Local service account
“SY” Local system
“NU” Network logon user
“NO” Network configuration operators
“NS” Network service account
“PO” Printer operators
“PS” Personal self
“PU” Power users
“RS” RAS servers group
“RD” Terminal server users
“RE” Replicator
“RC” Restricted code
“SA” Schema administrators
“SO” Server operators
“SU” Service logon user 

Miramos este ejemplo:

(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)

A – Allow
CC – SERVICE_QUERY_CONFIG – ask the SCM for the service’s current configuration
DC – Delete All Child Objects
LC – SERVICE_QUERY_STATUS – ask the SCM for the service’s current status
SW – SERVICE_ENUMERATE_DEPENDENTS – list dependent services
RP – Read all properites
WP – SERVICE_STOP – stop the service
DT – SERVICE_PAUSE_CONTINUE – pause / continue the service
LO – SERVICE_INTERROGATE – ask the service its current status
CR – SERVICE_USER_DEFINED_CONTROL – send a service control defined by the service’s authors
SD – Delete
RC – READ_CONTROL – read the security descriptor on this service.
WD – Modify permissions
WO – Modify owner
BA- Built-in administrators

Más info https://msdn.microsoft.com/en-us/library/aa374928(v=vs.85).aspx?tduid=(23d870496ae9d9381d9b898ca39fabf9)(256380)(2459594)(TnL5HPStwNw-g23csJa_kmQHrAWHkza0GA)() Para ver los permisos de un servicio en concreto lo podemos hacer:







MUY IMPORTANTE: Haz pruebas antes de poner en producción este procedimiento, si puede ser ten copias de seguridad,  snapshots, reinicia las veces que haga falta, comprueba los eventos, mira los servios etc ... un espacio mal puesto deja inestable e inaccesible el servidor. Yo he hecho más de 100 servidores sin problemas (IIS, SQL, FS, DNS, DC, etc...) pero hay que estar muy atentos durante estas actuaciones.

Si no tienes muy claro lo que vas hacer NO lo hagas, la responsabilidad de los servidores es tuya. Antes de hacer algo tan delicado contrasta con otras webs o consúltalo con un experto.

Es importante vuestra opinión, no hay mucha documentación de este tema, así que si lo probáis sería bueno que lo comentéis.

Artículo relaconado: http://gonsystem.blogspot.com.es/2016/02/monitorizacion-nagios-y-wmi-anadir.html


Check at Windows 2012 R2
by GoN | Published: May, 2016 | Last Updated: Abril  26, 2022

martes, 23 de febrero de 2016

MONITORIZACION. NAGIOS y WMI. Añadir todos los hosts de mi red.


La finalidad de este post es como añadir todos nuestros servidores windows a nuestro nuevo sistema Nagios evitando pasar uno por uno, através de consultas WMI. 

¿Porque WMI? porque es más seguro que poner un cliente y viene instalado por defecto en todos nuestros servidores Windows.

Importante!!! Recomiendo que antes de aplicar los cambios que a continuación voy a detallar aconsejo leer todo el artículo mínimo una vez. El gestionar GPOs puede tener consecuencias graves el en AD.

Nagios nos ofrece el procedimiento manual de como hacerlo uno por uno: https://assets.nagios.com/downloads/nagiosxi/docs/Monitoring-Windows-Using-WMI-and-Nagios-XI.pdf

Para esta explicación crearé un usuario, ya que no le veo muchos más uso que el alcance de permitir que el Nagios consulte nuestros servidores, si viese más utilidades crearía un grupo en el que a medida me salga la necesidad iría añadiendo usuarios. Llamaremos a nuestro nuevo usuario "nagiosuser"

Previamente nos tenemos que asegurar que el servicio siguiente esté arrancado:





[ ] Crearemos un usuario o grupo de seguridad para permitir consultas wmi y lo asociamos “Member of” a los grupos  “Perfomance Log Users”, “Performance Monitor User” y “Distributed DCOM”.



Estar parte también la podemos hacer por GPOs o manualmente a los grupos comentados.



 [ ] Creamos una GPO con los siguientes autorizaciones

·  Act as part of the opering system
·  Log on as a batch job
·  Log on as a service
·  Replace a process level token




[ ] Ahora toca la parte que no se puede hacer con las opciones que nos den las GPOs, con lo que nos vemos obligados a hacer un script
  • Abrimos la consola con el comando “compmgmt.msc”.

  • Le damos al boton derecho en "WMI Control" y  nos vamos a la pestaña "Security".


  • Añadimos nuestro usuario


  • Le concedemos los permisos de : Execute Methods, Enable Acount, Remote Enable y Read Security 


                            Aplicamos permisos en  “This namespace and subnamespaces”



[ ] Usaremos la consulta wmic, "The WMI command-line (WMIC) utility provides a command-line interface for WMI. WMIC is compatible with existing shells and utility commands" :


wmic /namespace:\\root\CIMV2  /output:MyInfo_sd.txt path __systemsecurity call getSD


Su contenido será parecido al siguiente:


Ahora abrimos el fichero generado “MyInfo_sd.txt



Tenemos que quitar todos los espacios entre cada número, lo podemos hacer con un buscar y sustituir:
 Nos quedará toda la lista de números solo separados por ","





Ahora tenemos que crear un script con lo que crearemos un fichero con el nombre Myscript.vbs con el siguiente código:



strSD = array(!!! Poner los número aqui!!!)
set namespace = createobject("wbemscripting.swbemlocator").connectserver(,"root\ \CIMV2")
set security = namespace.get("__systemsecurity=@")

nStatus = security.setsd(strSD)



En algunos caso hay que hacer

strSD = array(!!! Poner los número aqui!!!)
set namespace = createobject("wbemscripting.swbemlocator").connectserver(,"root\CIMV2")
set security = namespace.get("__systemsecurity=@")


nStatus = security.setsd(strSD)



Dentro de “array()” deberemos poner la cadena de números sin espacios en blanco ni salto de línea, con el resultado:




[ ] Ahora para probarlo hay que ejecutarlo con un usuario administrador y verificamos el resultado.

Ejecutar en el interprete de comandos como administrador de la siguiente manera

cscript fichero.vbs

[ ] Faltaría la parte de permisos WMI, que si lo hacemos en un servidor RECIEN instalado bastaría con poner 

   [A] Buscamos la cadena de SID de nuestro usuario “nagiosusr”
 Comando: wmic useraccount where name='nagiosusr' get sid

Resultado: S-1-5-21-3406756-4123087055-1055211938-1    -> Referencia del usuario 

 IMPORTANTE: Esta cadena variara para cada persona!!!

   [B] La documentación que encuentro en Internet pone que añadamos el comando siguiente sustituyendo <SID> por el número SID que hemos obtenido en el paso 1, se añade “LO” para poder ver todos los servicios.
sc sdset SCMANAGER D:(A;;CCLCRPRCLO;;;S-1-5-21-3406756-4123087055-1055211938-1)(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)

Este punto esta ampliamente documentado en otros post de este blog http://gonsystem.blogspot.com.es/2016/03/nagios-permisos-en-hosts-para-verificar.html

[ ] Ahora tenemos dos opciones o ponemos este script al arranque o cierre de los servidores o lo ejecutamos manualmente.

Si tenemos prisa esta claro que mejor ejecutarlo manualmente, a veces se tarda mucho en ver reiniciado todos nuestro parque de servidores.

Para ejecutarlo manualmente podemos usar la utilidad PsExec


Tenemos que dejar nuestro script en un lugar donde puedan acceder todos nuestros hosts o si es por GPO que lo puedan leer las políticas, en este ejemplo lo dejaré en MiDominio\SYSVOL\MiDominio.local\script\MiScript.vbs

Cuando el PsExec da como resultado "error code 0" es que ha ido bien.

Si lo que queremos hacer es forzar a un grupo de host, podemos tener un txt con una lista y ejecutar el .bat siguiente:


@ECHO OFF
FOR /F %%A IN (c:\gon\WindowsServerlist.txt) DO (
@ECHO %%A
psexec \\%%A.dominio.local -u dominio\useradmin –p contraseña c:\windows\system32\cscript //B \\dominio.local\SYSVOL\dominio.LOCAL\scripts\WMI_NAGIOS.vbs
psexec \\%%A.dominio.local -u dominio\useradmin - p contraseña gpupdate /force
)


Puede salir un problema, las G`POs no se pueden aplicar a los hosts que están en la DMZ ya que los hosts de dmz no pueden acceder al dominio, con lo que hay que poner otro origen de nuestro vbs.

El resultado podría ser:


Se podría añadir:

También es sencillo que la GPO abra reglas de FW

Antes de ponerlo en producción probar con algunos servidores, se han dado caso que se han parado algún servicio o los conectores COM de Windows.


MUY IMPORTANTE: Haz pruebas antes de poner en producción este procedimiento, si puedes ser ten copias de seguridad,  snapshots, reinicia las veces que haga falta, mira servicios, comprueba los eventos, etc ... 

Si no tienes muy claro lo que vas hacer NO lo hagas, la responsabilidad de los servidores es tuya. Antes de hacer algo tan delicado contrasta con otras webs o consúltalo con un experto.

Es importante vuestra opinión, no hay mucha documentación de este tema, así que si lo probáis sería bueno que lo comentéis.

Artículo relacionado: http://gonsystem.blogspot.com.es/2016/03/nagios-permisos-en-hosts-para-verificar.html

REF:

https://www.solucions-im.com/blogs/tecnic/usuario-no-administrador-en-dominio-para-wmi/
http://blogs.msdn.com/b/spatdsg/archive/2007/11/21/set-wmi-namespace-security-via-gpo-script.aspx


Gon. Marzo2016 v2