Обнаружение изменений критических файлов на Linux с помощью Auditbeat и ELK

Thank you for reading this post, don't forget to subscribe!

Auditbeat – cоглас­но инфор­ма­ции на оф сай­те, соби­ра­ет дан­ные Linux и сле­дит за целост­но­стью файлов.

Он пере­да­ет эти собы­тия в режи­ме реаль­но­го вре­ме­ни осталь­ной части сте­ка Elastic для даль­ней­ше­го анализа.

Это поз­во­ля­ет выяс­нить, кто был дей­ству­ю­щим лицом и какое дей­ствие выпол­ни­ли и когда.

Обнаружение изменений критических файлов на Linux с помощью Auditbeat и ELK

Установка и настройка стека ELK

Для нача­ла вам необ­хо­ди­мо иметь рабо­та­ю­щий стек ELK.

Elasticsearch – это мощ­ный рас­пре­де­лен­ный поис­ко­вый и ана­ли­ти­че­ский дви­жок реаль­но­го вре­ме­ни с откры­тым исход­ным кодом, кото­рый предо­став­ля­ет воз­мож­ность пол­но­тек­сто­во­го поиска.
Elasticsearch постро­ен на Apache Lucene, и это про­грамм­ное обес­пе­че­ние сво­бод­но доступ­но под лицен­зи­ей Apache 2.
В этой ста­тье мы уста­но­вим кла­стер Elasticsearch на CentOS 8/7 и Ubuntu 20.04 / 18.04, исполь­зуя инстру­мент авто­ма­ти­за­ции Ansible.
Это руко­вод­ство помо­жет поль­зо­ва­те­лям Linux уста­но­вить и настро­ить высо­ко­до­ступ­ный муль­ти­нод­ный кла­стер Elasticsearch в систе­мах CentOS 8 / CentOS 7 и Ubuntu 20.04 / 18.04 Linux.

Неко­то­рые из клю­че­вых при­ме­не­ний ElasticSearch – это ана­ли­ти­ка логов, поис­ко­вая систе­ма, пол­но­тек­сто­вый поиск, биз­нес-ана­ли­ти­ка, ана­ли­ти­ка без­опас­но­сти и мно­го другое.

Типы нод Elasticsearch

Суще­ству­ет два рас­про­стра­нен­ных типа нод Elasticsearch:
  • Matser нода: отве­ча­ют за опе­ра­ции на уровне кла­сте­ра, такие как управ­ле­ние индек­са­ми и рас­пре­де­ле­ние хра­ни­лищ дан­ных в data нодах.
  • Data нода: они содер­жат фак­ти­че­ские фраг­мен­ты индек­си­ро­ван­ных дан­ных и обра­ба­ты­ва­ют все опе­ра­ции CRUD, поис­ка и агре­ги­ро­ва­ния. Они потреб­ля­ют боль­ше ресур­сов про­цес­со­ра, памя­ти и вво­да / вывода

Требования

Преж­де чем начать, вам нуж­но уста­но­вить и обно­вить как мини­мум три сер­ве­ра CentOS 8/7.

Поль­зо­ва­тель с при­ви­ле­ги­я­ми sudo или root будет так­же необ­хо­дим для выпол­не­ния действий.

Моя уста­нов­ка осно­ва­на на сле­ду­ю­щей струк­ту­ре хостов:

Имя сер­ве­ра Харак­те­ри­сти­ка Роль ноды
elk-master-01 16gb ram, 8vpcus Master
elk-master-02 16gb ram, 8vpcus Master
elk-master-03 16gb ram, 8vpcus Master
elk-data01 32gb ram, 16vpcus Data
elk-data02 32gb ram, 16vpcus Data
elk-data03 32gb ram, 16vpcus Data
В неболь­ших сре­дах вы може­те исполь­зо­вать ноды как для дан­ных, так и для мастер роли.

Условия хранения данных

Для data нод реко­мен­ду­ет­ся пра­виль­но настро­ить хра­ни­ли­ще с уче­том масштабируемости.

В моем при­ме­ре каж­дая нода дан­ных име­ет диск 500 ГБ, смон­ти­ро­ван­ный в /data.

Это было настро­е­но с помо­щью команд, пока­зан­ных ниже.

ВНИМАНИЕ: Не копи­руй­те и не запус­кай­те коман­ды, они про­сто примеры
sudo parted -s -a optimal -- /dev/sdb mklabel gpt
sudo parted -s -a optimal -- /dev/sdb mkpart primary 0% 100%
sudo parted -s -- /dev/sdb align-check optimal 1
sudo pvcreate /dev/sdb1
sudo vgcreate vg0 /dev/sdb1
sudo lvcreate -n lv01 -l+100%FREE vg0
sudo mkfs.xfs /dev/mapper/vg0-lv01
echo "/dev/mapper/vg0-lv01 /data xfs defaults 0 0" | sudo tee -a /etc/fstab
sudo mount -a

Шаг 1. Установите Ansible на рабочей станции.

Мы будем исполь­зо­вать Ansible для настрой­ки кла­сте­ра Elasticsearch на CentOS 8/7.
Убе­ди­тесь, что Ansible уста­нов­лен на вашем компьютере!

На Fedora:

sudo dnf install ansible

На CentOS:

sudo yum -y install epel-release

sudo yum install ansible

RHEL 7 / RHEL 8:

--- RHEL 8 ---
sudo subscription-manager repos --enable ansible-2.9-for-rhel-8-x86_64-rpms
sudo yum install ansible

--- RHEL 7 ---
sudo subscription-manager repos --enable rhel-7-server-ansible-2.9-rpms
sudo yum install ansible
Ubuntu:

sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

Для любо­го дру­го­го дис­три­бу­ти­ва обра­ти­тесь к офи­ци­аль­но­му руко­вод­ству по уста­нов­ке Ansible.
Под­твер­ди­те уста­нов­ку Ansible на вашем ком­пью­те­ре, запро­сив версию.

Шаг 2: импортируйте официальную ansuble role Elasticsearch

После уста­нов­ки Ansible теперь вы може­те импор­ти­ро­вать роль ansible Elasticsearch в вашу локаль­ную систе­му с помо­щью galaxy.

Где 7.6.2 – вер­сия выпус­ка роли Elasticsearch.

Вы може­те про­ве­рить стра­ни­цу рели­зов на соот­вет­ствие вер­сии Elasticsearch, кото­рую вы хоти­те установить.

Роль будет добав­ле­на в ката­лог ~/.ansible/role.

$ ls ~/.ansible/roles
total 4.0K
drwx------. 15 jkmutai jkmutai 4.0K May 1 16:28 elastic.elasticsearch
Скон­фи­гу­ри­руй­те ваш ssh для вза­и­мо­дей­ствия с хоста­ми кла­сте­ра Elasticsearch.

$ vim ~/.ssh/config
Вот так выгля­дят мои допол­ни­тель­ные най­строй­ки – изме­ни­те в соот­вет­ствии с вашей средой.

Убе­ди­тесь, что вы ско­пи­ро­ва­ли клю­чи SSH на все машины.

--- Master ноды ---
for host in elk-master0{1..3}; do ssh-copy-id $host; done

--- Worker ноды ---
for host in elk-data0{1..3}; do ssh-copy-id $host; done
Под­твер­дить мож­но, зай­дя по ssh без аутен­ти­фи­ка­ции по паролю.

$ ssh elk-master01
Warning: Permanently added '95.216.167.173' (ECDSA) to the list of known hosts.
[root@elk-master-01 ~]#
Если ваш закры­тый ключ ssh име­ет пароль­ную фра­зу, сохра­ни­те ее, что­бы избе­жать запро­са для каж­дой машины.

$ eval `ssh-agent -s` && ssh-add
Enter passphrase for /var/home/jkmutai/.ssh/id_rsa:
Identity added: /var/home/jkmutai/.ssh/id_rsa (/var/home/jkmutai/.ssh/id_rsa)

Шаг 3: создайте плейбук для Elasticsearch и запустите его

$ vim elk.yml

Содер­жи­мое:

Значение ключей:
  • Для мастер нод в node.master уста­нов­ле­но зна­че­ние true, а для node.data уста­нов­ле­но зна­че­ние false.
  • data ноды име­ют в node.data зна­че­ние true, а для node.master зна­че­ние false.
  • Пере­мен­ная es_enable_xpack уста­нов­ле­на в false для уста­нов­ки вер­сии с откры­тым исход­ным кодом ElasticSearch.
  • cluster.initial_master_nodes & discovery.seed_hosts ука­зы­ва­ют на мастер ноды
  • /data/elasticsearch/data – это место хра­не­ния сег­мен­та дан­ных Elasticsearch. Реко­мен­ду­ет­ся, что­бы он был отдель­ным раз­де­лом от ОС по сооб­ра­же­ни­ям про­из­во­ди­тель­но­сти и масштабируемости.
  • /data/asticsearch/logs – это место, где будут хра­нить­ся логи Elasticsearch.
  • Ката­ло­ги будут созда­ны авто­ма­ти­че­ски по так­ску. Вам нуж­но толь­ко убе­дить­ся, что /data – это точ­ка мон­ти­ро­ва­ния жела­е­мо­го хра­ни­ли­ща дан­ных для Elasticsearch.

Создайте файл инвентари

Когда все уста­нов­ле­но, запу­сти­те плейбук:
$ ansible-playbook -i hosts elk.yml
Выпол­не­ние плей­бу­ка долж­но начаться.

Будь­те тер­пе­ли­вы, так как это может занять несколь­ко минут.

Успеш­ное выпол­не­ние ANSIBLE пока­жет вам резуль­тат, ана­ло­гич­ный при­ве­ден­но­му ниже.

Шаг 4: Подтвердите установку кластера Elasticsearch на Ubuntu / CentOS

Вой­ди­те на один из мастер нод

$ elk-master01

Про­верь­те состо­я­ние кластера.

Про­верь­те мастер ноды:

$ curl -XGET 'http://localhost:9200/_cat/master'
G9X__pPXScqACWO6YzGx3Q 95.216.167.173 95.216.167.173 elk-master01
Про­верь­те дата ноды:

 

Установка Auditbeat на хост

Что­бы иметь воз­мож­ность обна­ру­жи­вать изме­не­ния кри­ти­че­ских фай­лов в Linux с помо­щью Auditbeat и ELK, вам необ­хо­ди­мо уста­но­вить Auditbeat на хост, кото­рый вы отслеживаете.

В этом руко­вод­стве мы будем исполь­зо­вать два хоста, Ubuntu и Rocky Linux vms в каче­стве уда­лен­ных хостов для мони­то­рин­га любых изме­не­ний в кри­ти­че­ских файлах.

Установка Auditbeat на системы на базе Ubuntu/Debian

Выпол­ни­те при­ве­ден­ные ниже коман­ды для уста­нов­ки Auditbeat на систе­мы на базе Ubuntu/Debian;

apt install gnupg2 apt-transport-https -y
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor > /etc/apt/trusted.gpg.d/elastic.gpg
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" > /etc/apt/sources.list.d/elastic-7.x.list
apt update
apt install auditbeat -y

Установка Auditbeat на системы на базе RHEL

Выпол­ни­те при­ве­ден­ные ниже коман­ды для уста­нов­ки Auditbeat на систе­мы на базе RHEL;

rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch


yum --enablerepo=elastic-7.x install auditbeat -y

Настройка подключения Auditbeat к Elasticsearch

После завер­ше­ния уста­нов­ки открой­те файл кон­фи­гу­ра­ции Auditbeat для редактирования;

Перей­ди­те к раз­де­лу кон­фи­гу­ра­ции Elasticsearch Output;


Уста­но­ви­те кон­фи­гу­ра­ции выво­да в зави­си­мо­сти от того, как настро­ен ваш Elasticsearch.

В моей настрой­ке мне про­сто нуж­но обно­вить IP-адрес и порт Elasticsearch, заме­нив localhost:9200 на дан­ные под­клю­че­ния Elasticsearch; 192.168.58.22:9200.

Сохра­ни­те изме­не­ния и вый­ди­те из фай­ла конфигурации.

Убе­ди­тесь, что порт Elasticsearch открыт и к нему мож­но подключиться;

nc -nvz 192.168.58.22 9200
Затем про­верь­те соеди­не­ние Auditbeat с Elasticsearch (убе­ди­тесь, что служ­ба auditbeat не запу­ще­на до выпол­не­ния этой команды);

auditbeat test output

Настройка Auditbeat для сбора данных аудита

Далее необ­хо­ди­мо настро­ить Auditbeat для сбо­ра дан­ных систем­но­го ауди­та, кото­рые долж­ны быть отправ­ле­ны в Elasticsearch.

В стан­дарт­ном фай­ле кон­фи­гу­ра­ции Auditbeat, /etc/auditbeat/auditbeat.yml, настрой­ки по умол­ча­нию для Auditbeat пока­за­ны ниже;

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

К таким моду­лям относятся:

  • Auditd: опре­де­лен как – module: auditd.. Модуль полу­ча­ет собы­тия ауди­та от Linux Audit , кото­рый явля­ет­ся частью ядра Linux.
  • Целост­ность фай­ла: опре­де­ля­ет­ся – module: file_integrityв кон­фи­гу­ра­ци­он­ном фай­ле Auditbeat. Этот модуль посы­ла­ет собы­тия, когда файл изме­ня­ет­ся (созда­ет­ся, обнов­ля­ет­ся или уда­ля­ет­ся) на дис­ке. Собы­тия содер­жат мета­дан­ные фай­ла и хэши. По умол­ча­нию он отсле­жи­ва­ет сле­ду­ю­щие каталоги;
    /bin
    /usr/bin
    /sbin
    /usr/sbin
    /etc
    System: опре­де­ля­ет­ся - module: systemв кон­фи­гу­ра­ци­он­ном файле.
  • Этот модуль соби­ра­ет раз­лич­ную инфор­ма­цию о систе­ме, свя­зан­ную с безопасностью.

В этой уста­нов­ке мы будем исполь­зо­вать кон­фи­гу­ра­ции по умолчанию.

Если вы хоти­те отсле­жи­вать дру­гой файл/каталог на пред­мет изме­не­ний целост­но­сти, добавь­те его в модуль file_integrity.

Проверка конфигурации Auditbeat

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

auditbeat test config

Если в выво­де будет Config OK, зна­чит, все в порядке.

Загрузка шаблона индекса Auditbeat и дашбордов визуализации в Elasticsearch

Выпол­ни­те при­ве­ден­ную ниже коман­ду для загруз­ки шаб­ло­на индек­са Auditbeat:

auditbeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["192.168.58.22:9200"]' -E setup.kibana.host=192.168.58.22:5601

Вывод:

Index setup finished.

Выпол­ни­те эту коман­ду, что­бы загру­зить даш­бор­ды визу­а­ли­за­ции в Elasticsearch;

auditbeat setup -e -E output.logstash.enabled=false -E output.elasticsearch.hosts=['192.168.58.22:9200'] -E setup.kibana.host=192.168.58.22:5601

Настройка ведения логов Auditbeat

Выпол­ни­те при­ве­ден­ную ниже коман­ду для обнов­ле­ния жур­на­лов Auditbeat;

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

По умол­ча­нию это зна­че­ние рав­но “100 Мб”.

При зна­че­нии по умол­ча­нию вы може­те уви­деть пре­ду­пре­жде­ние, например:

failed to hash executable /usr/share/auditbeat/bin/auditbeat for PID 5888: failed to hash file /usr/share/auditbeat/bin/auditbeat: hasher: file size 111924496 exceeds max file size

sed -i '/ state.period:/a\ process.hash.scan_rate_per_sec: 50 MiB\n process.hash.max_file_size: 250 MiB\n process.hash.hash_types: [sha1]' /etc/auditbeat/auditbeat.yml

 

Запуск Auditbeat

Теперь вы може­те запу­стить и вклю­чить служ­бу Auditbeat;

systemctl enable --now auditbeat

Про­вер­ка состояния;

systemctl status auditbeat