EveBox
Overview
This image runs EveBox 0.26.0, a web-based event viewer and alert triage console for Suricata, together with Suricata 7.0.3, the open source intrusion detection engine that produces the alerts, on Ubuntu 24.04 LTS.
EveBox is only a viewer over an event stream it does not produce, so this image ships the complete appliance. Suricata captures traffic on the instance's primary network interface and matches it against the Emerging Threats open ruleset. It writes alerts, along with flow, DNS, TLS and HTTP metadata, to /var/log/suricata/eve.json.
EveBox indexes that stream into a local SQLite datastore, so there is no Elasticsearch cluster to run. It presents the events as a searchable analyst inbox in the browser.
The image is secure by default. EveBox is bound only to the loopback interface and is fronted by nginx on port 80 with HTTP Basic authentication. The password is generated on first boot, is unique to each instance, and is written to a root-only file. No credential is baked into the image, and no two deployments share one. Because EveBox is bound to loopback, nobody can bypass the authentication by reaching the application port directly.
What you get:
- EveBox 0.26.0 installed from the official upstream release, running as a dedicated non-root
eveboxservice bound to127.0.0.1:5636 - Suricata 7.0.3 configured for af-packet capture on the instance's primary interface, with the Emerging Threats open ruleset loaded at build time
- A self-contained SQLite datastore at
/var/lib/eveboxwith no external search cluster required - nginx on port
80reverse proxying the console and its JSON API with HTTP Basic authentication, plus an unauthenticated/healthzendpoint for Azure Load Balancer probes - A one-shot
evebox-firstboot.servicethat pins the capture interface to this instance's NIC, generates a per-instance password on first boot, and writes it to/root/evebox-info.txt(mode0600) - A shipped pipeline self-test signature, so you can verify the whole capture, index and display chain with one command
- An Ubuntu 24.04 LTS base, patched at build time, with unattended security upgrades enabled
- 24/7 SecureAnyCloud support
EveBox is published by the EveBox project under the MIT licence, and Suricata is published by the Open Information Security Foundation under the GPL 2.0 licence. This image is packaged by SecureAnyCloud and is not affiliated with or endorsed by the EveBox or Suricata projects.
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.
Standard_B2s (2 vCPU / 4 GiB RAM) is a sensible starting size. Increase CPU and memory for busier links or a larger ruleset.
In the network security group (NSG), allow inbound 22/tcp from your management network and 80/tcp for the console. EveBox serves plain HTTP on port 80. For production or shared access, terminate TLS in front of it with your own domain, using a reverse proxy or Azure Application Gateway.
What this sensor sees: Suricata inspects traffic arriving at this VM's own network interface. That makes it an excellent host-based sensor and a working monitoring point for anything routed through it. To inspect traffic for other machines, route or mirror that traffic through this instance, for example by making it a NAT or gateway hop.
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for EveBox by SecureAnyCloud, and select Create.
On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80).
Select Review + create, then Create.
Step 2 - Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:evebox-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name evebox \
--image sac1647283583153:evebox-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name evebox --port 80 --priority 1010Step 3 - Connect to your VM
ssh azureuser@<vm-public-ip>Step 4 - Confirm the services are running
The appliance is three cooperating units. suricata.service captures and detects, evebox.service indexes and serves the console on the loopback interface, and nginx.service fronts it on port 80. A one-shot evebox-firstboot.service runs once on first boot to pin the capture interface and generate the per-instance password.
Confirm all four are active, and that nginx is listening on port 80 while EveBox stays private on 127.0.0.1:5636:
systemctl is-active suricata evebox nginx evebox-firstbootss -tlnp | grep -E ':80 |:5636 'The second command is the security check that matters. EveBox must appear only on 127.0.0.1:5636. If it were bound to 0.0.0.0, the console would be reachable without passing through nginx authentication.
Step 5 - Retrieve your per-instance credentials
The first-boot service writes the console URL, username and generated password to /root/evebox-info.txt, which only root can read:
cat /root/evebox-info.txtThe file also records where Suricata writes events, how to refresh the ruleset, and how to rotate the password. Copy the password somewhere safe, such as a password manager. To change it later, run:
sudo htpasswd -B /etc/nginx/evebox.htpasswd eveboxStep 6 - Confirm the console is secure by default
Without credentials, nginx refuses the request. With the per-instance password, the same endpoint returns the EveBox version:
curl -s -o /dev/null -w 'HTTP %{http_code} (authentication required)\n' http://127.0.0.1/api/versioncurl -s -u evebox:<evebox-password> http://127.0.0.1/api/version | python3 -m json.toolThe first call returns HTTP 401. The unauthenticated /healthz endpoint stays open so an Azure Load Balancer can probe the instance without credentials:
curl -sI http://127.0.0.1/healthz | head -1Step 7 - Prove the detection pipeline end to end
The image ships a narrow self-test signature, sid 9000001, that matches only ICMP carrying the ASCII marker SecureAnyCloud. It fires only when you send the probe deliberately, so it adds no noise to ordinary traffic.
The test exercises every link in the chain at once: the wire, Suricata, eve.json, the SQLite index, and the authenticated web API.
First confirm the Emerging Threats ruleset is loaded:
grep -cE '^[[:space:]]*(alert|drop|reject|pass)[[:space:]]' /var/lib/suricata/rules/suricata.rulesNow send the probe at your default gateway and confirm Suricata wrote the alert:
GW=$(ip -o -4 route show to default | awk '{print $3}' | head -1); ping -c 3 -W 1 -p 636c6f7564696d67 "$GW" >/dev/null 2>&1; sleep 5; grep -o '"signature":"sac EveBox pipeline self-test"' /var/log/suricata/eve.json | head -1The gateway does not need to reply. The probe only has to leave the monitored interface.
Finally, confirm that EveBox has indexed the alert and serves it through the authenticated API:
curl -s -u evebox:<evebox-password> http://127.0.0.1/api/alerts | python3 -c "import sys,json;d=json.load(sys.stdin);print(json.dumps([e['_source']['alert']['signature'] for e in d.get('events',[])], indent=2))"The list shows SecureAnyCloud EveBox pipeline self-test, alongside any real signatures Suricata has already matched against live traffic.
Step 8 - Sign in to the EveBox console
Open http://<vm-public-ip>/ in a browser. Sign in with the username evebox and the password from Step 5.
EveBox opens on the Inbox, its main triage view. It lists every alert Suricata has raised, newest first, grouped by signature with a count, the source and destination addresses, and the time.
From the Inbox you can Archive an alert you have dealt with, or Escalate one that needs follow-up. Escalated alerts get their own view. Use the search box to filter by signature, address or any field in the event.
Step 9 - Investigate an alert
Click any alert to open the full record behind it. EveBox shows the timestamp, protocol, source and destination with ports, the capture interface and flow ID, and the signature with its category, severity and signature ID.
Where Suricata captured related context, such as DNS hostnames, HTTP transactions or extracted files, it appears in the tabs at the bottom. You can see not just that something matched, but what the traffic actually was.
Use Escalate to flag an alert for follow-up, Archive to clear it once handled, and Add Comment to leave a note for whoever picks it up next.
Step 10 - Browse the raw event stream
The Events view shows everything Suricata writes, not only alerts. Flow records, HTTP transactions, DNS queries, TLS handshakes and file metadata all appear here, and the Event Type filter narrows the list to one kind. Use this view to understand normal traffic on the instance, or to find the context around an alert you are investigating.
The Alerts view is the complement. It lists every alert regardless of inbox state, grouped by signature, which is the quickest way to see what matches most often.
Keeping the ruleset current
The image ships the Emerging Threats open ruleset as it stood when the image was built. New signatures are published continually, so refresh the ruleset regularly:
sudo suricata-update
sudo systemctl restart suricataTo automate it, add a weekly systemd timer or cron entry that runs those two commands. You can also add other rule sources with sudo suricata-update enable-source <name>; list what is available with sudo suricata-update list-sources.
Your own local rules can go in /var/lib/suricata/rules/, added to the rule-files list in /etc/suricata/suricata.yaml. The shipped self test rule at /var/lib/suricata/rules/sac-selftest.rules is a working example of the format.
Where the data lives
Suricata writes its event stream to /var/log/suricata/eve.json and EveBox indexes it into /var/lib/evebox. Both grow with traffic volume, so on a busy sensor, watch disk usage and consider attaching a larger data disk. Suricata's own logrotate configuration manages eve.json, and EveBox applies its own retention to the indexed events.
To confirm both sides are healthy at any time:
systemctl is-active suricata evebox && ls -lh /var/log/suricata/eve.jsonEnabling HTTPS for production
The console is served over plain HTTP on port 80. For anything beyond a trusted network, put TLS in front of it: point a DNS name at the instance and terminate TLS with Azure Application Gateway or Azure Front Door, or install a certificate directly in the nginx site at /etc/nginx/sites-available/sac-evebox. Keep the Basic authentication in place. TLS protects the credentials in transit, but it does not replace them.
Support
SecureAnyCloud provides 24/7 support for this image. Contact sales@secureanycloud.com.
Deploy on Azure
Launch EveBox on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
This image runs EveBox 0.26.0, a web-based event viewer and alert triage console for Suricata, together with Suricata 7.0.3, the open source intrusion detection engine that produces the alerts.
EveBox is only a viewer over an event stream it does not produce, so this image ships the complete appliance. Suricata captures traffic on the instance's primary network interface and matches it against the Emerging Threats open ruleset. It writes alerts, along with flow, DNS, TLS and HTTP metadata, to /var/log/suricata/eve.json.
EveBox indexes that stream into a local SQLite datastore, so there is no Elasticsearch cluster to run. It presents the events as a searchable analyst inbox in the browser.
The image is secure by default. EveBox is bound only to the loopback interface and is fronted by nginx on port 80 with HTTP Basic authentication. The password is generated on first boot, is unique to each instance, and is written to a root-only file. No credential is baked into the image, and no two deployments share one. Because EveBox is bound to loopback, nobody can bypass the authentication by reaching the application port directly.
What you get:
- EveBox 0.26.0 installed from the official upstream release, running as a dedicated non-root
eveboxservice bound to127.0.0.1:5636 - Suricata 7.0.3 configured for af-packet capture on the instance's primary interface, with the Emerging Threats open ruleset loaded at build time
- A self-contained SQLite datastore at
/var/lib/eveboxwith no external search cluster required - nginx on port
80reverse proxying the console and its JSON API with HTTP Basic authentication, plus an unauthenticated/healthzendpoint for load balancer probes - A one-shot
evebox-firstboot.servicethat pins the capture interface to this instance's NIC, generates a per-instance password on first boot, and writes it to/root/evebox-info.txt(mode0600) - A shipped pipeline self-test signature, so you can verify the whole capture, index and display chain with one command
- A fully patched Ubuntu 24.04 LTS base with unattended security upgrades enabled
- 24/7 SecureAnyCloud support
EveBox is published by the EveBox project under the MIT licence, and Suricata is published by the Open Information Security Foundation under the GPL 2.0 licence. This image is packaged by SecureAnyCloud and is not affiliated with or endorsed by the EveBox or Suricata projects.
Prerequisites
You need an active AWS account, an EC2 key pair in the target region, and a VPC with a subnet.
m5.large (2 vCPU / 8 GiB RAM) is a sensible starting size. Increase CPU and memory for busier links or a larger ruleset.
In the security group, allow inbound 22/tcp from your management network and 80/tcp for the console. EveBox serves plain HTTP on port 80. For production or shared access, terminate TLS in front of it with your own domain, using a reverse proxy, an Application Load Balancer or Amazon CloudFront.
What this sensor sees: Suricata inspects traffic arriving at this instance's own network interface. That makes it an excellent host-based sensor and a working monitoring point for anything routed through it. To inspect traffic for other machines, route or mirror that traffic through this instance, for example with a VPC traffic mirror session or by making it a NAT or gateway hop.
Connecting to your instance
Connect over SSH on port 22 as the default login user for the AMI variant you launched:
OS variant SSH login user
Ubuntu 24.04 ubuntu
Step 1 - Subscribe from AWS Marketplace
Sign in to the AWS Marketplace, search for EveBox by SecureAnyCloud, and choose Continue to Subscribe, then Continue to Configuration.
Pick the software version and your region, then choose Continue to Launch. Launch through EC2. Choose your instance type, VPC and subnet, your key pair, and a security group that allows inbound 22 and 80.
Step 2 - Launch from the AWS CLI
aws ec2 run-instances \
--image-id <evebox-ami-id> \
--instance-type m5.large \
--key-name <your-key-pair> \
--security-group-ids <sg-allowing-22-and-80> \
--subnet-id <your-subnet> \
--associate-public-ip-address \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=evebox}]'Find the AMI id for your region on the product's Launch page in AWS Marketplace.
Step 3 - Connect to your instance
ssh ubuntu@<instance-public-ip>Step 4 - Confirm the services are running
The appliance is three cooperating units. suricata.service captures and detects, evebox.service indexes and serves the console on the loopback interface, and nginx.service fronts it on port 80. A one-shot evebox-firstboot.service runs once on first boot to pin the capture interface and generate the per-instance password.
Confirm all four are active:
systemctl is-active suricata evebox nginx evebox-firstbootactive active active activeThen confirm that nginx is listening on port 80 while EveBox stays private on 127.0.0.1:5636:
ss -tlnp | grep -E ':80 |:5636 'LISTEN 0 128 127.0.0.1:5636 0.0.0.0:* users:(("evebox",pid=4032,fd=61)) LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=4082,fd=5),...)This is the security check that matters. EveBox must appear only on 127.0.0.1:5636. If it were bound to 0.0.0.0, the console would be reachable without passing through nginx authentication.
Step 5 - Retrieve your per-instance credentials
The first-boot service writes the console URL, username and generated password to /root/evebox-info.txt, which only root can read:
sudo cat /root/evebox-info.txtevebox_url=http://<instance-public-ip>/ evebox_username=evebox evebox_password=****************************The file also records where Suricata writes events, how to refresh the ruleset, and how to rotate the password. Copy the password somewhere safe, such as a password manager. To change it later, run:
sudo htpasswd -B /etc/nginx/evebox.htpasswd eveboxStep 6 - Confirm the console is secure by default
Without credentials, nginx refuses the request. With the per-instance password, the same endpoint returns the EveBox version:
curl -s -o /dev/null -w 'HTTP %{http_code} (authentication required)\n' http://127.0.0.1/api/versionHTTP 401 (authentication required)curl -s -u evebox:<evebox-password> http://127.0.0.1/api/version | python3 -m json.tool{ "revision": "70e9fc5a", "version": "0.26.0" }The unauthenticated /healthz endpoint stays open so a load balancer can probe the instance without credentials:
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1/healthzHTTP 200Step 7 - Prove the detection pipeline end to end
The image ships a narrow self-test signature, sid 9000001, that matches only ICMP carrying the ASCII marker SecureAnyCloud. It fires only when you send the probe deliberately, so it adds no noise to ordinary traffic.
The test exercises every link in the chain at once: the wire, Suricata, eve.json, the SQLite index, and the authenticated web API.
First confirm the Emerging Threats ruleset is loaded:
grep -cE '^[[:space:]]*(alert|drop|reject|pass)[[:space:]]' /var/lib/suricata/rules/suricata.rules52051Now send the probe at your default gateway and confirm that Suricata wrote the alert. The gateway does not need to reply. The probe only has to leave the monitored interface:
GW=$(ip -o -4 route show to default | awk '{print $3}' | head -1); ping -c 3 -W 1 -p 636c6f7564696d67 "$GW" >/dev/null 2>&1; for i in $(seq 1 10); do grep -q '"signature":"sac EveBox pipeline self-test"' /var/log/suricata/eve.json && break; sleep 2; done; grep -m1 -o '"signature":"sac EveBox pipeline self-test"' /var/log/suricata/eve.json"signature":"sac EveBox pipeline self-test"Finally, confirm EveBox has indexed it and will serve it through the authenticated API:
curl -s -u evebox:<evebox-password> http://127.0.0.1/api/alerts | python3 -c "import sys,json;d=json.load(sys.stdin);print(json.dumps(sorted(set(e['_source']['alert']['signature'] for e in d.get('events',[]))), indent=2))"[ "ET DROP Dshield Block Listed Source group 1", "GPL ATTACK_RESPONSE id check returned root", "SURICATA Applayer Mismatch protocol both directions", "SURICATA STREAM Packet with invalid timestamp", "sac EveBox pipeline self-test" ]The self test signature appears alongside any real signatures Suricata has already matched against live traffic reaching the instance.
Step 8 - Sign in to the EveBox console
Open http://<instance-public-ip>/ in a browser. Sign in with the username evebox and the password from Step 5.
EveBox opens on the Inbox, its main triage view. It lists every alert Suricata has raised, newest first, grouped by signature with a count, the source and destination addresses, and the time.
From the Inbox you can Archive an alert you have dealt with, or Escalate one that needs follow-up. Escalated alerts get their own view. Use the search box to filter by signature, address or any field in the event.
Step 9 - Investigate an alert
Click any alert to open the full record behind it. EveBox shows the timestamp, protocol, source and destination with ports, the capture interface and flow ID, and the signature with its category, severity and signature ID.
Where Suricata captured related context, such as DNS hostnames, HTTP transactions or extracted files, it appears in the tabs at the bottom. You can see not just that something matched, but what the traffic actually was.
Use Escalate to flag an alert for follow-up, Archive to clear it once handled, and Add Comment to leave a note for whoever picks it up next.
Step 10 - Browse the raw event stream
The Events view shows everything Suricata is writing, not only alerts. Flow records, HTTP transactions, DNS queries, TLS handshakes and file metadata all appear here, and the Event Type filter narrows to one kind. Use this view to understand normal traffic on the instance, or to find the context around an alert you are investigating.
The Alerts view is the complement. It lists every alert regardless of inbox state, grouped by signature, which is the quickest way to see what matches most often.
Keeping the ruleset current
The image ships the Emerging Threats open ruleset as it stood when the image was built. New signatures are published continually, so refresh the ruleset regularly:
sudo suricata-update
sudo systemctl restart suricataTo automate it, add a weekly systemd timer or cron entry that runs those two commands. You can also add other rule sources with sudo suricata-update enable-source <name>; list what is available with sudo suricata-update list-sources.
Your own local rules can go in /var/lib/suricata/rules/, added to the rule-files list in /etc/suricata/suricata.yaml. The shipped self test rule at /var/lib/suricata/rules/sac-selftest.rules is a working example of the format.
Where the data lives
Suricata writes its event stream to /var/log/suricata/eve.json and EveBox indexes it into /var/lib/evebox. Both grow with traffic volume, so on a busy sensor, watch disk usage and consider attaching a larger EBS volume. Suricata's own logrotate configuration manages eve.json, and EveBox applies its own retention to the indexed events.
To confirm both sides are healthy at any time:
systemctl is-active suricata evebox && ls -lh /var/log/suricata/eve.jsonactive active -rw-r--r-- 1 root root 952K Jul 25 04:44 /var/log/suricata/eve.jsonEnabling HTTPS for production
The console is served over plain HTTP on port 80. For anything beyond a trusted network, put TLS in front of it: point a DNS name at the instance and terminate TLS with an Application Load Balancer or Amazon CloudFront, or install a certificate directly in the nginx site at /etc/nginx/sites-available/sac-evebox. Keep the Basic authentication in place. TLS protects the credentials in transit, but it does not replace them.
Support
SecureAnyCloud provides 24/7 support for this image. Contact sales@secureanycloud.com.
Deploy on AWS
Launch EveBox Suricata IDS Alert Console on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com