Thank you for reading this post, don't forget to subscribe!
Linux предоставляет пользовательские инструменты для аудита безопасности под названием auditd (Audit daemon). auditd отслеживает все изменения, происходящие в системе, и генерирует журналы, которые можно проанализировать, чтобы получить представление о состоянии безопасности системы.
Как найти пользователя, который редактировал файлы в Linux
Не существует простого способа узнать, кто и какие файлы изменил на Linux.
Однако auditd делает этот процесс простым.
Установка пакетов auditd на Linux
В этом руководстве мы будем использовать две системы, на базе Debian и RHEL, чтобы показать, как пакет Audit может быть использован для выяснения того, кто редактировал файлы в Linux.
Red Hat Enterprise Linux предоставляет функцию правил аудита для регистрации действий файлов, выполненных пользователями или процессами.
Это может быть достигнуто путем настройки правил аудита.
Выполните шаги, описанные ниже, чтобы настроить правила audd для мониторинга удаления файлов в системе CentOS / RHEL.
Шаги настройки правил аудита для CentOS / RHEL 4,5,6
1. Чтобы настроить правила аудита, добавьте следующую строку в файл /etc/audit.rules (для RHEL 5,6 используйте файл /etc/audit/audit.rules).
Для CentOS / RHEL 4:
1 2 3 4 5 6 7 8 |
# tail -2 /etc/audit.rules auditctl -a exit,always -F arch=b32 -S unlink auditctl -a exit,always -F arch=b64 -S unlink Для CentOS/RHEL 5 и 6: # tail -2 /etc/audit/audit.rules -a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -S rmdir -k delete -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -S rmdir -k d |
2. При желании вы можете указать полный путь к каталогу для просмотра, например, если вы хотите отслеживать удаление файлов только в определенной файловой системе, вы можете указать точку монтирования, добавив следующее поле в правило аудита:
-F dir=[directory or mount point]
3. После написания правил перезапустите службу auditd и включите ее, чтобы сохранить правила после перезагрузки.
# /etc/init.d/auditd restart
# chkconfig auditd on
Auditd будет регистрировать операции удаления в файле /var/log/audit/audit.log, однако мы можем использовать команду ausearch с ключом, указанным в правиле аудита (-k), для просмотра событий:
# ausearch -k delete
Шаги для CentOS / RHEL 7
1. Чтобы настроить правила аудита, добавьте следующую строку в файл /etc/audit/rules.d/audit.rules.
1 2 3 |
# tail -2 /etc/audit/rules.d/audit.rules -a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -S rmdir -k delete -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -S rmdir -k delete |
2. При желании вы можете указать полный путь к каталогу для просмотра, например, если вы хотите отслеживать удаление файлов только в определенной файловой системе, вы можете указать точку монтирования, добавив следующее поле в правило аудита:
-F dir=[directory or mount point]
3. После написания правил перезапустите службу auditd и включите ее, чтобы сохранить правила после перезагрузки.
# service auditd restart ### use of command service instead of systemctl is intentional here.
# systemctl enable auditd
Auditd будет регистрировать операции удаления файла в файле /var/log/audit/audit.log, однако мы можем использовать команду ausearch с ключом, указанным в правиле аудита (-k), для просмотра событий:
# ausearch -k delete
===============================================
В дистрибутивах на базе Debian;
apt install auditd -y
Инструменты пакета Audit
Пакет Audit поставляется с несколькими инструментами с различными функциональными возможностями.
К ним относятся:
- auditd – компонент пользовательского пространства, который отвечает за запись записей аудита на диск.
- ausearch – пользовательский компонент для запроса логов демона аудита.
- aureport – пользовательский компонент, создающий сводные отчеты по логам аудита.
- auditctl – программа, используемая для настройки параметров ядра, связанных с аудитом, просмотра состояния конфигурации и загрузки дискреционных правил аудита. При загрузке системы auditctl считывает правила в файле /etc/audit/audit.rules и загружает их в ядро.
Чтобы проверить состояние;
systemctl status auditd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
● 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
Образец вывода;
1 2 |
-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
1 2 |
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
1 2 3 4 5 |
=============================================== # 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
1 2 3 4 5 6 7 8 |
---- 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 записывается определяемая администратором строка, связанная с правилом, которое породило это событие в логах аудита.
1 2 3 4 5 6 7 8 |
---- 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).