Skip to content

Draft: Documentation for Security Monitoring in F5 ADS - #2296

Open
edarzins wants to merge 4 commits into
mainfrom
secops-naas
Open

edarzins wants to merge 4 commits into
mainfrom
secops-naas

Conversation

@edarzins

@edarzins edarzins commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Documentation for configuring and operating Security Monitoring in F5 ADS.

Proposed changes

Checklist

Before sharing this pull request, I completed the following checklist:

Footnotes

  1. Potentially sensitive information includes personally identify information (PII), authentication credentials, and live URLs. Refer to the style guide for guidance about placeholder content. ↩

@edarzins
edarzins requested a review from a team as a code owner September 17, 2026 15:27
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 17, 2026
@github-actions

Copy link
Copy Markdown

✅ Deploy Preview will be available once build job completes!

Name Link
😎 Deploy Preview https://frontdoor-test-docs.nginx.com/previews/docs/2296/

@JTorreG JTorreG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove all the --- section separators.

@edarzins

Copy link
Copy Markdown
Contributor Author

@JTorreG Incorporated your suggestions. However, when I run "make watch" on this branch, it doesn't render anything in the directory "content/nginxaas/overview/app-protect/waf-security-dashboard". Any idea why?

@edarzins edarzins changed the title Draft: Documentation for Security Monitoring in NGINXaaS Draft: Documentation for Security Monitoring in F5 ADS Oct 22, 2026
url: /f5ads/platform/app-protect/waf-security-dashboard
---

Use the security monitoring module in the F5 ADS Console to collect, visualize, and query security events from F5 WAF for NGINX running on NGINX Plus instances. Review attacks, violations, and triggered signatures to assess threats.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't find it in these changes in the docs preview pages. Where does the content in this file show up?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consolidated redundant overview and security-monitoring overview.

f5-content-type: concept
f5-docs: DOCS-000
f5-product: F5 Application Delivery Service
title: Security monitoring overview

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks a but odd to see Overview and Security monitoring overview sections in the navbar. Can we move the contents of this file so they show up in Overview?

Image

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The "overview" section was redundant, so I removed it. It was a carryover from the N1 docs.

- **Deployment**: Each event records the F5 ADS deployment ID that produced it. Use this to scope by deployment.
- **Instance**: Each event records the NGINX instance hostname that produced it. Use this to scope by data plane.
- **Policy**: Each event records the F5 WAF for NGINX policy that produced it, so you can compare activity across policy versions or rollouts — useful for measuring the impact of a policy change before promoting it.
- **Destination hostname**: Each event records the HTTP `Host` header sent by the client — the *application* being attacked, not the instance hostname (which identifies the data plane). Use this when one data plane fronts multiple applications and you need to scope by app rather than by infrastructure.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sent by the client, or set by the NGINX dataplane?

This sounds like it is discussing the client of F5ADS (eg. the Host header used in the request to NGINX), while also discussing the backend/upstream application workloads that NGINX proxies to. Could use some clarity.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed unnecessary stuff to make it more clear.

- **Destination hostname**: Each event records the HTTP `Host` header sent by the client — the *application* being attacked, not the instance hostname (which identifies the data plane). Use this when one data plane fronts multiple applications and you need to scope by app rather than by infrastructure.
## Retention

Security events are retained for **90 days**. Queries that reach further back than 90 days return no results. If you need long-term retention, forward events to an external Security Information and Event Management (SIEM) system with a [custom log profile]({{< ref "/nginx-one-console/waf-integration/log-profiles/_index.md" >}}) in addition to the `secops_dashboard` log profile.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really want to tell users to go do this themselves? I could see suggesting they reach out to us (maybe we can work with them to retain their data for longer as a premium option if there is enough interest).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Retention for 90 days is the current configuration in AIDF. Extending that is beyond the scope of this epic. Please open a ticket if you think the data-retention period should be configurable.

toc: true
f5-keywords: "security monitoring, security dashboard, F5 WAF for NGINX, security events, analytics, F5 ADS Console"
f5-summary: >
Security monitoring in the F5 ADS Console centralizes security events from F5 WAF for NGINX instances and exposes them through dashboards.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Security monitoring in the F5 ADS Console centralizes security events from F5 WAF for NGINX instances and exposes them through dashboards.
Security monitoring in the F5 ADS Console centralizes security events from F5 WAF for your deployments and exposes them through dashboards.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree

f5-audience: operator
---

Security monitoring brings F5 WAF for NGINX events from every connected instance into a single place in the F5 ADS Console. This page explains what data the system collects, how it flows, and how it is organized.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Security monitoring brings F5 WAF for NGINX events from every connected instance into a single place in the F5 ADS Console. This page explains what data the system collects, how it flows, and how it is organized.
Security monitoring brings F5 WAF for NGINX events from every deployment into a single place in the F5 ADS Console. This page explains what data the system collects, how it flows, and how it is organized.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree


## What is security monitoring?

Security monitoring is the F5 ADS Console module that ingests F5 WAF for NGINX security events from your data planes, stores them centrally, and exposes them through a security dashboard. It gives you a single view of attacks, violations, and triggered signatures across every NGINX Plus instance you have connected to the F5 ADS Console.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Security monitoring is the F5 ADS Console module that ingests F5 WAF for NGINX security events from your data planes, stores them centrally, and exposes them through a security dashboard. It gives you a single view of attacks, violations, and triggered signatures across every NGINX Plus instance you have connected to the F5 ADS Console.
Security monitoring is the F5 ADS Console module that ingests F5 WAF for NGINX security events from your data planes, stores them centrally, and exposes them through a security dashboard. It gives you a single view of attacks, violations, and triggered signatures across every deployment you have created in the F5 ADS Console.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree

app_protect_security_log /etc/nginx/secops_dashboard.tgz syslog:server=127.0.0.1:1514;
```

`app_protect_enable on;` and `app_protect_policy_file` must be present in the same context. These are covered in [Before you begin](#before-you-begin).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All I see in before you begin is "- Deployment: A deployment that has been created with the F5 ADS Console."

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also added that the user needs a WAF policy to be referenced in their config.


```nginx
app_protect_security_log_enable on;
app_protect_security_log /etc/nginx/secops_dashboard.tgz syslog:server=127.0.0.1:1514;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

elsewhere I see the path is /etc/app_protect/conf/secops_dashboard.tgz (which would make more sense since this is pre-packaged and shouldn't be in a user-managed directory, right?)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes -- the correct path is "/etc/app-protect/conf/ecops_dashboard.tgz"

Every security event carries enough context to attribute it to a specific data plane, a specific policy, and the application it targeted.

- **Deployment**: Each event records the F5 ADS deployment ID that produced it. Use this to scope by deployment.
- **Instance**: Each event records the NGINX instance hostname that produced it. Use this to scope by data plane.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have these events for us given that we don't expose the underlying deployment instance details to our customers?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was leftover from the N1 docs, "Instance" is not applicable here.

- **Deployment**: Each event records the F5 ADS deployment ID that produced it. Use this to scope by deployment.
- **Instance**: Each event records the NGINX instance hostname that produced it. Use this to scope by data plane.
- **Policy**: Each event records the F5 WAF for NGINX policy that produced it, so you can compare activity across policy versions or rollouts — useful for measuring the impact of a policy change before promoting it.
- **Destination hostname**: Each event records the HTTP `Host` header sent by the client — the *application* being attacked, not the instance hostname (which identifies the data plane). Use this when one data plane fronts multiple applications and you need to scope by app rather than by infrastructure.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not the instance hostname (which identifies the data plane) - should this be the deployment name (or identifier)?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarified this. Removed discussion of the instance.


The security monitoring dashboard depends on a consistent set of fields being present on every security event. The `secops_dashboard` log profile is the guarantee of that consistency: it ensures every data plane forwards the same set of fields, so the dashboard can render every event correctly.

## What is the `secops_dashboard` log profile?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this content include the filepath to this log profile?

Comment on lines +29 to +30
2. **Forwarding.** F5 WAF for NGINX writes the entry over syslog (port `1514` on localhost) using the [`secops_dashboard` log profile]({{< ref "/f5ads/platform/app-protect/waf-security-dashboard/default-log-profile.md" >}}). NGINX Agent's OpenTelemetry collector receives it through the `tcplog/nginx_app_protect` receiver.
3. **Transport.** The collector batches events and exports them to the F5 ADS Console through the `otlp/default` exporter. Batching keeps the upstream call rate low while keeping per-event delivery latency under a minute.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a lot of internal technical detail that I don't think we should share in public docs. The use of NGINX Agent and otel are not important to how users interact with the F5ADS service and utilize our WAF capabilities.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree. This was leftover from the N1 docs. Removed.

The data pipeline has four stages:

1. **Detection.** F5 WAF for NGINX inspects requests on the data plane and produces a security log entry whenever a request matches a violation, signature, or threat campaign.
2. **Forwarding.** F5 WAF for NGINX writes the entry over syslog (port `1514` on localhost) using the [`secops_dashboard` log profile]({{< ref "/f5ads/platform/app-protect/waf-security-dashboard/default-log-profile.md" >}}). NGINX Agent's OpenTelemetry collector receives it through the `tcplog/nginx_app_protect` receiver.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a user-facing component to writing over the syslog port so it makes sense to reference that here but I'm wondering if we need to go into the internal details of our collector and receiver (unless there is a user-facing portion to it). Perhaps we can mention the collector generically, without the internal receiver name - something like:

Suggested change
2. **Forwarding.** F5 WAF for NGINX writes the entry over syslog (port `1514` on localhost) using the [`secops_dashboard` log profile]({{< ref "/f5ads/platform/app-protect/waf-security-dashboard/default-log-profile.md" >}}). NGINX Agent's OpenTelemetry collector receives it through the `tcplog/nginx_app_protect` receiver.
2. **Forwarding.** F5 WAF for NGINX writes the entry over syslog (port `1514` on localhost) using the [`secops_dashboard` log profile]({{< ref "/f5ads/platform/app-protect/waf-security-dashboard/default-log-profile.md" >}}). A collector on the data plane receives the entry and forwards it on.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree. This was leftover from the N1 docs. Removed.

A security engineer suspects a policy is producing false positives. The engineer opens the security dashboard, filters by policy and blocked requests, and reviews the breakdown of triggered signatures. The high-volume signatures with low risk and accuracy stand out as candidates for tuning. The engineer cross-checks a few events against the raw requests to confirm the signature is firing on legitimate traffic before changing the policy.
## What security monitoring does not cover

- **Access logs and performance metrics** — security monitoring only ingests F5 WAF for NGINX security events. NGINX access logs and performance telemetry are handled by other parts of the F5 ADS Console.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

handled by other parts of the F5 ADS Console

Better to just link to the monitoring docs?


1. **Detection.** F5 WAF for NGINX inspects requests on the data plane and produces a security log entry whenever a request matches a violation, signature, or threat campaign.
2. **Forwarding.** F5 WAF for NGINX writes the entry over syslog (port `1514` on localhost) using the [`secops_dashboard` log profile]({{< ref "/f5ads/platform/app-protect/waf-security-dashboard/default-log-profile.md" >}}). NGINX Agent's OpenTelemetry collector receives it through the `tcplog/nginx_app_protect` receiver.
3. **Transport.** The collector batches events and exports them to the F5 ADS Console through the `otlp/default` exporter. Batching keeps the upstream call rate low while keeping per-event delivery latency under a minute.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm less concerned about this one but specifying the otlp/default exporter seems like an internal detail. Perhaps we can omit that.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree. This was leftover from the N1 docs. Removed.


For more information, see:

- [Set up security monitoring]({{< ref "/f5ads/platform/app-protect/waf-security-dashboard/set-up-security-monitoring.md" >}})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The ordering here for the first 2 items is reversed from the assigned weights - (navbar shows secops_dashboard first and set up security monitoring next).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed.


---

## Deploy the `secops_dashboard` log profile

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm thinking the contents of the secops_dashboard log profile page can be added here as a note instead of having those separately called out in it's own page.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree. Combined them.


When you select **Save Changes** in the previous step, F5 ADS Console pushes the configuration change to the deployment and displays a confirmation message. At that point, the F5 WAF for NGINX policy and the `secops_dashboard` log profile are in place on the deployment, and the security log directive is wired to NGINX Agent.

Any request that F5 WAF for NGINX inspects on the instance produces a security event that flows to the F5 ADS Console. Use the following checks to confirm the pipeline end to end:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Any request that F5 WAF for NGINX inspects on the instance produces a security event that flows to the F5 ADS Console. Use the following checks to confirm the pipeline end to end:
Any request that F5 WAF for NGINX inspects on the deployment produces a security event that flows to the F5 ADS Console. Use the following checks to confirm the pipeline end to end:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree.


Any request that F5 WAF for NGINX inspects on the instance produces a security event that flows to the F5 ADS Console. Use the following checks to confirm the pipeline end to end:

1. Send one or more requests through the protected application path on the instance you just configured. If you have a staging policy or a known test case that triggers a violation, use it so the event is easy to identify. Otherwise, normal inspected traffic is enough to confirm the pipeline.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
1. Send one or more requests through the protected application path on the instance you just configured. If you have a staging policy or a known test case that triggers a violation, use it so the event is easy to identify. Otherwise, normal inspected traffic is enough to confirm the pipeline.
1. Send one or more requests through the protected application path on the deployment you just configured. If you have a staging policy or a known test case that triggers a violation, use it so the event is easy to identify. Otherwise, normal inspected traffic is enough to confirm the pipeline.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree.


| Filter | Description |
|:--- |:--- |
| **Config Sync Group** | Events from instances in a specific Config Sync Group. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have this? If so, what does it mean in the context of our service where users interact with deployments?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope, leftover from N1 docs. Removed.

| **Country** | A two-letter country code derived from the client IP address. |
| **Destination Hostname** | The HTTP `Host` header that the client sent, which identifies the application being attacked. |
| **Hostname** | The NGINX instance hostname (the data plane host), which identifies the data plane that produced the events. |
| **Instance** | A specific NGINX instance, identified by object identity rather than hostname. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have this? If so, what does it mean in the context of our service where users interact with deployments?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope, leftover from N1 docs. Removed.

| **Violation Context Value** | The field value where the violation occurred. |
| **Violation Rating** | The numeric severity rating (0–5) that F5 WAF for NGINX assigned to the violation. |

Use filters to scope the dashboard to a specific policy, instance, hostname, country, IP, signature, violation, or any combination. To go from a metric on the dashboard to the underlying events, apply the relevant filter and switch to the **Event Logs** tab.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar comment as previous re: instance, and hostname?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope, leftover from N1 docs. Removed.

| **Top Signatures** | Signature (the same as the **Top Signatures** widget on the Main tab) | URIs, IP addresses, violations, and policies |
| **Top Signature CVEs** | CVE referenced by one or more signatures | URIs, IP addresses, violations, and policies |
| **Top Threat Campaigns** | Threat campaign | URIs, IP addresses, violations, and policies |
| **Top Attacked Instances** | NGINX instance hostname (not the HTTP `Host` header) | URIs, IP addresses, violations, and policies |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar comment as previous re: instance hostname

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replaced with "Top Attacked Deployments".

@amudukutore amudukutore left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@edarzins - thanks for making these changes. Overall, this looks good to me.

I made a few suggestions and had a few questions (most of them related to instance and hostnames). Am approving this pending satisfactory resolution of those comments.

Consolidated it with setup-security-monitoring
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants