Песочница →
Аудит системных вызовов в Linux
Теория
Для работы auditd, необходимо что бы ядро было собрано с опциями AUDIT и AUDITSYSCALL
$ grep AUDIT /boot/config-`uname -r`
# CONFIG_AUDIT_ARCH is not set
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_TREE=y
CONFIG_AUDIT_GENERIC=y
AUDIT отвечает за общую подсистему аудита в ядре Linux, которую также использует SELinux. AUDITSYSCALL отвечает за инфраструктуру аудита системных вызовов, которая также используется в SELinux.
Основные особенности системы аудита в ядре Linux:
- Минимальный оверхед, как при активированном, так и при отключенном аудите
- Фильтрация на уровня ядра, что бы обеспечить наименьшие издержки
- Использование Netlink в пользовательских приложений
Установка
Установка auditd довольно просто, для Debian/Ubuntu:
$sudo apt-get install auditd
для CentOS:
#yum install audit
Домашняя страница проекта: people.redhat.com/sgrubb/audit/
Настройка
Конфигурационный файл auditd /etc/audit/auditd.conf. На каждой строке может быть определена не более чем одна директива. Название директы и значение разделяет знак равно. Большинство директив отвечают за настройку логирования и не требуют изменения. Для подробного ознакомления можно почитать man auditd.conf.
Правила аудита
Правила аудита содержатся в файле /etc/audit/audit.rules.
auditctl -l просмотреть список правил и auditctl -D для удаления всех правил
Аудит доступа к файлам
Основные аргументы для правил аудита доступа к файлам:
- -p [r|w|x|a] — фильтр по характеру доступа
- -w path — путь до наблюдаемых файлов
Добавим правила в runtime для директории /sys
sudo auditctl -w /sys/ -p ra
Запустим skype и посмотрем результат:
sudo aureport -f
/sbin/audispd permissions should be 0750
File Report
===============================================
# date time file syscall success exe auid event
===============================================
1. 16.01.2011 22:42:04 /sys/class/video4linux/video0/dev 5 yes /usr/bin/skype -1 23
2. 16.01.2011 22:42:03 /sys/devices/system/cpu 5 yes /usr/bin/skype -1 22
3. 16.01.2011 22:42:04 /sys/class/video4linux/video0/device/modalias 5 yes /usr/bin/skype -1 24
4. 16.01.2011 22:42:04 /sys/class/dmi/id/sys_vendor 5 yes /usr/bin/skype -1 25
5. 16.01.2011 22:42:04 /sys/class/dmi/id/product_name 5 yes /usr/bin/skype -1 26
6. 16.01.2011 22:42:04 /sys/class/dmi/id/product_version 5 yes /usr/bin/skype -1 27
7. 16.01.2011 22:42:04 /sys/class/dmi/id/board_vendor 5 yes /usr/bin/skype -1 28
8. 16.01.2011 22:42:04 /sys/class/dmi/id/board_name 5 yes /usr/bin/skype -1 29
9. 16.01.2011 22:42:04 /sys/class/dmi/id/board_version 5 yes /usr/bin/skype -1 30
Аудит системных вызовов
Основные атрибуты:
- -a list,action и -A list,action добавляет правило action в конец(-A в начало) списка list. О доступных list можно прочитать в man auditctl. actions never не генерирует событие, а always создает событие.
- -S [Syscall name or number|all] — наблюдаемые вызовы
- -F [n=v | n!=v | n<v | n>v | n<=v | n>=v | n&v | n&=v] всевозможные фильтры
auditctl -a exit,always -S open -F success=0 активирует аудит всех вызовов open() c кодом возврата больше меньше 0 и генерацией события во время выхода из системного вызова.
#auditctl -a exit,always -S open -F success=0
# touch /tmp/foo
# tail -1 /var/log/audit/audit.log
type=SYSCALL msg=audit(1295200915.069:14977): arch=c000003e syscall=2 success=no exit=-2 a0=7ff2f0ad4f60 a1=0 a2=7ff2f0d05010 a3=7fff56687650 items=1 ppid=1915 pid=16551 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=4294967295 comm="tail" exe="/usr/bin/tail" key=(null)
Узнать имя системного вызова по номеру можно из include/linux/unistd.h.
16.01.2011 21:09+0300