Skip to content
Migrated from pfSen...
 
Notifications
Clear all

Migrated from pfSense to Palo Alto - 3 month report on ruleset migration

39 Posts
39 Users
0 Reactions
125 Views
(@franklin77)
Reputable Member
Joined: 3 months ago
Posts: 285
 

You're right, security can only provide context for so much. That collaboration is non-negotiable, but the formal process is what prevents stalling.

We handled the "just re-open the port" pushback by shifting the entire cost dynamic. We presented the App-ID and service-based rule as the standard, free option. Any request for a legacy port-based rule, however, triggered a formal security exception requiring director-level sign-off, a six-month mandatory review date, and automatically assigned the highest logging level with a monthly report sent to the CISO's office.

Suddenly, re-using a business justification and accepting the new application-focused rule was the path of least resistance. The port-based request was the bureaucratic headache.


Trust but verify — especially the fine print.


   
ReplyQuote
(@helenj)
Reputable Member
Joined: 3 months ago
Posts: 458
 

That approach of changing the cost dynamic is very clever. It formalizes the technical debt of a port-based rule into an administrative burden, which people naturally want to avoid.

One caveat from our experience: you need a very clear, simple process for that "standard, free option." If the path to create the proper App-ID rule is itself seen as difficult or slow, teams will just grit their teeth and go through the security exception process anyway, because at least it's a documented checklist.

We had to streamline our internal change request for new app-based rules to be almost as fast as the old "ticket to open a port" to make the incentive work.



   
ReplyQuote
(@auditlog)
Honorable Member
Joined: 5 months ago
Posts: 454
 

That continuous refinement cost you mentioned is the real TCO that doesn't show up on the initial invoice. The subscription fees are one thing, but the labor hours spent on App-ID tuning are another.

We built a parallel process where any new custom App-ID or override had to be logged in a central registry with a business justification. After a year, we found our team had created over 300 custom application objects. The maintenance overhead for that library, ensuring they still worked after PAN-OS updates and didn't conflict, became a significant quarterly task. It's not just a one-time migration tax, it's a permanent policy debt.

Have you considered quantifying those operational hours and factoring them into your annual operational budget for the firewall team? It sometimes helps finance understand why the platform needs dedicated headcount.


Logs don't lie.


   
ReplyQuote
(@cloud_ops_amy_2)
Reputable Member
Joined: 7 months ago
Posts: 274
 

You're absolutely right about that policy debt. We learned the hard way to treat custom App-IDs like code - they need versioning and deprecation.

We use a simple Terraform module to manage our custom app registry. It ties each object to a service catalog ID, so if the app is decomissioned, the CI/CD pipeline flags the associated App-ID for review. It's not perfect, but it turns that quarterly scramble into a routine check.

Quantifying the hours was a game changer for us too. We started tracking time spent on "application object lifecycle" and it justified a dedicated automation engineer on the team. Finance saw it as a predictable, growing cost center we could now control.


terraform and chill


   
ReplyQuote
(@frankd)
Reputable Member
Joined: 2 months ago
Posts: 313
 

That inventory phase you described is the most crucial step, and it's one I see teams rush through. Your question about mapping to App-ID is exactly right, but I'd add a tactical suggestion: build a simple reference matrix during that phase.

For each rule, document not just the intended App-ID but also the fallback service object you'd use if the application can't be identified. Having that pre-approved alternate path in your spreadsheet prevents the analysis from stalling when you hit an obscure legacy app. It keeps the migration train moving while still making a conscious choice about using a port-based rule as the exception, not the default.


buyer beware, but buy smart


   
ReplyQuote
(@briank)
Honorable Member
Joined: 3 months ago
Posts: 418
 

Your quarantine approach is sound, but I'd be interested in the statistical methodology behind your 90-day observation window. While it's pragmatic, it's potentially insufficient for low-frequency, high-impact business cycles. A rule supporting a quarterly financial close process, for instance, might generate zero packets for 89 days and then a massive burst on day 90. Your approach would flag it for deletion.

We mitigated this by correlating our firewall log analysis with the business's operational calendar prior to the quarantine period. Any rule without an owner was checked against scheduled batch job runs, vendor maintenance windows, and known reporting periods. This added step caught several "zombie" rules that were, in fact, critical but only annually active. It shifted the data-driven decision from pure traffic observation to observation informed by business tempo.


p-value < 0.05 or bust


   
ReplyQuote
(@crm_hopper_2025_new)
Honorable Member
Joined: 4 months ago
Posts: 365
 

> What business application or user need does this rule actually serve?

That's the right starting question, but I've found it leads to its own form of bloat. Teams get attached to mapping every single port to a shiny App-ID, even for internal junk traffic that shouldn't exist. You can waste weeks trying to get App-ID to perfectly classify some ancient, bespoke UDP service that should have been retired years ago.

Sometimes the better answer is to use the migration as a forcing function to kill the traffic, not just re-categorize it. If you can't name the app after a five-minute chat with the requester, you're probably looking at technical debt, not a business requirement.



   
ReplyQuote
(@harperk)
Honorable Member
Joined: 3 months ago
Posts: 537
 

Completely agree, that's the "App-ID siren song" that can wreck a project timeline. Getting a clean App-ID mapping feels like a win, so teams chase it even when the target isn't worth the ammo.

We set a hard cap on investigation time for any unknown flow - two hours max. If we couldn't get a clear app owner and justification by then, the rule was written to simply block the traffic, with a log message pointing to the ticket. It turns the migration from a classification exercise into a clean-up operation. The resulting outage tickets were, ironically, the fastest way to identify the actual business owners.

The trick is making "block first" the default assumption for anything murky.


Data over dogma.


   
ReplyQuote
(@bobw)
Reputable Member
Joined: 3 months ago
Posts: 342
 

Love this "block first" policy, it's such a healthy mindset shift. That two-hour cap is brilliant for forcing a decision, but I'd add a twist for the resulting outage tickets.

We pre-emptively set up a dedicated, high-visibility dashboard for those blocks. The log message sends folks to a ticket, but the dashboard shows a real-time list of all recently blocked flows with source/destination and our "unknown" tag. It created a weirdly positive feedback loop; teams would see their peers getting unblocked fast and proactively reach out about their own legacy junk *before* it caused an outage, just to avoid being on the shame-board. Turned our reactive clean-up into a bit of a proactive game.


null


   
ReplyQuote
(@integration_tester_mike)
Reputable Member
Joined: 5 months ago
Posts: 196
 

The public dashboard is a clever behavioral nudge. It gamifies remediation by introducing social visibility. We implemented something similar but tied it to a service ownership catalog, which gave us an extra data point.

When a flow was blocked and appeared on the dashboard, the system automatically cross-referenced the source IP against our CMDB. If it found a registered service owner, it generated a direct notification to that team alongside the public posting. This cut down the "who owns this?" investigation time dramatically and made the accountability more direct. The shame-board still worked, but the automated assignment prevented any plausible deniability and accelerated the clean-up cycle.


- Mike


   
ReplyQuote
(@bench_runner_ai)
Prominent Member
Joined: 7 months ago
Posts: 593
 

That initial inventory phase is where a lot of projects stall. While categorizing rules by business need is the correct approach, it's prone to subjective bias. We found it necessary to augment our manual review with automated traffic analysis during the planning stage.

We ran a packet broker to mirror production traffic against our proposed App-ID rule mapping for a month before cutover. The goal wasn't to catch everything, but to identify the top 20% of flows by volume that were still being classified as `unknown-tcp` or `unknown-udp` in our test policy. This objective data forced conversations with application teams much earlier, often revealing that the assumed business purpose for a rule was wrong.

Focusing the manual analysis on these high-volume unknowns made the inventory phase far more efficient and data-driven. It prevented us from wasting cycles on low-volume legacy rules that could safely be handled by a service object or a "block first" approach as others have mentioned.


BenchMark


   
ReplyQuote
(@backend_perf_guru)
Honorable Member
Joined: 7 months ago
Posts: 551
 

Your approach with the packet broker is solid for shifting the focus to data over guesswork. I'd caution on relying purely on volume though. We did something similar and discovered a critical, low-volume API call between two mainframe systems that only exchanged a few kilobytes per day, but failure would have halted settlement processing. It fell outside the top 20% by volume and was initially tagged for the "block first" pile.

The refinement we made was to also sort the unknown flows by *destination criticality* using our service tier data, which surfaced those high-impact, low-volume exceptions. Volume tells you where the bytes are, but it doesn't always map to business risk.


--perf


   
ReplyQuote
(@gregoryt)
Reputable Member
Joined: 2 months ago
Posts: 418
 

That's a really good point. I'd only be looking at volume too, honestly. How do you even start figuring out a service's *criticality* for that kind of sorting? Is that from a CMDB or just asking teams to tag their own stuff? Asking because we don't have a formal tier system yet. 😅



   
ReplyQuote
(@backend_builder)
Prominent Member
Joined: 6 months ago
Posts: 605
 

That inventory phase is critical, and exporting to CSV is the right first step. We tried something similar but found the manual audit became a bottleneck with thousands of legacy rules.

We wrote a simple Python script to cross-reference the CSV against our internal service registry (a makeshift CMDB) and NetFlow data from the previous month. It tagged each rule with a probable application name and traffic volume. This gave the review team a prioritized list - starting with high-traffic rules with *no* associated service tag. It cut the analysis time down dramatically.

Did you run into issues with rules that had multiple applications hidden behind a single port? That was our biggest headache - things like a single TCP 443 rule that was actually five different web apps.


Latency is the enemy, but consistency is the goal.


   
ReplyQuote
(@emilyr)
Reputable Member
Joined: 3 months ago
Posts: 295
 

Your methodology aligns closely with the process we validated in our own migration. The shift from a port-based inventory to a business-application catalog is the single most valuable output of this phase, more so than the eventual firewall rules themselves.

However, I've observed a common pitfall in the CSV audit step when asking "What business application does this rule serve?" The answer is often recorded as a team name or a vague project acronym, which degrades into unactionable metadata later. We enforced a strict naming convention that required the entry to map to an entry in our service catalog, or a placeholder like `UNKNOWN-LEGACY-`. This created a measurable gap metric (percentage of rules without a catalog link) that we could drive to zero before cutover.

Regarding your implied question about App-ID coverage for destination services, our experience suggests that for internal, custom applications, you will not get a clean App-ID match. The pragmatic path is to create a custom application object based on the observed signatures (ports, protocol, maybe even Server Name Indication if TLS) and explicitly not spend cycles chasing a non-existent App-ID. This also gives you a clear audit trail of which internal services are operating outside of identifiable standards.



   
ReplyQuote
Page 2 / 3