Most engineers think…
"I built the security policy, so the WAF is protecting the app now."
Wrong — and this is the single most common day-one mistake. A security policy that isn't attached to a virtual server inspects nothing. ASM only sees a request because the BIG-IP is a full proxy: the client connects to a virtual server, the WAF terminates that connection, reassembles the whole HTTP request, inspects it, and only then opens its own connection to the app pool. No virtual server in the path = no inspection. This lesson builds the right mental model: full proxy → virtual server → attached policy → enforcement mode.
① Full proxy — why a WAF must hold the whole request
Think of airport security. You can't screen a passenger by glancing at them as they sprint past — you stop them, take the whole bag apart, look at everything, then let them walk to the gate. A WAF works the same way. A full proxy means the BIG-IP terminates the client's TCP and TLS connection, buffers and reassembles the entire HTTP request, hands it to ASM for inspection, and only then opens a separate connection to the back-end pool.
Why does this matter? A packet-by-packet (pass-through) device sees fragments — it never has the complete, decrypted, reassembled HTTP body in one place. ASM needs the whole request: the URI, every header, every parameter, the payload. Only a full proxy delivers that. The price is that the BIG-IP is now an explicit reverse proxy — clients connect to the virtual server, not to your web server.
The TLS session also terminates on the virtual server (via its client SSL profile), so ASM inspects cleartext HTTP. If the app is HTTPS end-to-end, the BIG-IP re-encrypts to the pool using a server SSL profile. No decryption = ASM is blind, no matter how good the policy.
Sneha at Infosys faces this
Sneha put the BIG-IP "in front of" the app by giving it an IP on the same subnet and pointing DNS at it — but kept the old server reachable directly too. Pentest traffic still hits the app un-inspected. Management asks why the WAF "isn't seeing anything".
ASM is a reverse proxy. If clients can still reach the web server's real IP directly, that traffic bypasses the virtual server entirely — so ASM never sees it. The WAF only inspects what flows through its virtual server.
Confirm where clients actually connect.
Local Traffic ▸ Virtual Servers → confirm the published address; then check DNS + firewall so the server's real IP is NOT directly reachableMake the virtual server the only path: publish DNS to the virtual-server address and block direct access to the pool member. Now every request is forced through the full proxy.
Re-run the test. The request now appears in Security ▸ Event Logs ▸ Application ▸ Requests with a support ID — proof it traversed ASM.
▶ Watch one request traverse the full proxy
Rahul at TCS opens the app. Press Play to follow the request through the full-proxy data path, then Break it to see what happens when the policy isn't attached to the virtual server.
Why must BIG-IP Advanced WAF be a full proxy rather than a packet-by-packet pass-through device?
Pause & Predict
A full proxy terminates the client's connection. For an HTTPS app, what BIG-IP object decrypts the traffic so ASM can read the cleartext HTTP? Type your guess.
② Where the ASM module sits — on a virtual server
So the WAF is a full proxy. But which object actually carries the inspection? The virtual server. A virtual server is the listener — an IP and port (e.g. 10.10.20.5:443) — that clients connect to. Everything that decides what happens to traffic hangs off it: the HTTP profile, the client SSL profile, the pool… and the security policy.
The attach chain
ASM doesn't inspect "the box" — it inspects whatever flows through a virtual server that has a policy associated. The chain is:
- Virtual server — the listener clients hit. Needs an HTTP profile (so the BIG-IP parses HTTP) and, for HTTPS, a client SSL profile (so TLS terminates and ASM sees cleartext).
- Security policy association — on modern versions ASM attaches via a Local Traffic Policy (the virtual server's Security ▸ Policies tab lets you pick the ASM policy). That association is what turns inspection on.
- Pool — the back-end app servers the BIG-IP forwards clean traffic to over its own connection.
Break the chain anywhere — no policy on the virtual server, no SSL profile on an HTTPS app, or clients reaching the server directly — and ASM is silently doing nothing.
One BIG-IP can host many virtual servers, each with its own security policy (or none). A policy you built but never associated with a virtual server protects nothing. Always confirm the association on Local Traffic ▸ Virtual Servers ▸ (your VS) ▸ Security ▸ Policies before you call a deployment done.
Priya at Flipkart faces this
Priya built a clean security policy for the HTTPS checkout app and associated it with the virtual server. Inspection still reports nothing — no violations, no logs, even on test attacks.
The virtual server has no client SSL profile, so TLS never terminates on the BIG-IP. ASM only ever sees encrypted bytes — it can't inspect cleartext HTTP it can't read.
Add a Client SSL profile (with the app's cert/key) so TLS terminates on the virtual server, plus a Server SSL profile if the back-end is HTTPS too. Now ASM sees cleartext.
Re-run a test attack. It now appears in Security ▸ Event Logs ▸ Application ▸ Requests — proof ASM is decrypting and inspecting.
On which BIG-IP object do you attach an ASM security policy so it actually inspects traffic?
Pause & Predict
Before any of this — before you can even see the Application Security menu to build a policy — one box-level step must be done. What is it? Type your guess.
③ Provision & attach — standing ASM up
Time to actually deploy. There's a strict order, and skipping the first step is why so many "the menu isn't there" tickets exist.
Step 1 — Provision the ASM module
The ASM software is on the box, but it isn't active until you give it resources. Provisioning lives at System ▸ Resource Provisioning. Set the Application Security (ASM) module to Nominal. On a combined LTM+ASM box, provision each module you run at Nominal so resources are shared — Dedicated gives one module everything and starves the rest. After you submit, the box re-provisions (a brief services restart) and the Security ▸ Application Security menu appears.
Step 2 — Build a security policy
With ASM provisioned, create a policy under Security ▸ Application Security ▸ Security Policies. Modern versions use the policy wizard: pick a template (Rapid Deployment is the common starting point), name the policy, and choose the enforcement mode (Transparent to start — Path 4). The policy is a configuration object at this point — it inspects nothing yet, because it isn't on a virtual server.
Step 3 — Attach the policy to the virtual server, then Apply
This is the step everyone forgets. Open Local Traffic ▸ Virtual Servers ▸ (your VS) ▸ Security ▸ Policies, set Application Security Policy to Enabled, and pick your policy. That writes a Local Traffic Policy that enables ASM on this virtual server. Confirm the virtual server also has an HTTP profile and (for HTTPS) a Client SSL profile. Then Apply Policy — every ASM change stays in the editor until you apply.
Only now does inspection actually start. A policy with no virtual-server association is dead weight — and it's the most common reason a freshly built WAF "isn't seeing anything".
▶ Watch ASM go from "racked" to "inspecting" — then watch someone skip the attach
Karthik at Wipro stands up ASM for a new app. Play the correct deploy order, then Break it to see what happens when he forgets to attach the policy to the virtual server.
The four objects you touch to deploy ASM — tap each card
The front names the object; the back gives you the "so what" — why it matters and where it lives.
Provisioned at System ▸ Resource Provisioning (Nominal). So what: until it's provisioned the Application Security menu doesn't exist — there's no policy to build. Nominal shares box resources with LTM; Dedicated starves the others.
The rule set ASM enforces, built with the policy wizard. So what: on its own it's just a configuration object. It inspects nothing until it's associated with a virtual server.
The IP:port listener clients connect to (e.g. 10.10.20.5:443). So what: this is the inspection point — the policy attaches here via Security ▸ Policies. It also needs an HTTP profile and, for HTTPS, a Client SSL profile.
Commits staged ASM changes so they go live. So what: every ASM edit sits in the editor until you Apply. Forget it and your attach (and every later tweak) never takes effect.
You created a security policy but no traffic is being inspected at all. The policy itself looks correct. Most likely cause?
Pause & Predict
An enforced signature is matching. The policy is in Blocking mode. But this signature has only its Alarm flag ticked — not Block. Will the request be dropped or just logged? Type your guess.
④ Transparent vs Blocking — the go-live decision
You've provisioned, built, and attached. The last choice decides whether your brand-new WAF is a quiet observer or an active gate: the policy's enforcement mode. Get this wrong on day one and you either protect nothing or block real customers.
Transparent — observe and tune
Transparent mode means ASM inspects every request and logs violations — but never drops anything. This is how you go live safely: watch real traffic, see which violations are real attacks vs your own app's quirks (false positives), and tune them out. No legitimate user is ever blocked while you learn.
Blocking — enforce for real
Blocking mode means ASM drops requests that trigger a violation set to Block, and serves the user a blocking response page with a support ID. You only flip to Blocking once Transparent-mode tuning has cleared the false positives. The flip is the actual moment the WAF starts protecting the app.
So the safe go-live sequence is: deploy in Transparent → observe & tune for a window → switch to Blocking. Going straight to Blocking on an untuned policy is the classic self-inflicted outage — the WAF blocks a legitimate workflow the first hour it's live.
Transparent still inspects and logs everything — you get full visibility, you just don't drop. Treat it as your tuning runway, not as "the WAF is disabled". The Event Log in Transparent mode is exactly what tells you whether a Block-mode flip will be clean or cause an outage.
root@(bigip01)(cfg-sync Standalone)(Active)(/Common)(tmos)# list sys provision asm # then confirm the policy + its enforcement mode: list asm policy /Common/app_pol enforcement-mode list ltm virtual /Common/app_vs security-policy
sys provision asm { level nominal }
asm policy /Common/app_pol { enforcement-mode transparent }
ltm virtual /Common/app_vs { security-policy /Common/app_pol }
# ASM provisioned (nominal), policy attached to app_vs, currently Transparent (logs only).root@(bigip01)(tmos)# modify asm policy /Common/app_pol enforcement-mode blocking root@(bigip01)(tmos)# modify asm policy /Common/app_pol apply
asm policy /Common/app_pol { enforcement-mode blocking }
Policy /Common/app_pol applied. Active.
# Now violations set to Block actually drop the request and return a support ID.Don't flip a brand-new policy to Blocking on day one to "protect instantly". An untuned policy is full of false positives — legitimate parts of your own app that look suspicious. In Blocking mode, those drop real users the first hour the WAF is live: checkout breaks, the support queue explodes, and someone disables the WAF entirely. Deploy in Transparent, watch the Event Log, tune out the false positives, then switch to Blocking. The runway is the whole point.
▶ Watch the go-live decision — Transparent observes, Blocking drops
A real attack hits a tuned policy. Play the Blocking-mode drop, then Break it to see what the same request does while the policy is still in Transparent mode.
Aditya at HCL faces this
Aditya attached the policy and confirmed real attacks are showing up in the Event Log — but every one is "Alarmed", never "Blocked". The app is taking live attacks. He's sure the policy is correct.
The policy is still in Transparent enforcement mode. Transparent inspects and logs every violation but never drops — exactly why he sees "Alarmed/Allowed" on real attacks.
Once the Event Log shows no false positives on legitimate traffic, set Enforcement Mode = Blocking and Apply Policy. Now violations set to Block actually drop.
Re-run the attack. The Event Log now shows the request Blocked with a support ID — not just an alarm entry.
Never claim the WAF is "live" from the config screen. Send a safe synthetic attack (e.g. ' OR 1=1-- from your test box), then open Security ▸ Event Logs ▸ Application ▸ Requests, filter on the support ID, and read the result. "Blocked" = policy attached + Blocking mode + violation set to Block. "Alarmed/Allowed" = the policy is attached but still Transparent (or the violation is Alarm-only) — not a box problem.
root@(bigip01)(tmos)# show asm policy /Common/app_pol # then read a test request in the Event Log by support ID
asm policy /Common/app_pol Virtual Servers: /Common/app_vs Enforcement Mode: blocking 2026-06-02 14:22 src 203.0.113.7 vs 10.10.20.5:443 Violation: Attack signature detected Result: BLOCKED Support ID: 18007244126553882151 # If Virtual Servers is empty → policy not attached. If Mode = transparent → only Alarmed, never Blocked.
A new policy is attached to the virtual server in Transparent enforcement mode. A real SQL-injection attack hits it. What does Advanced WAF do?
🤖 Ask the AI Tutor
Tap any question — instant, scoped to this lesson. No login, no waiting.
Pre-curated from F5 techdocs + DevCentral, scoped to BIG-IP Advanced WAF (formerly ASM) architecture & deployment. For a live prod issue, paste your Event-Log export into chat.techclick.in.
📝 Wrap-up assessment — six more
You've answered 4 inline. Six left. 70% (7 of 10) marks the lesson complete on your profile. Tap Submit all answers at the end.
🧠 In your own words
Type one line: you built a security policy but nothing is being inspected — what's the most likely cause, and how does a request actually reach ASM? Then compare to the expert version.
🗣 Teach a friend
Best way to lock it in — explain it in one line to a teammate. Tap to generate a paste-ready summary.
📖 Glossary
- Full proxy
- The BIG-IP terminates the client TCP/TLS connection and reassembles the whole HTTP request, then opens a separate connection to the pool. Two independent connections, not one pass-through — this is what lets ASM inspect the complete application layer.
- Reverse proxy
- Clients connect to the BIG-IP virtual server (the published address), not directly to the back-end server. ASM speaks for the server.
- Virtual server
- The BIG-IP listener — an IP:port (e.g. 10.10.20.5:443). Profiles, the pool, and the ASM security policy all attach here. It is the inspection point.
- Security policy
- The rule set ASM enforces on requests/responses. It must be ASSOCIATED with a virtual server (via a Local Traffic Policy / Security ▸ Policies) to inspect anything.
- Local Traffic Policy
- An LTM policy that enables ASM and applies a security policy on a virtual server — the plumbing that links a virtual server to an ASM policy on modern versions.
- Provisioning
- Allocating CPU/memory to a module so it runs (System ▸ Resource Provisioning). Levels: None / Minimum / Nominal / Dedicated. Until ASM is provisioned, the Application Security menu doesn't exist.
- Nominal vs Dedicated
- Nominal shares box resources across the modules you run (e.g. LTM + ASM). Dedicated gives one module everything and starves the others — only for a single-purpose box.
- Client SSL profile
- The profile on the virtual server that terminates the client's TLS so the BIG-IP decrypts and ASM sees cleartext HTTP. (A server SSL profile re-encrypts to an HTTPS back-end.)
- Enforcement mode (Transparent vs Blocking)
- Transparent = ASM detects and logs violations but never drops. Blocking = ASM drops requests that trigger a violation set to Block. Deploy Transparent, tune, then switch to Blocking.
- Apply Policy
- Commits staged ASM changes so they go live. Every ASM edit (attach, mode change) stays in the editor until you Apply.
📚 Sources
- F5 techdocs — BIG-IP Advanced WAF / ASM: Implementations & About security policies (ASM provisioning, building a policy, associating a security policy with a virtual server; Rapid Deployment template). techdocs.f5.com
- F5 techdocs — BIG-IP Local Traffic Management: Basics & Virtual server & profile concepts (virtual server = listener; HTTP profile, client/server SSL profiles, pool; full-proxy architecture and SSL termination on the virtual server). techdocs.f5.com
- F5 article K12313127 / K14947 — Overview of BIG-IP module resource provisioning (System ▸ Resource Provisioning; None/Minimum/Nominal/Dedicated; provision each module at Nominal on a multi-module box). my.f5.com
- F5 techdocs — Enforcement modes for security policies (Transparent = detect/log only; Blocking = drop; deploy Transparent first then switch to Blocking after tuning). techdocs.f5.com
- F5 DevCentral — The BIG-IP is a full proxy & ASM deployment walk-throughs (why a WAF must terminate + reassemble; reverse-proxy topologies, routed inline vs one-armed with SNAT). community.f5.com
- r/networking & r/f5networks practitioner threads — "ASM policy built but nothing inspected = not attached to a virtual server" and "deploy in Transparent, tune, then Blocking". reddit.com
- F5 Certification — 303 — BIG-IP ASM Specialist Exam Blueprint (full-proxy architecture, ASM provisioning, policy creation & virtual-server association, deployment modes; cert anchor: 90 min, 80 questions, pass 245/350). education.f5.com / f5.com
What's next?
You can now place ASM correctly in the data path: full proxy, on a virtual server, provisioned and attached, and deployed Transparent-then-Blocking. Next, go inside the policy itself — building a security policy: templates, the policy wizard, learning, and the building blocks ASM uses to protect an app. After that, attack signatures give you the negative-security engine.