Хакер - Основы аудита. Настраиваем журналирование важных событий в Linux

Хакер - Основы аудита. Настраиваем журналирование важных событий в Linux

hacker_frei

https://t.me/hacker_frei

Андрей Балабанов

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

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

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

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

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

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

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

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

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

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

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

$ 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. Пра­вила фай­ловой сис­темы необ­ходимы для наб­людения за фай­лом или катало­гом, дос­туп к которым мы хотим кон­тро­лиро­вать. Фор­мат пра­вила сле­дующий:
  3. -w path-to-file -p permissions -k keyname
  4. Ключ -w ука­зыва­ет на то, что это пра­вило фай­ловой сис­темы. Далее сле­дует путь к фай­лу или катало­гу.
  5. Ключ -p может содер­жать любые ком­бинации прав дос­тупа r (чте­ние), w (запись), x (выпол­нение) и a (изме­нение атри­бута).
  6. Ключ -k зада­ет имя пра­вила, по которо­му впос­ледс­твии мож­но филь­тро­вать логи.
  7. Пра­вила сис­темных вызовов исполь­зуют­ся для монито­рин­га сис­темных вызовов, выпол­няемых любым про­цес­сом или кон­крет­ным поль­зовате­лем. Пра­вило име­ет сле­дующий фор­мат:
  8. -a action,list -S syscall -F field=value -k keyname
  9. Ключ -a озна­чает append (добав­ление) пра­вила в филь­тр.
  10. Дей­ствие action может быть always (всег­да соз­давать события) или never (никог­да не соз­давать события).
  11. Филь­тр list содер­жит один из воз­можных вари­антов: taskexituserfilesystem или exclude.
  12. -S ука­зыва­ет кон­крет­ный syscall (имя или номер); мож­но в одном пра­виле ука­зывать сра­зу нес­коль­ко syscall, каж­дый пос­ле сво­его клю­ча -S.
  13. -F зада­ет филь­тр по полям. Рекомен­дует­ся всег­да ука­зывать раз­рядность, добав­ляя в пра­вила филь­тр -F arch=b64.
  14. Ключ -k — имя пра­вила. Как и в пра­виле фай­ловой сис­темы, исполь­зует­ся для мар­киров­ки событий для пос­леду­ющей филь­тра­ции лога.

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

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

Для начала убе­дим­ся, что у нас не при­мене­но ни одно­го пра­вила.

$ sudo auditctl -l

No rules

Ес­ли ранее уже были заданы какие‑то пра­вила, то сме­ло уда­ляем их коман­дой:

$ sudo auditctl -D

No rules

При­меним пра­вило:

$ sudo auditctl -w /etc/passwd -p wa -k passwd

Про­верим, что пра­вило активно:

$ sudo auditctl -l -w /etc/passwd -p wa -k passwd

Те­перь прос­мотрим, как наше пра­вило работа­ет. Мы не прос­то отре­дак­тиру­ем файл, а пос­ледова­тель­но соз­дадим и уда­лим поль­зовате­ля:

$ sudo useradd testuser

$ sudo userdel -r testuser

Убе­дим­ся, что по нашему пра­вилу сге­нери­рова­лись события. Для это­го пос­тро­им отчет:

$ sudo aureport --summary -k

Key Summary Report

===========================

total key

===========================

6 passwd

Те­перь пос­мотрим эти события.

$ sudo ausearch -i -k passwd

----

type=PROCTITLE msg=audit(08/31/2021 17:08:25.562:330349) : proctitle=/sbin/auditctl -R /etc/audit/audit.rules

type=SOCKADDR msg=audit(08/31/2021 17:08:25.562:330349) : saddr={ saddr_fam=netlink nlnk-fam=16 nlnk-pid=0 }

type=SYSCALL msg=audit(08/31/2021 17:08:25.562:330349) : arch=x86_64 syscall=sendto success=yes exit=1076 a0=0x3 a1=0x7ffd19279350 a2=0x434 a3=0x0 items=0 ppid=285156 pid=285166 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=auditctl exe=/usr/sbin/auditctl subj=system_u:system_r:unconfined_service_t:s0 key=(null)

type=CONFIG_CHANGE msg=audit(08/31/2021 17:08:25.562:330349) : auid=unset ses=unset subj=system_u:system_r:unconfined_service_t:s0 op=remove_rule key=passwd list=exit res=yes

----

type=PROCTITLE msg=audit(08/31/2021 17:08:38.406:330366) : proctitle=auditctl -w /etc/passwd -p wa -k passwd

type=SYSCALL msg=audit(08/31/2021 17:08:38.406:330366) : arch=x86_64 syscall=sendto success=yes exit=1076 a0=0x4 a1=0x7ffdcd6fca80 a2=0x434 a3=0x0 items=0 ppid=285219 pid=285221 auid=andrey uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=5 comm=auditctl exe=/usr/sbin/auditctl subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)

type=CONFIG_CHANGE msg=audit(08/31/2021 17:08:38.406:330366) : auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 op=add_rule key=passwd list=exit res=yes

...

Все записи в жур­нале обя­затель­но начина­ются с tуpe= — как лег­ко догадать­ся, это тип события. Я при­вел толь­ко два из выведен­ных событий, но мож­но заметить, что под­систе­ма ауди­та по нашему пра­вилу груп­пиру­ет события раз­ных типов в один блок. Это удоб­но для ана­лиза.

Есть события, которые не про­мар­кирова­ны нашим пра­вилом, мно­го чего инте­рес­ного собира­ется в авто­мати­чес­ком режиме. Общая кар­тина вид­на из отче­та:

$ sudo aureport

Summary Report

======================

Range of time in logs: 08/31/2021 17:08:25.540 - 08/31/2021 17:31:13.011

Selected time for report: 08/31/2021 17:08:25 - 08/31/2021 17:31:13.011

Number of changes in configuration: 5

Number of changes to accounts, groups, or roles: 8

Number of logins: 0

Number of failed logins: 0

Number of authentications: 3

Number of failed authentications: 0

Number of users: 2

Number of terminals: 6

Number of host names: 2

Number of executables: 8

Number of commands: 6

Number of files: 3

Number of AVC's: 0

Number of MAC events: 0

Number of failed syscalls: 0

Number of anomaly events: 0

Number of responses to anomaly events: 0

Number of crypto events: 0

Number of integrity events: 0

Number of virt events: 0

Number of keys: 1

Number of process IDs: 26

Number of events: 166

Все воз­можные типы регис­три­руемых событий можем узнать так (в реаль­нос­ти вывод гораз­до длин­нее, пос­коль­ку типов боль­ше 170):

$ sudo ausearch -m

Argument is required for -m

Valid message types are: ALL USER LOGIN USER_AUTH USER_ACCT USER_MGMT CRED_ACQ CRED_DISP USER_START USER_END USER_AVC USER_CHAUTHTOK USER_ERR CRED_REFR USYS_CONFIG USER_LOGIN USER_LOGOUT ADD_USER DEL_USER ADD_GROUP DEL_GROUP...

WWW

К при­меру, в резуль­тате наших дей­ствий по добав­лению и уда­лению поль­зовате­лей появи­лись события дру­гих типов, которые не попали в пра­вило. Но мы с лег­костью можем их прос­мотреть.

$ sudo ausearch -i -m USER_MGMT,ADD_USER,DEL_USER,ADD_GROUP,DEL_GROUP

----

type=ADD_GROUP msg=audit(08/31/2021 17:08:53.317:330382) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add-group acct=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success'

----

type=ADD_USER msg=audit(08/31/2021 17:08:53.322:330383) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add-user acct=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success'

----

type=USER_MGMT msg=audit(08/31/2021 17:08:53.652:330385) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add-home-dir id=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success'

...

Ес­ли мы хотим получить абсо­лют­но все события ауди­та за день, выпол­няем коман­ду sudo ausearch -i -ts today. Ответ будет очень длин­ным, поэто­му не при­вожу его.

Ес­ли же нам по каким‑то при­чинам не инте­рес­ны кон­крет­ные типы событий и мы хотим сок­ратить раз­мер логов, то можем пол­ностью исклю­чить регис­тра­цию этих типов. Нап­ример, с помощью пра­вил для филь­тра exclude:

$ sudo auditctl -a always,exclude -F msgtype=CWD

$ sudo auditctl -a always,exclude -F msgtype=PATH

$ sudo auditctl -a always,exclude -F msgtype=CRYPTO_KEY_USER

ВЫВОД

Как мы убе­дились, нас­тра­ивать аудит в Linux не так уж и слож­но. Дос­таточ­но понять, как он работа­ет, и набить руку в написа­нии пра­вил. Всем заин­тересо­вав­шимся советую обра­тить вни­мание на дру­гие реали­зации аген­тов ауди­та: auditbeat и go-audit. Воз­можно, для тво­их задач они подой­дут луч­ше.

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei



Report Page