Skip to main content
Mrugesh Patel
/lab/dc-east

Building a Palo Alto firewall stack in a data center — without making everyone hate you

How a real data center firewall actually gets built. Zone design, security policy structure, and the migration realities I learned moving from Cisco ASA to Palo Alto at a 200-node site.

You found a hidden page. Welcome.

The 30-second version

A data center firewall has two jobs that pull against each other: let legitimate traffic through fast, and stop everything else, even when it looks legitimate. Palo Alto wins here because of App-ID and User-ID — you stop thinking about ports and start thinking about applications.

But Palo Alto only delivers on that promise if you set up zones, security policy, and logging correctly. Get those wrong and it's just a more expensive ASA. Here's how I do it.

Zone design

Zones are the most under-thought-about part of any new Palo Alto deployment. People rush to write rules; they should be sketching zones first.

For a typical 3-tier app data center I create:

ZoneWhat lives thereTrust level
untrustInternet, all WAN circuitsExternal, untrusted
dmz-webPublic-facing web servers, reverse proxiesSemi-trusted
app-tierApplication servers, microservicesInternal
db-tierDatabases, caches, internal data storesMost sensitive
mgmtJump boxes, monitoring, backupAdmin-only
usersCorporate user network (via WAN)Trusted

Traffic flows go in one direction unless explicitly allowed: users → app-tier → db-tier, never the reverse. A compromised web server can't pivot to the database tier without triggering an explicit allow rule. That's the whole point of segmentation.

Security policy structure

Top-down, first-match-wins. Order matters. Every rule I write has a consistent structure:

name              : web-to-app-tomcat
description       : web servers reach Tomcat AppID on app tier
from zone         : dmz-web
to zone           : app-tier
source            : addr-grp-web-servers
destination       : addr-grp-tomcat-servers
application       : tomcat
service           : application-default
action            : allow
log at session end: yes
profile group     : standard-threat-prevention
tag               : tier-2, owner-platform-team

Notes on each line:

  • application: tomcat — not tcp-8080. App-ID looks at the actual L7 payload. If someone's tunneling SSH over port 8080, Palo Alto blocks it even though the port is open.
  • service: application-default — Palo Alto knows what port Tomcat normally uses. If the app appears on a different port, that's suspicious; the rule won't match.
  • log at session end — log at session START is for debugging, session END is what you keep long-term. Both = double the storage and slower searches.
  • tag — I tag every rule with tier (1=critical, 2=normal, 3=cleanup) and owner team. When something breaks, I can filter for "rules owned by platform-team" instantly.

The migration reality

Most data center firewall projects aren't greenfield. You're replacing something — usually Cisco ASA. The temptation is to convert ASA rules 1:1 to Palo Alto. Don't do this.

Lesson from Dynovis (2014): we converted 800 ASA rules directly to Palo Alto rules in a Friday night cutover. By Tuesday we had 400 stale rules nobody understood, half pointing to decommissioned servers. It took 6 months to clean up.

The right way: use migration as the moment to rebuild, not lift-and-shift.

  1. Capture flows for 30 days with the ASA still inline. Use NetFlow or firewall logs. You'll find ~30% of "active" rules match zero traffic.
  2. Group flows by application, not by IP. Five rules for the same app become one Palo Alto rule with App-ID.
  3. Build the new policy from scratch, informed by what you saw, not what the ASA had.
  4. Run both inline for 2 weeks in monitor mode for the Palo Alto rules. Catch the misses before cutover.
  5. Cut over with old rules disabled but present. If something breaks, you can re-enable a single old rule fast. Don't delete the old config until you've gone 30 days without re-enabling anything.

Logging strategy

Default Palo Alto logging is verbose. On a busy data center firewall, "log everything to Panorama" buries the signals you actually need.

What I actually log:

  • All denies → Panorama → SIEM. Always. No exceptions.
  • All threats (IPS hits, AV detections) → Panorama → SIEM, with high-severity paged.
  • Allows on critical apps (database, AD, payment systems) → Panorama → SIEM. For audit.
  • Routine allows (web browsing, generic app traffic) → Panorama only, 30-day retention.

Things that bit me on Palo Alto specifically

Implicit deny is invisible until you know.

Every Palo Alto rulebase has two invisible bottom rules: intrazone-default: allow and interzone-default: deny. If you're troubleshooting and traffic mysteriously matches "intrazone" when you didn't write a rule, that's the implicit allow inside the same zone. Override with explicit rules if you want intrazone restrictions (you do, eventually).

Commit times scale with rulebase complexity, not size

20,000 simple rules can commit faster than 200 rules with complex address-group nesting. Flatten your address groups when commits start pushing past 5 minutes. A nested group six layers deep takes the firewall longer to evaluate at commit time than at runtime.

Panorama push isn't the same as commit

A change in Panorama is staged, then pushed. The commit on the firewall is a separate event. You can stage a horrible mistake in Panorama and not affect production until you push. Use this. Stage everything, review the candidate config diff, push during a window.

What to automate

You'll have engineers asking for firewall changes constantly. Don't do them by hand:

  • Address objects: sync from your CMDB nightly. New servers appear automatically as objects.
  • Standard rules: Terraform managed. PR-based review. terraform plan shows the proposed change to a reviewer before it touches Panorama.
  • Ad-hoc changes: still ServiceNow ticketed, but with a Palo Alto API webhook so the requester can see exactly what got pushed.

I have a longer post on automating Palo Alto with Python that covers the API specifics.

If I had to pick three things for you to do today

  1. Stop using port-based rules. Convert at least your top 10 by traffic volume to App-ID this week. You'll find at least one surprise.
  2. Tag every rule with an owner. Six months from now, when nobody remembers why allow-tcp-12345-anywhere exists, you'll know who to ask.
  3. Set up commit emails. Panorama can email a diff of every commit to a list. Audit gold. Takes 10 minutes.

Battle-tested patterns from my actual Palo Alto deployments at Camping World, JLL, and earlier. If you're staring at a migration and want to talk through it, find me on LinkedIn.