Practical Guide: Linux Kernel and Audit Log Monitoring with Wazuh
Introduction
Linux systems generate critical security information through kernel logs and audit events. This guide provides a practical, tested approach to collecting and monitoring these logs using Wazuh, based on real-world implementations and community experiences.
What We’ll Monitor
- Kernel Logs: Hardware events, system calls, security violations
- Audit Events: User actions, file access, system changes
- System Events: Authentication, network connections, process execution
Architecture Overview
flowchart TB subgraph "Linux System" K[Linux Kernel] --> KL[Kernel Logs] A[Auditd] --> AL[Audit Logs] S[System Events] --> SL[System Logs]
KL --> J[journald] AL --> AF[/var/log/audit/audit.log] SL --> SF[/var/log/syslog] end
subgraph "Wazuh Agent" LC[Log Collector] J --> LC AF --> LC SF --> LC LC --> AB[Agent Buffer] AB --> T[TLS Transport] end
subgraph "Wazuh Manager" T --> WM[Log Reception] WM --> D[Decoders] D --> R[Rules Engine] R --> AG[Alert Generation] AG --> FB[Filebeat] end
subgraph "Wazuh Dashboard" FB --> WI[Wazuh Indexer] WI --> WD[Dashboard] end
style K fill:#ff6b6b style A fill:#4dabf7 style R fill:#51cf66 style WD fill:#ffd43b
Part 1: Kernel Log Collection
Method 1: Journald Integration (Recommended for Modern Systems)
Basic Configuration
Add to /var/ossec/etc/ossec.conf
on the agent:
<ossec_config> <!-- Collect all journal logs including kernel --> <localfile> <location>journald</location> <log_format>journald</log_format> </localfile></ossec_config>
Advanced Kernel-Specific Configuration
For kernel logs only:
<ossec_config> <!-- Kernel logs via journald --> <localfile> <location>journald</location> <log_format>journald</log_format> <filter field="_TRANSPORT">kernel</filter> </localfile>
<!-- High-priority kernel events --> <localfile> <location>journald</location> <log_format>journald</log_format> <query>_TRANSPORT=kernel AND PRIORITY<=3</query> <target>kernel-critical</target> </localfile></ossec_config>
Testing Journald Filters
Before applying, test your filters:
# View kernel messagesjournalctl _TRANSPORT=kernel
# Shorthand for kernel messagesjournalctl -k
# Real-time kernel monitoringjournalctl -k -f
# Check if wazuh user can accesssudo -u wazuh journalctl --since "1 minute ago" --no-pager
Method 2: Traditional Syslog Files
For older systems or specific requirements:
<ossec_config> <!-- Kernel logs --> <localfile> <log_format>syslog</log_format> <location>/var/log/kern.log</location> </localfile>
<!-- System messages (includes kernel) --> <localfile> <log_format>syslog</log_format> <location>/var/log/messages</location> </localfile>
<!-- All syslog --> <localfile> <log_format>syslog</log_format> <location>/var/log/syslog</location> </localfile></ossec_config>
Troubleshooting Kernel Log Collection
Issue: No Kernel Logs in Wazuh
- Check Permissions:
# Add wazuh to required groupssudo usermod -a -G systemd-journal wazuhsudo usermod -a -G adm wazuh
# Restart agentsudo systemctl restart wazuh-agent
- Verify Log Collection:
# Check agent logtail -f /var/ossec/logs/ossec.log | grep -E "journald|kernel"
# Test log generationecho "Test kernel message" | sudo tee /dev/kmsg
# Check if collectedgrep "Test kernel message" /var/ossec/logs/archives/archives.log
Part 2: Audit Log Collection with Auditd
Step 1: Install and Configure Auditd
# Ubuntu/Debiansudo apt-get install -y auditd audispd-plugins
# RHEL/CentOSsudo yum install -y audit audit-libs
# Enable and startsudo systemctl enable auditdsudo systemctl start auditd
Step 2: Configure Wazuh Agent
Add to /var/ossec/etc/ossec.conf
:
<ossec_config> <localfile> <log_format>audit</log_format> <location>/var/log/audit/audit.log</location> </localfile></ossec_config>
Step 3: Create Audit Rules
Monitor Root Command Execution
Edit /etc/audit/rules.d/audit.rules
:
# Monitor all commands by root (euid=0)-a exit,always -F arch=b64 -F euid=0 -S execve -k audit-wazuh-c-a exit,always -F arch=b32 -F euid=0 -S execve -k audit-wazuh-c
# Monitor specific user commands (uid=1000)-a exit,always -F arch=b64 -F auid=1000 -S execve -k user-commands-a exit,always -F arch=b32 -F auid=1000 -S execve -k user-commands
# File access monitoring-w /etc/passwd -p wa -k passwd-changes-w /etc/shadow -p wa -k shadow-changes-w /etc/sudoers -p wa -k sudoers-changes
# System calls-a always,exit -F arch=b64 -S open,openat -F exit=-EPERM -k access-denied-a always,exit -F arch=b64 -S unlink,rename -k file-deletion
# Kernel module monitoring-w /sbin/insmod -p x -k kernel-modules-w /sbin/rmmod -p x -k kernel-modules-w /sbin/modprobe -p x -k kernel-modules
Apply rules:
# Load rulessudo auditctl -R /etc/audit/rules.d/audit.rules
# Verify rulessudo auditctl -l
Step 4: Configure Wazuh Server
Update Audit Keys List
The Wazuh server maintains a list of audit keys at /var/ossec/etc/lists/audit-keys
:
# View current keyscat /var/ossec/etc/lists/audit-keys
# Add custom keysecho "user-commands:command" | sudo tee -a /var/ossec/etc/lists/audit-keysecho "passwd-changes:write" | sudo tee -a /var/ossec/etc/lists/audit-keysecho "kernel-modules:command" | sudo tee -a /var/ossec/etc/lists/audit-keys
# Restart managersudo systemctl restart wazuh-manager
Create Custom Rules
Add to /var/ossec/etc/rules/local_rules.xml
:
<group name="audit,"> <!-- Enhanced root command detection --> <rule id="100002" level="6"> <if_sid>80792</if_sid> <field name="audit.euid">0</field> <description>Root command execution: $(audit.exe) by user $(audit.auid)</description> <group>audit_command,</group> </rule>
<!-- Detect suspicious commands --> <rule id="100003" level="8"> <if_sid>100002</if_sid> <field name="audit.exe">nc|ncat|netcat|tcpdump|wireshark</field> <description>Suspicious command by root: $(audit.exe)</description> <group>audit_command,suspicious_command,</group> </rule>
<!-- File modification alerts --> <rule id="100004" level="7"> <if_sid>80784</if_sid> <field name="audit.key">passwd-changes</field> <description>Password file modified: $(audit.file.name)</description> <group>audit_watch_write,</group> </rule>
<!-- Kernel module changes --> <rule id="100005" level="9"> <if_sid>80792</if_sid> <field name="audit.key">kernel-modules</field> <description>Kernel module operation: $(audit.exe)</description> <group>audit_command,kernel_modules,</group> </rule></group>
Part 3: Real-World Testing
Generate Test Events
# Test root commandssudo su -whoamils /etc/shadowcat /etc/passwd
# Test kernel module operationssudo modprobe -v scsi_debugsudo rmmod scsi_debug
# Test file modificationssudo touch /etc/test-filesudo rm /etc/test-file
# Generate kernel messagesecho "Security test message" | sudo tee /dev/kmsg
Verify Alerts
# Check alerts on managersudo tail -f /var/ossec/logs/alerts/alerts.json | jq '.'
# Filter specific alertssudo grep "100002\|100003\|100004\|100005" /var/ossec/logs/alerts/alerts.log
Part 4: Dashboard Configuration
Create Visualizations
-
Security Events View:
- Navigate to Modules > Security Events
- Add filters:
rule.groups: audit
rule.level >= 6
-
Audit Dashboard Queries:
# Root commandsrule.id: 100002
# Suspicious commandsrule.id: 100003
# File modificationsrule.groups: audit_watch_write
# Kernel eventsdata.audit.key: kernel-modules
# Failed access attemptsdata.audit.success: no
- Custom Dashboard Panels:
- Top users executing root commands
- Command frequency timeline
- File modification heat map
- Failed access attempts by source
Part 5: Common Issues and Solutions
Issue 1: No Audit Events in Dashboard
Solution:
# Check if auditd is runningsudo systemctl status auditd
# Verify log file exists and growingls -la /var/log/audit/audit.logtail -f /var/log/audit/audit.log
# Check agent configurationgrep -A5 "audit" /var/ossec/etc/ossec.conf
# Restart agentsudo systemctl restart wazuh-agent
Issue 2: High Log Volume
Solution:
<!-- Rate limit in ossec.conf --><ossec_config> <localfile> <log_format>audit</log_format> <location>/var/log/audit/audit.log</location> <frequency>10</frequency> </localfile></ossec_config>
Issue 3: Missing Specific Events
Debug Process:
# Test audit rulessudo auditctl -m "Test audit message"
# Search audit logsudo ausearch -m USER_CMD -ts recent
# Check key-based searchsudo ausearch -k audit-wazuh-c
# Use ossec-logtestecho 'type=SYSCALL msg=audit(1234567890.123:456): arch=c000003e syscall=59 success=yes exit=0 a0=1234 a1=5678 items=2 ppid=1000 pid=2000 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="ls" exe="/usr/bin/ls" key="audit-wazuh-c"' | sudo /var/ossec/bin/ossec-logtest
Part 6: Performance Optimization
Audit Rule Optimization
# Limit rules to specific users-a exit,always -F arch=b64 -F auid>=1000 -F auid<2000 -S execve -k user-commands
# Exclude noisy processes-a exit,never -F exe=/usr/bin/bash-a exit,always -F arch=b64 -F euid=0 -S execve -k root-commands
# Use syscall filtering-a exit,always -F arch=b64 -S socket -F a0=2 -k network-connections
Wazuh Agent Tuning
<ossec_config> <!-- Buffer configuration --> <client_buffer> <disabled>no</disabled> <queue_size>5000</queue_size> <events_per_second>500</events_per_second> </client_buffer></ossec_config>
Part 7: Security Use Cases
1. Privilege Escalation Detection
<rule id="100010" level="10"> <if_sid>100002</if_sid> <field name="audit.auid" negate="yes">0</field> <field name="audit.exe">su|sudo|pkexec</field> <description>Privilege escalation: $(audit.auid) to root via $(audit.exe)</description> <group>audit_command,privilege_escalation,</group></rule>
2. Unauthorized Access Attempts
<rule id="100011" level="8"> <if_sid>80784</if_sid> <field name="audit.success">no</field> <description>Failed file access attempt: $(audit.file.name)</description> <group>audit_watch_read,access_denied,</group></rule>
3. Suspicious Network Tools
<rule id="100012" level="9"> <if_sid>80792</if_sid> <field name="audit.exe">nmap|masscan|zmap|nikto</field> <description>Network scanning tool detected: $(audit.exe)</description> <group>audit_command,recon,</group></rule>
Best Practices
- Start Small: Begin with basic rules and expand gradually
- Test Thoroughly: Verify rules in test environment first
- Monitor Performance: Watch system load with audit enabled
- Document Rules: Maintain documentation for audit rules
- Regular Review: Periodically review and update rules
Conclusion
This practical guide provides a working foundation for Linux kernel and audit log monitoring with Wazuh. By implementing these configurations, you’ll gain deep visibility into system activities, enabling effective threat detection and compliance monitoring.
Remember: Security monitoring is an iterative process. Start with the basics, test thoroughly, and expand based on your specific security requirements.
Additional Resources
- Wazuh Documentation - System Call Monitoring
- Linux Audit Documentation
- Wazuh Community Forum
- Audit Rule Examples
Building comprehensive security monitoring, one log at a time. Stay vigilant! 🛡️