Заместитель директора по безопасности вызывает к себе в кабинет. Ставится задача: безопасник хочет видеть, чем занимался каждый сотрудник в течение дня. Желательно, с архивом в несколько дней. В ходе беседы выясняется, что «ввод с клавиатуры» сотрудника его абсолютно не интересует, ему нужно только видеть, что происходило на экране монитора в рабочее время.
Рассмотрим вариант, как мы можем это все реализовать. Что нам нужно?
От записи видео сразу отказываемся, т.к.:
Таким образом, мы приходим к единственному варианту — делать скриншоты. Программ для этих целей огромное количество, но все они имеют кучу недостатков, а именно:
Несколько месяцев я пробовал самые разные программы, включая платные с триал-периодами. И каждый раз, в ходе обкатки, сталкивался с кучей проблем, описанных выше. Даже ходил на презентацию одного из раскрученных продуктов, который чуть ли не замеряет, сколько кофе сотрудник выпил в течение дня. Все не то, все слишком громоздкое или слишком кривое. Нужно было простое решение, легкое и эффективное. И тогда я начал смотреть не в сторону готовых решений, а в сторону универсальных скриптов.
Для начала — на каждом компьютере под управлением Windows есть командная строка. Есть домен, есть групповые политики и log-on скрипты. Все, что мне остается — запустить из командной строки цикл, который будет делать скриншоты экрана и записывать их в локальную папку. А на сервере я создам задание планировщику с повтором каждый час, по которому все накопленные скриншоты будут с компов забираться и складироваться в нужную папку, которую и будет просматривать наш безопасник. Проблема в том, что у командной строки нет функционала «сделать скриншот». Зато такой функционал есть у nircmd и даже больше.
Плюсом идет бесплатность, легкость, отсутствие вирусного кода и гибкость.
Итак, начнем. Первым делом, нам нужно будет запускать nircmd так, чтобы конечный пользователь об этом не подозревал. Тут нам поможет vbs:
Назовем его admin.vbs и добавим в наш log-on скрипт:
Сперва мы удаляем старые версии наших батников, потом закачиваем новые. А также закачиваем сам nircmd.exe и admin.vbs. Отлично, и start.bat, и finish.bat теперь будут запущенны незаметно для пользователя. Наполняем start.bat следующим содержанием:
И на этом с пользователями мы закончили. Теперь на каждом компьютере, где нужно, будет висеть процесс nircmd (если exe переименовать — имя процесса также изменится) который, как правило, вообще ни у кого интереса не вызывает. Процесс будет делать скриншот каждую минуту в течение месяца и сохранять его в c:\windows\Security\Domain\Log\. Если пользователь месяц не будет выходить из системы — частный случай, можно его просто вечером выкинуть для профилактики, сославшись на обновления или зайти под ним и запустить log-on скрипт еще раз. Единственное, о чем нам стоит заранее позаботиться — это разрешить пользователю писать в папку:
Нужно прогнать под админом для всех ПК\Юзеров в группе мониторинга. Но можно и не заморачиваться, есть ведь папки Users\Public, куда у них есть право записи по умолчанию.
Как показала практика, nircmd работает корректно только если был запущен самим пользователем (PSExec не поможет, будет писать черный экран), а также вполне себе работает в терминале, там только нужно разделить папки log по именам пользователей.
Теперь настроим наш сервер. Пишем один батник, который будет заниматься и забором, и чисткой, и восстановлением каталогов хранилища.
Содержимое scancopy.bat:
Loop.txt — просто список компов или IP-адресов, разделенных новой строкой. В конце списка — @END_OF_LOOP — как маркер конца списка.
Создадим три задания в планировщике, которые будут запускать service /scan каждый час, service /repair каждый день и service /archive каждый день. Все, наша система мониторинга готова. Даем безопаснику ссылки на каждую папку в хранилище (подписанные пофамильно), объясняем принцип работы и пусть сидит играется.
Теперь можно и что-нибудь полезное пойти сделать.
Кратко, структура:
Решение работает в моей конторе уже полгода, никаких проблем не возникало, пользователи о ней знать не знают (но догадываются), безопасник и руководство довольны. Нугрузка nircmd на проц на самом допотопном ПК в конторе составляет 1-2%.
Рассмотрим вариант, как мы можем это все реализовать. Что нам нужно?
- Программа, работающая в скрытом режиме, без уведомлений, не содержащая кода, определяемого как вирус, легкая и не мешающая работе самого пользователя.
- Сетевое хранилище из расчета максимум 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%.