Back to Resources

Taking Back the Keys: Why Self-Custody Will Define Critical Infrastructure Security in 2026

For more than a decade, vendor remote access has been treated as a practical necessity. But as we move toward 2026, the strategy of Critical Infrastructure Self-Custody has shifted from a preference to a mandate.

The Hidden Risk in Vendor Access Models

In many operational environments, vendor access has grown organically. From turbine suppliers to building management contractors, unmanaged access paths create a web of risk that sits outside the asset owner’s direct visibility.

This isn’t about malicious intent; it’s about governance. When credentials exist beyond central identity systems, activity occurs in the shadows. This is why a Critical Infrastructure Self-Custody model is the only way to ensure long-term resilience.

critical infrastructure compliance and Asset Accountability

Regulatory frameworks, including New Zealand’s SOCI obligations, now place explicit accountability on asset owners. “We trusted the vendor” is no longer a defensible legal position. If a third party accesses your operational systems, you must be able to prove who, when, and what was done without relying on that vendor’s logs.

The 4 Pillars of a Self-Custody Access Model

A true self-custody approach requires four foundational shifts in how OT access is governed:

  • Brokerage Control: All remote access is brokered through enterprise-controlled portals rather than vendor-owned VPNs.
  • Centralised Identity: Authentication is managed via the asset owner’s internal systems (MFA/SSO).
  • Time-Bound Permissions: Access is role-based and automatically revoked after the maintenance window closes.
  • Sovereign Logging: All activity logs are retained in the asset owner’s environment for audit and incident response.

Secure Access as Boardroom Governance

Identity-aware access is no longer “IT plumbing.” It is a foundational control discussed alongside safety systems and redundancy. Boards in 2026 are moving from trusting a vendor’s access model to governing it themselves.

How to Implement Critical Infrastructure Self-Custody

Transitioning to a self-custody model doesn’t happen overnight. It requires a tiered approach to reclaiming the “keys” to your environment:

Step 1: The Access Audit. Most organisations are surprised by the number of active “backdoor” connections. Identifying every persistent VPN and legacy credential is the first step toward sovereignty.

Step 2: Unified Access Gateways. Replace fragmented vendor connections with a single, hardened entry point. This provides a “single pane of glass” for all third-party activity.

Step 3: Just-in-Time (JIT) Provisioning. Move away from “always-on” access. By implementing JIT, access is only granted when a specific work order is active, significantly reducing the attack surface.

“Trusting a vendor is fine. Trusting their access model is no longer acceptable.”

If you are ready to re-evaluate your vendor access strategy, reach out to our critical infrastructure experts for a consultation.


( ! ) Warning: Undefined array key "auth_payload" in /srv/www/liquidit/current/web/app/plugins/gravityformshubspot/includes/class-gf-hubspot-api.php on line 175
Call Stack
#TimeMemoryFunctionLocation
10.0002467280{main}( ).../index.php:0
20.0004468592require( '/srv/www/liquidit/current/web/wp/wp-blog-header.php ).../index.php:7
30.8339125620024require_once( '/srv/www/liquidit/current/web/wp/wp-includes/template-loader.php ).../wp-blog-header.php:19
40.8427125731576include( '/srv/www/liquidit/current/web/app/themes/orro/templates/index.php ).../template-loader.php:132
51.0287136028392get_footer( $name = ???, $args = ??? ).../index.php:31
61.0287136028960locate_template( $template_names = [0 => 'footer.php'], $load = TRUE, $load_once = TRUE, $args = [] ).../general-template.php:92
71.0288136029264load_template( $_template_file = '/srv/www/liquidit/current/web/app/themes/orro/templates/footer.php', $load_once = TRUE, $args = [] ).../template.php:815
81.0289136030696require_once( '/srv/www/liquidit/current/web/app/themes/orro/templates/footer.php ).../template.php:880
91.0289136030696wp_footer( ).../footer.php:4
101.0289136030696do_action( $hook_name = 'wp_footer' ).../general-template.php:3457
111.0289136030912WP_Hook->do_action( $args = [0 => ''] ).../plugin.php:523
121.0289136030912WP_Hook->apply_filters( $value = '', $args = [0 => ''] ).../class-wp-hook.php:377
131.0312136033000GF_HubSpot->action_wp_footer( '' ).../class-wp-hook.php:353
141.0316136070544GF_HubSpot->get_portal_id( ).../class-gf-hubspot.php:2891
151.0316136070544GF_HubSpot->initialize_api( $refresh_token = ??? ).../class-gf-hubspot.php:2924
161.0379136117208GF_HubSpot_API->refresh_token( ).../class-gf-hubspot.php:1028

( ! ) Deprecated: json_decode(): Passing null to parameter #1 ($json) of type string is deprecated in /srv/www/liquidit/current/web/app/plugins/gravityformshubspot/includes/class-gf-hubspot-api.php on line 175
Call Stack
#TimeMemoryFunctionLocation
10.0002467280{main}( ).../index.php:0
20.0004468592require( '/srv/www/liquidit/current/web/wp/wp-blog-header.php ).../index.php:7
30.8339125620024require_once( '/srv/www/liquidit/current/web/wp/wp-includes/template-loader.php ).../wp-blog-header.php:19
40.8427125731576include( '/srv/www/liquidit/current/web/app/themes/orro/templates/index.php ).../template-loader.php:132
51.0287136028392get_footer( $name = ???, $args = ??? ).../index.php:31
61.0287136028960locate_template( $template_names = [0 => 'footer.php'], $load = TRUE, $load_once = TRUE, $args = [] ).../general-template.php:92
71.0288136029264load_template( $_template_file = '/srv/www/liquidit/current/web/app/themes/orro/templates/footer.php', $load_once = TRUE, $args = [] ).../template.php:815
81.0289136030696require_once( '/srv/www/liquidit/current/web/app/themes/orro/templates/footer.php ).../template.php:880
91.0289136030696wp_footer( ).../footer.php:4
101.0289136030696do_action( $hook_name = 'wp_footer' ).../general-template.php:3457
111.0289136030912WP_Hook->do_action( $args = [0 => ''] ).../plugin.php:523
121.0289136030912WP_Hook->apply_filters( $value = '', $args = [0 => ''] ).../class-wp-hook.php:377
131.0312136033000GF_HubSpot->action_wp_footer( '' ).../class-wp-hook.php:353
141.0316136070544GF_HubSpot->get_portal_id( ).../class-gf-hubspot.php:2891
151.0316136070544GF_HubSpot->initialize_api( $refresh_token = ??? ).../class-gf-hubspot.php:2924
161.0379136117208GF_HubSpot_API->refresh_token( ).../class-gf-hubspot.php:1028
171.0384136136616json_decode( $json = NULL, $associative = TRUE ).../class-gf-hubspot-api.php:175