Как собирать журналы командной строки
Практическое руководство по организации аудита выполнения команд в Windows и Linux. От настройки системных политик до централизованного сбора и корреляции событий для расследования инцидентов.
Почему логирование командной строки критично для безопасности
Командная строка остаётся основным интерфейсом для администрирования систем и одновременно — предпочтительным инструментом злоумышленников после получения доступа. Через cmd.exe, PowerShell, bash или sh выполняются скрипты, загружаются утилиты, изменяются конфигурации, извлекаются данные.
Я начинаю настройку с понимания того, что разные оболочки генерируют события по-разному. Windows Process Creation (Event ID 4688) фиксирует запуск процесса с аргументами, но требует включения аудита и расширенного логирования. PowerShell имеет собственные механизмы Script Block Logging и Module Logging. В Linux auditd перехватывает системные вызовы execve, а bash_history хранит команды пользователя — но только если оболочка завершается корректно.
Важный момент: сбор командной строки затрагивает вопросы обработки персональных данных и служебной информации. Я применяю фильтрацию чувствительных параметров на этапе нормализации — маскирую пароли, токены, пути к конфиденциальным файлам — чтобы избежать избыточного сбора и соответствовать требованиям регуляторов.
схема потока
командных логов]
Механизмы логирования в Windows
| Механизм | Что фиксирует | Особенности настройки |
|---|---|---|
| Process Creation 4688 | Имя процесса, аргументы командной строки, пользователь, сессия, родительский процесс | Включить через GPO: Audit Process Creation + Include command line in process creation events |
| PowerShell Script Block Logging | Исходный код выполняемых скриптов, включая обфусцированные и декодированные блоки | Включить через реестр или GPO: Enable Script Block Logging в PowerShell transcription |
| PowerShell Module Logging | Вызовы cmdlet, параметры, конвейеры, модули | Настроить Pipeline Execution Details + Module Logging через GPO |
| Sysmon Event ID 1 | Детальная информация о процессе: хеши, командная строка, сетевые подключения, родитель-потомок | Установить Sysmon с конфигурацией, включающей ProcessCreate и CommandLine |
| Transcription PowerShell | Полная запись сессии PowerShell: ввод, вывод, ошибки, в текстовый файл | Включить через GPO: Turn on PowerShell Transcription с указанием пути и включения invocation headers |
Я применяю комбинацию механизмов: 4688 для базового покрытия всех процессов, Script Block Logging для PowerShell-активности, Sysmon для глубокой телеметрии. Это создаёт перекрёстную проверку и снижает риск пропуска событий при обходе одного из каналов.
Настройка аудита команд в Linux
В Linux-средах логирование командной строки реализуется через несколько независимых механизмов. Каждый имеет свои преимущества и ограничения, поэтому я настраиваю их совместно для максимального покрытия.
auditd для перехвата execve
# Установка правил auditd для логирования выполнения команд # /etc/audit/rules.d/command-logging.rules # Логировать все вызовы execve для пользователей с UID >= 1000 -a always,exit -F arch=b64 -S execve -F auid>=1000 -F auid!=4294967295 -k user_commands -a always,exit -F arch=b32 -S execve -F auid>=1000 -F auid!=4294967295 -k user_commands # Логировать выполнение конкретных утилит -w /usr/bin/curl -k network_download -w /usr/bin/wget -k network_download -w /usr/bin/nc -k network_tool -w /usr/bin/bash -k shell_execution -w /usr/bin/python3 -k script_execution # Исключить системные службы для снижения шума -a never,exit -F arch=b64 -S execve -F auid=0 -F exe=/usr/sbin/sshd -a never,exit -F arch=b64 -S execve -F auid=0 -F exe=/usr/sbin/cron
auditd работает на уровне ядра, перехватывая системные вызовы до выполнения. Это делает его устойчивым к обходу через модификацию оболочек или переменных окружения.
bash_history и его ограничения
HISTFILE сохраняет команды после завершения сессии, но имеет уязвимости: пользователь может очистить историю, отключить запись через HISTSIZE=0, использовать приватные сессии.
# Усиление bash_history через /etc/profile.d/audit.sh # Запрет отключения истории readonly HISTSIZE=10000 readonly HISTFILESIZE=20000 export HISTTIMEFORMAT="%F %T " # Отправка команд в syslog в реальном времени export PROMPT_COMMAND='logger -t bash_history -p local6.info "USER=$(whoami) PWD=$PWD CMD=$(history 1)"' # Запрет на редактирование переменных readonly PROMPT_COMMAND
PROMPT_COMMAND отправляет каждую команду в syslog до её выполнения. Это даёт реальное время логирования, но требует доверия к пользователю — он может обойти через запуск другой оболочки.
process accounting (acct/psacct)
# Установка и настройка process accounting apt install acct # или yum install psacct systemctl enable acct systemctl start acct # Просмотр выполненных команд lastcomm --user username lastcomm --command bash lastcomm --exec /usr/bin/curl # Экспорт в читаемый формат acctdump /var/log/account/pacct | grep "2026-02-27"
Process accounting записывает метаданные выполнения: имя команды, пользователь, время старта/финиша, коды завершения. Не хранит аргументы командной строки, но полезен для ретроспективного анализа.
eBPF для продвинутого мониторинга
eBPF-программы позволяют перехватывать события выполнения с минимальным overhead и гибкой фильтрацией. Требуют ядра 4.x+ и root-доступа для загрузки программ.
# Пример eBPF-скрипта через bpftrace для логирования exec
bpftrace -e '
tracepoint:syscalls:sys_enter_execve
/uid >= 1000/
{
printf("%s %s executed by uid %dn", comm, str(args->argv[0]), uid);
}'
# Альтернатива через falco с правилами
- rule: Shell spawned in container
desc: Detect shell execution in container
condition: >
spawned_process and container
and shell_procs
output: "Shell spawned in container (user=%user.name container=%container.id)"
priority: WARNING
Централизованный сбор и нормализация событий
Локальные логи уязвимы к потере при компрометации хоста. Я организую доставку в реальном времени с буферизацией и шифрованием, затем нормализую события к единой структуре для последующего анализа.
| Источник | Формат сырых данных | Нормализованные поля |
|---|---|---|
| Windows 4688 | EventLog XML с полями NewProcessName, CommandLine, SubjectUserName | event_type:process_create, exe_path, cmdline_args, user, parent_pid, timestamp |
| PowerShell Script Block | Event ID 4104 с ScriptBlockText в Base64 или plaintext | event_type:powershell_script, script_content, user, host, decoded_flag |
| Linux auditd execve | audit.log строки с type=EXECVE, argc, a0, a1… | event_type:exec_command, exe_path, argv_array, uid, cwd, timestamp |
| Sysmon Event 1 | JSON/XML с ProcessCreate, CommandLine, ParentProcessGuid | event_type:sysmon_process, cmdline, parent_exe, hash_md5, hash_sha256 |
Нормализацию реализую через Grok-паттерны в Logstash или Lua-скрипты в Fluentd. Для PowerShell-скриптов добавляю декодирование Base64 и удаление обфускации через простые эвристики — замена $env:var на значения, раскрытие here-strings.
Корреляция событий для обнаружения аномалий
Отдельная команда редко указывает на атаку. Корреляция объединяет события во временном окне, выявляя паттерны, характерные для malicious activity.
Пример правила корреляции
rule: suspicious_powershell_chain
description: Обнаружение цепочки PowerShell с загрузкой и выполнением
conditions:
- event_type: powershell_script
- script_content MATCH "(IEX|Invoke-Expression|DownloadString|WebClient)"
- count >= 2
- time_window: 5m
- group_by: [user, host]
actions:
- severity: high
- alert: true
- enrich:
- user_risk_score
- process_tree
- notify: soc_team
Это правило срабатывает при двух и более PowerShell-скриптах с признаками загрузки кода за 5 минут от одного пользователя. Система добавляет оценку риска пользователя и строит дерево процессов для контекста.
Сценарии для детектирования
[✓] Последовательность: процесс с аргументами -EncodedCommand → загрузка файла → выполнение — почему: типичный паттерн fileless-атаки через PowerShell
[✓] Команда curl/wget с последующим chmod +x и запуском — почему: признак загрузки и выполнения внешней утилиты
[✓] Выполнение certutil -decode или bitsadmin /transfer — почему: легитимные утилиты, часто используемые для обхода защиты
[ ] Массовое выполнение find/grep по чувствительным путям — почему: может указывать на поиск данных, но требует контекста роли пользователя
Фильтрация чувствительных данных в логах
Командная строка может содержать пароли, токены, пути к конфиденциальным файлам. Я применяю маскирование на этапе нормализации или в агенте сбора, чтобы избежать избыточного сбора персональных данных.
Паттерны для маскирования
# Пример Grok-паттерна для Logstash для маскирования секретов
filter {
if [event_type] == "process_create" or [event_type] == "exec_command" {
mutate {
gsub => [
"cmdline_args", "(?i)(password|passwd|pwd|token|api[_-]?key|secret)[=:s]+[^s]+", "1=***",
"cmdline_args", "(?i)(Bearer|Basic)s+[A-Za-z0-9+/=]+", "Authorization: ***",
"cmdline_args", "(?i)https?://[^:]+:[^@]+@", "https://***:***@"
]
}
}
}
# Альтернатива через Lua-скрипт в Fluentd
function filter(tag, time, record)
if record["cmdline_args"] then
record["cmdline_args"] = record["cmdline_args"]
:gsub("(password|token|secret)[=:%s]+[^%s]+", "%1=***")
:gsub("(https?://)[^:]+:[^@]+@", "%1***:***@")
end
return true, record
end
Маскирование применяю после парсинга, но до отправки в хранилище. Это сохраняет возможность поиска по структуре команды, но скрывает чувствительные значения от аналитиков без специальных прав.
Контроль доступа к логам
[✓] Разделение ролей: сбор, анализ, администрирование — разные учётные записи — почему: предотвращает злоупотребление привилегиями одним пользователем
[✓] MFA для доступа к интерфейсу и API — почему: блокирует использование украденных учётных данных
[✓] Аудит действий администраторов самой системы логирования — почему: обеспечивает подотчётность тех, кто имеет доступ к доказательной базе
[✓] Шифрование данных в покое и при передаче — почему: защищает от утечки при компрометации хранилища или перехвате трафика
Сбор журналов командной строки превращает разрозненные события выполнения в единый источник аналитики и расследования. Ключ к эффективности — комбинация механизмов логирования, надёжная доставка, структурированная нормализация и фильтрация чувствительных данных. Система должна работать незаметно, пока не потребуется расследование инцидента.