Thank you for reading this post, don't forget to subscribe!
Auditbeat – cогласно информации на оф сайте, собирает данные Linux и следит за целостностью файлов.
Он передает эти события в режиме реального времени остальной части стека Elastic для дальнейшего анализа.
Это позволяет выяснить, кто был действующим лицом и какое действие выполнили и когда.
Обнаружение изменений критических файлов на Linux с помощью Auditbeat и ELK
Установка и настройка стека ELK
Для начала вам необходимо иметь работающий стек ELK.
Некоторые из ключевых применений 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 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 на рабочей станции.
На 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
1 2 3 4 5 6 7 |
$ ansible --version ansible 2.9.6 config file = /etc/ansible/ansible.cfg configured module search path = ['/var/home/jkmutai/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3.7/site-packages/ansible executable location = /usr/bin/ansible python version = 3.7.6 (default, Jan 30 2020, 09:44:41) [GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] |
Шаг 2: импортируйте официальную ansuble role Elasticsearch
После установки Ansible теперь вы можете импортировать роль ansible Elasticsearch в вашу локальную систему с помощью galaxy.
1 2 3 4 5 6 |
$ ansible-galaxy install elastic.elasticsearch,7.6.2 - downloading role 'elasticsearch', owned by elastic - downloading role from https://github.com/elastic/ansible-elasticsearch/archive/7.6.2.tar.gz - extracting elastic.elasticsearch to /var/home/jkmutai/.ansible/roles/elastic.elasticsearch - elastic.elasticsearch (7.6.2) was installed successfully |
Где 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
Вот так выглядят мои дополнительные найстройки – измените в соответствии с вашей средой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Elasticsearch master ноды Host elk-master01 Hostname 95.216.167.173 User root Host elk-master02 Hostname 95.216.195.161 User root Host elk-master03 Hostname 95.217.159.46 User root # Elasticsearch worker ноды Host elk-data01 Hostname 95.216.195.178 User root Host elk-data02 Hostname 95.217.159.52 User root Host elk-data03 Hostname 95.217.159.43 User root |
Убедитесь, что вы скопировали ключи 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
Содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
- hosts: elk-master-nodes roles: - role: elastic.elasticsearch vars: es_enable_xpack: false es_data_dirs: - "/data/elasticsearch/data" es_log_dir: "/data/elasticsearch/logs" es_java_install: true es_heap_size: "1g" es_config: cluster.name: "elk-cluster" cluster.initial_master_nodes: "95.216.167.173:9300,95.216.195.161:9300,95.217.159.46:9300" discovery.seed_hosts: "95.216.167.173:9300,95.216.195.161:9300,95.217.159.46:9300" http.port: 9200 node.data: false node.master: true bootstrap.memory_lock: false network.host: '0.0.0.0' es_plugins: - plugin: ingest-attachment - hosts: elk-data-nodes roles: - role: elastic.elasticsearch vars: es_enable_xpack: false es_data_dirs: - "/data/elasticsearch/data" es_log_dir: "/data/elasticsearch/logs" es_java_install: true es_config: cluster.name: "elk-cluster" cluster.initial_master_nodes: "95.216.167.173:9300,95.216.195.161:9300,95.217.159.46:9300" discovery.seed_hosts: "95.216.167.173:9300,95.216.195.161:9300,95.217.159.46:9300" http.port: 9200 node.data: true node.master: false bootstrap.memory_lock: false network.host: '0.0.0.0' es_plugins: - plugin: ingest-attachment |
Значение ключей:
- Для мастер нод в 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.
Создайте файл инвентари
1 2 3 4 5 6 7 8 9 10 |
$ vim hosts [elk-master-nodes] elk-master01 elk-master02 elk-master03 [elk-data-nodes] elk-data01 elk-data02 elk-data03 |
Когда все установлено, запустите плейбук:
$ ansible-playbook -i hosts elk.yml
Выполнение плейбука должно начаться.
Будьте терпеливы, так как это может занять несколько минут.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
PLAY [elk-master-nodes] ******************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************* ok: [elk-master02] ok: [elk-master01] ok: [elk-master03] TASK [elastic.elasticsearch : set_fact] **************************************************************************************************************** ok: [elk-master02] ok: [elk-master01] ok: [elk-master03] TASK [elastic.elasticsearch : os-specific vars] ******************************************************************************************************** ok: [elk-master01] ok: [elk-master02] ok: [elk-master03] ....... |
Успешное выполнение ANSIBLE покажет вам результат, аналогичный приведенному ниже.
1 2 3 4 5 6 7 |
PLAY RECAP ********************************************************************************************************************************************* elk-data01 : ok=38 changed=10 unreachable=0 failed=0 skipped=119 rescued=0 ignored=0 elk-data02 : ok=38 changed=10 unreachable=0 failed=0 skipped=118 rescued=0 ignored=0 elk-data03 : ok=38 changed=10 unreachable=0 failed=0 skipped=118 rescued=0 ignored=0 elk-master01 : ok=38 changed=10 unreachable=0 failed=0 skipped=119 rescued=0 ignored=0 elk-master02 : ok=38 changed=10 unreachable=0 failed=0 skipped=118 rescued=0 ignored=0 elk-master03 : ok=38 changed=10 unreachable=0 failed=0 skipped=118 rescued=0 ignored=0 |
Шаг 4: Подтвердите установку кластера Elasticsearch на Ubuntu / CentOS
Войдите на один из мастер нод
$ elk-master01
Проверьте состояние кластера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ curl http://localhost:9200/_cluster/health?pretty { "cluster_name" : "elk-cluster", "status" : "green", "timed_out" : false, "number_of_nodes" : 6, "number_of_data_nodes" : 3, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 } |
Проверьте мастер ноды:
$ curl -XGET 'http://localhost:9200/_cat/master'
G9X__pPXScqACWO6YzGx3Q 95.216.167.173 95.216.167.173 elk-master01
Проверьте дата ноды:
1 2 3 4 5 6 7 |
$ curl -XGET 'http://localhost:9200/_cat/nodes' 95.217.159.43 7 47 1 0.02 0.03 0.02 di - elk-data03 95.216.167.173 10 34 1 0.00 0.02 0.02 im * elk-master01 95.217.159.46 13 33 1 0.00 0.01 0.02 im - elk-master03 95.216.195.161 14 33 1 0.00 0.01 0.02 im - elk-master02 95.217.159.52 7 47 1 0.00 0.03 0.03 di - elk-data02 95.216.195.178 6 47 1 0.00 0.02 0.02 di - elk-data01 |
Установка 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
1 2 3 4 5 6 7 8 9 10 |
cat > /etc/yum.repos.d/elastic.repo << EOL [elastic-7.x] name=Elastic repository for 7.x packages baseurl=https://artifacts.elastic.co/packages/7.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=0 autorefresh=1 type=rpm-md EOL |
yum --enablerepo=elastic-7.x install auditbeat -y
Настройка подключения Auditbeat к Elasticsearch
После завершения установки откройте файл конфигурации Auditbeat для редактирования;
Перейдите к разделу конфигурации Elasticsearch Output;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
... ... # ---------------------------- Elasticsearch Output ---------------------------- output.elasticsearch: # Array of hosts to connect to. hosts: ["localhost:9200"] # Protocol - either `http` (default) or `https`. #protocol: "https" # Authentication credentials - either API key or username/password. #api_key: "id:api_key" #username: "elastic" #password: "changeme" ... |
Установите конфигурации вывода в зависимости от того, как настроен ваш Elasticsearch.
В моей настройке мне просто нужно обновить IP-адрес и порт Elasticsearch, заменив localhost:9200 на данные подключения Elasticsearch; 192.168.58.22:9200.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
... ... # ---------------------------- Elasticsearch Output ---------------------------- output.elasticsearch: # Array of hosts to connect to. hosts: ["192.168.58.22:9200"] # Protocol - either `http` (default) or `https`. #protocol: "https" # Authentication credentials - either API key or username/password. #api_key: "id:api_key" #username: "elastic" #password: "changeme" ... |
Сохраните изменения и выйдите из файла конфигурации.
Убедитесь, что порт Elasticsearch открыт и к нему можно подключиться;
nc -nvz 192.168.58.22 9200
Затем проверьте соединение Auditbeat с Elasticsearch (убедитесь, что служба auditbeat не запущена до выполнения этой команды);
auditbeat test output
1 2 3 4 5 6 7 8 9 10 |
elasticsearch: http://192.168.58.22:9200… parse url... OK connection... parse host... OK dns lookup... OK addresses: 192.168.58.22 dial up... OK TLS... WARN secure connection disabled talk to server... OK version: 7.16.0 |
Настройка Auditbeat для сбора данных аудита
Далее необходимо настроить Auditbeat для сбора данных системного аудита, которые должны быть отправлены в Elasticsearch.
В стандартном файле конфигурации Auditbeat, /etc/auditbeat/auditbeat.yml, настройки по умолчанию для Auditbeat показаны ниже;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# =========================== Modules configuration ============================ auditbeat.modules: - module: auditd # Load audit rules from separate files. Same format as audit.rules(7). audit_rule_files: [ '${path.config}/audit.rules.d/*.conf' ] audit_rules: | ## Define audit rules here. ## Create file watches (-w) or syscall audits (-a or -A). Uncomment these ## examples or add your own rules. ## If you are on a 64 bit platform, everything should be running ## in 64 bit mode. This rule will detect any use of the 32 bit syscalls ## because this might be a sign of someone exploiting a hole in the 32 ## bit API. #-a always,exit -F arch=b32 -S all -F key=32bit-abi ## Executions. #-a always,exit -F arch=b64 -S execve,execveat -k exec ## External access (warning: these can be expensive to audit). #-a always,exit -F arch=b64 -S accept,bind,connect -F key=external-access ## Identity changes. #-w /etc/group -p wa -k identity #-w /etc/passwd -p wa -k identity #-w /etc/gshadow -p wa -k identity ## Unauthorized access attempts. #-a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EACCES -k access #-a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat,open_by_handle_at -F exit=-EPERM -k access - module: file_integrity paths: - /bin - /usr/bin - /sbin - /usr/sbin - /etc - module: system datasets: - package # Installed, updated, and removed packages period: 2m # The frequency at which the datasets check for changes - module: system datasets: - host # General host information, e.g. uptime, IPs - login # User logins, logouts, and system boots. - process # Started and stopped processes - socket # Opened and closed sockets - user # User information # How often datasets send state updates with the # current state of the system (e.g. all currently # running processes, all open sockets). state.period: 12h # Enabled by default. Auditbeat will read password fields in # /etc/passwd and /etc/shadow and store a hash locally to # detect any changes. user.detect_password_changes: true # File patterns of the login record files. login.wtmp_file_pattern: /var/log/wtmp* login.btmp_file_pattern: /var/log/btmp* |
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;
1 2 3 4 5 6 7 8 9 |
cat >> /etc/auditbeat/auditbeat.yml << EOL logging.level: info logging.to_files: true logging.files: path: /var/log/auditbeat name: auditbeat keepfiles: 7 permissions: 0644 EOL |
Обновим ограничение на размер исполняемого файла процесса, который будет хэшироваться.
По умолчанию это значение равно “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
1 2 3 4 5 6 7 8 9 10 11 12 |
● auditbeat.service - Audit the activities of users and processes on your system. Loaded: loaded (/lib/systemd/system/auditbeat.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-12-09 20:46:09 EAT; 3s ago Docs: https://www.elastic.co/beats/auditbeat Main PID: 2621 (auditbeat) Tasks: 5 (limit: 1133) Memory: 41.8M CPU: 109ms CGroup: /system.slice/auditbeat.service └─2621 /usr/share/auditbeat/bin/auditbeat --environment systemd -c /etc/auditbeat/auditbeat.yml --path.home /usr/share/auditbeat --path.config /etc/auditbeat > Dec 09 20:46:09 debian11 systemd[1]: Started Audit the activities of users and processes on your system.. |