Document Type: Architectural Constraints & Known Limitations
System: Fedora 43 / Docker Compose Deployment
Last Updated: 2026-01-17
Important
These limitations are architectural and intentional, documented for transparency. They do not indicate misconfiguration. Each limitation includes mitigations and academic defense statements.
Wazuh agent running in a Docker container cannot read host journald logs.
systemd-journald uses socket-based IPC (AF_UNIX with namespace checks) that enforces:
- PID namespace isolation
- cgroup membership verification
- Explicit trust relationships
Docker containers are intentionally excluded from cross-namespace access.
- Rule 100030 (Firewall Packet Drop) cannot be triggered from containerized agent
- Rule 100031 (Port Scan Detection) similarly affected
✅ SOLVED via Systemd Log Export.
The workaround documentation below is kept for historical context.
- Host
systemdservice exports journald →/var/log/firewall/firewall.logviasyslogformat. - Docker volume mounts file → Container
/var/log/firewall.log. - Wazuh reads via standard
sysloglocalfile config. - Result: Full detection enabled (Rule 100030 verified).
While direct journald access remains impossible, this bridging solution provides robust, production-grade ingestion without violating container isolation.
Suricata in host network mode requires a specific network interface to exist.
Suricata uses AF_PACKET sockets bound to interface names (e.g., enp0s3). If the interface doesn't exist, the container exits.
- Suricata container fails on systems with different interface names
- IDS rules (100101-100107) won't trigger
| Option | Notes |
|---|---|
Set correct interface in .env |
SURICATA_COMMAND=-i <interface> |
| Use PCAP replay mode | For testing without live capture |
| Dynamic interface detection | Script to find first non-loopback |
Events take 10-30 seconds to propagate from log → Wazuh → Filebeat → Elasticsearch.
- Wazuh analysisd batch processing
- Filebeat harvester intervals
- Elasticsearch refresh interval (default 1s, but bulk indexing)
pipeline-testwith 5s wait shows false negative (+0 docs)- Alert verification may require multiple retries
- Increase wait time to 30s for reliable testing
- Use retry loops with exponential backoff (currently 6 retries × 5s)
Elasticsearch runs as a single node with no replication.
- Cluster status is yellow (unassigned replica shards)
- Data loss if container fails
- No horizontal scaling
- Deploy 3+ node cluster for production
- Use persistent volumes with backup strategy
Several containers require elevated privileges:
firewall-iptables:CAP_NET_ADMIN+ host networkids-suricata:CAP_NET_ADMIN,CAP_NET_RAW,CAP_SYS_NICEvpn-wireguard:CAP_NET_ADMIN,CAP_SYS_MODULE
- Containers with
network_mode: hostcan see all host traffic - Privilege escalation risk if container is compromised
- Use read-only mounts where possible (
:ro) - Apply SELinux labels (
:zalready used) - Limit container capabilities to minimum required
WireGuard VPN is configured with static peers (PEERS=1).
- New VPN clients require container restart
- No dynamic peer enrollment
- Implement proper key management
- Consider WireGuard with external configuration store
Log files grow unbounded:
logs/api/security.jsonlogs/nginx/access.loglogs/suricata/eve.jsonl
- Disk exhaustion over time
- Potential container failures
- Implement log rotation via logrotate or Docker logging driver
- Set max file sizes in Docker daemon config
Credentials are stored in plaintext:
.envfile contains DB passwords- LDAP admin password in compose file
- No secrets management
- Use Docker secrets or external vault
- Never commit
.envto version control - Rotate credentials regularly
MailHog is a development mail server that does not deliver external emails.
test-killchainexpects alerts visible athttp://localhost:8025- No real alerting in this configuration
- Replace with SMTP relay (SendGrid, SES, etc.)
- Configure Wazuh email integration with real SMTP
Wazuh agent uses automatic registration which can cause:
- Duplicate agent entries on container recreation
ERROR: Duplicate agent namerequiring manual cleanup
- Use
manage_agents -r <id>to remove stale agents - Consider pre-provisioned agent keys for production
| Limitation | Severity | Workaround Available |
|---|---|---|
| Journald container isolation | High | Yes (run on host) |
| Suricata interface binding | Medium | Yes (configure interface) |
| Pipeline latency | Low | Yes (increase wait) |
| Single-node ES | Medium | Yes (add nodes) |
| Container privileges | Medium | Partially |
| VPN static peers | Low | Yes (external config) |
| Log growth | Medium | Yes (rotation) |
| Plaintext credentials | High | Yes (secrets mgmt) |
| MailHog no delivery | Low | Yes (real SMTP) |
| Agent registration | Low | Yes (manual cleanup) |
| Source | Topic | Credibility |
|---|---|---|
| systemd-journald(8) | Journald isolation | 10/10 |
| Wazuh Documentation | Agent deployment | 9/10 |
| NIST SP 800-92 | Log management | 10/10 |
| Docker Security Best Practices | Container privileges | 9/10 |
| Elasticsearch Reference | Cluster topology | 9/10 |