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

С помощью ауди­та мож­но реали­зовать жур­налиро­вание для сле­дующих событий:

  • дос­туп к объ­ектам фай­ловой сис­темы;
  • вы­пол­нение сис­темных вызовов;
  • за­пуск поль­зователь­ских команд;
  • ло­гины поль­зовате­лей;
  • дей­ствия с учет­ными запися­ми и при­виле­гиями.

В этой статье я рас­ска­жу, как устро­ена под­систе­ма ауди­та, как ей управлять, а так­же как получить жур­нал ауди­та всех инте­ресу­ющих тебя событий.

Под­систе­ма ауди­та в Linux сос­тоит из двух групп ком­понен­тов: в прос­транс­тве ядра это kauditd, а в поль­зователь­ском — auditd.

В общем виде схе­ма работы под­систе­мы ауди­та выг­лядит сле­дующим обра­зом.

Яд­ро, при­нимая сис­темные вызовы из user space, про­пус­кает их через филь­тры user, task, filesystem , exclude и exit.

  • Филь­тр user исполь­зует­ся для филь­тра­ции (исклю­чения) событий, про­исхо­дящих в поль­зователь­ском прос­транс­тве до отправ­ки в auditd. Прак­тичес­ки никог­да не исполь­зует­ся.
  • Филь­тр task при­меня­ется для сис­темных вызовов fork() и clone().
  • Филь­тр filesystem исполь­зует­ся для исклю­чения событий для кон­крет­ной фай­ловой сис­темы.
  • Филь­тр exclude зада­ет исклю­чения для событий.
  • Филь­тр exit про­ходят все сис­темные вызовы. Обыч­но нас­тра­ивают имен­но этот филь­тр.

Че­рез netlink(7) сооб­щения отправ­ляют­ся из kauditd в auditd. При получе­нии событий, демон auditd записы­вает их в лог (по умол­чанию /var/log/audit/audit.log).

Нас­тра­ивая филь­тры с помощью ути­литы auditctl, мы можем управлять потоком событий, который хотим получать. С помощью ути­лит ausearch, aureport, aulast удоб­но прос­матри­вать жур­нал ауди­та.

Да­вай теперь уста­новим и нас­тро­им все под­систе­мы ауди­та. Уста­нов­ка край­не прос­та и не вызыва­ет никаких слож­ностей:

$ sudo dnf install audit
$ sudo systemctl enable --now auditd

Ста­тус работы под­систе­мы ауди­та мож­но получить так:

$ sudo auditctl -s
enabled 1
failure 1
pid 885
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
backlog_wait_time 60000
loginuid_immutable 0 unlocked

Для тес­та есть воз­можность отпра­вить тек­сто­вое сооб­щение в под­систе­му ауди­та и убе­дить­ся, что соот­ветс­тву­ющее событие попало в жур­нал ауди­та.

$ sudo auditctl -m helloaudit
$ sudo ausearch -m USER
----
type=USER msg=audit(08/31/2021 19:20:11.160:330699) : pid=305708 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='text=helloaudit exe=/usr/sbin/auditctl hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success'

Нас­трой­ки демона auditd пред­став­лены в фай­ле /etc/audit/auditd.conf. Кон­фиг по умол­чанию рабочий и не тре­бует изме­нений, оставля­ем его как есть.

Раз­берем­ся теперь, как управлять филь­тра­ми kauditd. Все нас­трой­ки филь­тров груп­пиру­ются в фай­лы пра­вил. Фор­мат пра­вил ана­логи­чен син­такси­су кон­соль­ной прог­раммы auditctl. Демон auditd заг­ружа­ет эти пра­вила пос­ледова­тель­но при стар­те сис­темы либо вруч­ную по коман­де пользователя.

info

Важ­ный момент: что­бы наши пра­вила при­меня­лись пос­ле перезаг­рузки, необ­ходимо записать их в файл, в каталог /etc/audit/rules.d/.

При­меры пра­вил ты можешь най­ти в катало­ге /usr/share/audit/sample-rules/. Пра­вила ауди­та быва­ют сле­дующих типов:

  1. Уп­равля­ющие пра­вила нас­тра­ивают сис­тему ауди­та и поведе­ние аген­та. Все воз­можные опции перечис­лены в мане auditctl(8).
  2. Пра­вила фай­ловой сис­темы необ­ходимы для наб­людения за фай­лом или катало­гом, дос­туп к которым мы хотим кон­тро­лиро­вать. Фор­мат пра­вила сле­дующий:

    -w path-to-file -p permissions -k keyname

    Ключ -w ука­зыва­ет на то, что это пра­вило фай­ловой сис­темы. Далее сле­дует путь к фай­лу или катало­гу.

    Ключ -p может содер­жать любые ком­бинации прав дос­тупа r (чте­ние), w (запись), x (выпол­нение) и a (изме­нение атри­бута).

    Ключ -k зада­ет имя пра­вила, по которо­му впос­ледс­твии мож­но филь­тро­вать логи.

  3. Пра­вила сис­темных вызовов исполь­зуют­ся для монито­рин­га сис­темных вызовов, выпол­няемых любым про­цес­сом или кон­крет­ным поль­зовате­лем. Пра­вило име­ет сле­дующий фор­мат:

    -a action,list -S syscall -F field=value -k keyname

    Ключ -a озна­чает append (добав­ление) пра­вила в филь­тр.

    Дей­ствие action может быть always (всег­да соз­давать события) или never (никог­да не соз­давать события).

    Филь­тр list содер­жит один из воз­можных вари­антов: task, exit, user, filesystem или exclude.

    -S ука­зыва­ет кон­крет­ный syscall (имя или номер); мож­но в одном пра­виле ука­зывать сра­зу нес­коль­ко syscall, каж­дый пос­ле сво­его клю­ча -S.

    -F зада­ет филь­тр по полям. Рекомен­дует­ся всег­да ука­зывать раз­рядность, добав­ляя в пра­вила филь­тр -F arch=b64.

    Ключ -k — имя пра­вила. Как и в пра­виле фай­ловой сис­темы, исполь­зует­ся для мар­киров­ки событий для пос­леду­ющей филь­тра­ции лога.

Важ­но отме­тить, что пра­вила сис­темных вызовов зна­читель­но вли­яют на про­изво­дитель­ность сис­темы в целом. Ста­рай­ся сок­ратить их количес­тво и объ­еди­няй пра­вила, где это воз­можно.

В качес­тве тре­ниров­ки соз­дадим пра­вило ауди­та для регис­тра­ции изме­нения фай­ла /etc/passwd.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии