AD-Security: Sinnvolle OU-Struktur
Eine sinnvolle Active-Directory-Struktur (AD-Struktur) ist die Grundlage für eine sichere, übersichtliche und effizient verwaltbare IT-Umgebung. Sie ermöglicht eine klare Organisation von Benutzern, Computern und Ressourcen, erleichtert die Rechteverwaltung und reduziert administrativen Aufwand. Eine durchdachte Struktur bildet nicht das Firmen-Organigramm ab, sondern orientiert sich an administrativen, technischen und sicherheitsrelevanten Anforderungen, berücksichtigt Delegationsanforderungen und schafft die Basis für zukünftiges Wachstum und Automatisierung. Ziel ist es, Benutzer, Computer und Ressourcen so zu organisieren, dass Verwaltung, Rechtevergabe und Automatisierung effizient und nachvollziehbar möglich sind; sie schafft somit Ordnung und Flexibilität, ohne die IT-Infrastruktur unnötig an organisatorische Hierarchien zu binden.
Struktur-Beispiele
Hier zwei grafische Beispiele einer möglichen Struktur:
Grundeinstellung

Variante 1

Variante 2

Eingliederung der o.g. Varianten
Die Varianten hängen dann direkt unter dem „Root“ des Active Directory:

PowerShell-Vorlagen o.g. Beispielen
PowerShell-Skript zu Variante 1:
### Creates the basic OUs with their sub OUs
Set-Variable -Name "ADname" -Value "DC=domain,DC=local" ### replace with your own domain name
### no changes underneath here ###
New-ADOrganizationalUnit -Name "MY" -Path $ADname -Description "Everything underneath is my own stuff and structure"
New-ADOrganizationalUnit -Name "ADMIN" -Path "OU=MY,$ADname" -Description "Tier-Level Administration: ADMIN-ZONE"
New-ADOrganizationalUnit -Name "DEVICES" -Path "OU=ADMIN,OU=MY,$ADname" -Description "Daily/Personal devices of IT-Team"
New-ADOrganizationalUnit -Name "HOSTGROUPS" -Path "OU=ADMIN,OU=MY,$ADname" -Description "The '-Administrators' and '-RemoteDesktopUsers' groups of each host (server and client) will be created here"
New-ADOrganizationalUnit -Name "1_SERVERS" -Path "OU=HOSTGROUPS,OU=ADMIN,OU=MY,$ADname" -Description "The hostgroups for all servers"
New-ADOrganizationalUnit -Name "2_CLIENTS" -Path "OU=HOSTGROUPS,OU=ADMIN,OU=MY,$ADname" -Description "The hostgroups for all clients"
New-ADOrganizationalUnit -Name "LOGICAL" -Path "OU=HOSTGROUPS,OU=ADMIN,OU=MY,$ADname" -Description "All logical groupings for example 'SQL Servers', 'Fileserver',..."
New-ADOrganizationalUnit -Name "X_ToBeDeleted" -Path "OU=HOSTGROUPS,OU=ADMIN,OU=MY,$ADname" -Description "The hostgroups of deleted devices. Have to be deleted as soon as possible."
New-ADOrganizationalUnit -Name "ACCOUNTS" -Path "OU=ADMIN,OU=MY,$ADname" -Description "All Accounts (T0-ADM... / T0-JUMP... / T0-PAW... // T1-ADM... / T1-JUMP... / T1-PAW... // T2-ADM... / T2-JUMP... / T2-PAW...)"
New-ADOrganizationalUnit -Name "GROUPS" -Path "OU=ADMIN,OU=MY,$ADname" -Description "All groups (T0-BKP-Admins / T0-DC-Admins / T0-EXC-Admins / T0-MFA-Admins / T0-PKI-Admins)"
New-ADOrganizationalUnit -Name "PAW" -Path "OU=ADMIN,OU=MY,$ADname" -Description "All (virtual) PAWs (T0-PAW-mustermx / ...)"
New-ADOrganizationalUnit -Name "JUMP-FARM" -Path "OU=ADMIN,OU=MY,$ADname" -Description "JUMP-FARM (for Tier-Level-Management)"
New-ADOrganizationalUnit -Name "CORE" -Path "OU=JUMP-FARM,OU=ADMIN,OU=MY,$ADname" -Description "JUMP-FARM: Core-Systems (RD-Gateway, RD-WebAccess, RD-ConnectionBroker)"
New-ADOrganizationalUnit -Name "SHosts" -Path "OU=JUMP-FARM,OU=ADMIN,OU=MY,$ADname" -Description "JUMP-FARM: SessionHosts (T1-SessionHosts, T2-SessionHosts)"
New-ADOrganizationalUnit -Name "VHosts" -Path "OU=JUMP-FARM,OU=ADMIN,OU=MY,$ADname" -Description "JUMP-FARM: VirtualisationHosts (they host the virtual PAWs for T0)"
New-ADOrganizationalUnit -Name "SERVERS" -Path "OU=ADMIN,OU=MY,$ADname" -Description "All servers except DCs"
New-ADOrganizationalUnit -Name "Tier0" -Path "OU=SERVERS,OU=ADMIN,OU=MY,$ADname" -Description "Tier0-Systems (PKI, Exchange, AzureAD-Connect, Backup (only if needed as AD-joined server))"
New-ADOrganizationalUnit -Name "Tier1" -Path "OU=SERVERS,OU=ADMIN,OU=MY,$ADname" -Description "Tier1-Systems (Fileserver, Webserver, DB-Server, WSUS,...)"
New-ADOrganizationalUnit -Name "Tier2" -Path "OU=SERVERS,OU=ADMIN,OU=MY,$ADname" -Description "Tier2-Systems (Servers that are especially for Tier2-Level; normally Tier2 is just the clients)"
New-ADOrganizationalUnit -Name "COMPANY" -Path "OU=MY,$ADname" -Description "Tier-Level Administration: COMPANY-ZONE"
New-ADOrganizationalUnit -Name "DEVICES" -Path "OU=COMPANY,OU=MY,$ADname" -Description "Devices of all workers (non-administrators!)"
New-ADOrganizationalUnit -Name "GROUPS" -Path "OU=COMPANY,OU=MY,$ADname" -Description "All ressourcegroups (=local domain) and usergroups (= global/universal)"
New-ADOrganizationalUnit -Name "USERS" -Path "OU=COMPANY,OU=MY,$ADname" -Description "All worker-accounts (non-administrators!)"
New-ADOrganizationalUnit -Name "STAGING" -Path "OU=MY,$ADname" -Description "STAGING-ZONE"
New-ADOrganizationalUnit -Name "CLIENTS" -Path "OU=STAGING,OU=MY,$ADname" -Description "All new devices (e.g. clients) that just joined the AD w/o prestaging"
New-ADOrganizationalUnit -Name "SERVERS" -Path "OU=STAGING,OU=MY,$ADname" -Description "All new prestaged servers that will or just have joined the AD -> If not prestaged then they will get into 'CLIENTS'-OU !"
PowerShell-Skript zu Variante 2:
### Creates the basic OUs with their sub OUs for two level OU-STRUCTURE
Set-Variable -Name "ADname" -Value "DC=DOMAIN,DC=adloc" ### replace with your own domain name
Set-Variable -Name "TIER_ROOT" -Value "000_TIER"
Set-Variable -Name "TIER_LEVEL_100" -Value "100_ACCOUNTS"
Set-Variable -Name "TIER_LEVEL_200" -Value "200_GROUPS"
Set-Variable -Name "TIER_LEVEL_300" -Value "300_SERVER"
Set-Variable -Name "TIER_LEVEL_400" -Value "400_CLIENTS"
Set-Variable -Name "TIER_LEVEL_500" -Value "500_SECURE-ADMIN-ACCESS"
### no changes underneath here ###
New-ADOrganizationalUnit -Name "$TIER_ROOT" -Path $ADname -Description "TIERING-STRUCTURE starting here"
New-ADOrganizationalUnit -Name "$TIER_LEVEL_100" -Path "OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL ACCOUNTS"
New-ADOrganizationalUnit -Name "110_ADMINS" -Path "OU=$TIER_LEVEL_100,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL ACCOUNTS | Administrators"
New-ADOrganizationalUnit -Name "120_USERS" -Path "OU=$TIER_LEVEL_100,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL ACCOUNTS | Users"
New-ADOrganizationalUnit -Name "130_TECHNICAL-ACCOUNTS" -Path "OU=$TIER_LEVEL_100,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL ACCOUNTS | TECHNICAL-ACCOUNTS"
New-ADOrganizationalUnit -Name "180_INACTIVE" -Path "OU=$TIER_LEVEL_100,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL ACCOUNTS | INACTIVE ACCOUNTS"
New-ADOrganizationalUnit -Name "190_DISABLED" -Path "OU=$TIER_LEVEL_100,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL ACCOUNTS | DISABLED ACCOUNTS"
New-ADOrganizationalUnit -Name "$TIER_LEVEL_200" -Path "OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL GROUPS"
New-ADOrganizationalUnit -Name "210_ADMIN" -Path "OU=$TIER_LEVEL_200,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL GROUPS | ADMIN-GROUPS"
New-ADOrganizationalUnit -Name "220_GPO-and-SEC" -Path "OU=$TIER_LEVEL_200,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL GROUPS | For GPOs and SecurityGroups"
New-ADOrganizationalUnit -Name "230_HOSTGROUPS-SERVER" -Path "OU=$TIER_LEVEL_200,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL GROUPS | HOSTGROUPS-SERVER"
New-ADOrganizationalUnit -Name "240_HOSTGROUPS-CLIENTS" -Path "OU=$TIER_LEVEL_200,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL GROUPS | HOSTGROUPS-CLIENTS"
New-ADOrganizationalUnit -Name "250_Ressources" -Path "OU=$TIER_LEVEL_200,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL GROUPS | Ressources (NTFS-Perm, Share-Perm, SQL-DB-Perm, etc."
New-ADOrganizationalUnit -Name "290_ToBeDeleted" -Path "OU=$TIER_LEVEL_200,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL GROUPS | To Be Deleted"
New-ADOrganizationalUnit -Name "$TIER_LEVEL_300" -Path "OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL SERVER-SYSTEMS (except Domain-Controllers!)"
New-ADOrganizationalUnit -Name "310_STAGING" -Path "OU=$TIER_LEVEL_300,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL SERVERS | STAGING (New Systems)"
New-ADOrganizationalUnit -Name "320_TIER0" -Path "OU=$TIER_LEVEL_300,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL SERVERS | Tier0 (bspw. PKI, EntraID-Connect, MFA-Systems)"
New-ADOrganizationalUnit -Name "330_TIER1" -Path "OU=$TIER_LEVEL_300,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL SERVERS | Tier1 (bspw. Fileserver, SQL-Server, Webserver, RDS-CoreSystems, other Appl.-Servers)"
New-ADOrganizationalUnit -Name "340_TIER2" -Path "OU=$TIER_LEVEL_300,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL SERVERS | Tier2 (bspw. DHCP-Server for Office-Networks, Printserver, RDS-SessionHosts / RDS-VirtualDesktops)"
New-ADOrganizationalUnit -Name "380_INACTIVE" -Path "OU=$TIER_LEVEL_300,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL SERVERS | INACTIVE Systems (e.g. automatically after 60 Days w/o connection to ADDS)"
New-ADOrganizationalUnit -Name "390_DISABLED" -Path "OU=$TIER_LEVEL_300,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL SERVERS | DISABLED Systems (e.g. automatically after 30 days after being inactive)"
New-ADOrganizationalUnit -Name "$TIER_LEVEL_400" -Path "OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL CLIENTS"
New-ADOrganizationalUnit -Name "410_STAGING" -Path "OU=$TIER_LEVEL_400,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL CLIENTS | STAGING (New Systems)"
New-ADOrganizationalUnit -Name "420_IN-USE" -Path "OU=$TIER_LEVEL_400,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL CLIENTS | Systems currently in use (e.g. Desktop-PCs, Notebooks/Laptops/Tablets, Media-/Conferencesystems, IoT)"
New-ADOrganizationalUnit -Name "480_INACTIVE" -Path "OU=$TIER_LEVEL_400,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL CLIENTS | INACTIVE Systems (e.g. automatically after 60 Days w/o connection to ADDS)"
New-ADOrganizationalUnit -Name "490_DISABLED" -Path "OU=$TIER_LEVEL_400,OU=$TIER_ROOT,$ADname" -Description "TIERING | ALL CLIENTS | DISABLED Systems (e.g. automatically after 30 days after being inactive)"
New-ADOrganizationalUnit -Name "$TIER_LEVEL_500" -Path "OU=$TIER_ROOT,$ADname" -Description "TIERING | SECURE-ADMIN-ACCESS"
New-ADOrganizationalUnit -Name "510_JUMPFARM" -Path "OU=$TIER_LEVEL_500,OU=$TIER_ROOT,$ADname" -Description "TIERING | SECURE-ADMIN-ACCESS | JUMPFARM"
New-ADOrganizationalUnit -Name "511_JUMPFARM_RDS-CORE" -Path "OU=510_JUMPFARM,OU=$TIER_LEVEL_500,OU=$TIER_ROOT,$ADname" -Description "TIERING | SECURE-ADMIN-ACCESS | JUMPFARM | Core-Systems (RDS-Roles: RD-Gateway, RD-WebAccess, RD-ConnectionBroker, RD-LicenceServer; optional SQL-Server/SQL-Cluster for RD-ConnectionBroker-HAMode)"
New-ADOrganizationalUnit -Name "512_JUMPFARM_RDS-SHOSTs" -Path "OU=510_JUMPFARM,OU=$TIER_LEVEL_500,OU=$TIER_ROOT,$ADname" -Description "TIERING | SECURE-ADMIN-ACCESS | JUMPFARM | Tierlevel-Jumphosts (RDS-Roles: RD-SessionHost)"
New-ADOrganizationalUnit -Name "513_JUMPFARM_RDS-VHOSTs" -Path "OU=510_JUMPFARM,OU=$TIER_LEVEL_500,OU=$TIER_ROOT,$ADname" -Description "TIERING | SECURE-ADMIN-ACCESS | JUMPFARM | Hypervisors for vPAWs (RDS-Roles: RD-VirtualisationHost)"
New-ADOrganizationalUnit -Name "520_PAWs" -Path "OU=$TIER_LEVEL_500,OU=$TIER_ROOT,$ADname" -Description "TIERING | SECURE-ADMIN-ACCESS | PAWs (Physical and virtual)"
New-ADOrganizationalUnit -Name "521_PHYSICAL" -Path "OU=520_PAWs,OU=$TIER_LEVEL_500,OU=$TIER_ROOT,$ADname" -Description "TIERING | SECURE-ADMIN-ACCESS | PAWs | PHYSICAL"
New-ADOrganizationalUnit -Name "522_VIRTUAL" -Path "OU=520_PAWs,OU=$TIER_LEVEL_500,OU=$TIER_ROOT,$ADname" -Description "TIERING | SECURE-ADMIN-ACCESS | PAWs | VIRTUAL (on JUMPFARM-RD-VirtualisationHost)"
Warum zwei Varianten?
Die Variante 1 habe ich mir auf Basis verschiedener eigener Erfahrung und unterschiedlichen Kundenumgebungen überlegt, damit sind eigene „Pain-Points“ als auch die meiner Kunden mit eingeflossen.
Die Variante 2 habe ich mir zum letzten Jahreswechsel (2024-2025) überlegt, dabei sind leicht veränderten Anforderungen und die Erkenntnisse aus meinen AD-Security/AD-Tiering Workshops verstärkt mit eingeflossen.
Bestimmt ist auch die zweite Variante nicht für alle Umgebungen die beste Wahl, es soll aber die Grundlage möglicher eigener Strukturen der Webseite-Gäste bieten.
Vorteile von Variante 2
In der Variante 2 sehe ich folgende Vorteile:
- LifeCycle für Accounts
- Staging => neue Accounts
- In Use
- Inactive => bspw. alle Accounts, die seit 60 Tagen nicht angemeldet waren
- Disabled => bspw. alle Accounts, die seit 60 Tage in „Inactive“ sind
- LifeCycle für Systeme (Clients)
- Staging => neue Geräte
- In Use => an Anwender verteilte/ausgegebene Geräte
- Inactive => bspw. alle Geräte, die sich seit 60 Tagen nicht an der AD gemeldet haben
- Disabled => bspw. alle Geräte, die seit 60 Tage in „Inactive“ sind
- LifeCycle für Systeme (Server)
- Staging/In Use/Inactive/Disabled => ähnlich zu Systeme (Clients)
- Abbildung der jeweiligen TIER-Level
- Tier 0: PKI, EntraID-Connect, etc.
- Tier 1: DB-Server, Web-Server, File-Server, sonstige Application-Server
- Tier 2: Systeme, die nahe am Client-Netz stehen bspw. Print-Server, DHCP-Server für Client-Netze, RDS-SessionHost mit Enduser-Aktivitäten (bspw. Mail, Browsen, Filedownloads, etc.)
Achtung: Ausnahme Domain-Controller!
Die oben abgebildeten OU-Strukturen zeigen nicht die OU „Domain Controllers“ auf. Diese sollten niemals aus der originale OU verschoben werden. In die „Tier0“-OU kommen nur alle sonstigen Tier0-Systeme (wie bspw. PKI-Systeme).

