Яндекс.Метрика

    Песочница

    Аудит системных вызовов в 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.