В этом руководстве вы узнаете, как узнать, кто редактировал файлы в Linux.
Linux предоставляет пользовательские инструменты для аудита безопасности под названием auditd (Audit daemon). auditd отслеживает все изменения, происходящие в системе, и генерирует журналы, которые можно проанализировать, чтобы получить представление о состоянии безопасности системы.
Как найти пользователя, который редактировал файлы в Linux
Не существует простого способа узнать, кто и какие файлы изменил на Linux.
Однако auditd делает этот процесс простым.
Итак, как узнать, кто редактировал файлы в Linux?
Установка пакетов auditd на Linux
В этом руководстве мы будем использовать две системы, на базе Debian и RHEL, чтобы показать, как пакет Audit может быть использован для выяснения того, кто редактировал файлы в Linux.
Как отследить, кто удаляет файл в CentOS / RHEL, используя Auditd
Для начала установите пакеты auditd на Linux.
В дистрибутиве на базе RHEL:
yum install audit -y
В дистрибутивах на базе Debian;
apt install auditd -y
Инструменты пакета Audit
Пакет Audit поставляется с несколькими инструментами с различными функциональными возможностями.
К ним относятся:
- auditd – компонент пользовательского пространства, который отвечает за запись записей аудита на диск.
- ausearch – пользовательский компонент для запроса логов демона аудита.
- aureport – пользовательский компонент, создающий сводные отчеты по логам аудита.
- auditctl – программа, используемая для настройки параметров ядра, связанных с аудитом, просмотра состояния конфигурации и загрузки дискреционных правил аудита. При загрузке системы auditctl считывает правила в файле /etc/audit/audit.rules и загружает их в ядро.
Чтобы проверить состояние;
systemctl status auditd
● auditd.service - Security Auditing Service Loaded: loaded (/lib/systemd/system/auditd.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-12-08 17:52:49 EAT; 25min ago Docs: man:auditd(8) https://github.com/linux-audit/audit-documentation Process: 1336 ExecStart=/sbin/auditd (code=exited, status=0/SUCCESS) Process: 1340 ExecStartPost=/sbin/augenrules --load (code=exited, status=0/SUCCESS) Main PID: 1337 (auditd) Tasks: 2 (limit: 5902) Memory: 616.0K CPU: 25ms CGroup: /system.slice/auditd.service └─1337 /sbin/auditd Dec 08 17:52:49 debian11 augenrules[1350]: enabled 1 Dec 08 17:52:49 debian11 augenrules[1350]: failure 1 Dec 08 17:52:49 debian11 augenrules[1350]: pid 1337 Dec 08 17:52:49 debian11 augenrules[1350]: rate_limit 0 Dec 08 17:52:49 debian11 augenrules[1350]: backlog_limit 8192 Dec 08 17:52:49 debian11 augenrules[1350]: lost 0 Dec 08 17:52:49 debian11 augenrules[1350]: backlog 0 Dec 08 17:52:49 debian11 augenrules[1350]: backlog_wait_time 60000 Dec 08 17:52:49 debian11 augenrules[1350]: backlog_wait_time_actual 0 Dec 08 17:52:49 debian11 systemd[1]: Started Security Auditing Service.
Узнаем, кто отредактировал файлы в Linux с помощью Auditd
Для того чтобы узнать, кто редактировал файлы в Linux с помощью Auditd, необходимо настроить правила аудита файловой системы.
Обратите внимание, что существуют различные правила аудита, которые определяют, как отслеживать изменения в системе. К ним относятся:
Control rules
: Позволяют изменять поведение системы аудита и некоторые ее конфигурации.
File system rules
:позволяют проводить аудит доступа к определенному файлу или каталогу. Они также известны как “файловые часы”.
System call rules
: Позволяют вести журнал системных вызовов, которые выполняет любая указанная программа.
Нас интересуют только file system rules, поскольку они позволяют нам узнать, кто редактировал файлы в Linux.
Как было сказано выше, утилита auditctl может быть использована для настройки правил аудита.
Настройка правил аудита файловой системы
Вы можете настроить правила аудита файловой системы в командной строке с помощью команды auditctl.
Синтаксис команды следующий;
auditctl -w path_to_file -p access_permissions -k filter_key
Используются следующие опции:
- -w path_to_file: определяет путь к объекту файловой системы, за которым ведется наблюдение.
- -p access_permissions: (-p [r|w|x|a]) Описывает тип разрешения доступа, на который будет срабатывать наблюдение за файловой системой. r=чтение, w=запись, x=выполнение, a=изменение атрибутов. Обратите внимание, что это не стандартные разрешения файлов, а скорее системный вызов, который будет выполнять подобные действия.
- -k filter_key: определяет произвольную строку текста, длина которой может достигать 31 байта. Она может однозначно идентифицировать записи аудита, созданные правилом.
Например, мы хотим следить за изменениями чтения/записи и атрибутов файла /etc/ssh/sshd_config, тогда мы определим правило следующим образом;
auditctl -w /etc/ssh/sshd_config -p wax -k monitor_sshd_conf
Образец вывода;
-a always,exit -F arch=b64 -S execve -F path=/bin/systemctl -F key=systemctl -F key=medium -a always,exit -F arch=b64 -S execve -F path=/sbin/service -F key=service -F key=medium
Чтобы проверить это правило, попробуйте изменить файл /etc/ssh/sshd_config.
От имени пользователя (не root) выполните команду следующим образом;
echo "AllowUsers itsecforu root" | sudo tee -a /etc/ssh/sshd_config
Если вы хотите прекратить мониторинг файла с помощью auditctl;
auditctl -W /etc/ssh/sshd_config -p wax -k monitor_sshd_conf
Настройка правил аудита файловой системы
Чтобы настроить постоянные правила, сохраняющиеся при перезагрузке системы, вы можете разместить правила в каталоге /etc/audit/audit.rules или в каталоге /etc/audit/rules.d/.
Правила в файле /etc/audit/audit.rules создаются на основе правил, определенных в каталоге /etc/audit/rules.d/.
Если правила размещены в каталоге /etc/audit/rules.d/, их необходимо загрузить с помощью утилиты augenrules.
Например:
echo "-w /etc/ssh/sshd_config -p wxa -k monitor_sshd_conf" > /etc/audit/rules.d/sshd.rules
Проверьте, обнаружены ли изменения;
augenrules --check
Загрузите правила;
augenrules --load
Это должно обновить файл /etc/audit/audit.rules.
Перезапустите службу auditd;
systemctl restart auditd
Проверьте правила;
auditctl -l
Существуют различные способы, с помощью которых можно просматривать записи логов аудита.
Чтение файла логов аудита, /var/log/audit/audit.log.
grep --color monitor_sshd_conf /var/log/audit/audit.log
type=CONFIG_CHANGE msg=audit(1638984278.290:13): auid=1000 ses=3 subj==unconfined op=add_rule key="monitor_sshd_conf" list=4 res=1AUID="itsecforu " type=SYSCALL msg=audit(1638984357.760:38): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=7fffe54487de a2=441 a3=1b6 items=2 ppid=987 pid=988 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=5 comm="tee" exe="/usr/bin/tee" subj==unconfined key="monitor_sshd_conf"ARCH=x86_64 SYSCALL=openat AUID="itsecforu" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root"
Создание отчета с помощью aureport (подробнее читайте в man aureport)
aureport -i -k
Key Report =============================================== # date time key success exe auid event =============================================== 1. 12/08/2021 20:24:38 monitor_sshd_conf yes ? itsecforu 13 2. 12/08/2021 20:25:57 monitor_sshd_conf yes /usr/bin/tee itsecforu 38
Выполним поиск в логах с помощью команды ausearch (подробнее читайте в man ausearch).
ausearch -i -k monitor_sshd_conf
---- type=CONFIG_CHANGE msg=audit(12/08/2021 20:24:38.290:13) : auid=itsecforu ses=3 subj==unconfined op=add_rule key=monitor_sshd_conf list=exit res=yes ---- type=PROCTITLE msg=audit(12/08/2021 20:25:57.760:38) : proctitle=tee -a /etc/ssh/sshd_config type=PATH msg=audit(12/08/2021 20:25:57.760:38) : item=1 name=/etc/ssh/sshd_config inode=526305 dev=08:01 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 type=PATH msg=audit(12/08/2021 20:25:57.760:38) : item=0 name=/etc/ssh/ inode=523877 dev=08:01 mode=dir,755 ouid=root ogid=root rdev=00:00 nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 type=CWD msg=audit(12/08/2021 20:25:57.760:38) : cwd=/home/itsecforu type=SYSCALL msg=audit(12/08/2021 20:25:57.760:38) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffff9c a1=0x7fffe54487de a2=O_WRONLY|O_CREAT|O_APPEND a3=0x1b6 items=2 ppid=987 pid=988 auid=kifarunix uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=5 comm=tee exe=/usr/bin/tee subj==unconfined key=monitor_sshd_conf
Из вывода отчета ausearch попробуем интерпретировать поля записей.
- type=PROCTITLE: Тип записи, который дает полную командную строку, вызвавшую это событие аудита.
- msg=audit(12/08/2021 20:24:38.290:13): Определяет метку времени и уникальный ID записи в форме audit(time_stamp:ID). Время обычно отображается в EPOCH, если вы не используете опцию -i.
Если время в EPOCH, например, 1638984357.760, то преобразуйте его с помощью команды date;
date -d @1638984357.760
Wed 08 Dec 2021 08:25:57 PM EAT
- proctitle=tee -a /etc/ssh/sshd_config: В поле записывается полная строка команды, которая была использована для вызова анализируемого процесса. Без опции -i она была бы отображена в шестнадцатеричном виде.
- type=PATH: тип записи PATH записывает путь, который передается системному вызову в качестве аргумента, в данном случае путь – /etc/ssh/sshd_config.
- item=1: поле item указывает, какой элемент из общего числа элементов, на которые ссылается запись типа SYSCALL, является текущим. значение 1 означает, что это второй элемент.
- name=/etc/ssh/sshd_config: Записывает путь к файлу или каталогу, который был передан системному вызову в качестве аргумента. В данном случае это был файл /etc/ssh/sshd_config.
- inode=526305: поле inode содержит номер inode, связанный с файлом или каталогом, записанным в этом событии. Следующая команда отображает файл или каталог, связанный с номером inode 526305:
find / -inum 526305 -print
/etc/ssh/sshd_config
- dev=08:01: Поле определяет минорный и мажорный идентификатор устройства, которое содержит файл или каталог, записанный в этом событии.
- mode=file,644: Поле mode записывает разрешения на файл или каталог, 644 означает -rw-r-r- для файла /etc/ssh/sshd_config.
- ouid=root: В поле ouid записывается идентификатор пользователя/имя пользователя владельца объекта.
- ogid=root: В поле ogid записывается идентификатор группы/имя пользователя владельца объекта.
- rdev=00:00: Поле rdev содержит записанный идентификатор устройства только для специальных файлов. В данном случае оно не используется, так как записанный файл является обычным файлом.
- nametype=NORMAL: записывает намерение операции каждой записи пути в контексте данного системного вызова.
- cap_fp=none: Поле cap_fp записывает данные, связанные с установкой разрешенной возможности объекта файла или каталога на основе файловой системы.
- cap_fi=none: В поле cap_fi записываются данные, связанные с установкой унаследованной возможности файловой системы объекта файла или каталога.
- cap_fe=0: В поле cap_fe записывается установка эффективного бита возможности объекта файла или каталога на основе файловой системы.
- cap_fver=0: В поле cap_fver записывается версия возможности объекта файла или каталога на основе файловой системы.
- type=CWD: записывает рабочий каталог, из которого выполнялся процесс, вызвавший системный вызов.
- cwd=/home/kifarunix: указывает каталог, в котором был вызван системный вызов.
- type=SYSCALL: указывает, что запись была вызвана системным вызовом ядра.
- arch=x86_64: Поле содержит информацию об архитектуре процессора системы. Если опция -i не используется с auseardh, значение отображается в шестнадцатеричной системе счисления.
- syscall=openat: В поле syscall записывается тип системного вызова, который был послан ядру. Если с ausearch используется опция -i, значения интерпретируются, в противном случае показываются числовые значения. Используйте команду ausyscall –dump, чтобы вывести список всех системных вызовов вместе с их номерами. Для получения дополнительной информации см. man ausyscall.
- success=yes: В поле success записывается, был ли системный вызов, записанный в данном событии, успешным или неудачным. В данном случае вызов прошел успешно.
- exit=3: Поле содержит значение, определяющее код завершения, возвращенный системным вызовом. Для разных системных вызовов это значение различно.
- a0=0xffffff9c a1=0x7fffe54487de a2=O_WRONLY|O_CREAT|O_APPEND a3=0x1b6: Поля a0 – a3 записывают первые четыре аргумента, закодированные в шестнадцатеричной системе счисления, системного вызова в данном событии. Эти аргументы зависят от используемого системного вызова.
- items=2: Поле items содержит количество вспомогательных записей PATH, которые следуют за записью системного вызова.
- ppid=987: В поле ppid записывается идентификатор родительского процесса (PPID).
- pid=988: В поле pid записывается идентификатор процесса (PID).
- auid=itsecforu: В поле auid записывается идентификатор пользователя аудита, то есть loginuid. Этот идентификатор присваивается пользователю при входе в систему и наследуется каждым процессом, даже если личность пользователя меняется, например, при смене учетной записи.
- uid=root: В поле uid записывается идентификатор пользователя, который запустил анализируемый процесс. Идентификатор пользователя может быть интерпретирован в имена пользователей при использовании опции -i с ausearch. Вы также можете интерпретировать с помощью следующей команды: ausearch -i -uid UID.
- gid=root: В поле gid записывается идентификатор группы пользователя, который запустил анализируемый процесс.
- euid=root: В поле euid записывается эффективный идентификатор пользователя, запустившего анализируемый процесс.
- suid=root: В поле suid записывается установленный идентификатор пользователя, запустившего анализируемый процесс.
- fsuid=root: В поле fsuid записывается идентификатор пользователя файловой системы пользователя, запустившего анализируемый процесс.
- egid=root: В поле egid записывается идентификатор эффективной группы пользователя, запустившего анализируемый процесс.
- sgid=root: В поле sgid записывается идентификатор установленной группы пользователя, запустившего анализируемый процесс.
- fsgid=root: В поле fsgid записывается идентификатор группы файловой системы пользователя, запустившего анализируемый процесс.
- tty=pts1: В поле tty записывается терминал, с которого был вызван анализируемый процесс.
- ses=5: В поле ses записывается идентификатор сессии, из которой был вызван анализируемый процесс.
- comm=tee: В поле comm записывается имя командной строки команды, которая была использована для вызова анализируемого процесса.
- exe=/usr/bin/tee: В поле exe записывается путь к исполняемому файлу, который был использован для вызова анализируемого процесса.
- subj=unconfined: В поле subj записывается контекст SELinux, которым был помечен анализируемый процесс во время выполнения.
- key=monitor_sshd_conf: В поле key записывается определяемая администратором строка, связанная с правилом, которое породило это событие в логах аудита.
---- type=CONFIG_CHANGE msg=audit(12/08/2021 20:24:38.290:13) : auid=kifarunix ses=3 subj==unconfined op=add_rule key=monitor_sshd_conf list=exit res=yes ---- type=PROCTITLE msg=audit(12/08/2021 20:25:57.760:38) : proctitle=tee -a /etc/ssh/sshd_config type=PATH msg=audit(12/08/2021 20:25:57.760:38) : item=1 name=/etc/ssh/sshd_config inode=526305 dev=08:01 mode=file,644 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 type=PATH msg=audit(12/08/2021 20:25:57.760:38) : item=0 name=/etc/ssh/ inode=523877 dev=08:01 mode=dir,755 ouid=root ogid=root rdev=00:00 nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0 type=CWD msg=audit(12/08/2021 20:25:57.760:38) : cwd=/home/itsecforu type=SYSCALL msg=audit(12/08/2021 20:25:57.760:38) : arch=x86_64 syscall=openat success=yes exit=3 a0=0xffffff9c a1=0x7fffe54487de a2=O_WRONLY|O_CREAT|O_APPEND a3=0x1b6 items=2 ppid=987 pid=988 auid=itsecforu uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=5 comm=tee exe=/usr/bin/tee subj==unconfined key=monitor_sshd_conf
Видно, что:
- файл конфигурации SSH-сервера, /etc/ssh/sshd_config, был обновлен с помощью команды tee.
- Команда была выполнена из каталога /home/itsecforu.
- Изменения были внесены пользователем itsecforu от пользователя root (с помощью sudo).
Заключение
Вот и все о том, как узнать, кто редактировал файлы в Linux. Конечно, вы можете настроить больше правил по своему усмотрению.