Saturday, November 25, 2006

Выпуск N2. Немного о безопасности в Windows или как из удобной вещи сделать надёжную.

Ну чтож, если вам понравилось, можно и продолжить. Надеюсь ваши машины полностью пропатчины и очищены от всего лишнего, а Вы готовы к получению новой порции информации.

О чем пойдёт речь в этот раз:

  1. Что такое правильный пароль - устанавливаем Account Policies
  2. Какие программы следует спрятать подальше - список утилит которые должен запускать только администратор.
  3. Повышаем надёжность TCP/IP

Что такое правильный пароль?

Я думаю с правильного подхода к работе с паролями начинается безопасность (к сожалению часто она заканчивается там же ещё не успев начаться). Итак начнём с прописных истин. Чего не стоит делать никогда - не используйте в качестве пароля имя того-же экаунта в прямой или перевёрнутой последовательности, своё (равно как и близких родственников) имя, фамилию или дату рождения - эти сведения слишком легко получить из других источников (например прочитать на двери вашего кабинета), не используйте простые слова или названия - взлом по словарю займе считанные минуты. Что же тогда - наилучший пароль состоит из смеси цифр, символов, малых и больших букв, причём первые три группы должны быть обязательно представлены в пароле. Почему? В Windows до сих пор существует метод криптования паролей называемый LM, но просто необходим если в вашей сети ещё остались машины с Windows 95 или 98, а так же UNIX с Samba ранних версий (кстати, если у вас динозавры уже вымерли, позже мы рассмотрим как запретить этот беспридел). Чем же так плох LM, дело в том что максимальная длинна пароля в нем 14 алфавитно-цифровых символов которые он переводит в нижний регистр перед криптованием (т.е. те самые три первых группы описанные ранее). После этого криптует пароль разделив по 7 символов, если длинна пароля 7 или менее знаков - хеш удваивается. Что в результате - простейший случай это симметричный хеш - заранее знаем что длинна пароля не более 7 символов, перебирать только алфавитно-цифровые нижнего регистра. Просто бальзам на сердце Bruteforce-ра. Теперь маленькая загадка - какой пароль лучше 8 или 10 символов. Казалось бы ответ очевиден - чем длиннее тем лучше ;) но не в этот раз. Что сделает умный хакер увидев несимметричный хеш, конечно начнёт взлом со второй половины, в надежде (обычно вполне оправданной), что до 14-и знаков дело не дошло, а значит и взлом будет легче. ОК, если пароль состоял из 8 символов, через секунду в руках взломщика будет последний. Что с ним делать? Ничего :_( Но совсем другое дело если у тебя три последних буквы, тут уж вполне можно прикинуть, а что же там было в начале: фамилия, дата рождения, номер телефона?

Подводим итог сказанному выше - хороший пароль имеет длину 8, а лучше 14 знаков, не может быть найден в словаре и состоит цифр, знаков и букв верхнего и нижнего регистра. Идиллическая картина, но как же этого добиться. Существуют организации, которые генерируют надёжные пароли специальными программами и заставляют своих пользователей ими пользоваться, запретив опцию замены пароля. Скажу прямо - это просто отвратительно, мало того людей лишают свободы выбора и заставляют набирать абсолютно не читабельные ругательства. С точки зрения security есть как минимум две большие проблемы: первая - сгенерированный пароль должен быть как-то доставлен пользователю, и тут уж громадное поле для краж и копирования; вторая - такой пароль невозможно запомнить если ты не Джеймс Бонд или хотя бы Кевин Митник, а посему, он будет записан и скорее всего просто приклеен к монитору или, в лучшем случае уложен в ящик стола. На мой взгляд, единственный способ, это научить своих пользователей применять алгоритм при заведении пароля. Например - к первым буквам имён детей выстроив их по возрасту прибавьте год вашего рождения в обратном порядке разделив их решётками плюс первые три цифры нажимая и отпуская клавишу Shift. Предложите несколько подобных алгоритмов чтобы работнику было легче придумать свой или хотя бы скомбинировать ваши.

Ну чтож, ц пряником разобрались, перейдём ко кнуту. Как не позволить создание слабых паролей. Для этого в Local Security Policy существует раздел - Account Policies. Рассмотрим его подробно

Для этого открываем папку Administrative Tools в Control Panel и запускаем Local Security Policy. На данном этапе нас интересует раздел Account Policies в нем есть две ветви: Password Policy и Account Lockout Policy.

Первая определяет правила работы с паролями, ей и займёмся.

Enforce password history - определяет сколько старых паролей будет помнить Windows. Нужен что бы при запросе на изменение пароля пользователь не мог установить свой старый (или один из старых) паролей. По умолчанию 0 т.е. при запросе на обновление можете поставить свой старый, уже всем известный пароль ;) Думаю 10 норма.

Maximum password age - как ясно из названия максимальное время которое можно иметь один пароль. 60-90 дней вполне приемлемо.

Minimum password age - минимальное время жизни пароля. Поясную зачем это нужно, если установить его в ноль (так оно стоит по умолчанию) то умный пользователь легко обойдёт ограничение "Enforce password history" просто перебрав нужное количество временных паролей. Установим 1 день, и юсер не станет этого делать.

Minimum password length - минимальная длинна пароля. Это мы уже обсудили. Я ставлю 14 знаков, хотя часто слышу нелестные слова от тех кто это набирает.

Password must meet complexity requirement - это (от Microsoft) означает: как минимум 3 из 4 описанных выше групп символов должны быть представлены в пароле, плюс , более трех символов подряд в имени и пароле совпадать не могут. По умолчнию отключено, по уму включить.

Store password using reversible encryption for all user in the domain - хранить пароли криптованые так что можно восстановить исходный текст. Практически тоже самое что хранить их открытым текстом. Почти никогда не нужен и выключен по умолчанию.

Второй раздел - Account Lockout Policy

  • Account lockout threshold - Количество неудачных попыток ввести пароль, после которого учётная запись будет заблокирована. На мой взгляд 3-5.
  • Account lockout duration - Время которое запись будет оставаться открученной. Эта настройка позволит владельцу все же войти в систему после разблокировки. Две особенности: первая - если параметр установлен в 0, пароль не будет разблокирован без участия администратора; вторая - локальный администратор не может быть блокирован от локального (с системной консоли) входа. Рекомендую для критичных систем 5 мин. для простых 15 мин.
  • Reset account lockout counter after - Время которое должно пройти с последней попытки для сброса счётчика "Account lockout threshold" в ноль. По понятным причинам должно быть меньше или равно "Account lockout duration"

Вот пожалуй и все что касается Account Policies. Теперь несколько слов о других параметрах связанных с паролями и авторизацией. Раздел политики Security Options. Начнём с

  • Prompt user to change password before expiration - этот параметр описывает за сколько дней до истечения срока действия пароля будет выдано сообщение о необходимости замены. (В реестр он представлен как HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\PasswordExpiryWarning. Обычно 15 дней.
  • Number of previous logons to cache - Этот параметр позволяет машине члену домена кэшировать пароли локально. Желательно устанавливать значение в 0, но если машина член домена, вы не сможете зайти на неё при отсутствии доступа к контроллеру домена. При необходимости такого подключения установите в 1.
  • Recovery Console: Allow automatic administrative logon - Если параметр разрешён, при вход в Recovery Console, не будет запрашиваться пароль администратора.
  • LAN Manager Authentication Level - как уже говорилось LM наиболее слабый метод криптования пароля применяемый в Windows. Установите этот параметр в "Send NTLMv2 responses only\refuse LM & NTLM" и ваш сервер перестанет разрешать удалённые подключения с низким уровнем криптования пароля. (Значение в реестре - HKLM\System\CurrentControlSet\Control\Lsa\LMCompatibilityLevel максимальный уровень 5, минимальный "Send LM & NTLM responses" = 0)
  • Send unencrypted password to connect to third-party SMB servers - если этот параметр разрешён, Windows будет по запросу пересылать в сети пароль открытым текстом. Применяется для связи с программами не поддерживающими методы криптования принятые в Microsoft. Параметр должен быть отключён. (HKLM\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnablePlainTextPassword = 0)
  • Do not display last user name in logon screen - Запрещает показ имени последнего пользователя вошедшего на машину. Таким образом атакующий должен подобрать не только пароль но и имя.
  • Rename administrator account - поскольку запись Administrator является стандартною, она может использоваться ка цель взлома. Параметр позволяет использовать другое имя как обычного администратора. Желательно создать ложную учётную запись Administrator, которая будет заранее блокирована, иметь сложный случайный пароль, обнулённые часы работы и просроченную дату устаревания. Ложный администратор не должен иметь ни каких прав на машине и используется как ловушка в IDS (Intrusion Detection Systems). Попытка зарегистрироваться под этим именем вызовет тревогу. Следует знать что SID у нового администратора останется прежним (предустановленным) и новое имя может быть узнано с помощью программ типа sid2user.
  • Rename guest account - переименовывает Guest запись соответственно.

Нужно отметить что в версиях Windows выше чем Win2K (WinXP, Win2K3, в Vista наверное тоже, но я ещё не проверял) добавлены дополнительные параметры:

  • Network security: Do not store LAN Manager hash value on next password change - запрещает сохранять новый пароль (после изменения) в LM формате. Поскольку алгоритмы шифрования пароля однонаправленные - т,е, пароль не может быть восстановлен из хеша (только подобран перебором) Windows вынужден хранить все форматы паролей: LM, NTLM и NTLMv2. Включите эту опцию, если ваша система не использует старые протоколы.
  • Accounts: Limit local account use of blank passwords to console logon only - не позволяет подключение с пустым паролем, кроме как через физическую консоль. Пользователи с пустым паролем не смогут подключится к серверу через сеть. ( HKLM\System\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse = 1)
  • Interactive logon: Allow Automatic Administrator Logon - Позволяет администратору автоматически подключится к серверу если вам нужен безпарольный вход в систему (например для авто инстоляции с перезагрузкой). К сожалению, вы вынужденны сохранить пароль в реестре открытым текстом. Структура

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
DefaultUserName="имя_пользователя"
DefaultPassword="пароль"
AutoAdminLogon="1" (если вход требуется члену группы Administrators)
ForceAutoLogon ="1" (если перед входом высвечивается предупреждение)

Я настоятельно рекомендую создавать временного пользователя для подобных целей, и разрушать учётную запись скриптом сразу после входа.

  • Accounts: Administrator account status - запрещение этого параметра приводит к блокировке записи администратора, например если желателен доступ только администратору домена. Реактивировать запись может член администраторской группы или через Safe Mode где этот пользователь никогда не блокируется.
  • Accounts: Guest account status - активация позволит пользователям без пароля подключатся к серверу как Guest.

Ещё два поля, связанные со входов в систему, они позволяют предупредить пользователя о правилах работы и законности подключения на данном сервере:

  • Interactive logon: Message title for users attempting to log on - заголовок сообщения - будет высвечен на рамке окна. (HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeCaption)
  • Interactive logon: Message text for users attempting to log on - текст сообщения (HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeText)
  • Interactive logon: Require Domain Controller authentication to unlock workstation - если активна, авторизация не может быть поризведена из кеша (вспомните о Number of previous logons to cache). Если опция выключена - для проверки пароля используется кеш, а подключение к домену происхоДит асинхронно.
  • Network access: Do not allow anonymous enumeration of SAM accounts - не позволяет не авторизованному пользователю получить список учётных записей (имеет некоторые побочные эффекты при работе в домене)
  • (HKLM\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM = 1)
  • Network access: Do not allow anonymous enumeration of SAM accounts and shares - как и приведущий он ограничивает доступ так же к списку розданных ресурсов. (HKLM\System\CurrentControlSet\Control\Lsa\RestrictAnonymous = 1)
  • Network access: Let Everyone permissions apply to anonymous users - позволяет не авторизованному пользователю получить некоторые дополнительные возможности, например список пользователей и доступных ресурсов в домене - сведения которые могут быть применены в социальной инженерии, например. (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA\EveryoneIncludesAnonymous = 0 )
  • Network access: Named Pipes that can be accessed anonymously - содержит список разрешённых коммуникационных сессий (именованных каналов) которыми пользуются аппликации для связи через сеть. Если анонимный доступ на машину запрещён, этот параметр может позволить стандартным аппликациям т.к. сервисы - Sever, Workstation, многие DCOM аппликации (о том все ли DCOM-ы нужны поговорим позже). (HKLM\System\CurrentControlSet\Services\LanManServer\Parameters\NullSessionPipes - формат Multi-String)
  • Network access: Restrict anonymous access to Named Pipes and Shares - запрещает анонимный доступ к "Named Pipes" и "Shares" даже если он был разрешён в "Network access: Named pipes that can be accessed anonymously" и "Network access: Shares that can be accessed anonymously"
  • Network access: Shares that can be accessed anonymously - содержит список сетевых ресурсов доступных анонимно. Очень опасный параметр, находящиеся в нем ресурсы будут доступны любому пользователю сети. Используйте его осторожно и только в случае необходимости. (HKLM\System\CurrentControlSet\Services\LanManServer\Parameters\NullSessionShares\NullSessionShares - формат Multi-String)
  • Network access: Sharing and security model for lkcal accounts - описывает как пользователь прошедший сетевую авторизацию будет обращаться к ресурсам сервера. Имеет два значения Classic - 0 позволяет установить разные уровни доступа для разных пользователей, Guest only - 1 рассматривает все пришедшие из сети будут рассматриваться как Guest. Этот параметр не действует на доменную авторизацию, а так же на интерактивные подключения через службы типа Telnet или Terminal Services. (HKLM\System\CurrentControlSet\Control\Lsa\ForceGuest = 0)

На этом мы закончим рассмотрение параметров политики безопасности связанных с авторизацией. Остальные параметры постараемся рассмотреть в следующих выпусках. Хочу только заметить, что ключи реестра приведённые в этом разделе могут быть использованы для немедленного изменения значения, или даже для временного локального обхода доменной политики. Однако для создания постоянной политики я рекомендую использовать стандартные редакторы локальной и групповой политики. А так же, как наилучший метод - создание файлов темплейтов политики которые позже могут быть загружены через GUI или secdit.exe. Превосходство этого метода заключается не только в том что повреждённая или изменённая политика может быть легко восстановлена в любой момент, но и в том что можно автоматически проверить расхождения между действующими значениями и темплетом.

В заключении этого раздела хотелось бы сказать несколько слов о других (не использующих обычный пароль) методах авторизации. Прежде всего обратим внимание на системы использующие так называемые Smart card и одноразовые пароли типа SecurID. Smart card - позволяют пользователю авторизацию с очень длинным паролем (2048 и более символов) без необходимости его ручного ввода. SecurID генерирует новый (обычно 6 - 8 значный) пароль примерно каждую минуту, что делает бессмысленным кражу пароля. Главной опасностью такого метода является кража карты или TokenSecurID (обычно в форме брелока). Для устранения этой опасности используется pin код (обычно 4-х значное число) который вводится в компьютер либо в сам Token. При трёх неудачных попытках микро-контроллер устройства полностью блокируется, что делает его абсолютно непригодным к использованию. Другой метод, приобретающий все большую популярность, это биометрия (biometric) - измерение уникальных биологических данных владельца. Наиболее популярны сегодня: отпечаток пальца (fingerprint), рисунок сетчатки глаза (retinal scanning), а так же измерение био-электрических показателей например ладони.

Какие программы следует спрятать подальше

Существует большое количество инструментов в Windows которые позволяют значительно облегчить жизнь системному администратору. С их помощью можно настроить и контролировать систему, написать автоматические скрипты на все случаи жизни или получить удалённый доступ к необходимым ресурсам. К сожалению, эти же инструменты могут стать источником немалой головной боли. Чего стоит одна tftp.exe - излюбленное средство вирусов для закачивания на ваш компьютер основной исполняемой части, всевозможных "Back doors" или даже "Root kits". И так, вот список программ которые, на мой взгляд, должны быть надёжно изолированны от всех пользователей (да и самой системы) кроме администратора:

  • arp.exe
  • at.exe
  • atsvc.exe
  • attrib.exe
  • cacls.exe
  • cmd.exe
  • command.com
  • cscript.exe
  • dcomcnfg.exe
  • diskcomp.com
  • diskcopy.com
  • debug.exe
  • format.com
  • gpresult.exe
  • edit.com
  • edlin.exe
  • finger.exe
  • ftp.exe
  • ipconfig.exe
  • iexpress.exe
  • irftp.exe
  • ipsecmon.exe
  • label.exe
  • nbtstat.exe
  • net.exe
  • net1.exe
  • netsh.exe
  • netstat.exe
  • nslookup.exe
  • ntbackup.exe
  • ping.exe
  • poledit.exe
  • qbasic.exe
  • rcp.exe
  • rdisk.exe
  • regedit.exe
  • regedt32.exe
  • regini.exe
  • rexec.exe
  • route.exe
  • rsh.exe
  • runonce.exe
  • runas.exe
  • srvmgr.exe
  • secedit.exe
  • setreg.exe
  • sysedit.exe
  • syskey.exe
  • telnet.exe
  • tftp.exe
  • tracert.exe
  • verifier.exe
  • wscript.exe
  • xcacls.exe
  • xcopy.exe
  • certmgr.msc
  • ciadv.msc
  • compmgmt.msc
  • devmgmt.msc
  • dfrg.msc
  • diskmgmt.msc
  • eventvwr.msc
  • faxserv.msc
  • fsmgmt.msc
  • gpedit.msc
  • ias.msc
  • lusrmgr.msc
  • ntmsmgr.msc
  • ntmsoprq.msc
  • perfmon.msc
  • secpol.msc
  • services.msc
  • webfldrs.msi
  • wmimgmt.msc

Обратите особое внимание на файл cmd.exe. Это, как всем известно, командный процессор. Побочный эффект такого изменения - невозможность запуска .bat файлов любыми пользователями кроме администратора. О запрещении интерактивного использования командного процессора поговорим позже. А теперь, я хочу обсудить два возможных метода решения этой задачи. Первый - изменение прав доступа к файлам, без изменения их места положения. Второй в добавок к изменению прав, перенос файлов в отдельную доступную только для администратора директория. Независимо от метода, я рекомендую следующие права: Administrator - Read&Execute, Users - Deny All, Everyone - Deny Write. ЕслИ применён второй метод (я обычно пользуюсь именно им) такие же права установите и на саму директорию. Основным плюсом этого метода является защита от вредоносных скриптов, написанных в расчёте на стандартное месторасположения системных утилит и запущенных под правами администратора. Небольшое неудобство в том что в таком случае администратор не сможет запускать bat файлы простым двойным кликом, и будет вынужден использовать структуру <new_path>\cmd.exe /c или /k <script>.bat /ц -применяется если после окончания работы скрипта окно должно быть закрыто, иначе /к.

Повышаем надёжность TCP/IP

Этот раздел будет совсем небольшим. Я опиши набор ключей в реестре которые позволяют сделать TCP стек более устойчивым к DOS (Denial-of-service attack) атакам. Предназначение конкретных ключей легко понять из их названия, поясню только некоторые из них. Все параметры находятся в разделе конфигурации TCP/IP сервиса и имеют формат DWORD (если параметр не представлен в реестре, его необходимо создать)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  • EnableDeadGWDetect = 0 (Запрещает изменить default gateway если считает его неустойчивым)
  • EnableICMPRedirect = 0
  • IPEnableRouter = 1
  • DisableIPSourceRouting = 2
  • EnablePMTUDiscovery = 0 (Запрещает динамическое определение MTU (maximum transmission unit), устанавливает 576 bytes для всех компьютеров не находящихся в той же подсети)
  • KeepAliveTime = 300000
  • KeepAliveInterval = 1000
  • PerformRouterDiscovery = 0
  • SynAttackProtect = 2 (Перестраивает комплекс параметров для защиты от Syn атак)
  • TcpMaxHalfOpen = 100
  • TcpMaxHalfOpenedRetried = 80
  • TcpMaxPortsExhausted = 5
  • TcpMaxConnectResponseTransmissions = 3 (Если сервер подвергся жёсткой SYN flood атаке, измените это значение в 1. Однако это может повлиять на количество падений в корректных соединениях)

Ну вот пожалуй и все на этот раз. Сегодня мы коснулись широкого спектра проблем в области Windows security от простых правил работы с паролями и до тьюнинга TCP/IP стека. Но немало важных вопросов ещё впереди.

И так следующий раз:

  1. Не всё что удобно - полезно, или какие сервисы лучше остановить
  2. Права на диски - забудьте про группу Everyone
  3. А где же у него кнопка? Работаем с registry

Если ваши советы и комментарии интересны всем, буду рад увидеть их здесь.
С личными просьбами и предложениями, добро пожаловать на e-mail

4 comments:

Anonymous said...

Не жалею, что потратил пару минут на чтение. Пишите почаще, еще непременно зайду почитать что-то новенькое.

Anonymous said...

решил помочь и разослал пост в соц. закладки. надеюсь поднимется популярность.

Anonymous said...

В прошлом годы был на Ибице, так там познакомился с человеком, у которого стиль изложения материала очень похож на ваш. Но, к сожалению, тот человек очень далек от Интернета.

Anonymous said...

Спасибо очень интересная заметка.