Manažer bezpečnosti: Zabezpečení datového centra v cloudu

1. 12. 2013

Sdílet

Autor: © sellingpix - Fotolia.com
Při migraci datového centra do různých cloudů vznikají starosti související s provisioningem serverů.

Naše firma přerostla své současné kanceláře a bude se stěhovat do nového sídla. Zatímco společnost jako celek bude mít více prostoru, datové centrum se zmenší na méně než polovinu současné plochy – cílem vedení je totiž snížit plochu datových center o 60 %.


Trouble Ticket
Co řešit: Provisioning SaaS serverů může vést k problémům se zabezpečením.
Akční plán: Použít přísná pravidla pro zabezpečení a kontrolu aplikací i infrastruktury.


Samozřejmě že klíčem k takové eliminaci datového centra bude cloud a je pochopitelné, že když vstupuje do hry cloud, je potřeba vzít v úvahu aspekty bezpečnosti.

V současné době už máme s cloudovou infrastrukturou docela rozsáhlé zkušenosti. Obvykle používáme pro nové podnikové aplikace externí dodavatele služeb SaaS, naše technické oddělení vytváří demonstrační verze v prostředích veřejného cloudu a dokonce i náš vlastní produkt má podobu nabídky SaaS.

Servery budeme umísťovat do tří typů prostředí. První, jímž je poskytovatel veřejného cloudu jako například Amazon EC2, nebude mít s naší vnitřní sítí žádný vztah. Druhému říkám hybridní model – umísťujeme infrastrukturu (včetně virtuálních serverů) v datovém centru třetí strany a do naší společnosti vytvoříme VPN tunel, čímž vznikne důvěryhodný vztah. Třetí je pak privátní cloud, kde vybudujeme virtuální prostředí v naší vlastní síti.

Kvůli správě, automatizaci, řízení a získání viditelnosti v těchto různých prostředích jsme se podrobněji podívali na několik společností, jež nabízejí komplexní provisioning serverů ve všech třech cloudových prostředích.

Tato část mne ale poněkud děsí. Nechci, aby inženýři používající novou platformu mohli omylem či jinak vytvořit server v DMZ naší společnosti. Ani nechci, aby měli možnost zprovoznit kritické produkční servery na Amazonu. Jsem na naše vystavování se internetu velmi citlivý.

Také se mi nelíbí myšlenka, že bude velká podnikové infrastruktury datového centra přístupná odkudkoliv z internetu. Pokud dnes chce vývojový inženýr vytvořit server, musí se fyzicky nacházet v jedné z našich budov nebo být součástí naší firemní sítě.

Cloud ale tuto oblast natolik otevírá, že takový server může vzniknout například z nedůvěryhodného internetového kiosku v Mexiku. Proto jsem pro tuto iniciativu vyhlásil pět bezpečnostních požadavků.

Požadavky na cloudy

První je, že přístup k nové platformě a všechny v ní uložené citlivé údaje společnosti musí být buď omezeny podle IP adresy, nebo obsahovat nějakou formu dvoufaktorové autentizace. Bez ohledu na to musí být přístup šifrován.

Další požadavek je na silné profily, které omezují a v případě nutnosti vytvoří pracovní postup pro provisioning určitých serverů. Tím by se zabránilo zbytečnému vytvoření DMZ serverů a produkčních serverů a naše duševní vlastnictví by se uchránilo před jejich vystavením méně bezpečným prostředím.

Tyto profily se musí integrovat s infrastrukturou Active Directory naší společnosti tak, že když je zaměstnanec propuštěn, bude jeho přístup k nové platformě zrušen.

Za třetí, všechny servery musí vyhovět našim zásadám pro správu konfigurací, které se týkají oblastí, jako jsou patch management, antivirová ochrana, zakázání nepotřebných služeb či centralizovaná správa.

Čtvrtý požadavek se týká dostupnosti a vyzývá k dostatečné odolnosti vůči chybám a také k vytvoření plánu obnovy po havárii. Předpokládá se, že řešení pro provisioning SaaS se bude provozovat mimo datové centrum vyhovující standardům SAS 70 nebo SSAE 16.

A konečně služba provisioningu musí nabízet robustní reportování a protokolování, aby bylo možné identifikovat zneužití a bezpečnostní problémy. Logy musí být kompatibilní a schopné přenosu do naší infrastruktury pro monitorování událostí.

Toto jsou hlavní řídicí prvky pro infrastrukturu, aplikace a zabezpečení, které musíme při přechodu k nové epoše provisioningu serverů zajistit.

docker + kubernetes školení s dotací tip


Řešíte podobné problémy jako Mathias Thurman? Podělte se o svoje zkušenosti s námi i se čtenáři Computerworldu. Můžete psát na adresu bezpecnost@idg.cz.


Tento příspěvek do Zápisníku manažera pro bezpečnost napsal skutečný manažer bezpečnosti, který zde vystupuje jako Mathias Thurman. Jeho pravé jméno ani jméno zaměstnavatele z pochopitelných důvodů neuvádíme.

Autor článku

'; 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'; } }