Перейти к содержанию
Shell

#1 Используем SEP для борьбы с локальными администраторами

Recommended Posts

Shell

У меня часто спрашивают - а что НЕ умеет твой SEP? Часто этот вопрос вводит в ступор, потому как по сути SEP дает мне довольно таки огромный потенциал разрешения моих задач и целей.

Итак, ближе к сути: Нужно вылавливать не лигитимных пользователей, которым не разрешено быть в группе локальных администраторов.

Для этого мной решено использовать:

1) vbscript который будет запускаться в политике Host Integrity по расписанию и записывать данные в БД на SQL в центральном офисе.

2) собственно, саму отдельную БД на SQL 2008

3) обрабатывающие процедуры.

В скрипте сразу закладывается логика - какие пользователи разрешены (экономлю трафик), на каких компьютерах (по MAC, ибо много у которых меняется IP) не запускать скрипт.

Итак, делаем новую политику в Host Integrity, выбираем Custom Requirements. Все далее как на скриншоте ниже (в окне имени файла вводим любое имя.vbs, ставим удаление скрипта после его исполнения (скрипт будет во временной директории ОС), в строке выполнения команды пишем cscript %F%)

2f258c21605f.jpg

Теперь редактируем под себя и вставляем сам скрипт:

'НЕ ЗАПУСКАТЬ НА СЕРВЕРАХ И КОНТРОЛЛЕРАХ ДОМЕНА!'или убрать сначала блокировку учеток в группе админов...'On  Error Resume  Nexterrors = 0 'выставляем счетчик для результата в host integritySet objRun = CreateObject("wscript.Shell")strUserName = objRun.ExpandEnvironmentStrings("%USERNAME%")Dim strComputer, member, strUsername, IsMemberDim grp, obj, objRunstrComputer = "."'объявляем массив разрешенных имен пользователейdim AllowUsersAllowUsers = "Administrator,Администратор,shell,Boss"AllowUsers = Split(AllowUsers,",")'объявляем массив разрешенных локальных пользователейdim LocalAccountsLocalAccounts = "Administrator,Администратор"LocalAccounts = Split(LocalAccounts,",")'объявляем массив mac-адресов не подлежащих проверке.dim MacAddressesMacAddresses = "00:21:9b:e5:76:f8,00:26:2d:81:70:70,00:0e:a6:f5:41:fb"'00:23:54:BD:F3:08 MyMacAddresses = Split(MacAddresses,",")'задаем параиетры соединения с БДSet objConn = CreateObject("ADODB.Connection")Set objRecordset = CreateObject("ADODB.Recordset")Set objRecordsetLast = CreateObject("ADODB.Recordset")Set objRecordsetChange = CreateObject("ADODB.Recordset")ServerName = "10.0.0.2" 'имя или IP-адрес сервераDSN = "LocalAdmins" 'имя базы данныхUID = "vbs" 'логин пользователя SQL-сервераPWD = "Sfgs%4F#D" 'пароль пользователя SQL-сервераConnectString = "Provider=SQLOLEDB;" & _                "Data Source=" & ServerName & _                ";Initial Catalog=" & DSN & _                ";UID=" & UID & ";PWD=" & PWDobjConn.ConnectionString = ConnectStringobjConn.ConnectionTimeOut = 15objConn.CommandTimeout = 30'получаем имя компаSet WshNetwork = WScript.CreateObject("WScript.Network")'WScript.Echo " " &WshNetwork.ComputerName CompName = LCase(WshNetwork.ComputerName)'получаем полное имя доменаSet objSystemInfo = CreateObject("ADSystemInfo") 'wscript.echo objSystemInfo.DomainDNSNameDomainName = LCase(objSystemInfo.DomainDNSName)'получаем IP и MACSet objWMIService = GetObject( _     "winmgmts:\\" & strComputer & "\root\cimv2")Set IPConfigSet = objWMIService.ExecQuery _("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")For Each IPConfig in IPConfigSet    If Not IsNull(IPConfig.IPAddress) Then         For i=LBound(IPConfig.IPAddress) _            to UBound(IPConfig.IPAddress)                If Not (IPConfig.IPAddress(i)="0.0.0.0") Then            IPAddress = IPAddr + IPConfig.IPAddress(i)            MACAddress = IPConfig.MACAddress            'Wscript.Echo "IP Address: " & IPAddress & " MACAddress: " & IPConfig.MACAddress                End if        Nextend ifnext'проверяем mac-адреса на исключенияFor Each address in MacAddresses    If LCase(address) = LCase(MACAddress) then    'Wscript.echo "Этот компьютер находится в исключениях проверки по критерию MAC"    Wscript.quit(0) 'и завершаем скрипт если MAC перечислен    Exit for    End ifNext'проверяем не заблокирован ли пользовательFunction dis(Username)    Set Accounts = GetObject("WinNT://" & strComputer & "")    Accounts.Filter = Array("user")        For each user in Accounts            If LCase(user.Name) = LCase(Username) then                If user.AccountDisabled = False then                dis = 0                'wscript.echo "Пользователь " & Username & " Не заблокирован"                Else                dis = 1                'wscript.echo "Пользователь " & Username & " Уже блокирован"                exit for                end if            end if        nextEnd function'ищем группу администраторов и проверяем её членовSet colGroups = GetObject("WinNT://" & strComputer & "") 'UPcolGroups.Filter = Array("group")Dim Result ()ReDim Result(1)For Each objGroup In colGroups    If  objGroup.Name = "Administrators" or objGroup.Name ="Администраторы" Then          i=0        For Each objUser in objGroup.Members                'проверяем языковое соответствие учетных записей администраторов                   if LCase(objUser.Name) = "administrators" and LCase(objGroup.Name) = "администраторы" or LCase(objUser.Name) = "администратор" and LCase(objGroup.Name) = "administrators" then                    Set ExistLocalAccounts = GetObject("WinNT://" & strComputer & "")                    ExistLocalAccounts.Filter = Array("user")                        For Each user In ExistLocalAccounts                            For Each allowuser In LocalAccounts                            c = 0                                If LCase(user.Name) = LCase(allowuser) then exit for                                    If user.AccountDisabled = False then                                    notallowaccs = user.Name                            c = 1                                    end if                        next                            if c = 1 then                            'wscript.Echo "Итог: НЕТ В БАЗЕ ЛОКАЛЬНОГО ПОЛЬЗОВАТЕЛЯ " & notallowaccs & " <--- Незаблокирован"                            'user.AccountDisabled = True                            'user.SetInfo                            errors = 1                            end if                                    Next                    Disabled = dis(objUser.Name)                    'wscript.echo "Обнаружено языковое несоответствие учетной записи администраторов"                    objConn.Open                    Set objRecordset = objConn.Execute("insert into CommonAdmins (CompName,DomainName,IPAddress,MacAddress,UserName,Disabled,GroupName,date) values ('" & CompName &"','"& DomainName &"','"& IPAddress &"','"& MACAddress &"','" & objUser.Name & "','"& Disabled &"','"& objGroup.Name &"', getdate())")                    objConn.Close                 end if         GroupName = objGroup.Name         IsMember = objUser.Name         Result(i)=IsMember         i=i+1         ReDim Preserve Result(i)         Next     End IfNextReDim Preserve Result(i-1)'сравниваем полученный массив пользователей-админов с разрешенными локальными админами.for each adminuser in Result    for each admins in AllowUsers     x = 0     if LCase(adminuser) = LCase(admins) then exit for    x = 1    next        if x = 1 then        isMember = adminuser        'WScript.Echo "Итог: НЕТ В БАЗЕ " & IsMember        errors = 1        Disabled = dis(IsMember)        objConn.Open        Set objRecordset = objConn.Execute("insert into CommonAdmins (CompName,DomainName,IPAddress,MACAddress,UserName,Disabled,GroupName,date) values ('" & CompName &"','"& DomainName &"','"& IPAddress &"','"& MACAddress &"','" & IsMember & "','"& Disabled &"','"& GroupName &"', getdate())")        objConn.Close         end ifnextIf errors = 1 Then   'WScript.echo "Выходим с кодом 1 для Host Integrity"        WScript.Quit(1) ' --- Quit with errorsElse    WScript.Quit(0) ' --- Quit with not errorsEnd If

Теперь готовим саму БД.

Делаем отдельную БД (или изменяем в параметрах скрипта ниже и выше на свои) с именем LocalAdmins. В ней создадим маленькую табличку

USE [LocalAdmins]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[CommonAdmins](    [iPAddress] [varchar](15) NULL,    [MACAddress] [varchar](17) NULL,    [userName] [varchar](128) NULL,    [Disabled] [nchar](10) NULL,    [GroupName] [varchar](50) NULL,    [Date] [datetime] NULL,    [incRegister] [int] NOT NULL,    [DomainName] [varchar](128) NULL,    [CompName] [varchar](128) NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOALTER TABLE [dbo].[CommonAdmins] ADD  CONSTRAINT [DF_CommonAdmins_UserName]  DEFAULT (NULL) FOR [userName]GOALTER TABLE [dbo].[CommonAdmins] ADD  CONSTRAINT [DF_CommonAdmins_Disabled]  DEFAULT (NULL) FOR [Disabled]GOALTER TABLE [dbo].[CommonAdmins] ADD  CONSTRAINT [DF_CommonAdmins_IncRegister]  DEFAULT ((0)) FOR [incRegister]GO

Теперь создадим 2 процедуры. Как и в предыдущей теме, я использую две процедуры. Первая будет работать по таблице, вторая - отсылать письма по подготовленным критериям и уже отфильтрованной таблице первой процедурой.

Первая процедура :

Use LocalAdmins;GOAlter PROCEDURE Clean_LocalAdminsASBEGINDECLARE @comp varchar(128), @domain varchar(128), @ip varchar(15), @users varchar(128),@group varchar(50), @date datetime, @inc int;DECLARE LACursor0 CURSOR LOCAL FOR SELECT DISTINCT CompName,DomainName,convert(varchar(15),IPAddress),UserName,GroupName,Date,IncRegister  FROM CommonAdminsorder by dateDECLARE @count int--Заменяем IP в случае выдачи скриптом из диапазона Reserved\BcastUpdate CommonAdminsSet IPAddress = 'APIPA'Where IPAddress like '%169.254.%'--меняем домен для корректной регистрации объекта инцидентаUpdate CommonAdminsSet DomainName = 'sk.domain.gk'where IPAddress like '%10.1.2.%' or IPAddress like '%10.1.1.%' or IPAddress like '%10.1.3.%'Update CommonAdminsSet DomainName = 'office.domain.gk'where IPAddress like '%10.0.17.%' or IPAddress like '%10.0.18.%'--иногда, увы скрипт не отрабатывает из за выключения питания или потери канала. Удаляем неполные данныеDELETE from CommonAdminswhere (IPAddress is NULL and MACAddress is NULL) or UserName is NULL and (GroupName is NULL)    OPEN LACursor0    FETCH NEXT FROM LACursor0 INTO @comp,@domain,@ip,@users,@group,@date,@incWHILE @@FETCH_STATUS = 0    BEGIN--считаем количество новых записей - если есть новые, делаем их актуальными, увеличиваем инкремент (IncRegister) чтобы потом контролировать--отсылку письма    Select @count = COUNT(*) from CommonAdminsWhere CompName = @comp and DomainName = @domain and convert(varchar(15),IPAddress) = @ip and UserName = @users and GroupName = @group        if @count > 1 --or @count =  0        BEGIN        Update CommonAdmins        SET IncRegister = + @count        WHERE CompName = @comp and DomainName = @domain and convert(varchar(15),IPAddress) = @ip and UserName = @users and GroupName = @group        Delete from CommonAdmins where CompName = @comp and DomainName = @domain and UserName = @users and GroupName = @group and Date < @date        END            FETCH NEXT FROM LACursor0 INTO @comp,@domain,@ip,@users,@group,@date,@inc    END;        CLOSE LACursor0;    DEALLOCATE LACursor0;--удаляем неактуальные данные, старее 120 часов :)Delete from CommonAdmins where Date < DATEADD (HOUR, -120, getdate())ENDGO

Вторая процедура, которая будет отсылать письмо

-- ================================================Use LocalAdmins;GOAlter PROCEDURE IncMailASBEGINDECLARE @comp varchar(128), @domain varchar(128), @ip varchar(15), @users varchar(128),@group varchar(50), @date datetime, @inc intDECLARE LACursor1 CURSOR LOCAL FOR SELECT CompName,DomainName,IPAddress,UserName,GroupName,Date,IncRegister FROM CommonAdmins ORDER by UserNameDECLARE @xml NVARCHAR(MAX)DECLARE @body NVARCHAR(MAX)DECLARE @dopsubj varchar(10)--создаем отчеты    OPEN LACursor1    FETCH NEXT FROM LACursor1 INTO @comp,@domain,@ip,@users,@group,@date,@incWHILE @@FETCH_STATUS = 0    BEGIN        --PRINT @comp + @domain + @ip + @users + @group + CONVERT(VARCHAR, @date, 104)    --SELECT @comp + ', '+ @domain + ', '+ @ip + ', ' + @users + ', ' + @group + ', ' + CONVERT(VARCHAR, @date, 102)+ ', '+ CONVERT(VARCHAR, @date, 8) + ', ' + @inc                IF (@inc = 0 or @inc > 120)    and @users not like 'S-1-5-21%'        BEGIN     -- готовим письмо и отсылаем            if @inc >= 120            BEGIN            SET @dopsubj = ' ПОВТОРНО '            END            ELSE            SET @dopsubj = ' '                        --Оформляем и пишем письмо        SET @body ='Инцидент ' + @dopsubj + ' по классу информационная безопасность по объекту ' + @domain + ' "Пользователь - локальный администратор".        Пользователь ' + @users + ' на АРМ ' + @comp + ' с IP адресом ' + @ip +'  - локальный администратор ' + ' (Обнаружено событие ' + convert(varchar(24),@date) + ' по Мск).        Необходимо:1) В аттаче к инциденту прикрепить письменную объяснительную ИТ специалиста по факту инцидента.2) Обеспечить функционирование ПО без повышенных привилегий.3) Удалить пользователя из локальных администраторов.                            Письмо создано автоматически.                В группе локальных администраторов должны быть только следующие учетные записи:1)    2)3)'DECLARE @subj varchar(128)= 'Локальный администратор ' + ' Пользователь - локальный администратор. '+ ' Object: ' + @domain + ' '        EXEC msdb.dbo.sp_send_dbmail        @recipients=N'helpdesk@company.ru',        @copy_recipients =N'ваш_емайл@company.ru',        @body = @body,        @body_format = 'TEXT',        @subject =@subj,        @profile_name = 'Database Mail'        END--обновляем данные о том что инцидент выслан по данному пользователю        Update CommonAdmins        Set IncRegister = @inc + 1        Where CompName = @comp and UserName = @users and GroupName = @group        FETCH NEXT FROM LACursor1 INTO @comp,@domain,@ip,@users,@group,@date,@inc    END;        CLOSE LACursor1;    DEALLOCATE LACursor1;ENDGO

Ставим шедуллер в SQL Agent на вызов этих процедур

Use LocalAdmins;GOexec Clean_LocalAdminsexec IncMail

Выше описанный метод оттестирован (в настоящее время маленькие доработки) и работоспособен.

Минусы? Конечно есть что я просто физически не успеваю реализовать. Например, то что скрипт получает имя пользователей в несовсем удобном формате (нет приставки Domain\User или Computer\User - есть возможность обдурить скрипт :) , не отмечаются группа или пользователь ну и так, по мелочи)

В скриптах есть заремаренные дополнительные функции которые вы можете открыть если нужно (например, автоматическая блокировка учетной записи - аккуратнее с этим на серверах, т.к. блокируются и IIS_\IWAM_ - внесите сначала все то что нужно).

На вопросы отвечу позже, через пару неделек ;)

P.S. не забудьте создать пользователя vbs с паролем указанным в скрипте. Только дайте ему права минимальные на БД.

  • Upvote 15

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
deviss

Я в восхищении. Теоретически, конечно, это можно решить другими средствами, но интеграция в SEP - это замечательно.

Сами выработали практику? Читая документацию как-то не доводилось сталкиваться с подобными решениями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Shell
Я в восхищении. Теоретически, конечно, это можно решить другими средствами, но интеграция в SEP - это замечательно.

Сами выработали практику? Читая документацию как-то не доводилось сталкиваться с подобными решениями.

Да, приходится вырабатывать коленочные решения :) На групповые политики не приходится рассчитывать так как поддоменов море и нужно учитывать человеческий фактор :)

В планах потом скрипт перегнать на c++\c# и доработать немного. В данное время не успеваю - нужно было что то временное но работающее сделать.

Еще один вопрос не решенным остался - не получилось вернуть из скрипта код ошибки для host integrity. К примеру, если локальные админы найдены - вернуть host complince error...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  • Сообщения

    • Dmitrius
      Сервис подбора и сравнение кредитов Случается так, что деньги нужны срочно. Поэтому если у вас нет накоплений, рациональней всего обратиться за помощью на этот сайт, где собраны надежные, проверенные банки, которым точно можно доверять. Учреждения подготовили лучшие предложения, которые только возможны. На этом сайте есть возможность подобрать кредит, а также оформить займ либо взять деньги на приобретение автомобиля. И самое главное, что все это на наиболее выгодных для вас условиях. Автокредит Казахстан проценты - это шанс купить все, что нужно, не отказывая себе в покупке. Все банковские продукты различаются требованиями, условиями выдачи, а потому рекомендуется детально изучить условия договора и особенности выдачи денежных средств. Потребительский кредит оформить (рассчитать) в Алматы получится в данный момент. На этом сайте вы сможете не только подобрать подходящий вариант, но и сравнить имеющиеся. Затем следует определиться с тем, в какой банк обратиться за материальной поддержкой. Составить заявку на выдачу средств можно в режиме реального времени. Кредит наличными заявка онлайн выдается в течение часа наиболее комфортным для вас способом. На портале опубликован список всех доступных предложений, имеется необходимая информация о каждом банке и кредитах. Выберете самую низкую процентную ставку, а также сумму и сроки, на которые планируете занять сумму. Все максимально просто, быстро и понятно. Ипотека проценты Казахстан (ипотека Казахстан) - это отличная возможность решить свои жилищные проблемы. Важно помнить о том, что лишь надежные компании с огромным опытом готовы предложить приемлемые условия. Выберете подходящий для себя банковский продукт, чтобы поправить материальное положение.
    • Dmitrius
      Интернет магазин автозапчастей  Интернет-магазин «AUTOSHOP» реализует внушительный выбор деталей на автомобили - их можно подобрать не только по наименованию, но и артикулу и другим параметрам. Имеются разные запчасти на любые автомобили самых разных марок и моделей - вы сможете их найти в один клик. Запчасти находятся на складе - это дает возможность осуществить быструю транспортировку. Сотрудничество исключительно с надежными, проверенными поставщиками, которые работают на совесть и предлагают продукцию безупречного качества и с длительными эксплуатационными сроками. Автозапчасти интернет магазин для иномарок рекомендует ознакомиться с полным ассортиментом – он даст возможность подобрать вариант с учетом обозначенных требований. Перед тем, как осуществить приобретение, необходимо детально изучить технические аспекты, ведь именно они влияют на сроки эксплуатации и внешний вид авто. Но если вам требуется помощь специалиста, то вы всегда можете воспользоваться профессиональной консультацией. Автозапчасти для иномарок Курск вы обязательно подберете для любой машины, несмотря на год производства. Изучите справочник автотоваров, каталог, а также новости, представленные на данную тематику - информация поможет принять правильное решение. Сотрудники интернет-магазина быстро реагируют на появление новых деталей в европейских магазинах для того, чтобы в ближайшее время пополнить ими свой ассортимент. Это даст возможность быстро среагировать за изменяющуюся ситуацию. Каталог автозапчастей Курск содержит огромный перечень деталей. Они созданы в соответствии с самыми высокими стандартами, нормами, требованиями. Администрация проверяет запчасти на соответствие заданным характеристикам, поэтому в продажу попадает только та продукция, которая имеет сопроводительную документацию, сертификаты. На продукцию есть гарантии, подтверждающие безупречное качество, оригинальность.
    • JamesBisee
      Купить газовый котел с закрытой камерой сгорания в Москве
      https://www.fire-flower.ru/
      https://www.google.tg/url?q=https://fire-flower.ru
    • PR55.RP55
      По всей видимости uVS не всегда может получить доступ к: Hosts Нужно чтобы в Лог писалась информация: "Нет доступа  к Hosts " Вроде сейчас uVS  соответствующих записей не создаёт?
    • Dmitrius
      Канализация из септиков под ключ На предприятии каждый сможет заказать установку септиков, созданных из ЖБ конец - они не только практичны, но и отличаются безукоризненным качеством. Ищите где заказать монтаж септика астра - получите всю необходимую информацию на сайте. Важным моментом является то, что услуги оказываются на должном, профессиональном уровне. Это достигается за счет того, что в бригаде трудятся специалисты, которые знают все особенности своей работы. При этом стоимость работ остается на доступном уровне. Огромный стаж работы позволил приобрести большое количество клиентов – они советуют предприятие знакомым. Бетонные септики пользуются популярностью не только за счет своей небольшой стоимости, но и благодаря прочности, а также невосприимчивы к негативным условиях среды, они не нуждаются в сервисном обслуживании. И самое важное, что установка проводится на грунте любого типа. Такой вид септика считается самым быстрым способом организовать очистное сооружение на дачном участке. Сотрудники предприятия специально для вас подготовят предложение, произведут расчеты, грамотно расположат септик, а заодно и закупят все необходимые материалы по доступным ценам, выполнят доставку и монтажные работы. На все, включая материалы, предоставляются гарантии. Услуги оказываются не только по столице, но и области, на любом грунте: песке, глине и др. Монтаж септиков различной сложности, а также с подключением бани или дачи, переливом, любых соединений. Есть возможность вызвать целую бригаду специалистов на малый участок либо дачу, на которой вы проживаете время от времени или постоянно. Монтажные работы в ограниченные сроки. Во время монтажных работ учитывается то, сколько человек проживает в доме, особенности – о них поведает консультант. Теперь и вы сможете заказать высококлассные работы.
×