Pull to refresh

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

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

Рассмотрим вариант, как мы можем это все реализовать. Что нам нужно?
  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%.
Tags:
Hubs:
Total votes 46: ↑13 and ↓33-20
Comments110

Articles