fleet/docs/Using-Fleet/Process-File-Events.md
Lucas Manuel Rodriguez 517acdad72
Add guide to configure process_file_events on CentOS 7 (#12322)
#11890

---------

Co-authored-by: Rachael Shaw <r@rachael.wtf>
2023-06-14 18:23:47 -03:00

179 lines
No EOL
5.9 KiB
Markdown

# Querying process_file_events on CentOS 7
This guide contains step-by-step instructions for configuring the `process_file_events` table on CentOS 7.
## Setup a CentOS 7 VM
Setup a CentOS 7 VM. (VMWare Fusion was used for this guide.)
The following kernel release was used:
```sh
$ uname --kernel-release
3.10.0-1160.83.1.el7.x86_64
```
> All commands shown in this guide were executed as `root`.
## Disable auditd
The `process_file_events` table will not work if the `auditd` daemon is running (there can only be one audit daemon).
To disable auditd run the following:
```sh
systemctl disable auditd
systemctl stop auditd
# Make sure auditd is not running by executing the following:
ps -Af | grep auditd
```
If auditd is running, osquery will log the following error:
```log
I0613 11:25:39.959703 29626 auditdnetlink.cpp:686] Failed to set the netlink owner
```
## Create test files
> The `process_file_events` table can only process events for files that existed before the osquery initialization.
> New files created after osqueryd has initialized won't be tracked by the `process_file_events` table.
Create the following test files in the CentOS VM:
```sh
mkdir /etc/foobar
echo "zoo" > /etc/foobar/zoo.txt
echo "other" > /etc/foobar/other.txt
```
## Create a test team in Fleet.
We will use a test team with special settings to avoid impacting other hosts.
## Install fleetd on the CentOS instance and enroll host
Generate fleetd rpm package (This step was executed on macOS.)
```sh
fleetctl package --type=rpm --fleet-desktop --fleet-url=https://host.docker.internal:8080 --enroll-secret=[redacted team enroll secret] --insecure --debug
```
Install fleetd package on the CentOS 7 VM:
```sh
rpm --install fleet-osquery-1.10.0.x86_64.rpm
```
## Set team agent options
Configure following settings on the team's agent options:
```sh
config:
options:
pack_delimiter: /
logger_tls_period: 10
distributed_plugin: tls
disable_distributed: false
logger_tls_endpoint: /api/osquery/log
distributed_interval: 10
distributed_tls_max_attempts: 3
decorators:
load:
- SELECT uuid AS host_uuid FROM system_info;
- SELECT hostname AS hostname FROM system_info;
file_paths:
etc:
- /etc/foobar/%%
command_line_flags:
verbose: true
events_expiry: 3600
disable_events: false
disable_audit: false
audit_persist: true
audit_allow_fim_events: true
audit_allow_config: true
audit_backlog_limit: 60000
audit_allow_process_events: false
audit_allow_sockets: false
audit_allow_user_events: false
audit_allow_selinux_events: false
audit_allow_kill_process_events: false
audit_allow_apparmor_events: false
audit_allow_seccomp_events: false
enable_bpf_events: false
```
Check osquery `command_line_flags` were delivered successfully to the agent:
```sh
sudo cat /opt/orbit/osquery.flags
--audit_allow_apparmor_events=false
--enable_bpf_events=false
--audit_allow_config=true
--audit_backlog_limit=60000
--audit_allow_user_events=false
--audit_allow_seccomp_events=false
--audit_allow_selinux_events=false
--audit_allow_sockets=false
--audit_allow_process_events=false
--audit_persist=true
--audit_allow_fim_events=true
--audit_allow_kill_process_events=false
--disable_audit=false
--verbose=true
--events_expiry=3600
--disable_events=false
```
### About the flags
- `file_paths:` We set `/etc/foobar/%%` as the path to monitor for file changes.
- `verbose: true`: We set this to `true` for troubleshooting purposes only.
- `disable_events: false`: Must be set to `false` to enable evented tables in general.
- `events_expiry: 3600`: The `events_expiry` value is the time it takes for events to be cleared from osquery local storage.
- `disable_audit: false`: Must be set to `false` to enable the audit events.
- `audit_persist: true`: Set to `true` to attempt to retain control of audit.
- `audit_allow_fim_events: true`: Must be set to `true` to generate FIM events (otherwise the `process_file_events` will generate no events). Once this is set correctly, the user should see "Enabling audit rules for the process_file_events table" in the logs.
- `audit_allow_config: true`: Must be set to `true` to allow osquery to configure the audit service (basically set backlog limit and wait time below).
- `audit_backlog_limit: 60000`: Sets the queue length for audit events awaiting transfer to osquery audit subscriber. We set this to a high value first to make sure the table is working, then it should be modified to a better value suited for production.
- The following flags were set to `false` to avoid unnecessary load on the host: `audit_allow_process_events: false`, `audit_allow_sockets: false`, `audit_allow_user_events: false`, `audit_allow_selinux_events: false`, `audit_allow_kill_process_events: false`, `audit_allow_apparmor_events: false`, `audit_allow_seccomp_events: false`, `enable_bpf_events: false`.
## Make sure osquery audit subscriber is working
```sh
auditctl -s
enabled 1
failure 0
pid 21590
rate_limit 0
backlog_limit 60000
lost 1137311
backlog 991
loginuid_immutable 0 unlocked
```
`enabled` should be `1` and `pid`'s value should be the process ID of osquery.
## Modify the test files
```sh
echo "boo" >> /etc/foobar/zoo.txt
rm /etc/foobar/other.txt
```
> Remember: the files must exist before the osquery process is initialized.
> Creating or modifying new files won't generate `process_file_events` events.
## Query the process_file_events table
Run the following live query:
```sql
SELECT * from process_file_events;
```
It should return two events, one with `operation=write` and one with `operation=unlink`.
## Additional notes
Make sure to keep an eye on logs like the following:
```log
auditdnetlink.cpp:354 The Audit publisher has throttled reading records from Netlink for 0.2 seconds. Some events may have been lost.
```
Some events might get lost due to system load or low CPU/memory resources.
<meta name="title" value="Querying process_file_events on CentOS 7">
<meta name="pageOrderInSection" value="1900">