Homelab Portfolio · 2026

Active Directory
Security

Homelab Portfolio

Windows Server 2025 Splunk SIEM BloodHound CE Sysmon v15.15 Docker · WSL2 PingCastle
Arturs Kaufmanis
Cybersecurity Professional · HyperionDev Bootcamp Graduate
Manchester Metropolitan University

Executive Summary

This portfolio documents the design, implementation, and security hardening of a comprehensive Active Directory homelab environment. The project demonstrates enterprise-level cybersecurity skills including SIEM integration, attack path analysis, identity management, and security monitoring.

The lab was built to demonstrate practical competency in:

1.1 Lab Environment Summary

ComponentSpecification
Domain ControllerWindows Server 2025 (Build 26100)
Domain NameADForest.local
Forest / Domain Functional LevelWindows Server 2016
DC HostnameWIN-ESVD1CAD1FJ
RAM24 GB
SIEMSplunk Enterprise 10.2 (Free)
EDRSysmon v15.15 with SwiftOnSecurity config
Attack Path ToolBloodHound Community Edition (Docker)
Container PlatformDocker Engine on WSL2 Ubuntu 24.04
Security AssessmentPingCastle v3.x

1.2 PingCastle Score Progression

60
Baseline
20
Final
SessionGlobalPrivilegedStale ObjectsAnomalyTrust
Baseline604031600
Session 1 – Password / NTLMv1 fixes50021500
Session 2 – Backup / Audit fixes35021350
Session 3 – LAPS / AES / SecAdmin212021200
Final – Schema Admins / Backup202020200
Result
67% improvement from baseline score of 60 to final score of 20. Remaining findings are lab limitations (single DC, BreakGlass used within 60 days).

Phase 1 — Active Directory Deployment & Baseline

2.1 Initial Setup

Windows Server 2025 was installed and configured as a Domain Controller for the ADForest.local domain. The following roles were installed:

2.2 Baseline PingCastle Assessment

PingCastle was used to establish a security baseline. Initial scan revealed a global score of 60 with multiple critical findings:

FindingPointsDescription
S-OldNtlm15NTLMv1 authentication enabled
A-LAPS-Not-Installed15Local Admin Password Solution not deployed
A-AuditDC10Insufficient audit policy on Domain Controllers
MachineAccountQuota10Default quota allows any user to join computers to domain
Schema Admins not empty10Administrator in Schema Admins group
A-HardenedPaths5Hardened UNC paths not configured
A-NotEnoughDC5Single Domain Controller — no redundancy
S-DC-SubnetMissing5DC subnets not declared in AD Sites and Services
S-PwdNeverExpires1Accounts with non-expiring passwords

Phase 2 — Security Hardening

3.1 Password Policy

Default password policy was strengthened to meet enterprise standards:

Set-ADDefaultDomainPasswordPolicy -Identity 'ADForest.local' -MinPasswordLength 12
Result
Minimum password length increased from 7 to 12 characters.

3.2 AD Recycle Bin

Enabled AD Recycle Bin to allow recovery of accidentally deleted objects:

Enable-ADOptionalFeature -Identity 'Recycle Bin Feature' -Scope ForestOrConfigurationSet -Target 'ADForest.local' -Confirm:$false
Result
Deleted AD objects can now be recovered within 180 days (tombstone lifetime).

3.3 MachineAccountQuota

By default, any domain user can join up to 10 computers to the domain. This was disabled to prevent unauthorized domain joins:

Set-ADDomain -Identity 'ADForest.local' -Replace @{'ms-DS-MachineAccountQuota'='0'}
Result
Only administrators can now join computers to the domain, preventing unauthorized device registration.

3.4 Schema Admins Cleanup

The built-in Administrator account was removed from Schema Admins. Schema Admins is one of the most powerful groups in AD — members can make irreversible forest-wide schema modifications:

Remove-ADGroupMember -Identity 'Schema Admins' -Members 'Administrator' -Confirm:$false
Best Practice
Schema Admins must be empty at all times except during planned schema modifications. Members are only added temporarily and removed immediately after.

3.5 Account Delegation Protection

The Administrator account was protected against Kerberos delegation attacks:

Set-ADUser -Identity 'Administrator' -AccountNotDelegated $true
Result
Prevents attackers from using delegation to impersonate the Administrator account.

3.6 NTLMv1 Disabled

NTLMv1 is a legacy and insecure authentication protocol. It was disabled via both registry and GPO:

Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name 'LmCompatibilityLevel' -Value 5

Set-GPRegistryValue -Name 'Default Domain Controllers Policy' -Key 'HKLM\SYSTEM\CurrentControlSet\Control\Lsa' -ValueName 'LmCompatibilityLevel' -Type DWord -Value 5
Note
LmCompatibilityLevel 5 = Only NTLMv2 responses are sent. NTLMv1 and LM are refused.

3.7 Audit Policy

Comprehensive audit policy was configured to capture all security-relevant events:

Audit CategorySetting
Credential ValidationSuccess and Failure
User Account ManagementSuccess and Failure
Security Group ManagementSuccess and Failure
Logon EventsSuccess and Failure
Logoff EventsSuccess
Sensitive Privilege UseSuccess and Failure
Audit Policy ChangeSuccess and Failure
Process Creation (4688)Success
Directory Service ChangesSuccess and Failure

3.8 AD Backup

Windows Server Backup was installed and a system state backup was configured:

Install-WindowsFeature -Name Windows-Server-Backup
# Create VHD for backup storage
diskpart /s backup_script.txt  # Creates 30GB VHD mounted as E:
wbadmin start systemstatebackup -backupTarget:E: -quiet
Result
System state backup completed successfully, covering AD database, SYSVOL, and registry.

3.9 AES Encryption

Legacy RC4 Kerberos encryption was replaced with modern AES encryption:

# Enable AES for all user accounts
Get-ADUser -Filter {Enabled -eq $true} | Set-ADUser -KerberosEncryptionType AES128,AES256

# Enable AES for krbtgt account
Set-ADUser -Identity krbtgt -KerberosEncryptionType AES128,AES256
Result
All Kerberos tickets now use AES256 encryption, eliminating RC4 downgrade attack vectors.

Phase 3 — LAPS Implementation

Windows LAPS (Local Administrator Password Solution) is built into Windows Server 2025. It automatically manages and rotates local administrator passwords on domain-joined computers, eliminating the risk of password reuse attacks.

4.1 LAPS Schema Extension

AD Schema was extended with LAPS attributes:

# Add Schema Admins temporarily for schema modification
Add-ADGroupMember -Identity 'Schema Admins' -Members 'SecAdmin'

# Extend schema with LAPS attributes
Update-LapsADSchema -Verbose

Schema attributes added:

# Remove from Schema Admins immediately after
Remove-ADGroupMember -Identity 'Schema Admins' -Members 'SecAdmin' -Confirm:$false

4.2 LAPS Computer Permissions

Set-LapsADComputerSelfPermission -Identity 'DC=ADForest,DC=local'
Result
Computers can now update their own LAPS password attribute in AD.

4.3 LAPS GPO Configuration

New-GPO -Name 'LAPS Policy' | New-GPLink -Target 'DC=ADForest,DC=local'

# Backup passwords to Active Directory
Set-GPRegistryValue -Name 'LAPS Policy' -Key 'HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\LAPS' -ValueName 'BackupDirectory' -Type DWord -Value 2

# Password age 30 days, minimum length 16 characters
Set-GPRegistryValue -Name 'LAPS Policy' -Key 'HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\LAPS' -ValueName 'PasswordAgeDays' -Type DWord -Value 30
Set-GPRegistryValue -Name 'LAPS Policy' -Key 'HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\LAPS' -ValueName 'PasswordLength' -Type DWord -Value 16
Impact
A-LAPS-Not-Installed finding resolved. PingCastle score reduced by 15 points.

Phase 4 — Privileged Account Management

5.1 SecAdmin Account Creation

A dedicated administrative account was created following the principle of least privilege. The built-in Administrator account (RID-500) is a well-known attack target — creating a separate admin account reduces this risk:

New-ADUser -Name 'SecAdmin' -SamAccountName 'SecAdmin' -UserPrincipalName 'SecAdmin@ADForest.local' `
  -AccountPassword (ConvertTo-SecureString 'SecureP@ss123!' -AsPlainText -Force) `
  -Enabled $true -PasswordNeverExpires $false

Add-ADGroupMember -Identity 'Domain Admins' -Members 'SecAdmin'

# Mark as sensitive - cannot be delegated
Set-ADUser -Identity SecAdmin -AccountNotDelegated $true

5.2 BreakGlass Account (Emergency Recovery)

The built-in Administrator account was renamed to BreakGlass and disabled. This follows defence-in-depth principles — attackers expect 'Administrator' but find 'BreakGlass' disabled:

# Rename Administrator to BreakGlass
Rename-ADObject -Identity (Get-ADUser Administrator).DistinguishedName -NewName 'BreakGlass'

# Disable the account
Disable-ADAccount -Identity 'CN=BreakGlass,CN=Users,DC=ADForest,DC=local'

# Set complex emergency password
Set-ADAccountPassword -Identity 'CN=BreakGlass,CN=Users,DC=ADForest,DC=local' `
  -NewPassword (ConvertTo-SecureString 'Xk9#mP2$vL5@nQ8!' -AsPlainText -Force) -Reset
AccountPurposeStatusUsage
SecAdminDaily administrationEnabledAll routine admin tasks
BreakGlass (was Administrator)Emergency recovery onlyDisabledOnly when SecAdmin fails
Security Principles
Least Privilege · Defence in Depth · Security by Obscurity. The BreakGlass account password is stored securely offline.

Phase 5 — Splunk SIEM Integration

Splunk Enterprise 10.2 was deployed as the SIEM solution. Despite being the free version (500 MB/day ingestion limit), it provides full SIEM functionality for the homelab environment.

6.1 Splunk Configuration

Windows Event Log collection was configured via inputs.conf (GUI editing restricted in free version):

[WinEventLog://Security]
index = wineventlog
disabled = false
start_from = oldest
current_only = 1
renderXml = false

[WinEventLog://System]
index = wineventlog
disabled = false
current_only = 1

[WinEventLog://Application]
index = wineventlog
disabled = false
current_only = 1

[WinEventLog://Microsoft-Windows-Sysmon/Operational]
index = wineventlog
disabled = false
current_only = 1
renderXml = true
whitelist = 1,3,8,10,11,12,13,22

6.2 Sysmon Integration

Sysmon (System Monitor) v15.15 was installed and integrated with Splunk for deep endpoint visibility. Key challenge: Splunk returned errorCode=5 (Access Denied) when accessing Sysmon logs.

Resolution — Splunk service configured to run as LocalSystem:

sc.exe config Splunkd obj= 'LocalSystem'

Splunk Add-on for Sysmon (TA-microsoft-sysmon v5.0.0) was installed to enable proper field extraction and sourcetype recognition.

6.3 Data Collection Results

SourcetypeDaily VolumeEvents
WinEventLog:Security~176 MBFailed logons, privilege use, group changes
xmlwineventlog (Sysmon)~76 MB filteredProcess creation, network connections, registry
WinEventLog:System~0.17 MBSystem events, service starts/stops
WinEventLog:Application~0.10 MBApplication events
Note
Total daily ingestion: ~253 MB — well within the 500 MB free version limit. Sysmon filtered to critical event IDs: 1, 3, 8, 10, 11, 12, 13, 22.

6.4 Key Security Searches

Search PurposeSPL Query
Failed Logon Attemptsindex=wineventlog EventCode=4625 | stats count by Account_Name | sort -count
Top Event Codesindex=wineventlog | stats count by EventCode | sort -count | head 10
Sysmon Process Creationindex=wineventlog sourcetype=xmlwineventlog | stats count by Image | sort -count | head 10
Logon Activityindex=wineventlog EventCode=4624 | stats count by Account_Name | sort -count

6.5 Splunk Dashboards Created

Phase 6 — BloodHound CE Attack Path Analysis

BloodHound Community Edition was deployed to visualize Active Directory attack paths — a critical tool for both offensive security (red team) and defensive security (blue team) operations.

7.1 Infrastructure

ComponentDetails
PlatformWSL2 Ubuntu 24.04 LTS on Windows Server 2025
Container RuntimeDocker Engine 29.3.0
BloodHound VersionLatest (SpecterOps)
DatabaseNeo4j 4.4.42 + PostgreSQL 16
Access URLhttp://127.0.0.1:8080
CollectorSharpHound v2.10.0

7.2 Deployment Process

Key challenge: Docker Desktop does not support Windows Server. Solution: WSL2 with Docker Engine on Ubuntu.

# Install WSL2 and Ubuntu
wsl.exe --install

# Install Docker Engine on Ubuntu
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Deploy BloodHound CE
wget -O docker-compose.yml 'https://raw.githubusercontent.com/SpecterOps/BloodHound/main/examples/docker-compose/docker-compose.yml'
docker compose up -d

7.3 SharpHound Data Collection

# Disable Defender temporarily
Set-MpPreference -DisableRealtimeMonitoring $true

# Run SharpHound collection
.\SharpHound.exe -c All --domain ADForest.local
Result
328 AD objects enumerated including users, groups, computers, GPOs, ACLs, and trust relationships.

7.4 Saved BloodHound Queries

Query NameCypher QueryPurpose
Domain Admin Members MATCH (u)-[:MemberOf]->(g:Group {name:'DOMAIN ADMINS@ADFOREST.LOCAL'}) RETURN u,g List all DA members
DCSync Rights Check MATCH p=(n)-[:DCSync]->(d:Domain) RETURN p Find DCSync privileges
Kerberoastable Accounts MATCH (u:User {hasspn:true}) RETURN u Find SPN accounts
Shortest Path to DA PATHFINDING: Any → Domain Admins Attack path visualization
Note
These queries are saved in BloodHound CE for reuse across future assessments and demonstrate proficiency in Cypher query language.

Challenges & Resolutions

ChallengeRoot CauseResolution
Splunk errorCode=5 for SysmonSplunk service lacked permission to read Sysmon event logChanged Splunk service to run as LocalSystem via sc.exe config
Sysmon Add-on not loadingTriple-nested folder structure after extractionUsed robocopy to copy correct inner folder to Splunk apps directory
Docker Desktop on Windows ServerDocker Desktop requires Windows 10/11 desktop OSInstalled WSL2 + Ubuntu + Docker Engine as alternative
BloodHound CLI 404 errorv8.7.0 does not include Linux CLI binaryUsed docker-compose method (official recommended approach)
Schema update access deniedSchema Admin group membership requires new login sessionRestarted Windows Server to refresh Kerberos token
PingCastle score increased after fixesSecAdmin left in Schema Admins after LAPS updateRemoved SecAdmin from Schema Admins — best practice
Splunk Smart Mode hiding resultsStats queries show in Statistics tab, not Events tabClicked Statistics tab to view results
SharpHound blocked by DefenderWindows Defender flags SharpHound as security toolTemporarily disabled real-time monitoring during download

Planned Enhancements

9.1 TopTon Security Gateway (In Progress)

A TopTon mini PC (Intel N150, 33 GB DDR5) is being configured as an inline security gateway:

InterfaceRole
ETH0WAN — Incoming internet cable
ETH1LAN — WiFi router (home network)
ETH2Homelab — Windows Server 2025
ETH3Management / spare

Software stack:

9.2 Additional Planned Items

Skills Demonstrated

Skill AreaTools / Technologies
Active Directory AdministrationWindows Server 2025, PowerShell, ADUC
Security AssessmentPingCastle, BloodHound CE, SharpHound
SIEM AdministrationSplunk Enterprise, SPL queries, Dashboards
Endpoint DetectionSysmon, Splunk Add-on for Sysmon
Identity ManagementLAPS, GPO, Privileged Account Management
ContainerisationDocker Engine, WSL2, docker-compose
Linux AdministrationUbuntu, Rocky Linux, bash
Network SecuritySuricata, TAP monitoring
ScriptingPowerShell, Bash
DocumentationGitHub, Portfolio writing