Короткий ответ

Базовая проверка Windows Server (и типичной станции WS-042) — не pentest и не полный CIS. Это повторяемый срез: слушает ли RDP мир, жив ли SMBv1, кто в локальных админах и есть ли LAPS, включены ли firewall и Defender, насколько старый CU, открыт ли WinRM, есть ли аудит логонов. Результат — файлы в заявке, не «ну вроде нормально». Исправляйте по связанным статьям, не выключая защиту «чтобы быстрее снять отчёт».

Контур: домен contoso.example, DC DC01, пилот хост подставьте. Часть проверок с LTE (периметр), часть с hop в LAN.

Симптомы и как отличить

Это профилактика, не инцидент. Запускайте:

  • перед сдачей сервера в прод;
  • ежеквартально;
  • после «временных» дыр (проброс 3389, firewall off).
ЦельНе этот чеклист
Импорт Security Baselinehardening
Расследование взломаDFIR, не час среза
Только сеть без Windowsping/traceroute, другой раздел
Полный CIS 400 пунктовотдельный проект

Возможные причины

  1. Нет регламента.
  2. Проверяют только антивирус на ПК директора.
  3. Сканер с LAN не видит открытый 3389 на WAN.
  4. Разные админы, нет общего чеклиста.
  5. Боязнь команд — ниже копипаста безопасных read-only съёмок.

Диагностика

Создайте каталог:

$h = $env:COMPUTERNAME
$dir = "C:\Temp\risk-$h-$(Get-Date -Format 'yyyyMMdd')"
New-Item -ItemType Directory -Force -Path $dir | Out-Null

Дальше все Out-File в $dir. На DC часть команд с RSAT.

1. Идентичность и патчи

Get-ComputerInfo | Select-Object CsName, WindowsProductName, WindowsVersion, OsBuildNumber, OsUptime |
  Format-List | Out-File "$dir\os.txt"
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 20 |
  Format-Table -Auto | Out-File "$dir\hotfix.txt"

Сверьте SLA с критическими обновлениями.

2. Периметр RDP / WinRM / SMB (локально)

Get-NetTCPConnection -State Listen | Where-Object LocalPort -in 22,80,443,445,3389,5985,5986,636,389 |
  Select-Object LocalAddress, LocalPort | Sort-Object LocalPort |
  Format-Table | Out-File "$dir\listen.txt"
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' |
  Select-Object fDenyTSConnections | Out-File "$dir\rdp-flag.txt"

С LTE (не из офиса):

Test-NetConnection <WAN-IP> -Port 3389
Test-NetConnection <WAN-IP> -Port 5985
Test-NetConnection <WAN-IP> -Port 445

True на 3389/5985/445 с улицы — критично: RDP, WinRM. 445 с WAN — немедленно закрыть.

3. SMB диалект и v1

Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol, RequireSecuritySignature |
  Format-List | Out-File "$dir\smb.txt"
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol |
  Out-File "$dir\smb1-feature.txt"
Get-SmbSession | Select-Object ClientComputerName, Dialect, ClientUserName |
  Out-File "$dir\smb-sessions.txt"

См. SMBv1.

4. Локальные админы и LAPS

Get-LocalGroupMember Administrators | Out-File "$dir\local-admins.txt"
Get-LapsADPassword -Identity $h -ErrorAction SilentlyContinue |
  Select-Object ComputerName, PasswordUpdateTime, ExpirationTimestamp |
  Out-File "$dir\laps.txt"

Get-LapsADPassword — с машины, где есть права чтения, не обязательно с самого хоста. Пустой laps.txt при живом ПК — LAPS / защита локального админа.

5. Firewall и Defender

Get-NetFirewallProfile | Format-Table Name, Enabled | Out-File "$dir\fw.txt"
Get-MpComputerStatus | Select-Object AntivirusEnabled, RealTimeProtectionEnabled,
  AntivirusSignatureLastUpdated, AntivirusSignatureAge |
  Format-List | Out-File "$dir\mp.txt"

Off недопустимы как постоянное состояние: firewall, Defender, базы.

6. TLS на типичных портах (если есть IIS/LDAPS)

Get-TlsCipherSuite | Select-Object Name | Out-File "$dir\ciphers.txt"
Get-ChildItem 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols' -ErrorAction SilentlyContinue |
  Out-File "$dir\schannel-keys.txt"

Интерпретация: TLS, шифры.

7. Аудит и привилегии

auditpol /get /subcategory:"Logon","Security Group Management","Directory Service Changes" |
  Out-File "$dir\auditpol.txt"
Get-WinEvent -LogName 'Microsoft-Windows-PowerShell/Operational' -MaxEvents 1 -ErrorAction SilentlyContinue |
  Out-File "$dir\ps-log-alive.txt"
Get-ADGroupMember 'Domain Admins' -Recursive -ErrorAction SilentlyContinue |
  Out-File "$dir\da-members.txt"

На member-сервере AD-команды с RSAT/jump. См. логоны, группы, PS logging, DA daily.

8. BitLocker (ноутбуки/диски с секретами)

Get-BitLockerVolume -ErrorAction SilentlyContinue |
  Select-Object MountPoint, VolumeStatus, ProtectionStatus |
  Out-File "$dir\bitlocker.txt"

Включение, ключи.

Решение

Чеклист — не «лечение одной кнопкой». Приоритизация находок:

  1. Открытые 3389/445/5985 с WAN — закрыть в тот же день.
  2. Firewall/Defender off — включить с правилами, не оставить off.
  3. Общий локальный админ / нет LAPS.
  4. SMBv1 на DC/FS.
  5. CU старше SLA.
  6. Нет аудита логонов на DC.
  7. DA-учётки на рабочих станциях.
  8. Слабые TLS/cipher на интернет-сайтах.
  9. Admin shares с пользовательских ПК.
  10. Остальное — в бэклог hardening.

Каждый пункт ведёт в свою инструкцию этого раздела, не в «отключить защиту».

Как проверить, что проблема устранена

Повтор того же каталога команд через неделю после фиксов. Diff: WAN-порты False, SMB1 false, LAPS expiration заполнен, fw/mp True, hotfix дата в SLA. Функционально: пользователи входят, backup жив, RDP через VPN жив.

Храните отчёты не на самом проверяемом хосте единственной копией (скопируйте с jump).

Если не помогло

  • Нет RSAT: снимайте локальные пункты, AD — с DC01.
  • Server Core: те же cmdlet, без GUI.
  • Третий AV: Get-MpComputerStatus может не отражать защиту — смотрите консоль вендора плюс firewall.
  • Кластер: проверяйте оба узла и CSV отдельно.
  • Hyper-V: хост и гости — два среза.

Дальше полный hardening, не раздувайте этот час до CIS Level 2.

Профилактика

  • Квартальный запуск чеклиста по всем серверам (оркестратор/jump).
  • Алерт: 3389/WAN, firewall off, signature age, CU age.
  • Онбординг сервера: чеклист обязателен до DNS в прод.
  • Не считать зелёный ping заменой этого среза.

FAQ

Это заменяет pentest?

Нет. Это гигиена админа. Pentest ищете глубже (ADCS, делегирования). Без гигиены pentest найдёт 3389 и уйдёт.

Можно ли одним скриптом на весь домен?

Да, с учётки jump и журналом ошибок недоступных хостов. Не требуйте локального админа с каждой WS-042 под DA-учёткой daily.

Сколько времени

Один хост — 15–40 минут с LTE-проверкой. Парк — автоматизация тех же команд.

Нужен ли nmap?

Не обязательно. Test-NetConnection с улицы закрывает вопрос 3389. Внутренний скан портов — по политике, с окна.

Чеклист для DC vs member

На DC добавьте репликацию, LDAP listen только внутренние NIC, не SMBv1, аудит DS Changes. Не патчите единственный DC в том же «часе», что съёмка, без плана.

Куда класть отчёты

Шара с ACL админов, не Teams-чат с паролями LAPS. В laps.txt этого чеклиста не должно быть plaintext пароля (Get-LapsADPassword без -AsPlainText).