Construyendo un Tier-model
Pre-requisitos:
Máquina Windows server 2019 con un Directorio Activo instalado.
Powershell
Archivos:
Todos estos scripts y archivos los iremos creando a medida que vayamos construyendo el script.
Creando el módulo principal que contendrá todas las funciones
Empezaremos creando un archivo de módulo de powershell (.psm1) dónde incluirémos todas las funciones que necesitaremos. Podemos ponerle el nombre que queramos a las funciones, siempre teniendo en cuenta que powershell es delicado con el tema de los verbos. De esta manera depende del nombre que vayamos a elegir podríamos encontrarnos con algún warning debido a esto.
Por ello estableceremos la variable $warningPreference al principio del script. Justo antes de definir las funciones.
Create-OU: Esta función se encargará de crear Unidades Organizativas (OUs) en Active Directory.
Create-Group: Esta función se utilizará para crear grupos de seguridad o distribución.
Set-OUUserPermission: Configura los permisos de usuarios en una OU específica.
Set-OUWorkstationPermissions: Define los permisos de estaciones de trabajo dentro de una OU.
Set-OUGroupPermissions: Asigna permisos a grupos dentro de una OU.
Set-OUComputerPermissions: Establece permisos para equipos dentro de una OU.
Set-OUReplicationPermissions: Gestiona los permisos relacionados con la replicación dentro de una OU.
Set-OUGPOPermissions: Configura los permisos de las Políticas de Grupo (GPO) en una OU.
Create-User: Crea usuarios en Active Directory.Import-GPO: Importa configuraciones de GPO predefinidas.
Cada una de estas funciones debe ser diseñada para realizar tareas específicas relacionadas con la gestión de Active Directory y deben ser integradas dentro del módulo para permitir una gestión estructurada y segura del entorno de Active Directory conforme al modelo de tier.
Creando las funciones
Create-OU:
La función Create-OU se utiliza para automatizar la creación de Unidades Organizativas (OUs) en Active Directory:
- Parámetros de Entrada:
- La función recibe un parámetro que es una lista de objetos PSObject. Cada objeto contiene dos propiedades:
Name
yParentOU
. Name
: El nombre de la OU que se desea crear.ParentOU
: La OU padre bajo la cual se debe crear la nueva OU. Puede estar vacío si la nueva OU debe crearse en el nivel raíz del dominio.
- La función recibe un parámetro que es una lista de objetos PSObject. Cada objeto contiene dos propiedades:
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[PSObject] $OUs
)
- Contexto del Naming:
- La función obtiene el contexto de naming predeterminado del dominio mediante
Get-ADRootDSE
.
- La función obtiene el contexto de naming predeterminado del dominio mediante
- Iteración a través de las OUs:
- La función itera sobre cada objeto en la lista proporcionada (
$OUs
). - Construye el
distinguishedName
de la OU que se va a crear usando el nombre y la OU padre.
- La función itera sobre cada objeto en la lista proporcionada (
$OUs | ForEach-Object {
$name = $_.Name
$parentOU = $_.ParentOU
$ouPath = if ($parentOU -eq '') { "$dNC" } else { "$parentOU,$dNC" }
$testOUPath = "OU=$name,$ouPath"
- Verificación de Existencia:
- Antes de crear una nueva OU, la función verifica si una OU con el mismo
distinguishedName
ya existe. - Si la OU ya existe, se puede actualizar o asegurar que esté protegida contra eliminación accidental. Podemos usar varios métodos para esta parte, bien con un Try catch o con un if o con una combinación de ambas.
- Antes de crear una nueva OU, la función verifica si una OU con el mismo
try {
$existingOU = Get-ADOrganizationalUnit -Filter "DistinguishedName -eq '$testOUPath'" -ErrorAction Stop
}
catch {
$existingOU = $null
}
- Creación de la OU:
- Si la OU no existe, la función crea una nueva OU utilizando el cmdlet
New-ADOrganizationalUnit
. - Proporciona protección contra eliminación accidental.
- Si la OU no existe, la función crea una nueva OU utilizando el cmdlet
- Por último necesitamos establecer la que será la ou principal de la estructura, esta será la OU Admin.
Set-ADOrganizationalUnit -Identity “OU=Admin,$((Get-ADRootDSE).defaultNamingContext)” -ProtectedFromAccidentalDeletion $true
Ejemplo de uso:
$OUs = @(
$(New-Object PSObject -Property @{Name = “Admin”; ParentOU = “” }),
$(New-Object PSObject -Property @{Name = “Groups”; ParentOU = “” }),
$(New-Object PSObject -Property @{Name = “Tier 1 Servers”; ParentOU = “” }),
$(New-Object PSObject -Property @{Name = “Workstations”; ParentOU = “” }),
$(New-Object PSObject -Property @{Name = “User accounts”; ParentOU = “” }),
$(New-Object PSObject -Property @{Name = “Quarantine”; ParentOU = “” })
)
create-OU -OUs $OUs -Verbose
Y de esta manera tendríamos creadas las OUs Raíz
Create-Groups:
La función Create-Group se utiliza para automatizar la creación de grupos en Active Directory basándose en la información proporcionada en un archivo CSV en el que introduciremos todos los grupos necesarios y permisos que vamos a necesitar.
Name,samAccountName,GroupCategory,GroupScope,DisplayName,OU,Description,Membership
BreakGlassAdmins,BreakGlassAdmins,Security,Global,BreakGlassAdmins,”OU=T0-Groups,OU=Tier0,OU=Admin”,Members of this group are classed as “Break Glass Admins” and the accounts have equivalent DomainAdmin rights to the domain. These account should be used in an “emergency” situation,
Tier 0 Admins,Tier0Admins,Security,Global,Tier 0 Admins,”OU=T0-Groups,OU=Tier0,OU=Admin”,Members of this group administer Tier 0,
Tier 0 PAW Users,Tier0PAWUsers,Security,Global,Tier 0 PAW Users,”OU=T0-Groups,OU=Tier0,OU=Admin”,Members of this group are permitted to log onto Tier0 Privileged Access Workstations using normal accounts,
Tier 0 PAW Maintenance,Tier0PAWMaint,Security,Global,Tier 0 PAW Maintenance,”OU=T0-Groups,OU=Tier0,OU=Admin”,Members of this group maintain and support Tier0 Privileged Access Workstations,
Tier 0 Replication Maintenance,Tier0ReplicationMaintenance,Security,Global,Tier 0 Replication Maintenance,”OU=T0-Groups,OU=Tier0,OU=Admin”,Members of this group are Tier 0 Replication Maintenance,
Tier 0 Servers,Tier0Servers,Security,Global,Tier 0 Servers,”OU=T0-Groups,OU=Tier0,OU=Admin”,Group that contain all Tier 0 servers,
Tier 0 Sync Servers,Tier0SyncServers,Security,Global,Tier 0 Sync Servers,”OU=T0-Groups,OU=Tier0,OU=Admin”,Group that contain all Tier 0 synchronisation servers,
Tier 0 Physical Access,Tier0PhysicalAccess,Security,Global,Tier 0 PhysicalAccess,”OU=T0-Groups,OU=Tier0,OU=Admin”,Group that contain users allowed to access physical domain controller,
Tier 0 Physical DC,Tier0PhysicalDC,Security,Global,Tier 0 PhysicalDC,”OU=T0-Groups,OU=Tier0,OU=Admin”,Group that contain physical domain controller computer object,
Tier 0 Service Accounts,Tier0serviceaccounts,Security,Global,Tier 0 Service Accounts,”OU=T0-Groups,OU=Tier0,OU=Admin”,Group that contain all Tier 0 svc accouts,
Tier 0 PAW Computers,Tier0PAWComputers,Security,Global,Tier 0 PAW Computers,”OU=T0-Groups,OU=Tier0,OU=Admin”,Group with members of the tier 0 devices servers and domaincontrollers,
Tier 1 Admins,tier1admins,Security,Global,Tier 1 Admins,”OU=T1-Groups,OU=Tier1,OU=Admin”,Members of this group administer Tier 1,
Tier 1 Server Maintenance,Tier1ServerMaintenance,Security,Global,Tier 1 Server Maintenance,”OU=T1-Groups,OU=Tier1,OU=Admin”,Members of this group perform Tier 1 Server Maintenance,
Tier 1 PAW Users,Tier1PAWUsers,Security,Global,Tier 1 PAW Users,”OU=T1-Groups,OU=Tier1,OU=Admin”,Members of this group are permitted to log onto Tier1 Privileged Access Workstations using normal accounts,
Tier 1 PAW Computers,Tier1PAWComputers,Security,Global,Tier 1 PAW Computers,”OU=T1-Groups,OU=Tier1,OU=Admin”,Group with members of the Tier 1 devices and servers,
Tier 1 PAW Maintenance,Tier1PAWMaint,Security,Global,Tier1 PAW Maintenance,”OU=T1-Groups,OU=Tier1,OU=Admin”,Members of this group maintain and support Tier0 Privileged Access Workstations,
Tier 1 Servers,Tier1Servers,Security,Global,Tier 1 Servers,”OU=T1-Groups,OU=Tier1,OU=Admin”,Group that contain all Tier 1 servers,
Tier 1 Service Accounts,Tier1serviceaccounts,Security,Global,Tier 1serviceaccounts,”OU=T1-Groups,OU=Tier1,OU=Admin”,Group that contain all Tier 1 svc accouts,
Tier 2 Admins,tier2admins,Security,Global,Tier 2 Admins,”OU=T2-Groups,OU=Tier2,OU=Admin”,Members of this group administer Tier 2,
Tier 2 Service Desk Operators,Tier2ServiceDeskOperators,Security,Global,Tier 2 Service Desk Operators,”OU=T2-Groups,OU=Tier2,OU=Admin”,Members of this group are Service Desk Operators,
Tier 2 Workstation Maintenance,Tier2WorkstationMaintenance,Security,Global,Tier 2 Workstation Maintenance,”OU=T2-Groups,OU=Tier2,OU=Admin”,Members of this group perform Workstation Maintenance,
Tier 2 Service Accounts,Tier2serviceaccounts,Security,Global,Tier 2 Service Accounts,”OU=T2-Groups,OU=Tier2,OU=Admin”,Group that contain all Tier 2 svc accouts,
- Parámetros de Entrada:
- La función recibe un parámetro que es la ruta al archivo CSV (
$CSVFile
). Este archivo contiene la información necesaria para crear los grupos, como el nombre del grupo, la OU, la categoría, el ámbito, el nombre de la cuenta SAM, el nombre para mostrar, la descripción y las membresías del grupo.
- La función recibe un parámetro que es la ruta al archivo CSV (
[CmdletBinding()]
param(
[string] $CSVFile
)
- Contexto del Naming:
- La función obtiene el contexto de naming predeterminado del dominio mediante
Get-ADRootDSE
.
- La función obtiene el contexto de naming predeterminado del dominio mediante
- Importación del CSV:
- La función importa el contenido del archivo CSV utilizando
Import-Csv
, lo que permite manejar cada fila del CSV como un objeto PowerShell.
- La función importa el contenido del archivo CSV utilizando
$dNC = (Get-ADRootDSE).defaultNamingContext
$groups = Import-Csv $CSVFile
- Iteración a través de los Grupos:
- La función itera sobre cada objeto (grupo) en el archivo CSV.
- Construye el
distinguishedName
del grupo utilizando el nombre del grupo y la OU destino.
foreach ($group in $groups) {
$groupName = $group.Name
$groupOUPrefix = $group.OU
$destOU = $group.OU + “,” + $dNC
$groupDN = “CN=” + $groupName + “,” + $destOU
$checkForGroup = Get-ADGroup -Filter “Name -eq ‘$groupName'” -ErrorAction SilentlyContinue
- Verificación de Existencia:
- Antes de crear un nuevo grupo, la función verifica si un grupo con el mismo
distinguishedName
ya existe medianteGet-ADGroup
. - Si el grupo ya existe, se genera un mensaje verboso indicando que el grupo ya existe y no se realiza ninguna acción adicional.
- Antes de crear un nuevo grupo, la función verifica si un grupo con el mismo
- Creación del Grupo:
- Si el grupo no existe, la función crea un nuevo grupo utilizando el cmdlet
New-ADGroup
. - Proporciona mensajes verbosos durante la creación del grupo para informar sobre el progreso.
- Si el grupo no existe, la función crea un nuevo grupo utilizando el cmdlet
- Añadir Membresías al Grupo:
- Si el campo de membresía (
Membership
) del grupo no está vacío, la función añade los miembros especificados al grupo utilizandoAdd-ADPrincipalGroupMembership
.
- Si el campo de membresía (
if ($group.Membership -ne “”) {
Write-Verbose “Adding Group Membership ‘$($group.Membership)’ for group ‘$($group.samAccountName)'”
Add-ADPrincipalGroupMembership -Identity $group.samAccountName -MemberOf $group.Membership
Ejemplo de uso de la función:
$CSVFile = “C:\path\to\groups.csv”
Create-Group -CSVFile $CSVFile -Verbose