a
This commit is contained in:
@@ -0,0 +1,569 @@
|
||||
$RootPath = Split-Path $MyInvocation.MyCommand.Path -Parent
|
||||
$RootPath = Split-Path $RootPath -Parent
|
||||
. "$RootPath\Helpers\AuditGroupFunctions.ps1"
|
||||
[AuditTest] @{
|
||||
Id = "SBD-101"
|
||||
Task = "Ensure the system is booting in 'UEFI' mode."
|
||||
Test = {
|
||||
if (isWindows8OrNewer) {
|
||||
$status = switch ($env:firmware_type) {
|
||||
"UEFI" {
|
||||
@{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
"Legacy" {
|
||||
@{
|
||||
Message = "System is booting using 'Legacy' mode."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
Default {
|
||||
@{
|
||||
Message = "Unknown boot mode"
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
return $status
|
||||
}
|
||||
else {
|
||||
if ((bcdedit | findstr -i path | findstr -i winload.efi).Count -ge 1) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
elseif (((bcdedit | findstr -i path | findstr -i winload.exe).Count -ge 1)) {
|
||||
return @{
|
||||
Message = "System is booting using 'Legacy' mode."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
Message = "Unknown boot mode"
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-102"
|
||||
Task = "Virtualization Based Security: Ensure the system is using SecureBoot."
|
||||
Test = {
|
||||
if (isWindows8OrNewer) {
|
||||
try {
|
||||
$status = switch ($env:firmware_type) {
|
||||
"UEFI" {
|
||||
$obj = Confirm-SecureBootUEFI
|
||||
}
|
||||
"Legacy" {
|
||||
return @{
|
||||
Message = "System is booting using 'Legacy' mode. SecureBoot not supported."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
Default {
|
||||
return @{
|
||||
Message = "Unknown boot mode"
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch [UnauthorizedAccessException] {
|
||||
return @{
|
||||
Message = "Permission Denied"
|
||||
Status = "Error"
|
||||
}
|
||||
}
|
||||
$status = switch ($obj) {
|
||||
$true {
|
||||
@{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
$false {
|
||||
@{
|
||||
Message = "SecureBoot is supported but disabled."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
Default {
|
||||
@{
|
||||
Message = "SecureBoot is not supported or system is in non-UEFI mode."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
return $status
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
Message = "System does not support this feature (Windows 8 or newer required)."
|
||||
Status = "None"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-103"
|
||||
Task = "Ensure the TPM Chip is 'present'."
|
||||
Test = {
|
||||
$hasTpm = hasTPM
|
||||
if (($null -eq $hasTpm) -or ($false -eq $hasTpm)) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if (isWindows8OrNewer) {
|
||||
$obj = (Get-Tpm).TpmPresent
|
||||
if ($obj -isnot [Boolean]) {
|
||||
return @{
|
||||
Message = "Cannot get 'present' status of TPM."
|
||||
Status = "Error"
|
||||
}
|
||||
}
|
||||
$status = switch ($obj) {
|
||||
$true {
|
||||
@{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
$false {
|
||||
@{
|
||||
Message = "The TPM Chip is not 'present'."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
return $status
|
||||
}
|
||||
else {
|
||||
# Get any property to see if a TPM is present
|
||||
if (win7NoTPMChipDetected) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
} else {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-104"
|
||||
Task = "Ensure the TPM Chip is 'ready'."
|
||||
Test = {
|
||||
$hasTpm = hasTPM
|
||||
if (($null -eq $hasTpm) -or ($false -eq $hasTpm)) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if (isWindows8OrNewer) {
|
||||
$obj = (Get-Tpm).TpmReady
|
||||
if ($obj -isnot [Boolean]) {
|
||||
return @{
|
||||
Message = "Cannot get 'ready' status of TPM."
|
||||
Status = "Error"
|
||||
}
|
||||
}
|
||||
$status = switch ($obj) {
|
||||
$true {
|
||||
@{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
$false {
|
||||
@{
|
||||
Message = "The TPM Chip is not 'ready'."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
return $status
|
||||
}
|
||||
else {
|
||||
if (win7NoTPMChipDetected) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
} else {
|
||||
return @{
|
||||
Message = "System does not expose a 'ready' status"
|
||||
Status = "None"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-105"
|
||||
Task = "Ensure the TPM Chip is 'enabled'."
|
||||
Test = {
|
||||
$hasTpm = hasTPM
|
||||
if (($null -eq $hasTpm) -or ($false -eq $hasTpm)) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if (isWindows8OrNewer) {
|
||||
|
||||
$state = Get-WmiObject -class Win32_Tpm -namespace root\CIMV2\Security\MicrosoftTpm
|
||||
if ($state.IsEnabled_InitialValue -eq $true) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
return @{
|
||||
Message = "The TPM Chip is not 'enabled'."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (win7NoTPMChipDetected) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if (Get-CimInstance -ClassName Win32_Tpm -Namespace root\cimv2\security\microsofttpm | Select-Object -ExpandProperty IsEnabled_InitialValue) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
Message = "The TPM Chip is not 'enabled'."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-106"
|
||||
Task = "Ensure the TPM Chip is 'activated'."
|
||||
Test = {
|
||||
$hasTpm = hasTPM
|
||||
if (($null -eq $hasTpm) -or ($false -eq $hasTpm)) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if (isWindows8OrNewer) {
|
||||
$state = Get-WmiObject -class Win32_Tpm -namespace root\CIMV2\Security\MicrosoftTpm
|
||||
if ($state.IsActivated_InitialValue -eq $true) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
return @{
|
||||
Message = "The TPM Chip is not 'enabled'."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (win7NoTPMChipDetected) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if (Get-CimInstance -ClassName Win32_Tpm -Namespace root\cimv2\security\microsofttpm | Select-Object -ExpandProperty IsActivated_InitialValue) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
Message = "The TPM Chip is not 'activated'."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-107"
|
||||
Task = "Ensure the TPM Chip is 'owned'."
|
||||
Test = {
|
||||
$hasTpm = hasTPM
|
||||
if (($null -eq $hasTpm) -or ($false -eq $hasTpm)) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if (isWindows8OrNewer) {
|
||||
$state = Get-WmiObject -class Win32_Tpm -namespace root\CIMV2\Security\MicrosoftTpm
|
||||
if ($state.IsOwned_InitialValue -eq $true) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
return @{
|
||||
Message = "The TPM Chip is not 'enabled'."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (win7NoTPMChipDetected) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if (Get-CimInstance -ClassName Win32_Tpm -Namespace root\cimv2\security\microsofttpm | Select-Object -ExpandProperty IsOwned_InitialValue) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
Message = "The TPM Chip is not 'owned'."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-108"
|
||||
Task = "Ensure the TPM Chip is implementing specification version 2.0 or higher."
|
||||
Test = {
|
||||
$hasTpm = hasTPM
|
||||
if (($null -eq $hasTpm) -or ($false -eq $hasTpm)) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
# get array of implemented spec versions
|
||||
$obj = (Get-CimInstance -Class Win32_Tpm -Namespace root\CIMV2\Security\MicrosoftTpm -ErrorAction SilentlyContinue | Select-Object -ExpandProperty SpecVersion)
|
||||
if ($obj -eq $null) {
|
||||
return @{
|
||||
Message = "No TPM Chip detected."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
# get main spec version (first element)
|
||||
$obj = $obj.split(', ')[0]
|
||||
|
||||
if ($obj -ge 2.0) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
elseif ($obj -gt 0) {
|
||||
return @{
|
||||
Message = "Specification version lower than 2.0 found."
|
||||
Status = "Warning"
|
||||
}
|
||||
} else {
|
||||
return @{
|
||||
Message = "No implemented specification version found."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-109"
|
||||
Task = "Virtualization Based Security: Ensure Virtualization Based Security is enabled and running."
|
||||
Test = {
|
||||
$isWindows10OrNewer = isWindows10OrNewer
|
||||
if($isWindows10OrNewer -eq $false){
|
||||
return @{
|
||||
Message = "System does not support this feature (Windows 10 or newer required)."
|
||||
Status = "None"
|
||||
}
|
||||
}
|
||||
$obj = (Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).VirtualizationBasedSecurityStatus
|
||||
$status = switch ($obj) {
|
||||
{$PSItem -eq 2} {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
{$PSItem -eq 1} {
|
||||
return @{
|
||||
Message = "VBS is activated but not running."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
{$PSItem -eq 0} {
|
||||
return @{
|
||||
Message = "VBS is not activated."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
default {
|
||||
return @{
|
||||
Message = "Cannot get the VBS status."
|
||||
Status = "Error"
|
||||
}
|
||||
}
|
||||
}
|
||||
return $status
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-110"
|
||||
Task = "Virtualization Based Security: Ensure Hypervisor-protected Code Integrity (HVCI) is running."
|
||||
Test = {
|
||||
$isWindows10OrNewer = isWindows10OrNewer
|
||||
if($isWindows10OrNewer -eq $false){
|
||||
return @{
|
||||
Message = "System does not support this feature (Windows 10 or newer required)."
|
||||
Status = "None"
|
||||
}
|
||||
}
|
||||
if ((Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning -contains 2) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
Message = "HVCI is not running."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-111"
|
||||
Task = "Virtualization Based Security: Ensure Credential Guard is running."
|
||||
Test = {
|
||||
$value = isWindows10OrNewer
|
||||
if($value -eq $false){
|
||||
return @{
|
||||
Message = "System does not support this feature (Windows 10 or newer required)."
|
||||
Status = "None"
|
||||
}
|
||||
}
|
||||
$systemSKU = (Get-CimInstance Win32_OperatingSystem).Caption
|
||||
$supportedSKUs = @("Windows Enterprise", "Windows Education", "Windows Server")
|
||||
|
||||
$system = $systemSKU -replace "\d\s*", ""
|
||||
$system = $system -replace "Microsoft ", ""
|
||||
if($supportedSKUs.Contains($system)){
|
||||
if ((Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning -contains 1) {
|
||||
return @{
|
||||
Message = "Compliant"
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
Message = "Credential Guard is not running."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
if ((Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesConfigured -contains 1) {
|
||||
return @{
|
||||
Message = "Credential Guard is configured but not running, due to incompatibility with $($systemSKU) <br/>See Microsoft documentation for further information: <a href='https://learn.microsoft.com/en-us/windows/security/identity-protection/credential-guard/#windows-edition-and-licensing-requirements'>Here</a>"
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
else {
|
||||
return @{
|
||||
Message = "Credential Guard is not configured."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
[AuditTest] @{
|
||||
Id = "SBD-112"
|
||||
Task = "Virtualization Based Security: Ensure Security Services are running."
|
||||
Test = {
|
||||
$value = isWindows10OrNewer
|
||||
if($value -eq $false){
|
||||
return @{
|
||||
Message = "System does not support this feature (Windows 10 or newer required)."
|
||||
Status = "None"
|
||||
}
|
||||
}
|
||||
$serviceRunningIDs = (Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning
|
||||
if ($serviceRunningIDs -contains 0) {
|
||||
return @{
|
||||
Message = "No Device Guard security services are running."
|
||||
Status = "False"
|
||||
}
|
||||
}
|
||||
if ($serviceRunningIDs -contains 1) {
|
||||
$message += "Credential Guard"
|
||||
}
|
||||
if ($serviceRunningIDs -contains 2) {
|
||||
if (![string]::IsNullOrEmpty($message)) {
|
||||
$message += ", "
|
||||
}
|
||||
$message += "Memory Integrity (HVCI)"
|
||||
}
|
||||
if ($serviceRunningIDs -contains 3) {
|
||||
if (![string]::IsNullOrEmpty($message)) {
|
||||
$message += ", "
|
||||
}
|
||||
$message += "System Guard Secure Launch"
|
||||
}
|
||||
if ($serviceRunningIDs -contains 4) {
|
||||
if (![string]::IsNullOrEmpty($message)) {
|
||||
$message += ", "
|
||||
}
|
||||
$message += "SMM Firmware Measurement"
|
||||
}
|
||||
if ($serviceRunningIDs -contains 5) {
|
||||
if (![string]::IsNullOrEmpty($message)) {
|
||||
$message += ", "
|
||||
}
|
||||
$message += "Kernel-mode Hardware-enforced Stack Protection"
|
||||
}
|
||||
if ($serviceRunningIDs -contains 6) {
|
||||
if (![string]::IsNullOrEmpty($message)) {
|
||||
$message += ", "
|
||||
}
|
||||
$message += "Kernel-mode Hardware-enforced Stack Protection is configured in Audit mode"
|
||||
}
|
||||
if ($serviceRunningIDs -contains 7) {
|
||||
if (![string]::IsNullOrEmpty($message)) {
|
||||
$message += ", "
|
||||
}
|
||||
$message += "Hypervisor-Enforced Paging Translation"
|
||||
}
|
||||
return @{
|
||||
Message = "$message are running on Device Guard as services."
|
||||
Status = "True"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user