Организация мониторинга работы сотрудников в малом офисе

от автора

Заместитель директора по безопасности вызывает к себе в кабинет. Ставится задача: безопасник хочет видеть, чем занимался каждый сотрудник в течение дня. Желательно, с архивом в несколько дней. В ходе беседы выясняется, что «ввод с клавиатуры» сотрудника его абсолютно не интересует, ему нужно только видеть, что происходило на экране монитора в рабочее время.

Рассмотрим вариант, как мы можем это все реализовать. Что нам нужно?

  1. Программа, работающая в скрытом режиме, без уведомлений, не содержащая кода, определяемого как вирус, легкая и не мешающая работе самого пользователя.
  2. Сетевое хранилище из расчета максимум 1 Гб на каждого пользователя на три дня.
  3. Сервер, не выполняющий важных ролей в сети с разгруженным сетевым интерфейсом.
  4. Полученные данные должны легко обрабатываться и анализироваться.


От записи видео сразу отказываемся, т.к.:

  • во-первых: слишком большой объем данных — 9-тичасовой рабочий день сотрудника выходил в самом ужатом формате порядка 2 Гб;
  • во-вторых: большая нагрузка — даже самый незаметный рекордер доставит пользователю видимый дискомфорт;
  • в-третьих: неудобство в анализе полученной информации — перемотка многочасового видео, монтаж, когда нужен отчет по сотруднику, много вопросов «А как?» и т.д.
  • в-четвертых: не все такие программы могут взаимодействовать с терминальными сеансами или вернуть себе работоспособность после выхода из блокировки\сна.

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

  1. Часто определяются как вирусы, многие даже не всегда удается добавить в список исключенных процессов антивируса.
  2. Недостаточный или лишний функционал.
  3. Излишнее взаимодействие с рабочей областью пользователя («Ой, а что это у меня мышка так дергается и экран каждую минуту мигает?»).
  4. Нормальные программы идут только в комплекте с комплексным решением, репорт-центрами и за большие деньги.

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

Для начала — на каждом компьютере под управлением 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 каждый день. Все, наша система мониторинга готова. Даем безопаснику ссылки на каждую папку в хранилище (подписанные пофамильно), объясняем принцип работы и пусть сидит играется.

Теперь можно и что-нибудь полезное пойти сделать.

Кратко, структура:

  1. Log-on скрипт запускает nircmd;
  2. nircmd делает скриншоты каждую минуту и сохраняет локально;
  3. Сервер раз в час прогоняет robocopy по списку ПК\IP и забирает скриншоты у пользователей;
  4. У безопасника ссылки на папки в хранилище и он знает, что загрузка идет раз в час, а также что файлы старше 5-ти дней удаляются.

Решение работает в моей конторе уже полгода, никаких проблем не возникало, пользователи о ней знать не знают (но догадываются), безопасник и руководство довольны. Нугрузка nircmd на проц на самом допотопном ПК в конторе составляет 1-2%.

ссылка на оригинал статьи http://habrahabr.ru/post/266419/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *