02.12.2021
Лого

Как логировать запуск команд в Powershell?

В этой статье поделюсь с Вами одним способом того, как логировать запуск команд в консоли Powershell. Способ основывается на использовании такой встроенной переменной как $Profile.

Формулировка задачи и немного о переменной $Profile

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

Переменная $Profile возвращает путь к скрипту, который инициализируется при каждом запуске консоли. Это своего рода как автозагрузка для Windows, но только для powershell.

Значение переменной $profile
Значение переменной $profile

По умолчанию этот файл (скрипт) отсутствует. Чтобы им можно было пользоваться, его необходимо создать с тем именем, которое возвращает переменная. Для классической консоли и консоли ISE файлы имеют свои имена:

  • $env:userprofile\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 – для классической консоли;
  • $env:userprofile\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1 – для консоли ISE.

Далее в нем можно описать какие-либо свои команды или функции. Ими можно будет пользоваться сразу после запуска консоли без необходимости их объявления при каждом запуске. Потому что они уже будут проиницализированы при старте консоли.

Реализация логирования

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

Что нужно сделать:

  • Создать файловую шару с правами на запись для целевых пользователей;
  • Настроить протоколирование с сохранением лога в файловую шару.

Создадим шару

В качестве примера файловой шары буду использовать папку на моем ПК

Настройка файловой шары
Настройка файловой шары

В этом примере я выдал права на изменение для группы “Все”. Не забывайте о том, чтобы не было противоречий с разрешениями на уровне NTFS. Если на вкладке безопасность для группы “Все” будет стоять запрет, логировать запуск команд не получится. В результате этих нехитрых действий папка доступна по пути – \\Vedroid\Share. В качестве сервера файловой шары конечно же может использоваться и удаленный сервер. Главное – это наличие сетевого доступа по протоколу SMB и наличие разрешений на запись.

Настроим протоколирование

Редактируем Profile-скрипт и пишем следующий код:

$date = Get-Date -Format "HH-mm dd-MM-yyyy" 
Start-Transcript -Path "\\Vedroid\Share\$env:USERNAME\$date.log" -Append -Force | Out-Null

В файловой шаре будет создана папка с именем пользователя – $env:USERNAME. А дата и время запуска консоли будет именем лог-файла. При запуске команды Start-Transcript она сообщает в консоль о том, что транскрибирование запущено:

PS C:\Windows\system32> Start-Transcript C:\1.txt
Транскрибирование запущено, выходной файл C:\1.txt

Чтобы это скрыть, мы используем командлет Out-Null. Таким образом транскрибирование запустится, но информация об этом не будет выведена в консоль.

Важно, чтобы profile-скрипт был выполнен при запуске консоли, в системе необходимо разрешить выполнение скриптов. По умолчанию в Windows 10 установлен запрет на запуск скриптов powershell. Для чего выполним команду Set-ExecutionPolicy Bypass. Если не разрешить выполнение скриптов, при запуске консоли будет получено сообщение об ошибке:

Windows PowerShell
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

Попробуйте новую кроссплатформенную оболочку PowerShell (https://aka.ms/pscore6)

. : Невозможно загрузить файл C:\Users\Admin\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1, так как выпо
лнение сценариев отключено в этой системе. Для получения дополнительных сведений см. about_Execution_Policies по адресу
 https:/go.microsoft.com/fwlink/?LinkID=135170.
строка:1 знак:3
+ . 'C:\Users\cherd\Documents\WindowsPowerShell\Microsoft.PowerShell_pr ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : Ошибка безопасности: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
PS C:\Windows\system32>

Конечно, установка в значение Bypass не очень безопасна, т.к. позволяет запускать вредоносные скрипты powershell. Выходом из ситуации может быть подписание скрипта электронной подписью и установкой Execution Policy в AllSigned. Подробнее о политиках запуска скриптов можно узнать здесь. Или можно обратиться к справке.

Таким образом, если все готово, при запуске консоли в файловой шаре появляется лог файл. В котором мы можем наблюдать все действия и полученный вывод. Запустим консоль и выполним любую команду для теста.

Результат логирования команд
Результат логирования команд

Конечно в такой конфигурации есть минус. Если пользователь выполнит команду Start-Transcript при уже запущенном транскрибировании, то получит соответствующее уведомление. И после выполнения Stop-Transcript логирование будет прекращено.

Так же есть риск в плане безопасности. Если злоумышленник имеет доступ в профиль пользователя, он может заменить код profile-скрипта. А если скрипта нет, то создать его. И этот код будет выполнен при запуске консоли от имени жертвы. Но такой риск существует всегда, не зависимо от темы текущей статьи. Охраняйте доступ к Вашему профилю!

Как масштабировать такую конфигурацию?

Для доставки скрипта на ПК пользователя в его профиль, можно использовать доменные групповые политики. Либо в образе ОС, если из него происходит установка ОС на новых ПК, добавить скрипт в дефолтный профиль. И после создания профиля нового пользователя на ПК, скрипт уже будет присутствовать в его профиле.

Игорь Чердаков

Мне 32 года. На текущий момент я являюсь администратором систем Microsoft в одной из крупнейших компаний в России. За моими плечами практически 7 лет опыта работы в IT, последние 3 из которых в администрировании. Сопровождая немалую инфраструктуру, в ежедневной деятельности я сталкиваюсь с необходимостью автоматизации рутинных процессов, в чем мне успешно помогает Powershell. Данный блог основывается на моем личном опыте и знаниях. Мои статьи не являются истиной в последней инстанции и я положительно отношусь к обоснованной и конструктивной критике. По этому я приглашаю Вас обсуждать волнующие нас вопросы, связанные с Powershell.

Посмотреть все записи автора Игорь Чердаков →

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

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