/* ========================================
MOBILE ONLY STYLES
add and modify varibales for mobile breakpoint
========================================= */
html.dwc-mobile {
--mobile-menu-width: min(450px, 100%);
--menu-item-font-size: 18px;
--dropdown-item-font-size: var(--menu-item-font-size);
--back-text-font-size: 16px;
--menu-item-hover-border-bg: initial;
}
/* =======================================
GENERAL NAV STYLES
========================================= */
:root {
/* ========================
GENERAL COLORS/BACKGROUND
======================== */
--primary-clr: orangered;
--header-bg: white;
--dropdown-content-bg: white;
--mobile-menu-bg: white;
--mobile-menu-topbar-bg: white;
/* ===============================
GENERAL WIDTH | HEIGHT | SPACINGS
================================== */
--mobile-menu-width: min(300px, 100%); /* mobile & offcanvas */
--multilevel-dropdown-width: 200px;
--dropdown-content-gap: 1px; /* header -> dropdown gap, add unit (e.g. 0px) */
--header-min-height: 60px;
--fullscreen-mobile-menu-top-height: 60px;
--top-offset: 40px; /* when nav is below header */
--dropdown-content-default-width: 1080px; /* preview width & default width for dropdown content */
/* ==============================================
GENERAL BORDERS | SHADOWS | OVERLAY BACKDROP
================================================= */
/* dropdown content */
--dropdown-content-border-radius: 0px;
--dropdown-content-shadow: 0px 5px 15px -10px rgb(0 0 0 / 0%);
--dropdown-content-border-size: 1px; /* at least 1px */
--dropdown-content-border-color: var(--dropdown-content-bg);
/* overlay backdrop */
--nav-overlay-backdrop-blur: 0px;
--nav-overlay-backdrop-clr: rgba(0, 0, 0, 0.3);
/* sidebar nav */
--sidebar-shadow: 0px 0px 2px rgba(0, 0, 0, 0.7);
/* radius for special mobile style on overlay header*/
--mobile-menu-radius: var(--overlay-header-radius);
/* mobile & offcanvas */
--slide-out-speed: 1.3;
/* ===============================
MENU TOGGLE - Hamburger
(additional settings at line 202)
================================== */
--menu-toggle-clr: var(--menu-item-clr);
--menu-close-toggle-clr: var(--menu-item-clr);
--menu-toggle-hover-clr: var(--menu-item-hover-clr);
/* ========================
MENU ITEMS
======================== */
/* DEFAULT STATE */
--menu-item-clr: #000;
--menu-item-font-size: 14px;
--menu-item-font-weight: 500;
--menu-item-bg: initial;
/* HOVER STATE */
--menu-item-hover-clr: var(--primary-clr);
--menu-item-hover-bg: initial;
--menu-item-hover-border-bg: var(--menu-item-active-border-bg);
--menu-item-hover-border-height: var(--menu-item-active-border-height);
/* ACTIVE STATE
(to exclude a link from this style,
add .dwc-exclude to its container)*/
--menu-item-active-clr: var(--menu-item-hover-clr);
--menu-item-active-bg: initial;
--menu-item-active-border-bg: var(--primary-clr);
--menu-item-active-border-height: 2px;
/* PADDING | GAP */
--menu-item-inline-padding: 1.1rem;
--menu-item-block-padding: 1rem;
--menu-items-gap: 0;
/* BORDERS | RADIUS */
--menu-item-border: 1px solid rgba(0, 0, 0, 0.1);
--menu-item-radius: 0;
/* CHEVRON (dropdown arrow) */
--chevron-size: 14px;
--chevron-clr: var(--menu-item-clr);
--chevron-hover-clr: var(--menu-item-hover-clr);
/* ========================
MULTILEVEL DROPDOWN LINKS
======================== */
/* DEFAULT STATE */
--dropdown-item-clr: var(--menu-item-clr);
--dropdown-item-font-size: var(--menu-item-font-size);
--dropdown-item-bg: initial;
--dropdown-indent-bg: rgb(0 0 0 / 5%);
--dropdown-heading-clr: var(--primary-clr);
/* HOVER STATE */
--dropdown-item-hover-clr: var(--menu-item-hover-clr);
--dropdown-item-hover-bg: white;
/* EXPANDED STATE (PARENT) - mobile */
/* when [data-submenu-reveal="expand"] */
--dropdown-expanded-clr: white;
--dropdown-expanded-bg: black;
/* PADDING | GAP | INDENT */
--dropdown-item-inline-padding: var(--menu-item-inline-padding);
--dropdown-item-block-padding: var(--menu-item-block-padding);
--dropdown-indent: 0.6rem;
--dropdown-indent-item-pad-offset: 0.5;
--dropdown-indent-line: solid 1px rgb(0 0 0 / 25%);
/* OTHERS */
--dropdown-inactive-overlay: rgb(0 0 0 / 10%);
/* ========================
MENU CTA BUTTON (ALL BUTTONS)
======================== */
/* all cta buttons max width on mobile */
--cta-width: 100%;
/* gap offset between 2 or 3 cta buttons on mobile/offcanvas/sidebar*/
--cta-gap-offset: 0;
/* gap between breakout cta and menu toggle on mobile */
--cta-breakout-gap: 20px;
/* ========================
MENU CTA BUTTON (LAST BUTTON)
======================== */
/* DEFAULT STATE */
--menu-cta-clr: white;
--menu-cta-bg: black;
--menu-cta-inline-padding: calc(var(--menu-item-inline-padding) * 1.3);
--menu-cta-block-padding: var(--menu-item-block-padding);
--menu-cta-border: none;
--menu-cta-radius: 0em;
/* HOVER STATE */
--menu-cta-hover-clr: white;
--menu-cta-hover-bg: var(--primary-clr);
/* ========================
MENU CTA BUTTON (SECOND BUTTON)
======================== */
/* DEFAULT STATE */
--menu-cta-2-clr: white;
--menu-cta-2-bg: black;
--menu-cta-2-inline-padding: var(--menu-cta-inline-padding);
--menu-cta-2-block-padding: var(--menu-cta-block-padding);
--menu-cta-2-border: var(--menu-cta-border);
--menu-cta-2-radius: var(--menu-cta-radius);
/* HOVER STATE */
--menu-cta-2-hover-clr: white;
--menu-cta-2-hover-bg: var(--primary-clr);
/* ========================
MENU CTA BUTTON (THIRD BUTTON)
======================== */
/* DEFAULT STATE */
--menu-cta-3-clr: white;
--menu-cta-3-bg: black;
--menu-cta-3-inline-padding: var(--menu-cta-inline-padding);
--menu-cta-3-block-padding: var(--menu-cta-block-padding);
--menu-cta-3-border: var(--menu-cta-border);
--menu-cta-3-radius: var(--menu-cta-radius);
/* HOVER STATE */
--menu-cta-3-hover-clr: white;
--menu-cta-3-hover-bg: var(--primary-clr);
/* ========================
MENU TOGGLE - Hamburger additional settings
======================== */
--open-icon-size: 40px;
--open-icon-line-height: 4px;
--icon-line-gap: 0.7em; /* gap between the lines*/
--open-icon-line-variance: 9px; /* line width variation, e.g. 0 = same width*/
--open-icon-align: 0; /* 0 = right | auto = left */
--open-icon-horizontal-offset: 0px; /* nudge icon left or right from edge of screen*/
--open-icon-close-offset: 1.2; /* nudge icon left or right when close icon is active */
/* ======================================
ADAPTIVE HEIGHT/ STRIPE BG COLOR/BORDER
========================================= */
--adaptive-height-bg: #fff;
--adaptive-height-border: 1px solid #fff;
--adaptive-height-shadow: 0 0 30px rgb(39 50 59 / 10%);
/* ========================
STRIPE - when [data-optimize-stripe="true"]
======================== */
--stripe-border-radius: 10px;
/* ========================
MOBILE/OFFCANVAS MENU
======================== */
--mobile-menu-ttf: cubic-bezier(0.8, 0.07, 0.2, 0.95);
/* Transition timing function */
/* =================
OVERLAY HEADER
================== */
--overlay-header-width: 1400px;
--overlay-header-inset: 1rem;
--overlay-header-bg: rgb(255 255 255 / 100%);
--overlay-header-bg-active: rgb(255 255 255 / 100%);
--overlay-header-blur: 10px;
--overlay-header-radius: 1rem;
--overlay-header-shadow: 0px 2px 20px rgb(0 0 0 / 20%);
--overlay-offset-padding: clamp(5rem, 1.875rem + 12.5vw, 11.25rem);
/* ========================
BACK TEXT
======================== */
--back-text-clr: var(--menu-item-clr);
--back-text-font-size: 12px;
--back-text-font-weight: 600;
--back-text-transform: uppercase;
--back-text-bg: var(--mobile-menu-topbar-bg);
/* ========================
SIDEBAR NAV - OVERLAY MODE
======================== */
--overlay-sidebar-radius: 1rem;
--overlay-sidebar-bg: rgb(255 255 255 / 80%);
--overlay-sidebar-shadow: 0 0 30px rgb(39 50 59 / 10%);
--overlay-sidebar-inset: 12px;
/* ======== DO NOT EDIT THIS VARIABLES! ======== */
--iw: calc(var(--open-icon-size) - var(--open-icon-line-variance));
--aw: calc(var(--iw) - var(--open-icon-line-variance));
--caret-size: calc(var(--dropdown-content-gap) + var(--dropdown-content-border-size));
--dropdown-content-border: solid var(--dropdown-content-border-color) var(--dropdown-content-border-size);
}
/* SIDEBAR BACK TEXT BAR HEIGHT WHEN BACK TEXT OVERLAYS LOGO */
#brx-header:has([data-sidebar-back-text-on-logo="true"]) {
--top-offset: var(--mobile-menu-top-height);
}
/* ========================
STICKY HEADER STYLES
add variables to modify for sticky header
======================== */
.sticky.scrolling {
/* add your sticky styles variable here */
}
/* ========================
DROPDOWN ITEM IS BUTTON OR ICON
======================== */
[data-is-button]>.brx-submenu-toggle {
--menu-item-bg: black;
--menu-item-clr: white;
--menu-item-hover-clr: white;
--menu-item-hover-bg: black;
--menu-item-radius: 50vw;
--menu-item-hover-border-height: 0;
--chevron-size: 0;
--chevron-color: white;
--menu-item-inline-padding: 1.5rem;
--menu-item-block-padding: 1rem;
/* mobile only*/
--menu-item-width: 200px;
--menu-item-border: solid 1px transparent;
--menu-item-hover-border: solid 1px transparent;
}
[data-is-icon]>.brx-submenu-toggle {
--menu-item-bg: black;
--menu-item-clr: white;
--menu-item-hover-clr: white;
--menu-item-hover-bg: black;
--icon-clr: white;
--icon-hover-clr: white;
--icon-size: 14px;
--menu-item-inline-padding: 1.1rem;
--button-max-diameter: 45px;
--menu-item-radius: 50vw;
--menu-item-border: solid 1px transparent;
--menu-item-hover-border: solid 1px transparent;
}
/* ========== NAV STYLES END ============== */
/* ======= STICKY HEADER WITH OVERLAY SPECIAL STYLES ===== */
/* SVG STYLES BEFORE SCROLLING - REVERTS TO INITIAL VALUES WHEN DROPDOWN IS OPEN */
html:not(.dwc-mobile):has([data-sticky-overlay-special-style="true"]) .bricks-is-frontend .sticky:not(.scrolling) .dwc-nest-header:not(:has(.brxe-dropdown.open)) :is(path, .cls-1):not(:is(.brx-submenu-toggle path)) {
fill: white;
}
/* STYLES BEFORE SCROLLING - REVERTS TO INITIAL VALUES WHEN DROPDOWN IS OPEN */
html:not(.dwc-mobile):has([data-sticky-overlay-special-style="true"]) .bricks-is-frontend .sticky:not(.scrolling) .dwc-nest-header:not(:has(.brxe-dropdown.open)) {
--menu-item-clr: white;
--chevron-clr: white;
--menu-item-hover-clr: white;
--menu-item-hover-border-bg: white;
--overlay-header-bg: transparent;
--overlay-header-shadow: none;
}
/* STYLES BEFORE SCROLLING */
html:not(.dwc-mobile):has([data-sticky-overlay-special-style="true"]) .bricks-is-frontend .sticky:not(.scrolling) {
--link-transition: 0s;
--transition: 0.2s;
}
/* STYLES WHEN SCROLLING */
html:not(.dwc-mobile):has([data-sticky-overlay-special-style="true"]) .bricks-is-frontend .sticky.scrolling {
--overlay-header-bg: white;
}
/* STYLES WHEN SCROLLING :HOVER*/
html:not(.dwc-mobile):has([data-sticky-overlay-special-style="true"]) .bricks-is-frontend .sticky.scrolling .dwc-nest-header:has(.brxe-dropdown.open) {
/* add and update variable here */
}
/* DEFAULT STYLES FOR OVERLAY HEADER */
html:not(.dwc-mobile):has([data-sticky-overlay-special-style="true"]) .bricks-is-frontend .sticky {
--menu-item-hover-bg: initial;
--menu-item-bg: initial;
--overlay-header-inset: 0;
--overlay-header-width: 100%;
--overlay-header-radius: 0;
}
/* RESET STICKY HEADER TRANSITION*/
html:not(.dwc-mobile):has([data-sticky-overlay-special-style="true"]) .bricks-is-frontend #brx-header.sticky .dwc-nest-header {
transition: var(--transition);
}
/* ======= END STICKY HEADER WITH OVERLAY SPECIAL STYLES ===== */
/* ======== CHANGE postid-xxxx TO THIS TEMPLATE'S ID ========= */
/*hide sidebar in builder */
:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header:not(.postid-23338 *, :has(.dwc-sidebar) *) {
display: none !important;
}
[data-builder-window] #brx-header:has([data-offcanvas="true"]):not(.postid-23338 *, :has(.dwc-sidebar) *) :is(.dwc-nav-wrapper, .dwc-nest-menu) {
display: none !important;
}
:is(.brx-header-left, .brx-header-right)[data-builder-window] :is(#brx-content, #brx-footer):not(.postid-23338 *, :has(.dwc-sidebar) *) {
margin: unset !important;
}
[data-builder-mode]:is(.brx-header-left, .brx-header-right).postid-23338::before {
display: none
}
const MegaMenuCONFIG = {
// Minimum width threshold for desktop behavior,
// should be 1px larger than mobile (max-width) breakpoint in the "MENU Styles/Options" CSS code block
//IMPORTANT: Also change min-width in the "MEGA MENU Codes" CSS code block
minWidth: 1201,
// automatically open the current menu panel/dropdown (mobile, offcanvas & sidebar)
menuAutoExpansion: true,
swipeToClose: true,
// show or hide swipe to close hint
toolTip: true,
// adaptive height animation
adaptiveHeight: 0,
// Stripe menu animation
stripeStyle: 0,
headerSelector: '.dwc-nest-header',
nestMenuSelector: '.dwc-nest-menu',
closeNavOnClick: 1,
closeOnHashClickOnly: 0,
breakinToNavList: 0, /*do not enable if using last item is button*/
// Selectors (e.g. .class-name, #id_name, tag-name, .complex > selectors etc.) that should NOT close the navigation when clicked
// Separate multiple selectors with a comma e.g. '.class-one, #id_one, tag'
closeNavOnClickExclude: '.js-wpml-ls-item-toggle',
// New properties for dropdown positioning
shiftFactor: 1, // Factor to shift overflow
minOverflow: 10, // Minimum overflow threshold
reinitializeOnURLchange: false, //when using page transition API
//move backdrop overlay element Inside header
//placing it inside header will allow backdrop overlay/blur to affect header, but won't work when data-overlay-header is enabled.
overlayInsideHeader:0
};
// Centered Logo Configuration
const CenteredLogoCONFIG = {
enable: 0,
centerGuide: 1,
forceCenteredLogo: 1,
// move the navigation left
// or right using negative or positive value
centerNudge: 0,
// allow centered logo when no. of
// menu items are odd e.g. 5 or 7
allowOddItems: 1,
// place logo 'before' or 'after' the odd menu item
roundOffFactor: 'before'
};
class SidebarNavigation {
constructor(options = {}) {
// Basic configuration properties
this.config = {
minWidth: options.minWidth || MegaMenuCONFIG.minWidth, // Using external minWidth variable
menuSelector: options.menuSelector || '.dwc-nest-menu',
openClass: options.openClass || 'brx-open',
activeClasses: options.activeClasses || ['open', 'active'],
leftHeaderClass: options.leftHeaderClass || 'brx-header-left',
rightHeaderClass: options.rightHeaderClass || 'brx-header-right',
debounceDelay: options.debounceDelay || 100,
menuItemClickDelay: options.menuItemClickDelay || 300
};
// Set dependent selectors
const menuSelector = this.config.menuSelector;
this.config.submenuToggleSelector = options.submenuToggleSelector || `${menuSelector} .brx-submenu-toggle`;
this.config.dropdownSelector = options.dropdownSelector || `${menuSelector} .brxe-dropdown`;
this.config.dropdownContentSelector = options.dropdownContentSelector || `${menuSelector} .brx-dropdown-content`;
// State
this.previousHeaderClass = null;
this.dropdownClickHandlers = new Map();
this.menuHoverHandlers = null;
this.menuItemClickTimeout = null;
this.keyboardNavHandler = null;
this.cachedFocusableElements = null;
this.cachedElements = {
menuElement: null,
navElement: null,
dropdowns: null,
dropdownToggles: null,
menuItems: null
};
// Bind methods to this instance
this.handleResize = this.debounce(this.handleMenu.bind(this), this.config.debounceDelay);
this.handleOutsideClick = this.handleOutsideClick.bind(this);
}
// Initialize everything - called once
init() {
// Wait for DOM to be fully loaded before attaching events
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => {
this.initAfterDOMLoaded();
}, { once: true });
} else {
this.initAfterDOMLoaded();
}
return this;
}
// Separate initialization method to run after DOM is loaded
initAfterDOMLoaded() {
// Cache DOM elements once
this.cacheElements();
// Setup resize event with passive flag
window.addEventListener('resize', this.handleResize, { passive: true });
// Setup mutation observer for critical class changes only
this.setupMutationObserver();
// Initial setup based on current screen size
this.handleMenu();
// Cache focusable elements once if header class is present
if (this.hasHeaderClass()) {
this.cacheFocusableElements();
this.setupMenuFocusNavigation();
}
}
// Cache all required DOM elements upfront
cacheElements() {
this.cachedElements.menuElement = document.querySelector(this.config.menuSelector);
if (this.cachedElements.menuElement) {
this.cachedElements.navElement = this.cachedElements.menuElement.querySelector('.dwc-nest-nav-items');
this.cachedElements.dropdowns = Array.from(document.querySelectorAll(this.config.dropdownSelector));
this.cachedElements.dropdownToggles = Array.from(document.querySelectorAll(this.config.submenuToggleSelector));
this.cachedElements.menuItems = Array.from(document.querySelectorAll(`${this.config.menuSelector} .menu-item`));
}
}
// Set up a focused mutation observer only for dropdown state changes
setupMutationObserver() {
if (!this.cachedElements.dropdowns || this.cachedElements.dropdowns.length === 0) return;
const callback = (mutations) => {
for (let mutation of mutations) {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
const target = mutation.target;
const prevClassList = mutation.oldValue ? mutation.oldValue.split(' ') : [];
const hadBothBefore = prevClassList.includes('open') && prevClassList.includes('active');
const hasBothNow = target.classList.contains('open') && target.classList.contains('active');
if (hadBothBefore !== hasBothNow) {
this.updateDropdownAccessibility();
break; // Only need to update once per batch
}
}
}
};
// Create observer with optimized options
this.classObserver = new MutationObserver(callback);
// Observe only the dropdown elements
this.cachedElements.dropdowns.forEach(dropdown => {
this.classObserver.observe(dropdown, {
attributes: true,
attributeFilter: ['class'],
attributeOldValue: true
});
});
}
// Cache focusable elements for keyboard navigation
cacheFocusableElements() {
if (!this.cachedElements.navElement) return;
// Get direct children of nav
const directChildren = Array.from(this.cachedElements.navElement.children);
// Find the first focusable element within each direct child
this.cachedFocusableElements = directChildren.map(child => {
// Check if the child itself is focusable
if (child.matches('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])')) {
return child;
}
// Otherwise, find the first focusable element within this child
return child.querySelector('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])');
}).filter(Boolean); // Remove null/undefined values
}
// Clean up all event listeners and observers
destroy() {
// Clean up the mutation observer
if (this.classObserver) {
this.classObserver.disconnect();
this.classObserver = null;
}
// Clean up resize listener
window.removeEventListener('resize', this.handleResize);
// Clean up click handlers
if (this.dropdownClickHandlers.size > 0) {
this.dropdownClickHandlers.forEach((handler, toggle) => {
toggle.removeEventListener('click', handler);
});
this.dropdownClickHandlers.clear();
}
// Clean up hover handlers
this.cleanupMenuHover();
// Clean up menu item click handlers
this.cleanupMenuItemClicks();
// Clean up outside click handler
document.removeEventListener('click', this.handleOutsideClick);
// Clean up keyboard navigation
if (this.keyboardNavHandler) {
document.removeEventListener('keydown', this.keyboardNavHandler);
this.keyboardNavHandler = null;
}
// Clear any pending timeouts
if (this.menuItemClickTimeout) {
clearTimeout(this.menuItemClickTimeout);
this.menuItemClickTimeout = null;
}
}
// Utility methods
hasHeaderClass() {
return document.body.classList.contains(this.config.leftHeaderClass) ||
document.body.classList.contains(this.config.rightHeaderClass);
}
debounce(func, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => func(...args), delay);
};
}
// Check if an element has all the required active classes
hasAllActiveClasses(element) {
return this.config.activeClasses.every(className => element.classList.contains(className));
}
// Toggle all active classes on an element
toggleActiveClasses(element) {
this.config.activeClasses.forEach(className => {
element.classList.toggle(className);
});
}
// Core functionality methods
handleMenu() {
if (!this.cachedElements.menuElement) return;
if (!this.hasHeaderClass() && !this.previousHeaderClass) return;
const screenWidth = window.innerWidth;
const isLargeScreen = screenWidth >= this.config.minWidth;
const menuElement = this.cachedElements.menuElement;
if (!isLargeScreen) {
// Save which class was present before removal
if (this.hasHeaderClass()) {
this.previousHeaderClass = document.body.classList.contains(this.config.leftHeaderClass)
? this.config.leftHeaderClass
: this.config.rightHeaderClass;
// Remove header classes
document.body.classList.remove(this.config.leftHeaderClass, this.config.rightHeaderClass);
menuElement.classList.remove(this.config.openClass);
// Reset accessibility attributes
this.resetAccessibilityAttributes();
}
// Clean up event handlers for mobile view
this.cleanupMenuHover();
this.cleanupMenuItemClicks();
this.cleanupDropdownHandlers();
document.removeEventListener('click', this.handleOutsideClick);
return;
}
// Large screen behavior
if (!this.hasHeaderClass() && this.previousHeaderClass) {
document.body.classList.add(this.previousHeaderClass);
}
if (this.hasHeaderClass()) {
if (!menuElement.classList.contains(this.config.openClass)) {
menuElement.classList.add(this.config.openClass);
}
// Setup elements for large screen view
this.setupMenuHover();
this.setupMenuItemClicks();
this.setupDropdownHandlers();
this.setupMenuFocusNavigation();
this.updateDropdownAccessibility();
// Ensure outside click handler is set up
document.removeEventListener('click', this.handleOutsideClick);
document.addEventListener('click', this.handleOutsideClick, { passive: false });
}
}
// Reset accessibility attributes when switching to mobile
resetAccessibilityAttributes() {
if (!this.cachedElements.dropdowns) return;
// Remove all inert attributes from dropdown contents
this.cachedElements.dropdowns.forEach(dropdown => {
const content = dropdown.querySelector(this.config.dropdownContentSelector);
if (content) {
content.removeAttribute('inert');
}
const button = dropdown.querySelector('button');
if (button) {
button.setAttribute('aria-expanded', 'false');
}
});
}
setupMenuFocusNavigation() {
// Only run if hasHeaderClass() is true and we have focusable elements
if (!this.hasHeaderClass() || !this.cachedFocusableElements || this.cachedFocusableElements.length === 0) {
return;
}
// Clean up previous handler if it exists
if (this.keyboardNavHandler) {
document.removeEventListener('keydown', this.keyboardNavHandler, true);
this.keyboardNavHandler = null;
}
const navMenu = this.cachedElements.menuElement;
const focusableElements = this.cachedFocusableElements;
const firstFocusableElement = focusableElements[0];
const lastFocusableElement = focusableElements[focusableElements.length - 1];
// Find adjacent focusable elements outside the menu (only once during setup)
const headerElement = navMenu.closest('header') || document.querySelector('header');
// Prepare variables to hold adjacent elements
let prevFocusableElement = null;
let nextFocusableElement = null;
let firstElementAfterHeader = null;
if (headerElement) {
// Get all focusable elements within the header - do this once and cache the result
const headerFocusables = Array.from(
headerElement.querySelectorAll('a:not([tabindex="-1"]), button:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])')
).filter(el => window.getComputedStyle(el).display !== 'none');
// Find the index of our first and last menu elements in one pass
const menuStartIndex = headerFocusables.indexOf(firstFocusableElement);
const menuEndIndex = headerFocusables.indexOf(lastFocusableElement);
// Cache the adjacent elements
if (menuStartIndex > 0) {
prevFocusableElement = headerFocusables[menuStartIndex - 1];
}
if (menuEndIndex !== -1 && menuEndIndex < headerFocusables.length - 1) {
nextFocusableElement = headerFocusables[menuEndIndex + 1];
}
// Pre-calculate the first element after header - but only if needed
if (!nextFocusableElement) {
// Use a more efficient selector that targets immediate children of body that aren't the header
const selector = 'body > *:not(header)';
const nonHeaderElements = document.querySelectorAll(selector);
// Only process if we have elements
if (nonHeaderElements.length > 0) {
// Create a function to find the first focusable element (used later if needed)
this.findFirstFocusableAfterHeader = () => {
for (const element of nonHeaderElements) {
const focusable = element.querySelector('a:not([tabindex="-1"]), button:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])');
if (focusable && window.getComputedStyle(focusable).display !== 'none') {
return focusable;
}
}
return null;
};
}
}
}
// Create keyboard navigation handler with closure over the cached elements
this.keyboardNavHandler = (e) => {
// Quick check for Tab key first
if (e.key !== 'Tab') return;
// Then check if focus is inside the menu
if (!navMenu.contains(document.activeElement)) return;
let targetElement = null;
// Handle tab navigation at boundaries only
if (!e.shiftKey && document.activeElement === lastFocusableElement) {
// Forward tab from last element
e.preventDefault();
e.stopPropagation();
if (nextFocusableElement) {
targetElement = nextFocusableElement;
} else if (this.findFirstFocusableAfterHeader) {
// Only search for elements after header if needed and not already found
firstElementAfterHeader = this.findFirstFocusableAfterHeader();
targetElement = firstElementAfterHeader;
}
// Focus on the target or body as fallback
setTimeout(() => {
if (targetElement) {
targetElement.focus();
} else {
document.body.setAttribute('tabindex', '-1');
document.body.focus();
document.body.removeAttribute('tabindex');
}
}, 10);
}
else if (e.shiftKey && document.activeElement === firstFocusableElement) {
// Backward tab from first element
e.preventDefault();
e.stopPropagation();
setTimeout(() => {
if (prevFocusableElement) {
prevFocusableElement.focus();
} else {
document.body.setAttribute('tabindex', '-1');
document.body.focus();
document.body.removeAttribute('tabindex');
}
}, 10);
}
};
// Use capture phase for the event
document.addEventListener('keydown', this.keyboardNavHandler, true);
}
setupMenuHover() {
const menuElement = this.cachedElements.menuElement;
if (!menuElement) return;
// Clean up existing hover handlers first
this.cleanupMenuHover();
// Create event handlers
const mouseenterHandler = () => {
menuElement.classList.add(this.config.openClass);
};
const mouseleaveHandler = () => {
menuElement.classList.remove(this.config.openClass);
};
// Add event listeners with passive flag for better performance
menuElement.addEventListener('mouseenter', mouseenterHandler, { passive: true });
menuElement.addEventListener('mouseleave', mouseleaveHandler, { passive: true });
// Store the handlers for cleanup
this.menuHoverHandlers = {
element: menuElement,
mouseenter: mouseenterHandler,
mouseleave: mouseleaveHandler
};
}
cleanupMenuHover() {
if (this.menuHoverHandlers) {
const { element, mouseenter, mouseleave } = this.menuHoverHandlers;
element.removeEventListener('mouseenter', mouseenter);
element.removeEventListener('mouseleave', mouseleave);
this.menuHoverHandlers = null;
}
}
setupMenuItemClicks() {
if (!this.cachedElements.menuItems || this.cachedElements.menuItems.length === 0) return;
// Clean up existing handlers first
this.cleanupMenuItemClicks();
const menuElement = this.cachedElements.menuElement;
const menuItemHandlers = new Map();
this.cachedElements.menuItems.forEach(item => {
const clickHandler = () => {
if (this.hasHeaderClass()) {
// Clear any existing timeout
if (this.menuItemClickTimeout) {
clearTimeout(this.menuItemClickTimeout);
}
// Set timeout before adding the class
this.menuItemClickTimeout = setTimeout(() => {
if (!menuElement.classList.contains(this.config.openClass)) {
menuElement.classList.add(this.config.openClass);
}
}, this.config.menuItemClickDelay);
}
};
menuItemHandlers.set(item, clickHandler);
item.addEventListener('click', clickHandler);
});
this.menuItemClickHandlers = menuItemHandlers;
}
cleanupMenuItemClicks() {
if (this.menuItemClickHandlers && this.menuItemClickHandlers instanceof Map) {
this.menuItemClickHandlers.forEach((handler, item) => {
item.removeEventListener('click', handler);
});
this.menuItemClickHandlers.clear();
}
if (this.menuItemClickTimeout) {
clearTimeout(this.menuItemClickTimeout);
this.menuItemClickTimeout = null;
}
}
setupDropdownHandlers() {
if (!this.hasHeaderClass() || !this.cachedElements.dropdownToggles) return;
// Clean up existing handlers first
this.cleanupDropdownHandlers();
this.cachedElements.dropdownToggles.forEach(toggle => {
const clickHandler = (event) => {
event.stopPropagation();
event.preventDefault();
const dropdown = toggle.closest(this.config.dropdownSelector);
if (dropdown) {
this.toggleActiveClasses(dropdown);
this.updateDropdownAccessibility();
}
};
this.dropdownClickHandlers.set(toggle, clickHandler);
toggle.addEventListener('click', clickHandler);
});
}
cleanupDropdownHandlers() {
if (this.dropdownClickHandlers.size > 0) {
this.dropdownClickHandlers.forEach((handler, toggle) => {
toggle.removeEventListener('click', handler);
});
this.dropdownClickHandlers.clear();
}
}
handleOutsideClick(event) {
if (event.target.tagName === 'A') return;
if (!event.target.closest(this.config.dropdownSelector)) return;
if (!event.target.closest(this.config.submenuToggleSelector)) {
event.preventDefault();
event.stopPropagation();
}
}
updateDropdownAccessibility() {
// Only run if hasHeaderClass() is true
if (!this.hasHeaderClass() || !this.cachedElements.dropdowns) return;
this.cachedElements.dropdowns.forEach(dropdown => {
const content = dropdown.querySelector(this.config.dropdownContentSelector);
const button = dropdown.querySelector('button');
// Check if dropdown has all active classes
const isOpen = this.hasAllActiveClasses(dropdown);
if (content) {
if (isOpen) {
content.removeAttribute('inert');
} else {
content.setAttribute('inert', '');
}
}
if (button) {
button.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
}
});
}
}
const sidebarNav = new SidebarNavigation().init();
In de zorg worden digitale dreigingen steeds moeilijker te voorspellen. Aanvallen komen van criminelen, hackersgroepen en andere kwaadwillenden, vaak met hulp van AI of slimme trucs. Door internationale spanningen en digitale afhankelijkheden nemen de risico’s toe, vooral als systemen of leveranciers buiten eigen zicht vallen.
Het is dan ook niet meer de vraag óf digitale risico’s zich aandienen, maar in welke vorm, met welke impact en op welk moment.
Cyberaanvallen zijn nauwelijks nog te onderscheiden van geopolitieke druk, AI wordt niet alleen ingezet voor innovatie maar ook voor misleiding, en contracten met leveranciers zeggen weinig als de dienst uitvalt. Bestuurders worden daarmee geconfronteerd met verantwoordelijkheden die lang niet altijd zichtbaar zijn in dashboards of compliancechecks.
Het rapport Cybersecuritybeeld Nederland 2025 – Riskante mix in een onvoorspelbare wereld, gepubliceerd door de NCTV, bevestigt dit beeld: de risico’s nemen toe, worden diffuser en raken steeds meer sectoren tegelijk.
Wie voorbereid wil zijn, moet anders leren kijken: breder, scherper en sneller.
1. Geopolitieke spanningen en digitale dreiging voor de zorg
Geopolitieke spanningen zorgen voor een flinke toename van digitale risico’s, ook in de zorgsector.
Informatiebeveiliging gaat daardoor allang niet meer alleen over firewalls en wachtwoorden. Zorginstellingen zitten, vaak ongemerkt, middenin een speelveld waarin grote landen elkaar digitaal onder druk zetten.
Niet omdat de zorg zelf altijd het primaire doelwit is, maar omdat systemen, leveranciers en netwerken waar zorginstellingen op draaien, onderdeel zijn van iets veel groters. En dat heeft direct invloed op hoe organisaties hun digitale veiligheid moeten organiseren.
Informatiebeveiliging raakt dus steeds vaker de bestuurslaag. Niet alleen vanuit wetgeving of compliance, maar ook omdat sommige risico’s simpelweg niet zichtbaar zijn op IT-niveau. Als buitenlandse actoren via softwareleveranciers of dataverwerkers toegang krijgen tot netwerken, dan is dat geen hypothetisch scenario meer.
Dit vraagt van bestuurders dat ze begrijpen wat er speelt, ook al is het technisch ingewikkeld. De dreiging komt namelijk niet alleen van cybercriminelen met financiële motieven, maar ook van actoren die opereren in dienst van een land. Dat maakt het speelveld onvoorspelbaar.
Politieke spanningen worden digitale risico’s
Wat tussen landen speelt op politiek of economisch gebied, vertaalt zich steeds vaker naar digitale aanvallen of digitale druk. En dat gebeurt niet alleen bij overheden of militaire organisaties.
Ook zorginstellingen kunnen geraakt worden als onderdeel van bredere campagnes. Soms gaat het dan om directe aanvallen, maar het komt net zo vaak voor dat toeleveranciers, hostingpartijen of IT-systemen onderdeel worden van zo’n conflict.
Zorgorganisaties merken hier bijvoorbeeld het volgende van:
Verstoringen bij leveranciers, zonder directe oorzaak op eigen terrein.
Datalekken of kwetsbaarheden die ontstaan via derde partijen.
Politiek gemotiveerde aanvallen die toevallig ook zorgketens raken.
Regels uit andere landen die doorwerken in Nederlandse IT-dienstverlening.
Bestuurders hoeven geen IT-specialist te zijn om de impact te begrijpen. Wel is het van belang te onderkennen dat informatiebeveiliging in toenemende mate wordt beïnvloed door geopolitieke factoren.
Risicobeheersing vereist daardoor een bredere blik dan enkel op de interne organisatie.
Risico’s worden onvoorspelbaarder
Waar vroeger digitale risico’s vooral technisch waren – denk aan verouderde software of slecht ingestelde systemen – zijn er nu steeds meer dreigingen die ontstaan door afhankelijkheden buiten de organisatie.
Leveranciers gebruiken software uit landen met andere belangen. Clouddiensten draaien op infrastructuur die ook door andere partijen wordt gebruikt. Data wordt opgeslagen op plekken waar andere wetten gelden.
Die afhankelijkheden brengen risico’s met zich mee die lastig te overzien zijn. En het zijn juist deze risico’s die in zorginstellingen vaak onder de radar blijven. Het gaat dan niet alleen om:
Waar data fysiek wordt opgeslagen;
Maar ook om wie er toegang kan krijgen, onder welke wetgeving;
En of die toegang te herleiden is tot buitenlandse overheden of strategische belangen.
Dit soort vragen horen inmiddels thuis op directieniveau, niet alleen bij IT of privacy officers. Vooral omdat ze invloed hebben op continuïteit, reputatie en zelfs patiëntveiligheid.
Hacktivisten, bots en slimme timing
Naast statelijke actoren zijn er ook steeds meer groepen actief die werken uit overtuiging, niet voor geld. Die richten zich op publieke doelen, reageren op politieke gebeurtenissen of kiezen doelwitten om een boodschap af te geven. Deze zogeheten hacktivisten vallen aan wanneer het effect het grootst is.
Rond verkiezingen, internationale topontmoetingen, of na gevoelige politieke uitspraken.
Voor de zorg betekent dit dat:
Publieke aandacht of maatschappelijke thema’s ineens digitale dreiging opleveren;
Campagnes zich richten op systemen met veel gebruikers of publieke zichtbaarheid;
Aanvallen vaak bestaan uit simpele middelen (zoals DDoS), maar met grote impact.
Juist omdat deze groepen vaak weinig voorspelbaar zijn, is het lastig om er standaardmaatregelen tegen te nemen.
Tegelijkertijd is het wél belangrijk om dit soort scenario’s mee te nemen in crisisoverleggen, incidentplannen en communicatievoorbereiding. Vooral omdat de zorg snel in het nieuws komt als er iets misgaat.
Digitale dreiging stopt niet bij nationale grenzen
Een andere realiteit die vaak wordt onderschat: veel digitale diensten die in de zorg worden gebruikt, zijn eigendom van buitenlandse partijen. Denk aan cloudleveranciers, softwareontwikkelaars of dataplatforms.
Dat betekent dat er risico’s kunnen ontstaan buiten eigen controle.
Voorbeelden van dit soort risico’s:
Amerikaanse leveranciers die data moeten afstaan aan hun overheid.
Chinese ontwikkelaars die beveiligingsupdates beheren.
Europese organisaties die gebruikmaken van tools zonder te weten wie erachter zit.
Deze afhankelijkheid betekent dat keuzes die elders worden gemaakt, ook impact kunnen hebben op Nederlandse zorginstellingen.
Een politieke maatregel in de VS kan bijvoorbeeld gevolgen hebben voor de werking van een dienst hier. Dat vraagt om bewustzijn, maar ook om het maken van keuzes op basis van risico’s, niet alleen prijs of gemak.
Wat bestuurders kunnen doen
Hoewel geopolitieke dreiging geen directe invloed heeft op dagelijkse beslissingen, is het wel belangrijk om dit soort risico’s structureel mee te nemen. Niet alleen bij grote investeringen of bij het kiezen van leveranciers, maar ook bij het opstellen van beleid, contracten en verantwoordingsdocumenten.
Bestuurders kunnen onder andere:
Kritischer kijken naar contracten met buitenlandse partijen.
IT-keuzes baseren op risico’s en niet alleen functionaliteit.
Zorgen dat scenario’s voor verstoringen ook niet-technische oorzaken meenemen.
Periodiek toetsen of de digitale keten nog aansluit bij de risico-acceptatie van de organisatie.
Zorginstellingen hebben vaak meerdere lagen van toeleveranciers, cloudservices en externe platforms. Zonder overzicht kan dat leiden tot onzichtbare risico’s. En juist statelijke actoren of gemotiveerde hackers maken daar gebruik van.
Politiek belang, economische druk en afhankelijkheid
Digitale veiligheid heeft ondertussen raakvlakken met economische strategie, mededinging en politieke beïnvloeding.
Dat betekent dat zelfs kleinere zorgorganisaties kunnen worden meegezogen in conflicten waar ze niets mee te maken hebben. Denk aan internationale sancties, exportbeperkingen of regelgeving die verandert zonder dat men daar invloed op heeft.
Voor zorgbestuurders betekent dit:
Digitale risico’s zijn niet meer statisch.
Afhankelijkheden moeten niet alleen technisch, maar ook geopolitiek beoordeeld worden.
Privacy en informatiebeveiliging zijn onderdeel geworden van externe strategie.
Informatiebeveiliging is geen losstaand domein meer. Het is onderdeel van bestuurlijke afwegingen over hoe de organisatie afhankelijk is van externe partijen, wat dat betekent voor de werking van zorg, en waar in de keten er knelpunten kunnen ontstaan. Zonder dat die direct zichtbaar zijn op de werkvloer.
2. Ransomware en de gevolgen voor zorginstellingen
Ransomware-aanvallen hebben een verschuiving veroorzaakt in de manier waarop organisaties in de zorg naar digitale risico’s kijken.
Niet langer gaat het alleen om toegang tot systemen of verlies van data. De gevolgen van zo’n aanval raken direct de dagelijkse zorgpraktijk, de financiële positie en het vertrouwen in de organisatie.
Waar geopolitieke dreigingen vaak indirect verlopen via infrastructuur en ketenpartners, is ransomware veel directer en tastbaarder. Het is zichtbaar, blokkeert processen en zorgt voor schade die direct merkbaar is op de werkvloer.
Zorginstellingen zijn aantrekkelijk voor deze aanvallen omdat ze sterk afhankelijk zijn van digitale systemen, veel gevoelige informatie verwerken en doorgaans niet de meest robuuste verdediging hebben.
Dat zorgt voor een situatie waarin criminele groepen relatief snel kunnen toeslaan en weten dat de druk om te betalen groot is. Zeker als zorgverlening in gevaar komt.
Ransomware is geen technisch probleem
Veel bestuurders zien ransomware als iets dat thuishoort bij de IT-afdeling. Maar in werkelijkheid gaat het over bedrijfsvoering, besluitvorming en herstelvermogen.
Zodra systemen zijn versleuteld, draait het niet meer om techniek, maar om scenario’s, aansprakelijkheid en communicatie. In veel gevallen is de vraag niet of een aanval kan worden voorkomen, maar of de organisatie goed voorbereid is op wat daarna komt.
Aanvallen leiden vaak tot vragen als:
Wie neemt de beslissing om al dan niet te betalen?
Wat is de impact op zorgprocessen en patiëntveiligheid?
Hoe wordt intern en extern gecommuniceerd?
Wat betekent dit juridisch, bijvoorbeeld richting toezichthouders?
Deze vragen kunnen niet door IT of beveiligingsfunctionarissen worden opgelost. Ze raken het bestuur direct en vragen om duidelijke afspraken en scenario’s die vooraf zijn doordacht.
Financiële en juridische druk
Ransomware is meer dan alleen digitale chantage. Het is ook een verdienmodel voor georganiseerde groepen die druk uitoefenen via reputatieschade, juridische claims of directe economische impact.
Voor zorginstellingen komt daar nog iets bij: de maatschappelijke verantwoordelijkheid om door te blijven draaien.
Zodra patiëntgegevens op straat liggen of systemen niet beschikbaar zijn, ontstaat er druk van meerdere kanten:
Verzekeraars die eisen stellen aan preventie en herstelcapaciteit.
Toezichthouders die onderzoek instellen naar gegevensverwerking.
Media die aandacht besteden aan de impact op patiënten.
Leveranciers en samenwerkingspartners die geraakt worden in de keten.
In deze context is informatiebeveiliging niet alleen een IT-kwestie, maar ook een juridisch en financieel dossier. Bestuurders moeten kunnen aantonen dat risico’s serieus zijn genomen, maatregelen zijn getroffen en dat er binnen redelijke grenzen is gehandeld.
Tactieken veranderen, druk blijft hetzelfde
De manier waarop ransomware wordt ingezet verandert snel. Waar het eerst ging om het versleutelen van bestanden, is het nu vaak een combinatie van datadiefstal en dreiging met publicatie.
In veel gevallen zijn systemen al wekenlang gecompromitteerd voordat een aanval zichtbaar wordt. Dat betekent dat detectie en monitoring belangrijker zijn dan ooit, maar het verandert niets aan het bestuurlijke karakter van de schade.
De meeste aanvallen verlopen volgens een vergelijkbaar patroon:
Inbraak via een zwakke plek of gestolen inloggegevens.
Stil verzamelen van informatie over de organisatie.
Downloaden van data en voorbereiden van versleuteling.
Aanzetten van ransomware en tonen van een betalingseis.
Publicatie van gestolen data als er niet wordt betaald.
Deze aanpak is professioneel en vaak gericht op maximale impact. Zorginstellingen worden niet willekeurig gekozen, maar zijn onderdeel van doelgerichte aanvallen waarbij bekend is dat de verstoring directe gevolgen heeft voor patiëntenzorg en dienstverlening.
Besluitvorming onder druk
Een ransomware-aanval zorgt voor een situatie waarin bestuurders onder druk besluiten moeten nemen, vaak met beperkte informatie. De tijd om af te wegen, juristen te raadplegen en alternatieven te onderzoeken is beperkt.
Toch zijn dit beslissingen met vergaande gevolgen: voor privacy, voor aansprakelijkheid en voor het vertrouwen van patiënten.
In veel gevallen worden er vooraf geen duidelijke afspraken gemaakt over wie welke verantwoordelijkheid draagt. Daardoor ontstaan in het heetst van de strijd vragen als:
Wie voert het woord naar buiten?
Wie schakelt externe hulp in?
Wat is het mandaat om over betaling te praten?
Welke voorwaarden gelden voor het inschakelen van politie of toezichthouders?
Zonder vooraf uitgewerkte scenario’s leidt dat tot verwarring, vertraging en extra schade. Bestuurlijke voorbereiding is dus net zo belangrijk als technische preventie.
Herstel kost meer dan tijd
Na een aanval is herstel niet alleen een kwestie van systemen opnieuw opstarten. Vaak moet complete infrastructuur worden vervangen, worden er audits uitgevoerd, en is er langdurig toezicht op de manier waarop gegevens worden verwerkt.
Herstel is het duurste onderdeel van een ransomware-incident, zowel in geld als in mensuren.
Daarnaast zijn er andere vormen van schade:
Vertrouwen van patiënten en personeel krijgt een klap.
Interne werkdruk neemt toe door manuele processen.
Ketenpartners eisen extra garanties of beëindigen samenwerking.
Juridische trajecten duren vaak maanden tot jaren.
Deze gevolgen zijn niet altijd zichtbaar op het moment van de aanval, maar bepalen wél de uiteindelijke impact op de organisatie. Daarom is het belangrijk om ransomware niet te onderschatten als ‘alleen een cyberprobleem’.
Wat nodig is vanuit bestuursperspectief
De kans op een aanval is reëel, en de gevolgen zijn breed. Bestuurders moeten daarom zorgen voor meer dan alleen basismaatregelen. Ze moeten ook nadenken over:
Welke scenario’s relevant zijn voor hun organisatie.
Wie beslissingen neemt in crisissituaties.
Hoe juridische, ethische en praktische belangen worden afgewogen.
Wat er moet gebeuren als data daadwerkelijk op straat ligt.
In veel gevallen ontbreekt het nog aan afspraken op dit niveau. Er zijn wel technische maatregelen, maar geen bestuurlijk kader om onder druk te kunnen handelen. Dat maakt organisaties kwetsbaar, niet alleen voor de aanval zelf, maar vooral voor wat daarna gebeurt.
Informatiebeveiliging is dus ook in dit geval een bestuurlijk vraagstuk. Niet omdat bestuurders technische oplossingen moeten bedenken, maar omdat zij verantwoordelijk zijn voor het voorbereiden, kiezen en communiceren van de juiste reactie. En dat begint niet op het moment dat het misgaat, maar lang daarvoor.
3. Afhankelijkheid van digitale dienstverleners in de zorg
Zorginstellingen zijn sterk afhankelijk geworden van digitale dienstverleners. Die afhankelijkheid is in korte tijd uitgegroeid tot een structureel bedrijfsrisico.
Systemen voor patiëntregistratie, laboratoriumdiagnostiek, beeldvorming, medicatiebeheer en administratie draaien steeds vaker in de cloud, worden beheerd door externe partijen, of zijn onderdeel van internationale softwareketens.
Dat maakt de zorg kwetsbaar voor incidenten die buiten de eigen organisatie plaatsvinden. Zeker als er geen zicht is op wat zich afspeelt achter de interfaces van leveranciers en partners.
Digitale uitbesteding is vaak praktisch en kostenbesparend. Maar als diezelfde partners slachtoffer worden van een aanval of zelf fouten maken, kan dat gevolgen hebben die de zorgverlening direct raken.
Informatiebeveiliging houdt hier niet op bij de voordeur van de organisatie. Juist in de digitale keten ontstaan risico’s die moeilijk te detecteren zijn, laat staan te beheersen als er geen afspraken of overzicht zijn.
Complexiteit van de digitale zorgketen
Zorginstellingen hebben te maken met tientallen tot honderden digitale dienstverleners. Niet alleen grote softwarebedrijven of cloudaanbieders, maar ook nichepartijen die cruciale onderdelen leveren, zoals afsprakensystemen, dataopslag, of laboratoriumrapportages.
Veel van deze leveranciers maken op hun beurt weer gebruik van andere platforms, infrastructuren of ontwikkelaars. Daardoor ontstaat een keten van afhankelijkheden die nauwelijks volledig te overzien is.
Kenmerken van deze ketencomplexiteit zijn:
Onduidelijkheid over wie verantwoordelijk is bij een incident.
Gebrek aan transparantie over subleveranciers of hostinglocaties.
Verouderde of slecht onderhouden systemen binnen de keten.
Internationale datastromen die onder andere wetgeving vallen.
Bestuurders zijn in veel gevallen afhankelijk van verklaringen of contractbepalingen die niet voorzien in realtime inzicht of concrete garanties. Toch is het bestuur verantwoordelijk voor wat er met patiëntgegevens gebeurt, ook als de fout bij een derde partij ligt.
Schijnzekerheid door contracten
Leverancierscontracten bieden vaak een gevoel van zekerheid. Service Level Agreements (SLA’s), certificaten en audits geven de indruk dat risico’s afgedekt zijn. Maar in de praktijk blijkt dat deze afspraken zelden bestand zijn tegen echte incidenten.
Bij verstoringen schuiven partijen verantwoordelijkheid van zich af, of blijkt er geen voorziening te zijn voor langdurige uitval of dataverlies.
Wat vaak ontbreekt:
Afspraken over beschikbaarheid tijdens crisissituaties.
Herstelgaranties bij uitval door ransomware of sabotage.
Inzicht in ketenpartijen en bijbehorende risico’s.
Exitmogelijkheden bij onvoldoende beveiliging of samenwerking.
Bestuurders moeten zich ervan bewust zijn dat juridische afspraken weinig betekenen als de dienstverlening stilvalt of gegevens verloren gaan. Vertrouwen op papier is iets anders dan werkelijke veerkracht in de praktijk.
Internationale platformen, beperkte grip
Veel zorgdata wordt verwerkt via Amerikaanse of Aziatische platformen. Denk aan hosting, e-mail, planningstools of teleconsultatie. Hoewel deze diensten vaak stabiel en gebruiksvriendelijk zijn, brengen ze risico’s met zich mee die niet altijd zichtbaar zijn.
Buitenlandse wetgeving, geopolitieke druk en extraterritoriale bevoegdheden kunnen betekenen dat data onder andere regimes valt dan de AVG.
Mogelijke risico’s die hieruit voortvloeien:
Data die juridisch toegankelijk is voor buitenlandse autoriteiten.
Slechts beperkte mogelijkheden tot bezwaar of toezicht.
Onvoorspelbare beleidswijzigingen bij de leverancier.
Eenzijdige beëindiging van dienstverlening bij politieke spanningen.
Zorginstellingen opereren in een gereguleerde omgeving, maar veel van hun IT-componenten zijn dat niet. Bestuurders die geen rekening houden met deze asymmetrie, nemen ongemerkt grote juridische en operationele risico’s.
Leveranciersfalen raakt de hele zorgketen
Een storing of aanval bij één leverancier kan impact hebben op meerdere zorginstellingen tegelijk. Zeker als er gebruik wordt gemaakt van dezelfde applicaties of netwerken.
De ketenstructuur betekent dat een probleem bij één partij zich razendsnel verspreidt, ook naar organisaties die op het eerste gezicht geen directe relatie hebben met die leverancier.
Voorbeelden van deze impact:
Toegang tot patiëntendossiers wordt onmogelijk door centrale storingen.
Resultaten van laboratoriumonderzoeken komen niet door.
Communicatie met ketenpartners valt weg.
Medewerkers moeten terugvallen op papieren processen.
Deze verstoringen hebben niet alleen gevolgen voor de interne processen, maar ook voor het vertrouwen van patiënten, verwijzers en toezichthouders. Herstel duurt vaak langer dan verwacht, juist omdat het buiten de invloedssfeer van de organisatie ligt.
Te weinig grip op vitale leveranciers
Hoewel veel zorginstellingen weten wie hun grootste IT-leveranciers zijn, ontbreekt het vaak aan inzicht in de mate van afhankelijkheid.
De prioritering van leveranciersrisico’s is meestal niet gebaseerd op impact op zorgcontinuïteit, maar op financiële waarde of contractduur. Dat leidt tot onderschatting van kleinere partijen die cruciale processen ondersteunen, maar buiten het formele IT-landschap vallen.
Daarnaast zijn er andere signalen van beperkte grip:
Incidenten bij leveranciers worden laat gemeld of niet gedeeld.
Updates of patches worden automatisch uitgerold zonder lokaal toezicht.
Dataflows worden niet actief gemonitord of gecontroleerd.
Er is geen plan als een leverancier uitvalt of failliet gaat.
De optelsom van deze factoren zorgt voor een situatie waarin de digitale bedrijfscontinuïteit voor een groot deel buiten zicht is. En dat terwijl informatiebeveiliging in de kern gaat over beschikbaarheid, integriteit en vertrouwelijkheid van gegevens, óók bij uitbesteding.
Sturen op verantwoordelijkheid en herstelvermogen
Om risico’s te beheersen, moeten bestuurders sturen op drie pijlers: verantwoordelijkheid, herstelvermogen en samenwerking. Niet door alle techniek intern te halen, maar door duidelijke eisen te stellen aan de manier waarop leveranciers omgaan met beveiliging, incidentrespons en transparantie.
Dat betekent onder andere:
Herzien van contracten op basis van actuele dreigingsscenario’s.
Eisen stellen aan detectie, logging en herstelprocessen.
Afspraken maken over communicatie bij incidenten.
Werken met exitstrategieën en redundante leveranciers waar mogelijk.
Ook samenwerking met andere instellingen is hierbij van belang. Gezamenlijk optrekken richting leveranciers verhoogt de onderhandelingspositie en maakt het mogelijk om eisen te stellen die individueel moeilijk af te dwingen zijn.
Digitale afhankelijkheid als strategisch thema
Digitale afhankelijkheid moet gezien worden als strategisch vraagstuk. Niet als IT-kwestie of operationeel detail. Het raakt direct aan bedrijfsvoering, naleving van wetgeving en het vermogen om zorg te blijven leveren bij verstoringen. Zorgorganisaties moeten durven kiezen voor minder gemak, als dat leidt tot meer grip.
Dat vraagt om een andere blik op leveranciersmanagement:
Niet alleen kijken naar kosten, maar naar continuïteit.
Niet alleen sturen op functionaliteit, maar op transparantie.
Niet alleen contracten afsluiten, maar relaties onderhouden.
De rol van bestuurders is daarbij essentieel. Zonder bestuurlijke aandacht voor digitale afhankelijkheid, blijven kwetsbaarheden bestaan. En in het geval van zorg, is de impact van zo’n kwetsbaarheid zelden beperkt tot techniek alleen.
4. AI versterkt digitale dreigingen in de zorg
De opkomst van kunstmatige intelligentie heeft digitale aanvallen ingrijpend veranderd.
AI stelt aanvallers in staat om sneller, gerichter en geloofwaardiger op te treden. Voor de zorg betekent dat een groeiende dreiging die niet per se complexer is, maar vooral efficiënter en moeilijker te herkennen.
Waar voorheen technische kennis of veel tijd nodig was om systemen aan te vallen of mensen te misleiden, kan dat nu grotendeels geautomatiseerd en op grote schaal. Daardoor verschuift het speelveld opnieuw, met gevolgen voor hoe informatiebeveiliging wordt ingericht en bestuurd.
AI wordt steeds vaker ingezet om bestaande aanvalstechnieken te versterken, niet om geheel nieuwe typen aanvallen te ontwikkelen. Dat maakt de dreiging lastig te onderscheiden van eerdere patronen, maar juist daardoor des te gevaarlijker.
Zeker in een sector waar tijdsdruk, digitale communicatie en vertrouwensrelaties centraal staan.
Phishingcampagnes worden gepersonaliseerd
Een van de meest directe gevolgen van AI in cyberaanvallen is de toename van gepersonaliseerde phishing.
Waar eerder nog sprake was van slecht geschreven e-mails met herkenbare fouten, maken aanvallers nu gebruik van taalmodellen die foutloos en overtuigend communiceren. Ze analyseren publieke informatie over organisaties, medewerkers en processen en passen hun berichten daarop aan.
Dat levert situaties op waarin:
Aanvallers zich geloofwaardig voordoen als interne collega’s.
Taalgebruik, tone of voice en context nauwelijks van echt te onderscheiden zijn.
E-mails aansluiten op actuele gebeurtenissen binnen de organisatie.
Zorginstellingen lopen extra risico doordat veel medewerkers dagelijks grote hoeveelheden e-mails verwerken, vaak onder tijdsdruk. Daarnaast zijn er veel tijdelijke of flexibele krachten, waardoor niet iedereen altijd scherp is op wat wel of niet klopt.
Deepfakes en stemklonen ondermijnen vertrouwen
AI maakt het mogelijk om stemmen na te bootsen, videobeelden te manipuleren en gesprekken te faken. Hoewel deze technieken technisch geavanceerd lijken, zijn ze inmiddels laagdrempelig beschikbaar.
Aanvallers kunnen telefoongesprekken simuleren, videovergaderingen nabootsen of voicemails inspreken met een vertrouwd stemgeluid.
In de zorg kan dit zich uiten in:
Vragen om patiëntgegevens ‘vanuit de directie’.
Verzoeken tot betaling of toegang via een nagemaakte stem.
Video’s die lijken op interne communicatie maar in werkelijkheid gemanipuleerd zijn.
Deze vormen van misleiding ondermijnen niet alleen de informatiebeveiliging, maar ook het onderlinge vertrouwen binnen teams en ketenpartners. Organisaties die hier geen protocollen of verificatiemethoden voor hebben, lopen het risico dat beslissingen worden genomen op basis van nepverzoeken.
AI verlaagt de drempel voor cybercriminelen
AI verlaagt de technische instap voor kwaadwillenden. Waar voorheen programmeerkennis of infrastructuur nodig was om een aanval uit te voeren, kunnen nu complete campagnes worden opgezet met behulp van standaardtools, scripts en openbare modellen. Daarmee komen geavanceerde technieken beschikbaar voor een bredere groep daders.
Dat leidt tot:
Meer aanvallen met een lager technisch niveau, maar met hoge effectiviteit.
Aanvallen die sneller aangepast worden aan de reactie van de organisatie.
Creatie van malware of scripts op basis van publieke informatie of testdata.
Voor zorginstellingen betekent dit dat aanvallen niet alleen van professionele groepen hoeven te komen. Ook individuen of kleine netwerken kunnen gericht toeslaan, zeker als ze toegang hebben tot AI-modellen die gericht zijn op automatisering en misleiding.
Detectie wordt moeilijker
AI zorgt er ook voor dat aanvallen subtieler en flexibeler worden. In plaats van grote volumes e-mails of brute force-aanvallen, kiezen kwaadwillenden steeds vaker voor langzame, verspreide en goed gecamoufleerde methodes. Daardoor vallen ze minder snel op in monitoringtools of gedragsanalyses.
Moeilijkheden bij detectie ontstaan onder andere door:
Variatie in aanvalspatronen, waardoor standaardregels niet werken.
Dynamisch gegenereerde content, die filters omzeilt.
Gebrek aan herkenbare kenmerken zoals verdachte IP-adressen of domeinen.
Dit vraagt om andere vormen van monitoring, bijvoorbeeld gebaseerd op afwijkend gedrag of contextuele signalen. Ook is samenwerking tussen afdelingen essentieel, omdat incidenten niet altijd direct herkend worden als cyberaanval.
Grenzen tussen intern en extern vervagen
AI maakt het eenvoudiger om externe signalen te koppelen aan interne informatie. Denk aan het combineren van LinkedIn-profielen, openbare beleidsstukken en eerdere datalekken. Hierdoor kunnen aanvallers zeer specifiek te werk gaan, met kennis van interne processen, systemen en verantwoordelijkheden.
Dat betekent:
Aanvallen worden afgestemd op specifieke medewerkers of afdelingen.
Interne structuur van organisaties wordt gebruikt als ingang.
Schijnbaar onschuldige informatie wordt inzet voor misleiding.
Voor bestuurders betekent dit dat bescherming niet stopt bij technische systemen of privacybeleid. Ook communicatie, openbaarheid en digitale sporen moeten worden meegewogen in het risicobeeld.
Reactie op AI-gedreven dreigingen vraagt ander perspectief
De traditionele manier van omgaan met digitale dreigingen volstaat niet meer. Incidentbestrijding moet sneller, communicatie moet voorbereid zijn op verwarring door deepfakes, en besluitvorming moet ook rekening houden met mogelijk gemanipuleerde input.
AI brengt niet alleen technische, maar ook bestuurlijke uitdagingen met zich mee.
Zorgorganisaties moeten zich afvragen:
Welke processen kwetsbaar zijn voor misleiding of manipulatie.
Of medewerkers weten hoe ze afwijkende signalen moeten melden.
Hoe wordt bepaald wat ‘echt’ is bij onverwachte communicatie.
Wat het herstelplan is als AI wordt ingezet om reputatie te beschadigen.
Dit vraagt om scenario’s die verder gaan dan alleen toegang tot systemen of verlies van data. Denk aan gerichte campagnes tegen personen, beïnvloeding van publieke opinie of manipulatie van patiëntcommunicatie.
AI inzetten voor verdediging is niet vanzelfsprekend
Hoewel AI ook wordt gebruikt in de verdediging, bijvoorbeeld voor detectie, risicoscoring of netwerkmonitoring, is dat geen garantie op betere veiligheid.
Veel modellen zijn gevoelig voor ruis, onvolledige datasets of verkeerde interpretaties. Daardoor kunnen incidenten over het hoofd worden gezien, of juist onterecht als risico worden gemarkeerd.
Valkuilen van AI in beveiliging zijn onder andere:
Vertrouwen op modellen zonder begrip van de beperkingen.
Onvoldoende toezicht op hoe beslissingen tot stand komen.
Geen plan voor wanneer AI-tools falen of gemanipuleerd worden.
Voor bestuurders is het belangrijk om niet alleen de voordelen te zien, maar ook de afhankelijkheden en beperkingen. AI is geen vervanging van menselijk toezicht of besluitvorming, maar een aanvulling die zorgvuldig ingebed moet worden.
Bestuurlijke aandacht voor nieuwe aanvalsvormen
De zorg kan AI niet negeren, maar moet ook niet doorschieten in vertrouwen op technologische oplossingen.
De focus moet liggen op digitale weerbaarheid, voorbereiding en bewustzijn.
Bestuurders spelen daarin een centrale rol. Niet omdat zij de techniek moeten begrijpen, maar omdat ze verantwoordelijk zijn voor de context waarin beslissingen worden genomen.
Aandachtspunten zijn onder andere:
Training van personeel op herkenning van AI-gestuurde misleiding.
Interne protocollen voor verificatie bij twijfelachtige communicatie.
Bewustwording van de eigen digitale voetafdruk in de publieke ruimte.
Betrekken van communicatie- en juridische teams in incidentvoorbereiding.
AI verandert de spelregels, maar niet de verantwoordelijkheid. Die blijft liggen bij de organisatie zelf. Door vooruit te denken en niet te wachten tot een incident zich voordoet, kan schade worden beperkt of voorkomen.
5. Verstoringen in de zorgketen
Digitale verstoringen beperken zich zelden tot één organisatie.
In de zorgsector is sprake van een hechte keten, waarbij meerdere partijen afhankelijk zijn van elkaars systemen, data en processen. Als ergens in die keten een schakel uitvalt, door een cyberaanval, storing of technisch falen, verspreidt de impact zich snel naar andere delen van de zorgverlening.
Zorginstellingen die zelf niet zijn aangevallen, kunnen toch te maken krijgen met uitval van functionaliteit, vertraging in dienstverlening of reputatieschade.
Deze ketenafhankelijkheid maakt bedrijfscontinuïteit kwetsbaar. En het betekent dat bestuurders ook verantwoordelijkheid moeten nemen voor risico’s buiten de directe organisatie.
Verstoringen ontstaan namelijk niet alleen door interne zwakke plekken, maar juist ook door incidenten bij laboratoria, apotheken, toeleveranciers, softwarepartners of clouddiensten.
Verstoringen zijn zelden lokaal
Zorgprocessen zijn verweven met systemen van externe partijen. Denk aan gegevensuitwisseling met huisartsen, labresultaten via externe systemen, beeldvorming vanuit gespecialiseerde centra of medicatiebeheer via apothekersnetwerken.
Een verstoring op één plek leidt al snel tot stagnatie elders.
Kenmerken van ketenverstoringen:
Tijdverlies door ontbrekende of vertraagde informatie.
Afhankelijkheid van externe herstelacties.
Onvermogen om patiënten veilig te behandelen door ontbrekende data.
Verwarring over verantwoordelijkheden bij uitval.
Zorginstellingen hebben vaak slechts gedeeltelijk inzicht in hoe andere schakels werken. Daardoor is de reactie op verstoringen vaak reactief en ongecoördineerd, met vertraging en miscommunicatie als gevolg.
Onzichtbare knelpunten in de keten
Niet alle ketenrisico’s zijn direct zichtbaar.
Sommige afhankelijkheden zijn technisch of juridisch goed geregeld, maar blijken in de praktijk kwetsbaar zodra er een storing optreedt. Zeker als er sprake is van exclusieve samenwerkingen of legacy-systemen die niet eenvoudig te vervangen zijn.
Voorbeelden van knelpunten:
Eén extern laboratorium verzorgt diagnostiek voor meerdere instellingen.
EPD-leveranciers leveren updates die tijdelijk functies uitschakelen.
Data-uitwisseling verloopt via verouderde API’s of handmatige koppelingen.
Verantwoordelijkheid voor herstel ligt bij partijen zonder directe prikkel om snel te handelen.
Bestuurders moeten zich realiseren dat deze knelpunten niet altijd uit auditrapporten of contracten blijken. Pas bij incidenten wordt duidelijk hoe afhankelijk de organisatie daadwerkelijk is van anderen.
Uitval raakt niet alleen IT, maar ook mensen
Een verstoring heeft directe gevolgen voor zorgprofessionals, patiënten en ondersteunende processen. Zodra systemen uitvallen, moeten medewerkers terugvallen op handmatige processen. Dit levert niet alleen vertraging op, maar verhoogt ook het risico op fouten, stress en frustratie.
Gevolgen voor de praktijk:
Medewerkers moeten zoeken naar papieren alternatieven.
Patiëntendossiers zijn tijdelijk niet beschikbaar.
Diagnostiek of uitslagen lopen vertraging op.
Consulten worden uitgesteld of verplaatst.
Deze verstoringen hebben impact op kwaliteit van zorg, wachttijden en tevredenheid. En hoewel de oorzaak extern ligt, wordt de schade vaak intern gevoeld.
Vertrouwen verdwijnt sneller dan het herstelt
Zodra een verstoring merkbaar wordt voor patiënten of ketenpartners, is reputatieschade snel een feit. De oorzaak speelt daarbij vaak een ondergeschikte rol. Of het incident nu intern of extern is ontstaan, de publieke beleving is dat de organisatie niet functioneert.
Dit heeft gevolgen op meerdere vlakken:
Verwijzers kiezen voor alternatieve routes.
Patiënten stellen vragen over de veiligheid van hun gegevens.
Partners worden terughoudender in samenwerking.
Medewerkers verliezen vertrouwen in systemen.
Herstel van vertrouwen vraagt tijd, duidelijke communicatie en zichtbare verbetering. Bestuurders doen er goed aan dit proces actief te sturen, ook als de verstoring feitelijk buiten hun organisatie is ontstaan.
Continuïteit vereist voorbereiding, niet alleen reactie
Veel zorginstellingen hebben wel een calamiteitenplan of ICT-herstelstrategie, maar deze zijn vaak gericht op interne uitval. Ketenverstoringen worden minder vaak geoefend of volledig doordacht. Dat zorgt voor blinde vlekken in scenario’s, waardoor de organisatie niet goed is voorbereid op verstoringen die via partners binnenkomen.
Effectieve continuïteitsvoorbereiding vraagt om:
Scenario’s waarin ook uitval bij ketenpartners is meegenomen.
Afspraken met leveranciers over alternatieven bij uitval.
Vastgelegde communicatielijnen voor spoedincidenten.
Herverdeling van taken en processen bij beperkte functionaliteit.
Zorginstellingen moeten hierbij rekening houden met de volgorde van prioriteiten: niet elk systeem is even kritisch. Maar juist door die afweging vooraf te maken, wordt het mogelijk om in crisissituaties sneller en gerichter te reageren.
Eigenaarschap en samenwerking in crisistijd
Bij ketenverstoringen is het niet altijd duidelijk wie de leiding heeft. Meerdere partijen werken samen, maar niemand voelt zich volledig verantwoordelijk. Dat leidt tot versnipperde communicatie, onduidelijkheid over herstelacties en vertraging bij besluitvorming.
Wat nodig is bij verstoringen:
Eén aanspreekpunt per organisatie met bevoegdheden.
Heldere afspraken over gezamenlijke besluitvorming.
Transparantie over wat wél en niet beschikbaar is bij uitval.
Respect voor elkaars positie, ook bij fouten of vertragingen.
Samenwerking in de keten is niet vanzelfsprekend. Het vraagt onderhoud, vertrouwen en duidelijke afspraken. Zonder dat valt de zorgketen snel uit elkaar bij digitale incidenten.
Structureel denken over verstoringen
Verstoringen zijn geen uitzondering meer. Ze horen bij een digitale zorgomgeving waarin meerdere partijen, platformen en systemen samenwerken. Dat vraagt om structurele aandacht, niet alleen na incidenten.
Voor bestuurders betekent dat:
Ketenafhankelijkheid onderdeel maken van risicobeoordeling.
Incidenten bij partners analyseren alsof ze intern zijn.
Continuïteitsplannen jaarlijks actualiseren op basis van ketenrisico’s.
Samenwerkingen evalueren op herstelvermogen en informatievoorziening.
Informatiebeveiliging gaat niet alleen over bescherming, maar ook over herstel. En herstel is in ketensamenwerking alleen mogelijk als iedereen zijn rol kent, erkent en uitvoert.
6. Bestuurlijke en juridische verantwoordelijkheid in digitale weerbaarheid
Digitale weerbaarheid is geen technisch project of tijdelijk aandachtsgebied. Het is een structureel onderdeel van goed bestuur. In een sector die werkt met gevoelige gegevens, vitale processen en publieke verantwoordelijkheid, kan informatiebeveiliging niet worden overgelaten aan afzonderlijke afdelingen of leveranciers. Bestuurders zijn eindverantwoordelijk voor wat er gebeurt binnen en rondom hun organisatie, ook als het gaat om cyberincidenten, datalekken of uitval van systemen.
Dat betekent dat digitale risico’s moeten worden meegenomen in strategische afwegingen, risicobeheersing, communicatie en externe verantwoording. Zeker in de zorg, waar de druk op IT-systemen blijft toenemen en afhankelijkheid van externe partijen groeit, is een bestuursstructuur nodig die gericht is op continuïteit en veerkracht.
Digitale weerbaarheid begint met eigenaarschap
Digitale weerbaarheid is het vermogen van een organisatie om zich te beschermen tegen, te reageren op en te herstellen van digitale verstoringen. Dat vraagt om duidelijke verantwoordelijkheden, actuele afspraken en bestendige sturing. Bestuurders hoeven geen technische kennis te hebben, maar wél overzicht en regie.
Verschillende elementen vallen hieronder:
Inzicht in digitale risico’s die invloed hebben op zorgcontinuïteit.
Mandaatverdeling voor besluitvorming bij incidenten.
Integratie van informatiebeveiliging in het bredere risicoprofiel.
Afstemming tussen zorg, IT, juridische zaken en communicatie.
Eigenaarschap betekent in dit kader: weten welke risico’s er zijn, waar ze kunnen ontstaan, en wat de organisatie er op voorhand aan doet. Niet alleen op papier, maar ook in de praktijk.
Informatiebeveiliging vraagt om bestuurlijke kaders
Informatiebeveiliging gaat over vertrouwelijkheid, integriteit en beschikbaarheid van gegevens en systemen. Binnen zorgorganisaties is dit onderwerp sterk verweven met privacywetgeving, ketenafspraken en kwaliteitsbeleid. Dat betekent dat besluiten over beveiliging niet alleen op operationeel niveau thuishoren, maar juist ook in de bestuurskamer.
Een bestuurlijk kader moet voorzien in:
Heldere beleidslijnen die doorvertaald worden naar uitvoering.
Jaarlijkse beoordeling van risico’s en bijbehorende maatregelen.
Toezicht op naleving van procedures en toetsing van effectiviteit.
Rapportage aan interne toezichthouders en externe instanties.
Voor veel instellingen is ISO 27001 het uitgangspunt. Deze internationale norm geeft structuur aan informatiebeveiliging via een beheerssysteem (ISMS), dat risico’s vertaalt naar concrete maatregelen. In de zorgsector is daarnaast NEN 7510 van toepassing. Deze standaard richt zich specifiek op medische gegevens en stelt aanvullende eisen op het gebied van beschikbaarheid, privacy en toegangsbeheer.
Bestuurders zijn verantwoordelijk voor de implementatie en werking van deze kaders. Dat betekent dat zij moeten weten wat de status is, welke audits zijn uitgevoerd en waar bijsturing nodig is.
Wet- en regelgeving raakt de bestuurslaag
Digitale veiligheid is niet vrijblijvend. Verschillende wetten leggen verplichtingen op aan zorginstellingen en hun bestuurders. Denk aan de Algemene verordening gegevensbescherming (AVG), maar ook aan de Wet beveiliging netwerk- en informatiesystemen (Wbni), en in de nabije toekomst: NIS2. Deze regelingen brengen niet alleen plichten met zich mee voor beveiliging, maar leggen ook nadruk op bestuurlijke verantwoordelijkheid en meldplicht bij incidenten.
Meldingen van datalekken of beveiligingsincidenten moeten op tijd worden gedaan.
Bij nalatigheid kunnen bestuurders persoonlijk aansprakelijk worden gehouden.
Inspecties kunnen onderzoek doen naar de bestuursrol bij incidenten.
Juridische verantwoordelijkheid gaat dus verder dan ‘weten dat er iets speelt’. Het vraagt om aantoonbaar beleid, monitoring, toetsing en opvolging. Zonder dit fundament lopen organisaties niet alleen risico op schade, maar ook op sancties of toezichtmaatregelen.
Verantwoording intern en extern
Zorginstellingen leggen verantwoording af aan meerdere partijen: toezichthouders, raden van toezicht, zorgverzekeraars en in sommige gevallen ook financiers of de publieke opinie. Informatiebeveiliging en digitale weerbaarheid horen expliciet onderdeel te zijn van die verantwoording. Niet alleen bij incidenten, maar ook in reguliere overleggen en rapportages.
Inhoudelijke thema’s die daarbij aan bod moeten komen:
Wat is de huidige staat van digitale weerbaarheid?
Welke risico’s zijn geïdentificeerd en geprioriteerd?
Hoe is de voortgang van maatregelen vastgelegd en gecontroleerd?
Welke keuzes zijn gemaakt op het gebied van leveranciers, technologie en privacy?
Door digitale veiligheid te behandelen als vast onderdeel van governance, ontstaat consistentie. En dat is nodig in een domein waar de dreigingen zich snel ontwikkelen, maar waar ook de verwachtingen van externe partijen toenemen.
Bestuurders sturen op samenhang, niet op incidenten
Digitale risico’s hangen samen met andere thema’s: ketenverantwoordelijkheid, gegevensuitwisseling, personeelsschaarste, innovatie en externe druk. Bestuurders moeten daarom sturen op samenhang, niet alleen op acute incidentbestrijding. Informatiebeveiliging hoort thuis in het bredere geheel van risicomanagement en bedrijfscontinuïteit.
Praktische stappen die hierbij horen:
Digitale risico’s opnemen in de reguliere risicorapportage.
Integratie van ISO 27001 en NEN 7510 in kwaliteitsbeleid.
Samenhang creëren tussen IT, zorg, privacy en strategie.
Jaarlijkse evaluatie van digitale weerbaarheid door bestuur en toezicht.
Deze samenhang zorgt ervoor dat informatiebeveiliging niet blijft hangen in losse projecten of technische discussies, maar onderdeel wordt van hoe de organisatie functioneert en bestuurd wordt.
Van controle naar cultuur
De meeste normen en wetgeving richten zich op processen, maatregelen en documenten. Maar echte digitale weerbaarheid ontstaat pas als er een cultuur is waarin risico’s bespreekbaar zijn, fouten gemeld worden en samenwerking vanzelfsprekend is. Bestuurders spelen hierin een voorbeeldrol. Niet door elk incident persoonlijk op te lossen, maar door zichtbaar te maken dat digitale veiligheid ertoe doet.
Een gezonde veiligheidscultuur herken je aan:
Openheid over meldingen, zonder schuldvraag.
Duidelijke verwachtingen richting medewerkers en leidinggevenden.
Aandacht voor veilig gedrag, niet alleen voor veilige systemen.
Investeringen in bewustwording, scholing en oefening.
Bestuurders die hierin sturen, maken hun organisatie wendbaarder. Niet omdat elke dreiging verdwijnt, maar omdat de organisatie beter reageert als het misgaat. En dat is de kern van digitale weerbaarheid.
Samengevat
In de zorg is digitale weerbaarheid een directe voorwaarde geworden voor continuïteit en veilige patiëntenzorg.
De complexiteit van systemen, ketens en dreigingen vraagt om meer dan technische maatregelen: het gaat om bestuurlijke scherpte, duidelijke verantwoordelijkheden en strategisch inzicht.
Informatiebeveiliging is niet langer een taak voor specialisten alleen, maar een structureel onderdeel van goed bestuur.
1. Digitale weerbaarheid is een strategisch vermogen, geen IT-project Weerbaar zijn betekent als organisatie kunnen blijven functioneren onder digitale druk. Dat vereist bestuurlijke keuzes, niet alleen technische maatregelen.
2. Informatiebeveiliging hoort thuis in het hart van governance De bescherming van data, systemen en processen moet geïntegreerd zijn in risicomanagement, compliance en zorgkwaliteit. Zonder bestuurlijke verankering blijft het versnipperd en kwetsbaar.
3. Ketenafhankelijkheid vergroot de impact van elk incident Een storing bij één partij werkt razendsnel door naar de hele zorgketen. Organisaties moeten niet alleen naar hun eigen risico’s kijken, maar ook naar die van partners en leveranciers.
4. Ransomware is niet alleen technisch, maar ook juridisch en bestuurlijk risico De schade na een aanval ontstaat niet door versleutelde bestanden, maar door chaos, besluiteloosheid en reputatieverlies. Wie geen scenario’s heeft voorbereid, verliest tijd én controle.
5. AI versterkt bestaande aanvallen en ondermijnt vertrouwen Slimme aanvallen misbruiken taal, beeld en gedrag om systemen én mensen te misleiden. Detectie wordt lastiger, menselijke beoordeling belangrijker.
6. Compliance zonder inzicht biedt schijnveiligheid Certificaten als ISO 27001 en NEN 7510 zijn essentieel, maar alleen waardevol als bestuurders begrijpen wat erachter zit en hoe dit wordt toegepast in de praktijk.
7. Verantwoordelijkheid houdt niet op bij de eigen voordeur Wetgeving en publieke verwachtingen maken bestuurders ook verantwoordelijk voor wat ketenpartners, leveranciers en dataverwerkers doen. Verantwoordelijkheid is gedeeld, maar aansprakelijkheid blijft lokaal.
8. Bestuurlijke voorbereiding bepaalt de schadebeperking Niet de aanval zelf, maar de manier waarop een organisatie reageert bepaalt de werkelijke impact. Dat vraagt om mandaten, communicatieafspraken en geoefende besluitvorming.
9. Transparantie, vertrouwen en cultuur versterken weerbaarheid Een open cultuur waarin incidenten gemeld en besproken worden zonder schuldvraag, zorgt voor snellere respons en lerend vermogen — de echte kern van informatiebeveiliging.
10. Digitale dreiging is dynamisch, dus beleid moet meebewegen Statische plannen en jaarlijkse evaluaties zijn niet genoeg. Digitale weerbaarheid vraagt om continue monitoring, bijstelling en betrokkenheid van het hele bestuur.