Как собирать журналы командной строки

Как собирать журналы командной строки

Практическое руководство по организации аудита выполнения команд в Windows и Linux. От настройки системных политик до централизованного сбора и корреляции событий для расследования инцидентов.

Почему логирование командной строки критично для безопасности

Командная строка остаётся основным интерфейсом для администрирования систем и одновременно — предпочтительным инструментом злоумышленников после получения доступа. Через cmd.exe, PowerShell, bash или sh выполняются скрипты, загружаются утилиты, изменяются конфигурации, извлекаются данные.

Я начинаю настройку с понимания того, что разные оболочки генерируют события по-разному. Windows Process Creation (Event ID 4688) фиксирует запуск процесса с аргументами, но требует включения аудита и расширенного логирования. PowerShell имеет собственные механизмы Script Block Logging и Module Logging. В Linux auditd перехватывает системные вызовы execve, а bash_history хранит команды пользователя — но только если оболочка завершается корректно.

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

[placeholder
схема потока
командных логов]

Механизмы логирования в 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 — почему: блокирует использование украденных учётных данных

[✓] Аудит действий администраторов самой системы логирования — почему: обеспечивает подотчётность тех, кто имеет доступ к доказательной базе

[✓] Шифрование данных в покое и при передаче — почему: защищает от утечки при компрометации хранилища или перехвате трафика

Сбор журналов командной строки превращает разрозненные события выполнения в единый источник аналитики и расследования. Ключ к эффективности — комбинация механизмов логирования, надёжная доставка, структурированная нормализация и фильтрация чувствительных данных. Система должна работать незаметно, пока не потребуется расследование инцидента.

Оставьте комментарий