Después de ver en al cybertruco previo en esta serie sobre la gestión de Active Directory con Powershell como podíamos gestionar tanto los usuarios como los ordenadores dentro de nuestra red, vamos a abordar ahora la gestión de los grupos y la membresía de estos objetos a los mismos.
En Active Directory utilizamos los grupos para gestionar de manera unificada los permisos a diferentes recursos para conjuntos de usuarios y/o máquinas. Hablamos principalmente de grupos de seguridad y de listas de distribución en ambos casos estos grupos están aplicados a un determinado ámbito (scope) que pueden ser Universal, Global o Domain Local.
Ámbito de grupo
Antes de empezar con los ejemplos conviene que repasemos y tengamos claros estos conceptos, básicamente cada tipo de grupo por su ámbito (Universal, Global y Domain Local) se diferencian en los tres siguientes aspectos:
- Que tipo de miembros puede incluir
- Donde podemos asignarle permisos
- A qué ámbito podríamos convertirlo
Universal
-Que tipo de miembros puede incluir?
- Cuentas de cualquier dominio dentro del bosque en el cual resida el grupo Universal
- Grupos Globales de cualquier dominio dentro del bosque en el cual resida el grupo Universal
- Grupos Universales de cualquier dominio dentro del bosque en el cual resida el grupo Universal
-Donde podemos asignarle permisos?
- En cualquier dominio o bosque
-Se puede convertir a..
- Domain Local y Global (siempre que no tenga como miembro otro grupo Universal)
Global
-Que tipo de miembros puede incluir
- Cuentas del mismo dominio que el grupo Global padre
- Grupos Globales del mismo dominio que el grupo Global padre
-Donde podemos asignarle permisos
- En cualquier dominio
-Se puede convertir a..
- Universal (siempre que el grupo no sea miembro de otro grupo Global)
Domain Local
-Que tipo de miembros puede incluir
- Cuentas de cualquier dominio
- Grupos Globales de cualquier dominio
- Grupos Universales de cualquier dominio
- Grupos Domain Local pero solo del mismo dominio que el grupo Domain Local padre
-Donde podemos asignarle permisos
- Unicamente dentro del propio dominio
-A qué ámbito podríamos convertirlo
- Universal (siempre que no tenga como miembro otro grupo Domain Local)
Tenéis toda la información detallada en el siguiente link de Microsoft
Gestión de grupos con Active Directory
Vamos a ver cómo podemos agilizar en gran medida la gestión de nuestros grupos de seguridad a través de powershell. Como siempre y como con cualquier código que encontréis en Internet, probad los siguientes comandos en entornos de pruebas y adaptadlos a vuestro entorno antes de llevarlos a producción.
Crear grupos
Para crear un nuevo grupo de seguridad utilizaremos el cmdlet new-adgroup y para ellos necesitaremos indicarle tres parámetros que serán el propio nombre -name que queramos asignar al grupo, el -path de la OU y el ámbito con el parámetro -groupscope. En este caso utilizamos el domainlocal pero podemos especificar global o universal
new-adgroup -name "grupoprueba" -path "OU=grupos,DC=cyberseguridad,DC=net" -groupscope domainlocal
Ver información de un grupo
Para buscar un grupo o ver su información utilizaremos el cmdlet get-adgroup. Podemos ejecutarlo de manera directa para ver información relevante de nuestros grupos como podría ser el nombre, groupcategory (security o distribution), groupscope (Universal,Global o Domain Local) y objectcategory (DN)
Get-adgroup - filter * -properties * | select name,groupcategory,groupscope,objectcategory
Podemos también de manera sencilla, como hemos visto en otros ejemplos, buscar un grupo por su nombre utilizando el parámetro filter
Get-adgroup -filter {name -like “*grupoprueba*”}
O con una doble condición de filtrado
Get-adgroup -filter {name -like “*prueba*” -or name -eq “grupoprueba”}
Modificar información de un grupo
Para modificar la información de un grupo determinado actuaremos de la misma manera que respecto a los usuarios y ordenadores, seleccionaremos con el get-adgroup aquel o aquellos grupos sobre los cuales queramos realizar la modificación y la ejecutaremos con el cmdlet set-adgroup.
Por ejemplo con el siguiente comando añadiremos una descripción a un grupo
get-adgroup -filter {name -eq "grupoprueba" } | set-adgroup - description "test"
De la misma manera podemos aplicar cambios a diversos grupos en un mismo comando ya sea porque ampliemos nuestro filtro de búsqueda en get-adgroup o porque le pasemos los nombres de los mismos en una variable o desde un fichero a set-adgroup
$listagrupos = get-adgroup -filter {name -eq “*prueba*”}
foreach($grupo in $listagrupos) { set-adgroup -description $grupo.description “grupo de prueba”}
get-content C:\gruposparacambiar.txt | foreach { set-adgroup -identity $_ -description “grupo de prueba”}
Como estamos hablando repetidamente del scope de un grupo, vemos otro ejemplo en el cual cambiamos este valor a través del parámetro -groupscope
get-adgroup -filter {name -eq "grupoprueba" } | set-adgroup -groupscope domainlocal
De la misma manera podemos cambiar el tipo de grupo (security o distribution) de la siguiente manera con el parámetro -groupcategory
get-adgroup -filter {name -eq "grupoprueba" } | set-adgroup - groupcategory security
Ver miembros de un grupo
Después de ver cómo podemos crear y modificar grupos vamos a abordar ahora como podemos ver los miembros actuales de un grupo. Un grupo de seguridad puede contener usuarios, ordenadores, otros grupos o una combinación de los mismos y nos referiremos a ellos como miembros.Para esta tarea usaremos el cmdlet get-adgroupmember, en este caso solo tenemos que indicar a través del parámetro -identity el nombre del grupo en cuestión
get-adgroupmember -identity prueba
Esto nos saca un listado de los miembros de un grupo con una serie de propiedades preestablecidas a mostrar en pantalla (distinguishedname, name, objectclass, objectguid, samaccountname y sid). A partir de aquí podemos por ejemplo sacar el número de miembros de un grupo con
get-adgroupmember -identity prueba | measure-object
O sacar una tabla para visualizar los datos más claramente con los datos que queramos con por ejemplo en el siguiente ejemplo en que también mostramos el tipo de objeto del que se trata
get-adgroupmember -identity prueba | select name, objectclass
En caso que queramos datos extras dependiendo del tipo de objeto miembro podemos realizar un filtrado adicional como vemos a continuación para sacar información únicamente de los usuarios del grupo
get-adgroupmember -identity prueba | where-object {$_.objectclass -eq "user" } | foreach {get-aduser -identity $_} | select name, enabled, distinguishedname, emailaddress
Si queremos ver los miembros de grupos anidados dentro de otro podemos utilizar el parámetro -recursive como vemos a continuación
get-adgroupmember -identity prueba -recursive | select name, objectclass
Añadir miembros a un grupo
Para añadir miembros usaremos el cmdlet add-adgroupmember
En el siguiente ejemplo vemos cómo añadimos el usuario tempuser al grupo grupoprueba, con el parámetro -identity indicamos al cmdlet el contenedor (grupo) al que queremos añadir el miembro y con el parámetro -members indicamos que miembro queremos añadir
add-adgroupmember –identity "grupoprueba" –members tempuser
Como podéis suponer, podemos añadir múltiples usuarios desde un archivo, desde variable, separados por comas... a uno o a múltiples grupos, vamos a ver algunos ejemplos
Añadiendo múltiples usuarios directamente escritos en el comando
add-adgroupmember –identity "grupoprueba" –members tempuser1,tempuser2
Añadiendo el mismo usuario a diversos grupos
“Grupo1”, “grupo2” | foreach {add-adgroupmember -identity $_ -members tempuser}
Añadiendo un listado de usuarios a un grupo
get-content C:\usuariosparagrupopruebas.txt | foreach { add-adgroupmember -identity “grupoprueba” -members $_}
Añadiendo todos los miembros de una OU a un grupo
get-aduser -searchbase "OU=it,DC=cyberseguridad,dc=net" -filter {objectclass -eq "user" } | foreach {add-adgroupmember -identity grupoprueba -Members $_}
O copiar los de un grupo a otro con un comando similar
get-adgroupmember -identity grupoprueba | foreach {add-adgroupmember -identity grupoprueba2 -members $_}
Añadir ordenadores a un grupo
El procedimiento es exactamente igual que para los usuarios pero añadiendo el símbolo $ tras el nombre de la máquina, tal y como almacena AD el samaccountname de las máquinas, por ejemplo en el caso más sencillo
add-adgroupMember -identity grupoprueba -members "pcprueba$"
Teniendo esto en cuenta el procedimiento es exactamente igual que para los usuarios por lo que podéis utilizar los ejemplos anteriores.
Anidamiento de grupos
Es probable que tengamos que anidar grupos de seguridad dentro de otros para obtener un control más sencillo de sus permisos, para ello hemos de tener en cuenta lo que hemos visto anteriormente sobre las limitaciones sobre los miembros que puede contener. De todas maneras si tratamos de anidar un grupo incompatible dentro de otro (ejemplo grupo universal dentro de grupo global) el mismo cmdlet nos devolverá un error.
De nuevo leeros detenidamente la documentación de Microsoft para entender este aspecto. Una vez hecho esto, como veis en el siguiente ejemplo, en el que añadimos el grupo grupoprueba2 dentro del grupo grupoprueba, no tiene mayor dificultad
add-adgroupmember -identity grupoprueba -members grupoprueba2
Si ahora ejecutáramos el cmdlet get-adgroupmember contra el grupo grupoprueba veríamos entre sus miembros el grupo grupoprueba2
Get-adgroupmember -identity grupoprueba | select name,objectclass
Y si lo ejecutáramos con el parámetro -recursive los miembros del mismo..
Eliminar miembros de un grupo
Para mantener nuestro AD limpio esta es otra de las tareas que tendremos que realizar de manera habitual, para ello utilizaremos el cmdlet remove-adgroupmember. Este cmdlet tiene de nuevo dos parámetros obligatorios, que son -identity en el que indicaremos el nombre del grupo del cual queremos quitar miembros y el parámetro -members donde especificaremos que miembros hay que quitar del mismo.
A continuación un sencillo ejemplo para quitar el usuario testuser del grupo prueba
remove-adgroupmember -identity grupoprueba -members testuser
Este cmdlet de nuevo ejecuta una acción considerada como crítica, por lo que siempre se nos pedirá confirmación, a no ser que indiquemos lo contrario con -confirm:$false, lo que insistimos en no recomendar por cuestiones de seguridad.
Para eliminar un ordenador, como en el caso de añadirlo tendremos que añadir el símbolo $ correspondiente a su samaccountname.
Remove-adgroupmemeber -identity grupoprueba -members pcprueba$
En el caso que tengamos más de un miembro a quitar, podemos separarlos con comas en el parámetro -members, ejecutar un foreach por ejemplo a partir de un get-adusers o simplemente leerlo de una archivo donde tengamos una lista de usuarios a eliminar de cierto grupo.
get-content C:\usuariosparaeliminargrupopruebas.txt | foreach { remove-adgroupmember -identity grupoprueba -members $_}
De la misma manera podemos tener un listado de miembros (de todo tipo) y los grupos de los cuales eliminarlos, en este caso el script (que podemos ejecutar como .ps1) es un poco más largo pero igualmente sencillo
#importamos el fichero csv a una variable
$miembrosaeliminar = import-csv c:\miembrosaeliminar.csv
#vamos linea a linea
foreach($miembro en $miembrosaeliminar)
{
#sacamos el valor de la columna nombredegrupo
$grupo=$miembro.nombredegrupo
#comprobamos el valor de la columna tipodeobjeto
if($miembro.tipodeobjecto -eq “computer”)
{
#si es un ordenador, le añadimos el simbolo $ al final de su nombre
$miembroaeliminar=”{0}`$” -f $miembro.nombre
}
Else
$miembroaeliminar=$miembro.nombre
}
#ejecutamos el cmdlet para eliminar el miembro del grupo
Remove-adgroupmember -identity $grupo -members $miembroaeliminar
Borrar un grupo
En el caso que queramos borrar un grupo el cual consideremos no necesitar, lo primero que debemos hacer es asegurarnos que el mismo no tiene ningún miembro para evitar futuros fallos. Para ello podemos usar de nuevo el cmdlet get-adgroupmember
Get-adgroupmember -identity grupoprueba
Una vez tengamos claro que el grupo está vacío podemos ejecutar el cmdlet remove-adgroup como vemos a continuación
Remove-adgroup -identity grupoprueba
En este caso de nuevo tenemos la opción de indicar que se evite la confirmación con el parámetro -confirm:$false
Como en ejemplos anteriores podemos pasarle el grupo a eliminar a este cmdlet a través de una búsqueda previa enlazando cmdlets.
Get-adgroup -filter “name -eq “grupoprueba” | remove-adgroup
Esperemos como siempre que estos ejemplos os sirvan de ayuda y sean solo la base de vuestros futuros scripts que os hagan trabajar mucho más eficientemente con el potencial inmenso de powershell. Nos vemos en el próximo cybertruco.