Skip to content

Security Trade-offs

Every security decision involves trade-offs. The CTA board does not just want to hear what you recommend — they want to hear what you considered and rejected, and why. This page catalogs the most important security trade-offs that arise in CTA scenarios.

Restrictive vs Open OWD

The fundamental tension: how locked down should the default record access be?

DimensionRestrictive (Private OWD)Open (Public Read/Write OWD)
SecurityMaximum — users only see what is explicitly sharedMinimum — all users see all records
ComplexityHigher — sharing rules, teams, or Apex sharing needed to grant accessLower — no sharing configuration needed
PerformanceShare table rows created for every record; sharing recalculation on rule changesNo share table overhead; fastest queries
ScalabilityShare tables grow with record volume; recalculation time increasesNo scalability concern from sharing
AuditClear audit trail of who has access and whyNo access controls to audit
FlexibilityCan open access selectively as needs changeCannot restrict without changing OWD (breaking change)
LDV impactAt 10M+ records, share tables can become a bottleneckNo share table impact

CTA Positioning

Start with the restrictive approach and present the trade-offs honestly. “I’ve set Account OWD to Private because the scenario has partner users who should not see each other’s accounts. The trade-off is that I need four sharing rules to grant cross-team visibility for internal users, which adds sharing recalculation overhead. Given the record volumes described (2M accounts), this is acceptable.”

When Restrictive OWD Becomes Problematic

flowchart TD
    Private["Private OWD"] --> Q1{"Record volume?"}
    Q1 -->|"< 1M records"| OK1["Sharing overhead\nis manageable"]
    Q1 -->|"1M - 10M records"| Caution["Monitor sharing\nrecalculation time"]
    Q1 -->|"> 10M records"| Q2{"How many\nsharing rules?"}
    Q2 -->|"< 20"| Monitor["Acceptable with\nmonitoring"]
    Q2 -->|"20-50"| Redesign["Consider role hierarchy\nredesign to reduce rules"]
    Q2 -->|"> 50"| Rethink["Rethink architecture:\n- Flatten hierarchy\n- Territory management\n- Apex managed sharing\n- Consider data archival"]

    style OK1 fill:#2e7d32,color:#fff
    style Caution fill:#e65100,color:#fff
    style Rethink fill:#c62828,color:#fff

Security vs Usability

The more secure a system is, the more friction users experience. Finding the right balance is an architectural skill.

Security MeasureUsability ImpactMitigation
MFA on every loginAdditional step; lost devices block accessSalesforce Authenticator push notification reduces friction; backup codes for lost devices
Private OWD + sharing rulesUsers cannot see records they expect to see; “why can’t I see this?” support ticketsClear communication; well-designed sharing rules; sharing reason field on shared records
FLS hiding fieldsUsers confused by missing data; reports appear incompleteDocument which user types see which fields; provide appropriate list views and reports
Session timeout (short)Users logged out frequently; work may be lostBalance timeout length with security requirements; auto-save functionality
IP restrictionsRemote workers blocked; VPN requiredUse IP relaxation for Connected Apps; Named Credentials for integrations
Platform EncryptionSearch limitations; report filter restrictions; slower typeaheadCommunicate limitations upfront; redesign reports; use deterministic where search is needed
SSO (no direct login)If IdP is down, users cannot access SalesforceConfigure breakglass admin accounts that bypass SSO; monitor IdP availability

Sharing Model Complexity vs Performance

flowchart LR
    subgraph "Simple Model"
        S1["2-3 level hierarchy"]
        S2["5-10 sharing rules"]
        S3["Fast recalculation"]
        S4["Easy to audit"]
    end

    subgraph "Complex Model"
        C1["8+ level hierarchy"]
        C2["50+ sharing rules"]
        C3["Hours for recalculation"]
        C4["Impossible to audit"]
    end

    S1 -.->|"Adding requirements"| C1
    S2 -.->|"Adding requirements"| C2

    style S1 fill:#2e7d32,color:#fff
    style S2 fill:#2e7d32,color:#fff
    style C1 fill:#c62828,color:#fff
    style C2 fill:#c62828,color:#fff
DimensionSimple SharingComplex Sharing
Role hierarchy depth2-4 levels8-15 levels
Sharing rules per object5-1550-100+
Recalculation timeMinutesHours (defer to maintenance window)
Debugging access issuesStraightforward”Why can this user see this record?” becomes a multi-hour investigation
Onboarding new adminsQuick trainingWeeks to understand the model
Impact of changesPredictableRipple effects across rules

When to Accept Complexity

  • The business has genuinely complex data access requirements (multi-territory, matrix management, regulatory segmentation)
  • The alternative (Public OWD with manual processes) creates security risk
  • The organization has dedicated Salesforce architects who can maintain the model
  • Performance testing confirms acceptable recalculation times

When to Simplify

  • More than 50 sharing rules per object — redesign the hierarchy
  • Sharing recalculation takes more than 4 hours — too many rules or too many records
  • Admins cannot explain who has access to what — the model is too complex to govern
  • Users report “I can see records I shouldn’t” or “I can’t see records I should” frequently

Encryption Impact Analysis

The trade-off between data protection and platform functionality is the most concrete and testable security trade-off.

Functionality Impact by Encryption Scheme

CapabilityUnencryptedDeterministicProbabilistic
SOQL WHERE (exact match)FullYesNo
SOQL WHERE (LIKE, CONTAINS)FullNoNo
SOQL ORDER BYFullLimitedNo
Aggregate functions (SUM, AVG)FullNoNo
Validation rulesFullLimitedLimited
Workflow field comparisonsFullLimitedLimited
Duplicate rulesFullExact matchNo
Report groupingFullYesNo
Report filteringFullExact matchNo
Search (SOSL)FullDepends on search index encryptionNo
Formula referencesFullLimited functionsLimited functions
Auto-completeFullNoNo

Encryption Can Break Production

Enabling encryption on a field that is used in SOQL WHERE clauses with LIKE, ORDER BY, or aggregate functions will break those queries in production. Always do a thorough code and configuration scan before encrypting any field.

Cost of Encryption

Cost DimensionImpact
License costShield is 30-50% of platform license cost
Functionality regressionFeatures break; users lose search/filter capabilities
Development effortCode must be reviewed and potentially refactored
Testing effortEvery report, integration, and workflow touching encrypted fields must be tested
Operational overheadKey management, rotation, disaster recovery for keys
PerformanceEncrypted field operations are slower (encrypt/decrypt overhead)

Profile Complexity vs Permission Set Groups

DimensionMany ProfilesMinimum Access + PSG
Initial setup effortLower (clone existing profiles)Higher (design atomic Permission Sets)
Ongoing maintenanceHigh (changes across all profiles)Lower (change one Permission Set)
AuditabilityDifficult (permissions scattered)Clear (each PS has one purpose)
ScalabilityPoor (profile limit: 1,500)Good (PSG composition is flexible)
User provisioningAssign one profileAssign one PSG (bundles multiple PS)
Exception handlingCreate another profile cloneAdd/remove individual PS or use Muting PS
Migration effortN/A (legacy approach)Significant (retrofitting existing profiles)

Multi-Org Identity Trade-offs

Multi-org scenarios (common after M&A or in global enterprises) introduce identity complexity that the CTA board frequently probes.

flowchart TD
    subgraph "Option A: Single IdP for All Orgs"
        IdPA["Central IdP\n(e.g., Okta)"]
        IdPA -->|SAML| Org1A["Production Org"]
        IdPA -->|SAML| Org2A["Sandbox / Dev Org"]
        IdPA -->|SAML| Org3A["Acquired Co Org"]
    end

    subgraph "Option B: SF Org as IdP"
        MainOrg["Main SF Org\n(Identity Provider)"]
        MainOrg -->|"SF-to-SF SAML"| Org2B["Secondary Org"]
        MainOrg -->|"SF-to-SF SAML"| Org3B["Acquired Org"]
    end
DimensionCentral External IdP (Option A)Salesforce as IdP (Option B)
Best whenExisting IdP serves all apps; M&A consolidationNo external IdP; SF is primary system
DeprovisioningDisable at IdP; all orgs locked out instantlyMust manage Connected Apps per org
MFASingle MFA policy at IdPMFA at IdP org; spokes trust it
CostIdP license costNo additional license cost
RiskIdP outage blocks all accessCompromised IdP org compromises all orgs
ComplexityOne SAML config per orgConnected App per spoke org

IdP Architecture Trade-offs

DimensionSF as Service ProviderSF as Identity Provider
Best whenCorporate IdP exists (Okta, Azure AD, ADFS)SF is the user SOR (portals, small companies)
User experienceConsistent with other corporate appsSF-centric; other apps redirect to SF
MFA managementIdP handles MFA centrallySF handles MFA (or delegates)
User provisioningIdP provisions via SCIM/JITManual or custom provisioning
DeprovisioningDisable at IdP; SSO stops workingMust deactivate in SF explicitly
AvailabilityDependent on IdP uptimeDependent on SF uptime
ComplexitySAML/OIDC configurationConnected Apps for each SP
CostIdP license costNo additional cost

Session-Based vs Permanent Permissions

DimensionPermanent Permission SetsSession-Based Permission Sets
Access durationAlways activeActive only during qualifying session
Use caseStandard business rolesElevated access, step-up authentication, time-limited access
Security posturePermissions always availablePermissions only when actively needed
ComplexitySimple — assign and forgetRequires activation logic (Flow, Auth Provider, Apex)
Audit trailUser always has permissionsClear audit of when permissions were activated/deactivated
User experienceTransparentMay require re-authentication or additional steps

The Security Architecture Decision Summary

For CTA board presentations, frame security trade-offs using this structure:

flowchart TD
    Decision["Security Decision"] --> Recommend["1. State your recommendation"]
    Recommend --> Why["2. Explain why\n(tie to requirements)"]
    Why --> Tradeoff["3. Acknowledge the trade-off\n(what you sacrifice)"]
    Tradeoff --> Mitigate["4. Explain how you mitigate\nthe trade-off"]
    Mitigate --> Alternative["5. Note what you considered\nand rejected"]

    style Decision fill:#1565c0,color:#fff
    style Tradeoff fill:#e65100,color:#fff
    style Mitigate fill:#2e7d32,color:#fff

Example: “I recommend Private OWD for Accounts because the scenario includes partner users who should not see each other’s customer data. The trade-off is increased sharing complexity — I need three criteria-based sharing rules to grant regional visibility for internal sales teams. I mitigate this by keeping the role hierarchy flat at four levels and using public groups as sharing targets, which simplifies future changes. I considered Public Read Only but rejected it because partner users would see all Account names, which the scenario identifies as confidential.”

Sources