Делаем Windows Server безопаснее

В этой статье автор хотел бы дать пару хороших советов по администрированию серверов на Windows, которые по какой-то причине не нашел в интернете.

Следуя этим принципам вы сильно обезопасите свои серверы под управлением Windows как в локальных средах, так и в публичных.

26163d36d9ef7d329df74014752b5641.png


1. Правильно вводим компьютер в AD


Не используйте пользователей с административными привилегиями для ввода компьютеров в Active Directory. Никто не гарантирует того, что на компьютере сотрудника уже не появился Keylogger. Имея же отдельную учетную запись. Злоумышленник похитивший учетные данные сможет только добавить в AD еще компьютеров.

1.1. Создаем нового пользователя


Для этого нужно перейти в ADUC (Active directory users and Computers). Нажать на пустое место в папке Users and Computers и создать пользователя. Для простоты назовем его JoinAdmin.

1.2. Делегируем полномочия


После того, как пользователь был создан, ему нужно назначить полномочия. Для этого нужно нажать ПКМ по папке «Users» и выбрать «Delegate Control». Жмём «Далее» и выбираем нашего админа.

d9c3772fb5c4f5372b40c4cac60ea636.png


Мы хотим чтобы пользователь выполнять только одну функцию, поэтому выбираем второй вариант.

d22f427138ad40f4dfbb5673636258bd.png


Далее выбираем «Computer objects» и все его подпункты.

e9b8a65770e1f4d589c214ac56962f28.png


cc9b8829c044c18bdd54778c0a9d7e88.png


Используйте этого юзера и не беспокойтесь о том, что кто-то мог украсть пароль от администратора.

2. Controlled folder access


В Windows Server 2019 появилась очень недооцененная возможность — controlled folder access. Она запрещает доступ к записи программам, которых нет в белом списке на выбранных папках или разделах. 

Её включение поможет защитить данные от вирусов-шифровальщиков даже если ваш сервер был заражен. Однако это не обезопасит ваши данные от похищения, их можно будет прочитать.

Включить функцию можно в центре безопасности Windows или через Powershell:

Set-MpPreference -EnableNetworkProtection Enabled


Добавляем разрешенные программы:

Разрешенные программы можно добавить через центр безопасности Windows, а через Powershell нужно вводить полный путь до исполняемых файлов через запятую.

Set-MpPreference -ControlledFolderAccessAllowedApplications "C:\Folder\File.exe"

Добавлять новые файлы в тот же самый список будет легче с помощью скрипта.

$ApplicationToAdd = "C:\Fodler\file.exe"
 
$ExistingApplicationList = (Get-MpPreference).ControlledFolderAccessAllowedApplications
 
$FullList = $ApplicationToAdd + $ExistingApplicationList 
 
Set-MpPreference -ControlledFolderAccessAllowedApplications $FullList


Добавляем защищенные папки:

Папки добавляются ровно так же, как и программы. К примеру этой командой мы добавляем диск C: целиком:

Set-MpPreference -ControlledFolderAccessProtectedFolders "C:\"


3. SYSWOW64 и SMB


Все 32 битные программы работают на 64 битных через слой совместимости — SYSWOW64. Отключение этого компонента делает несовместимым все 32 битное ПО, в том числе и вирусы.

Сами по себе 32 битные приложения более уязвимые, 64-битные программы не поддаются атаке на переполнение буфера и через них гораздо труднее исполнить код который этими программами не предусмотрен. Если на сервере работают только встроенные компоненты или только 64 битные программы, обязательно удалите этот компонент.

А помните Wannacry, который гулял через SMB1? SMB первой версии до сих пор является стандартным компонентом Windows Server и установлен по умолчанию в каждой редакции. Обязательно удалите этот компонент, если он все еще установлен на вашем сервере.

Эта команда удалить и SMB1 и SYSWOW64:

Remove-WindowsFeature WoW64-Support, FS-SMB1


4. Отключите ping


По умолчанию компьютер под управлением Windows отвечает на ICMP только в локальной сети. Отключение ICMP немного повышает безопасность вашего сервера. От части, это обусловлено тем, что на форумах кулхацкеров и других script kiddie существуют руководства, как нужно искать цели, которые можно брутфорсить.

Для того, чтобы показать что вы выиграете, если отключите ICMP, было создано два сервера. На обоих из них был открыт RDP, однако один из серверов не отвечал на ICMP.

ICMP отключен:

e0c09e5082ec31022a5caff3ebd75b2f.png


ICMP включен:

5283e54c77a2e68b3dbb29ead1764a68.png


Как можно видеть из скриншота, это остановило не всех, но многих. Собрать данные о том, насколько сильно хотят взломать вас, можно этим скриптом:
 

function Get-Bruteforce {
 
    $Last = 4
    $Attempts = 10
 
    #Getting date -one hour (default)
    $DateTime = [DateTime]::Now.AddHours(-$Last)
 
    $BruteEvents = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $DateTime -ErrorAction SilentlyContinue | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[-2]} }
    $TopPunks = $BruteEvents | Group-Object -property IpAddress | Sort-Object Count
 
    #Get bruteforsers that tried to login greated or equal than 4 times (default)
    $GetPunks = $TopPunks | where {$_.Count -ge $attempts} | Select -property Name
 
    Write-host Unique attackers IP: $GetPunks.Length -ForegroundColor Green
    Write-Host Total bruteforce attempts: $BruteEvents.Length -ForegroundColor Green
 
    #Output-punks
    foreach ($i in $TopPunks | where {$_.Count -ge $attempts}) {
 
    $PunkRdns = (Resolve-DnsName $i.Name -ErrorVariable ProcessError -ErrorAction SilentlyContinue).NameHost 
 
    if ($ShowRDNS) {
        if ($PunkRdns) {
            Write-Host "attempts": $i.count IP: $PunkRdns
        }
        else {
            Write-Host "attempts": $i.count IP: $i.name
        }
    }
    else {
 
        Write-Host "attempts": $i.count IP: $i.name
 
    }
 
    }
   
}
Get-Bruteforce


Вы все еще сможете мониторить ваш сервер, к примеру, проверяя доступность определенного порта:

Test-NetConnection 192.168.0.1 -Port 3389


5. Не все имена одинаково хороши


Используя еще один скрипт, вытащим наиболее популярные имена пользователей, которые подвергались атаке. 

Если вы устанавливаете службы удаленных рабочих столов, настоятельно рекомендуем вам избегать этих имен. В сочетании со слабым паролем, можно гарантировать быстрый взлом учетной записи.

Для вашего удобства, список «плохих» имен был переписан в таблицу:


Получить такой же список на вашем сервере можно этим скриптом:

function Get-Badname {
 
    $Last = 24
    $Attempts = 40
 
   
    $DateTime = [DateTime]::Now.AddHours(-$Last)
 
    $BruteEvents = Get-EventLog -LogName 'Security' -InstanceId 4625 -After $DateTime -ErrorAction SilentlyContinue | Select-Object @{n='IpAddress';e={$_.ReplacementStrings[5]} }
    $TopPunks = $BruteEvents | Group-Object -property IpAddress | Sort-Object Count
 
   
    $GetPunks = $TopPunks | where {$_.Count -ge $attempts} | Select -property Name
 
    Write-host Unique attackers IP: $GetPunks.Length -ForegroundColor Green
    Write-Host Total bruteforce attempts: $BruteEvents.Length -ForegroundColor Green
 
    #Output
    foreach ($i in $TopPunks | where {$_.Count -ge $attempts}) {
 
        Write-Host "Attempts": $i.count Username: $i.name
 
    }
   
}
Get-Badname


6. Очевидные вещи


Ну, а закончим мы статью очевидными вещами:

  1. Создайте шлюз — Для управления большой инфраструктурой лучше всего обезопасить себя имея единую точку входа. Подробне.
  2. Устанавливайте обновления. В особенности, на боевые сервера.
  3. Отключите службы, которыми вы не пользуетесь — это лишняя площадь для атаки.
  4. Используйте Server Core, он имеет наименьшую площадь атаки и наименьшее количество перезагрузок при установке обновлений
  5. Сервер удаленных рабочих столов на несколько пользователей — плохая идея. Придерживайтесь принципа один человек или служба — один сервер.
  6. Делайте резервные копии и обязательно тестируйте их. Бэкап который не был протестирован не является бэкапом.


Надеемся, первые пять пунктов были для вас полезны и интересны.

wwd4ro5_5a28hvdxyazf3enjxou.png

© Habrahabr.ru