Заместитель директора по безопасности вызывает к себе в кабинет. Ставится задача: безопасник хочет видеть, чем занимался каждый сотрудник в течение дня. Желательно, с архивом в несколько дней. В ходе беседы выясняется, что «ввод с клавиатуры» сотрудника его абсолютно не интересует, ему нужно только видеть, что происходило на экране монитора в рабочее время.
Рассмотрим вариант, как мы можем это все реализовать. Что нам нужно?
- Программа, работающая в скрытом режиме, без уведомлений, не содержащая кода, определяемого как вирус, легкая и не мешающая работе самого пользователя.
- Сетевое хранилище из расчета максимум 1 Гб на каждого пользователя на три дня.
- Сервер, не выполняющий важных ролей в сети с разгруженным сетевым интерфейсом.
- Полученные данные должны легко обрабатываться и анализироваться.
От записи видео сразу отказываемся, т.к.:
- во-первых: слишком большой объем данных — 9-тичасовой рабочий день сотрудника выходил в самом ужатом формате порядка 2 Гб;
- во-вторых: большая нагрузка — даже самый незаметный рекордер доставит пользователю видимый дискомфорт;
- в-третьих: неудобство в анализе полученной информации — перемотка многочасового видео, монтаж, когда нужен отчет по сотруднику, много вопросов «А как?» и т.д.
- в-четвертых: не все такие программы могут взаимодействовать с терминальными сеансами или вернуть себе работоспособность после выхода из блокировки\сна.
Таким образом, мы приходим к единственному варианту — делать скриншоты. Программ для этих целей огромное количество, но все они имеют кучу недостатков, а именно:
- Часто определяются как вирусы, многие даже не всегда удается добавить в список исключенных процессов антивируса.
- Недостаточный или лишний функционал.
- Излишнее взаимодействие с рабочей областью пользователя («Ой, а что это у меня мышка так дергается и экран каждую минуту мигает?»).
- Нормальные программы идут только в комплекте с комплексным решением, репорт-центрами и за большие деньги.
Несколько месяцев я пробовал самые разные программы, включая платные с триал-периодами. И каждый раз, в ходе обкатки, сталкивался с кучей проблем, описанных выше. Даже ходил на презентацию одного из раскрученных продуктов, который чуть ли не замеряет, сколько кофе сотрудник выпил в течение дня. Все не то, все слишком громоздкое или слишком кривое. Нужно было простое решение, легкое и эффективное. И тогда я начал смотреть не в сторону готовых решений, а в сторону универсальных скриптов.
Для начала — на каждом компьютере под управлением Windows есть командная строка. Есть домен, есть групповые политики и log-on скрипты. Все, что мне остается — запустить из командной строки цикл, который будет делать скриншоты экрана и записывать их в локальную папку. А на сервере я создам задание планировщику с повтором каждый час, по которому все накопленные скриншоты будут с компов забираться и складироваться в нужную папку, которую и будет просматривать наш безопасник. Проблема в том, что у командной строки нет функционала «сделать скриншот». Зато такой функционал есть у nircmd и даже больше.
Плюсом идет бесплатность, легкость, отсутствие вирусного кода и гибкость.
Итак, начнем. Первым делом, нам нужно будет запускать nircmd так, чтобы конечный пользователь об этом не подозревал. Тут нам поможет vbs:
CreateObject("Wscript.Shell").Run """" & WScript.Arguments(0) & """", 0, False
Назовем его admin.vbs и добавим в наш log-on скрипт:
cmdow @ /HID ECHO off REM ----- PREPARE INJECTION --------------------------------------------------------------- MKDIR C:\WINDOWS\Security\Domain\ MKDIR C:\WINDOWS\Security\Domain\Log IF EXIST "C:\WINDOWS\Security\Domain\start.bat" ( DEL C:\WINDOWS\Security\Domain\start.bat DEL C:\WINDOWS\Security\Domain\finish.bat REM ----- INJECT -------------------------------------------------------------------------- copy "\\SYSVOL\Domain\scripts\monitor\inject\start.bat" "C:\WINDOWS\security\Domain\" copy "\\SYSVOL\Domain\scripts\monitor\inject\finish.bat" "C:\WINDOWS\security\Domain\" ) copy "\\SYSVOL\Domain\scripts\monitor\inject" "C:\WINDOWS\security\Domain\" ping 127.0.0.1 -n 1 -w 1000 > nul REM ----- LOG MONITOR --------------------------------------------------------------------- IF "%1"=="/login" (goto LOG-IN) IF "%1"=="/logout" (goto LOG-OUT) :LOG-IN wscript.exe "C:\WINDOWS\security\Domain\admin.vbs" "C:\WINDOWS\security\Domain\start.bat" (ECHO %DATE% %TIME% --- %COMPUTERNAME%: %USERNAME%: LOGGED IN. Processing start.bat )>>"\\DomainController\LOG\nir_journal.txt" goto EOF :LOG-OUT REM wscript.exe "C:\WINDOWS\security\Domain\admin.vbs" "C:\WINDOWS\security\Domain\finish.bat" (ECHO %DATE% %TIME% --- %COMPUTERNAME%: %USERNAME%: LOGGED OUT. Processing finish.bat )>>"\\DomainController\LOG\nir_journal.txt" goto EOF
Сперва мы удаляем старые версии наших батников, потом закачиваем новые. А также закачиваем сам nircmd.exe и admin.vbs. Отлично, и start.bat, и finish.bat теперь будут запущенны незаметно для пользователя. Наполняем start.bat следующим содержанием:
echo off REM 43200 = 60*24*30 = 1 month. c:\windows\Security\Domain\nircmd.exe loop 43200 60000 savescreenshot "c:\windows\Security\Domain\Log\scr~$currdate.MM_dd_yyyy$-~$currtime.HH_mm_ss$.jpg"
И на этом с пользователями мы закончили. Теперь на каждом компьютере, где нужно, будет висеть процесс nircmd (если exe переименовать — имя процесса также изменится) который, как правило, вообще ни у кого интереса не вызывает. Процесс будет делать скриншот каждую минуту в течение месяца и сохранять его в c:\windows\Security\Domain\Log\. Если пользователь месяц не будет выходить из системы — частный случай, можно его просто вечером выкинуть для профилактики, сославшись на обновления или зайти под ним и запустить log-on скрипт еще раз. Единственное, о чем нам стоит заранее позаботиться — это разрешить пользователю писать в папку:
cacls "\\%PC%\C$\windows\Security" /G %USER%:F
Нужно прогнать под админом для всех ПК\Юзеров в группе мониторинга. Но можно и не заморачиваться, есть ведь папки Users\Public, куда у них есть право записи по умолчанию.
Как показала практика, nircmd работает корректно только если был запущен самим пользователем (PSExec не поможет, будет писать черный экран), а также вполне себе работает в терминале, там только нужно разделить папки log по именам пользователей.
Теперь настроим наш сервер. Пишем один батник, который будет заниматься и забором, и чисткой, и восстановлением каталогов хранилища.
@echo off setlocal ENABLEDELAYEDEXPANSION cd /d e:\ IF "%1"=="/repair" (goto REPAIR) IF "%1"=="/scan" (goto SCANCOPY) IF "%1"=="/archive" (goto ARCHIVE) :SCANCOPY REM ------------- Собираем скриншоты for /F "tokens=*" %%A in (e:\auto\loop.txt) do ( if %%A EQU @END_OF_LOOP ( exit /b ) else ( e:\auto\scancopy.bat /%%A ) ) goto :EOF :ARCHIVE REM ------------- Чистим мусор attrib -H -S /S e:\roam\Thumbs.db del /F /S /Q e:\roam\Thumbs.db attrib -H -S /S e:\roam\_desktop.ini del /F /S /Q e:\roam\_desktop.ini REM ------------- Удаляем все, что старше -5 дней forfiles -p e:\roam -m *.* -s -d -5 -c "cmd /c del /q @path" :REPAIR REM ------------- Удаляем все пустые папки goto start :fn1 for /d %%i in ("%~1\*") do (call :fn1 "%%i" & rd /q "%%i") exit /b :start call :fn1 "e:\roam" :REPAIR_P2 REM ------------- Создадим папки для наших ПК for /F "tokens=*" %%A in (e:\auto\loop.txt) do ( if %%A EQU @END_OF_LOOP ( exit /b ) else ( MKDIR e:\roam\%%A\ ) )
Содержимое scancopy.bat:
@ECHO off set DEST=%1 IF not EXIST "\%DEST%\ADMIN$" ( goto :EOF ) IF not EXIST "\%DEST%\ADMIN$\Security\Domain\Log" ( (ECHO WARNING --- %DATE% %TIME% --- %COMPUTERNAME%: Log folder not found! )>>"\\DomainController\LOG\nir_journal.txt" goto :EOF ) >nul 2>nul dir /a-d "\%DEST%\ADMIN$\Security\Domain\Log\*" && (GOTO TRANSFER) || ( (ECHO WARNING --- %DATE% %TIME% --- %COMPUTERNAME%: Zero files in source folder! )>>"\\DomainController\LOG\nir_journal.txt" ) :TRANSFER IF NOT EXIST e:\roam%DEST%\%DATE%\ ( MKDIR e:\roam%DEST%\%DATE%\ ) robocopy \%DEST%\ADMIN$\Security\Domain\Log e:\roam%DEST%\%DATE%\ /MOV /R:0) (ECHO SERVICE --- %DATE% %TIME% --- %DEST%: Files transfer success. )>>"\\DomainController\LOG\nir_journal.txt"
Loop.txt — просто список компов или IP-адресов, разделенных новой строкой. В конце списка — @END_OF_LOOP — как маркер конца списка.
Создадим три задания в планировщике, которые будут запускать service /scan каждый час, service /repair каждый день и service /archive каждый день. Все, наша система мониторинга готова. Даем безопаснику ссылки на каждую папку в хранилище (подписанные пофамильно), объясняем принцип работы и пусть сидит играется.
Теперь можно и что-нибудь полезное пойти сделать.
Кратко, структура:
- Log-on скрипт запускает nircmd;
- nircmd делает скриншоты каждую минуту и сохраняет локально;
- Сервер раз в час прогоняет robocopy по списку ПК\IP и забирает скриншоты у пользователей;
- У безопасника ссылки на папки в хранилище и он знает, что загрузка идет раз в час, а также что файлы старше 5-ти дней удаляются.
Решение работает в моей конторе уже полгода, никаких проблем не возникало, пользователи о ней знать не знают (но догадываются), безопасник и руководство довольны. Нугрузка nircmd на проц на самом допотопном ПК в конторе составляет 1-2%.
ссылка на оригинал статьи http://habrahabr.ru/post/266419/
Добавить комментарий