My knowledge base

Показаны сообщения с ярлыком скрипт. Показать все сообщения
Показаны сообщения с ярлыком скрипт. Показать все сообщения

вторник, 20 марта 2012 г.

Сканирование Windows без прав администратора

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

                    I.            Информация о жестком диске ПК (чтение информации о жестком диске).
                  II.            Права пользователей (чтение списка пользователей с указанными привилегиями):
1.       доступ к диспетчеру учетных данных от имени доверенного вызывающего;
2.       изменение метки объекта;
3.       создание символических ссылок;
4.       увеличение рабочего набора процесса;
5.       доступ к компьютеру из сети (SeNetworkLogonRight);
6.       работа в режиме операционной системы (SeTcbPrivilege);
7.       настройка квот памяти для процесса (SeIncreaseQuotaPrivilege);
8.       разрешить локальный вход в систему (SeInteractiveLogonRight);
9.       архивирование файлов и каталогов (SeBackupPrivilege);
10.   обход перекрестной проверки (SeChangeNotifyPrivilege);
11.   изменение системного времени (SeSystemTimePrivilege);
12.   создание файла подкачки (SeCreatePagefilePrivilege);
13.   создание маркерного объекта (SeCreateTokenPrivilege);
14.   создание глобальных объектов (SeCreateGlobalPrivilege);
15.   создание постоянных объектов совместного использования (SeCreatePermanentPrivilege);
16.   отладка программ (SeDebugPrivilege);
17.   отказ в доступе к компьютеру из сети (SeDenyNetworkLogonRight);
18.   отклонить локальный вход (SeDenyInteractiveLogonRight);
19.   разрешение доверия к учетным записям и компьютеру при делегировании (SeEnableDelegationPrivilege);
20.   принудительное удаленное завершение (SeRemoteShutdownPrivilege);
21.   создание журналов безопасности (SeAuditPrivilege);
22.   имитация клиента после проверки подлинности (SeImpersonatePrivilege);
23.   увеличение приоритета выполнения (SeIncreaseBasePriorityPrivilege);
24.   загрузка и выгрузка драйверов устройств (SeLoadDriverPrivilege);
25.   закрепление страниц в памяти (SeLockMemoryPrivilege);
26.   вход в качестве пакетного задания (SeBatchLogonRight);
27.   вход в качестве службы (SeServiceLogonRight);
28.   управление аудитом и журналом безопасности (SeSecurityPrivilege);
29.   изменение параметров среды оборудования (SeSystemEnvironmentPrivilege);
30.   запуск операций по обслуживанию логических дисков (SeManageVolumePrivilege);
31.   профилирование одного процесса (SeProfileSingleProcessPrivilege);
32.   профилирование загруженности системы (SeSystemProfilePrivilege);
33.   извлечение компьютера из стыковочного узла (SeUndockPrivilege);
34.   замена маркера уровня процесса (SeAssignPrimaryTokenPrivilege);
35.   восстановление файлов и каталогов (SeRestorePrivilege);
36.   завершение работы системы (SeShutdownPrivilege);
37.   овладение файлами или иными объектами (SeTakeOwnershipPrivilege).
                III.            Политики аудита (чтение информации о статусе включения указанного аудита):
1.       аудит событий входа в систему;
2.       аудит управления учетными записями;
3.       аудит доступа к службе каталогов;
4.       аудит входа в систему;
5.       аудит доступа к объектам;
6.       аудит изменения политики;
7.       аудит использования привилегий;
8.       аудит отслеживания процессов;
9.       аудит системных событий.

В MS проблема описана, но реакции пока не видно:
For purposes of compliance and audit Windows we should use least privilege (read only). But Windows has the following problems:
1. Lsa*InformationPolicy APIs were never designed (almost 20 years ago)
for remoting, and were designed to require administrative rights. These APIs manage the policy that the security subsystem enforces and it’s easy to effectively make someone an admin via policy, without regards to group membership.
2.IF they can't impersonate an administrator, you won't be able to retrieve the logical disk information. The only way to retrieve the class is to be a member of the administrators group on the local machine, ordinary users cannot retrieve this information from WMI because of the low level API execution restrictions. Need to inform that it's confirmed that this a normal behavior due to a change in security change.
To summarize it shortly, the issue occurs because the above classes under the cover uses APIs which require elevated privileges. This is by design and very difficult to change the work around is to use administrator credentials when accessed remotely. As WMI is ment to be used by Administrators we run here in a limitation of WMI for Standard Users that can´t be changed.
In regards to accessing i.e. Win32_CDROMDrive, Win32_QuickFixEngineering or Win32_PageFileSettings, the WMI provider, servicing these two classes requires the use of the SetupDi APIs which do require Administrator or Administrator or INTERACTIVE_USER access. … and all changes via the APIs are restricted to Admins. This is basically dictated by the PNP manager for device and driver access in case of Win32_CDROMDrive.
Using an agent does not solve the problem.
This problem does not exist in *nix systems (have full RBAC). 


Обходным маневром является написание скрипта, который запускается с правами администратора (ИТ администратор запускает по расписанию или как сервис), и таким образом разделить ИТ и ИБ. Но это полумера.

Но большую часть информации собрать можно, например, через WMI. Вот описание настройки привилегий:
МоёМесто.ru WMI ACCESS for non admin user.pdf (17 Kb)
Есть классная утилита для настройки привилегий: SetACL, хотя ещё понадобиться скачать dcomperm с сайта Microsoft (входит в SDK).

Получится, что-то типа этого:
@ECHO OFF
REM Проверяем правильность введенных параметров
IF /i "%1" NEQ "set" IF /i "%1" NEQ "unset" GOTO ERR
IF "%2" EQU "" GOTO ERR2
IF "%3" NEQ "" GOTO ERR3
IF "%4" NEQ "" GOTO ERR3
REM Проверяем, что пользователь существует (в искомой строке важны пробелы)
net user | find /I " %2 " > nul
IF ERRORLEVEL 1 GOTO ERR4
IF /i "%1" EQU "unset" GOTO UNSET
REM Права на чтение всей ветки HKCU (официальная утилита от MS) Право на чтение HKLM есть у группы "Пользователи"
subinacl /subkeyreg HKEY_CURRENT_USER /grant=%2=r > nul 2>nul
ECHO reg OK
REM Полные права на папку %systemroot%\temp
subinacl /subdirectories %systemroot%\temp\* /grant=%computername%\%2%=F
ECHO TEMP folder OK
REM Права на DCOM (официальная утилита от MS): разрешить локальный и удаленный доступ
dcomperm -ma set %2 permit > nul
REM Права на DCOM (официальная утилита от MS): разрешить удаленный запуск и активацию
dcomperm -ml set %2 permit level:rl,ra > nul
ECHO DCOM OK
REM Права на удаленный доступ (чтение) к WMI Namespace (утилита от www.codeproject.com/KB/system/WmiSecurity.aspx)
wmiSecurity /C="%computername%" /A /N=Root/CIMV2 /M="%computername%\%2:REMOTEACCESS" /R > nul
ECHO WMI OK
GOTO EXIT
:UNSET
REM удаляем права на чтение ветки реестра HKCU
subinacl /subkeyreg HKEY_CURRENT_USER /revoke=%2 > nul
ECHO reg OK
REM удаляем права на папку
subinacl /subdirectories %systemroot%\temp\* /revoke=%computername%\%2%
ECHO TEMP folder OK
REM удаляем права на локальный и удаленный доступ DCOM
dcomperm -ma remove %2 > nul
REM удаляем права на удаленный запуск и активацию DCOM
dcomperm -ml remove %2 > nul
ECHO DCOM OK
REM должны удалить права на WMI Namespace - пока утилита этого сделать не может, надо удалять вручную
GOTO EXIT
:ERR
ECHO First parameter is incorrect. Enter SET or UNSET
GOTO EXIT
:ERR2
ECHO Enter user name
GOTO EXIT
:ERR3
ECHO Too many parameters
GOTO EXIT
:ERR4
ECHO User not found
GOTO EXIT
:EXIT


В этом скрипте wmisecurity и subinacl лучше заменить на SetACL.

Скрипт: настройка Windows Firewall

Пример скрипта по настройке Windows Firewall:

@ECHO OFF
REM Проверяем правильность введенных параметров
IF /i "%1" NEQ "set" IF /i "%1" NEQ "unset" GOTO ERR
IF "%1" EQU "" GOTO ERR1
IF "%2" NEQ "" GOTO ERR2
IF /i "%1" EQU "unset" GOTO UNSETF
:SET
REM для старых ОС (позже Windows 6.0***) выполняем старую команду настройки Windows Firewall
ver | find "6."
IF ERRORLEVEL 0 GOTO NEWSETF
REM Настройка windows firewall для Windows XP, Windows 2003
netsh firewall set service RemoteAdmin enable
GOTO EXIT
:NEWSETF
netsh advfirewall firewall add rule dir=in name="DCOM" program=%systemroot%\system32\svchost.exe service=rpcss action=allow protocol=TCP localport=135
netsh advfirewall firewall add rule dir=in name ="WMI" program=%systemroot%\system32\svchost.exe service=winmgmt action = allow protocol=TCP localport=any
netsh advfirewall firewall add rule dir=in name ="UnsecApp" program=%systemroot%\system32\wbem\unsecapp.exe action=allow
netsh advfirewall firewall add rule dir=out name ="WMI_OUT" program=%systemroot%\system32\svchost.exe service=winmgmt action=allow protocol=TCP localport=any
GOTO EXIT
:UNSETF
REM для старых ОС (позже Windows 6.0***) выполняем старую команду настройки Windows Firewall
ver | find "6."
IF ERRORLEVEL 0 GOTO NEWUNSETF
REM Настройка windows firewall для Windows XP, Windows 2003
netsh firewall set service RemoteAdmin disable
GOTO EXIT
:NEWUNSETF
netsh advfirewall firewall delete rule name="DCOM"
netsh advfirewall firewall delete rule name="WMI"
netsh advfirewall firewall delete rule name="UnsecApp"
netsh advfirewall firewall delete rule name="WMI_OUT"
GOTO EXIT
:ERR
ECHO First parameter is incorrect. Enter SET or UNSET
GOTO EXIT
:ERR1
ECHO Enter parameter
GOTO EXIT
:ERR2
ECHO Too many parameters
GOTO EXIT
:EXIT

понедельник, 31 января 2011 г.

Автоматизация настройки Windows Firewall (скрипт)

Для работы WMI иногда надо настроить Windows Firewall для расрешения WMI трафика. Задача усложняется тем, что для Windows XP и Windows 2003 используется старый firewall, упрощенный. А для Windows Vista, 7, 2008 - новый, продвинутый. В продвинутом есть стандартные  правила для WMI но их лучше не трогать, а создать новые, как рекомендует Microsoft: http://msdn.microsoft.com/en-us/library/aa822854 Для "старого" WF (Windows Firewall) надо просто разрешить удаленные подключения, в нем нет гибких правил. Попробовал сделать скрипт, который настраивает и новый и старый WF. Вроде работает :) Пользуйтесь:

@ECHO OFF
REM Проверяем правильность введенных параметров
IF /i "%1" NEQ "set" IF /i "%1" NEQ "unset" GOTO ERR
IF "%1" EQU "" GOTO ERR1
IF "%2" NEQ "" GOTO ERR2

IF /i "%1" EQU "unset" GOTO UNSETF

:FWSET
REM для старых ОС (позже Windows 6.0***) выполняем старую команду настройки Windows Firewall
ver | find "6."
IF ERRORLEVEL 0 GOTO NEWSETF

REM Настройка windows firewall для Windows XP, Windows 2003
netsh firewall set service RemoteAdmin enable
GOTO EXIT

:NEWSETF
netsh advfirewall firewall add rule dir=in name="DCOM" program=%systemroot%\system32\svchost.exe service=rpcss action=allow protocol=TCP localport=135
netsh advfirewall firewall add rule dir=in name ="WMI" program=%systemroot%\system32\svchost.exe service=winmgmt action = allow protocol=TCP localport=any
netsh advfirewall firewall add rule dir=in name ="UnsecApp" program=%systemroot%\system32\wbem\unsecapp.exe action=allow
netsh advfirewall firewall add rule dir=out name ="WMI_OUT" program=%systemroot%\system32\svchost.exe service=winmgmt action=allow protocol=TCP localport=any
GOTO EXIT

:UNSETF
REM для старых ОС (позже Windows 6.0***) выполняем старую команду настройки Windows Firewall
ver | find "6."
IF ERRORLEVEL 0 GOTO NEWUNSETF

REM Настройка windows firewall для Windows XP, Windows 2003
netsh firewall set service RemoteAdmin disable
GOTO EXIT

:NEWUNSETF
netsh advfirewall firewall delete rule name="DCOM"
netsh advfirewall firewall delete rule name="WMI"
netsh advfirewall firewall delete rule name="UnsecApp"
netsh advfirewall firewall delete rule name="WMI_OUT"
GOTO EXIT

:ERR
ECHO First parameter is incorrect. Enter SET or UNSET
GOTO EXIT

:ERR1
ECHO Enter parameter
GOTO EXIT

:ERR2
ECHO Too many parameters
GOTO EXIT

:EXIT