Jak směrnice NIS2 ovlivní možnost používat druhotný software?

26. 2. 2025

Sdílet

Autor: Depositphotos
V prosinci 2022 byla Evropskou unií schválena směrnice NIS2 (Network and Information System Directive 2), která stanovuje pravidla a požadavky na kybernetickou bezpečnost ICT systémů i sítí. NIS2 měly jednotlivé země EU implementovat do svých právních řádů do 18. října 2024.

V praxi se tak ale dosud v řadě zemí nestalo, včetně ČR, kde se počítá se zavedením v polovině roku. Dotknou se nová, přísnější pravidla možnosti využívat druhotný software?

NIS2 – koho se týká?

Nová legislativa se dotýká desítek tisíc společností v celé Evropské unii a přináší významné změny ve způsobu řízení kybernetické bezpečnosti ve veřejném i soukromém sektoru. Na rozdíl od své předchůdkyně, směrnice NIS, se dotýká mimo jiné veřejné správy, potravinářského průmyslu nebo nakládání s odpady.

Směrnice definuje dva typy subjektů:

•             Základní subjekty s nejširším rozsahem odpovědností.

•             Důležité subjekty, které musí splňovat méně přísné požadavky, ale stále podléhají regulaci.

Za podstatné subjekty a významné subjekty lze obecně považovat subjekty z odvětví uvedených v příloze I. a II. směrnice, které jsou minimálně středním podnikem (zaměstnávají minimálně 50 osob nebo jejichž roční obrat přesahuje 10 mil. EUR). Rovněž jsou zahrnuty další entity definované směrnicí NIS2, např. subjekty veřejné správy, subjekty označené jako kritické subjekty podle směrnice (EU) 2022/2557, poskytovatelé veřejných sítí elektronických komunikací nebo veřejně dostupných služeb elektronických komunikací, kvalifikovaní poskytovatelé důvěryhodných služeb a registry doménových jmen nejvyšší úrovně a také poskytovatelé služeb DNS bez ohledu na jejich velikost. Na základě vnitrostátních právních předpisů mohou být zahrnuty i další subjekty. Směrnice však obsahuje několik výjimek. Nicméně do 17. dubna 2025 musí všechny členské státy vytvořit seznamy výše zmíněných subjektů, na které se budou nové předpisy vztahovat.

Vítaným pomocníkem, jak ověřit, zda bude mít na konkrétní společnost směrnice NIS2 dopad, může být web https://portal.nukib.gov.cz/. Tyto stránky provozuje Národního úřadu pro kybernetickou bezpečnost a informace, který je v ČR odpovědný za transpozici NIS2 do české legislativy. Na webu najdete nejen informace o aktuálním stavu implementace směrnice, ale také „kalkulačku”, která vám pomůže zjistit, zda se na vás NIS2 bude vztahovat.

Při řešení kybernetické bezpečnosti jde o implementaci systému řízení kybernetické bezpečnosti a vždy byste měli mít na paměti:

•             stupeň rizika,

•             míru hrozících následků,

•             rozpočet, který je k dispozici,

•             přiměřenost.

NIS2 vs. druhotný software

Ve své podstatě NIS2 neomezuje využívání druhotného softwaru, pokud jsou splněny parametry, které vyžaduje legislativa v této oblasti. Při výběru druhotného softwaru, kterým lze dosáhnout optimalizaci nákladů až do výše 70 procent ceny ve srovnání s nákupem softwaru přímo od výrobce, je ovšem třeba mít na paměti několik aspektů kybernetické bezpečnosti.

„Snažte se používat software, jehož životní cyklus produktu neskončil. To znamená, že pro takový produkt výrobce stále poskytuje nejnovější aktualizace ovlivňující mimo jiné vylepšenou kybernetickou bezpečnost. Tento cyklus někdy trvá přes deset let, ale vždy se vyplatí požádat softwarového brokera, jako je Forscope, o podrobnosti a odbornou pomoc. Ideální je, pokud vybraný broker nabízí rozšířenou škálu podpory, včetně technických, licenčních, compliance a právních služeb. Důvěryhodný broker by tohle měl být schopen nabídnout,“ doporučuje Michal Baudyš, Public Sector Strategy Leader pro trhy v EU společnosti Forscope.

Zde si připomeňme, že životní cyklus softwaru se obvykle skládá ze čtyř fází:

•             1. fáze – plná podpora. Softwarové aktualizace pokrývající jak bezpečnostní problémy, tak další oblasti jako je vylepšování funkcionality apod. a umožňuje vznést na výrobce požadavky na úpravy a funkce.

•             2. fáze – rozšířená podpora. V této fázi již není možné žádat o změny produktu nebo funkčnosti, protože jsou již poskytovány pouze aktualizace kybernetické bezpečnosti. Stejný zůstává přístup k podpoře.

•             3. fáze – po podpoře. Stále je možné využívat aktualizace z oblasti kybernetické bezpečnosti, ale pouze za příplatek. Zároveň jde nejzazší okamžik, kdy je nutné se poohlédnout po novějším softwaru.

•             4. fáze – software již není podporován.

Alternativa k fázi tři a čtyři by mohla zahrnovat použití vyhrazených řešení ke zvýšení kybernetické bezpečnosti softwaru, který již výrobce nepodporuje. Tato řešení mohou také doporučit a poskytovat softwaroví brokeři.

Cyber25

Správci firemní IT infrastruktury by proto neměli zapomínat na pravidelnou instalaci záplat a aktualizací, které mohou pomoci zabránit tomu, aby byly systémy vystaveny útokům.

Kromě toho se vždy ujistěte, že používáte ověřený software od důvěryhodného brokera. Jeho výběr je zásadní, protože na trhu existují podvodné subjekty, které nabízejí například pouze produktové klíče bez řádné dokumentace. Případný nákup nelegálního software, byť v dobré víře, zvyšuje riziko soudních sporů, odpovědnost za škody za porušení práv duševního vlastnictví a navyšuje riziko instalace škodlivého softwaru v případě instalace z neznámých instalačních souborů.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »