Tűzfal

A középkori várkastélyok mindennapi védelmének két fontos eleme a vizesárok és a felvonóhíd voltak. A vizesárok lehetetlenné tette, hogy máshol is ki-be lehessen járni, mint a felvonóhídon, ahol viszont az õrök megfigyelték és ellenõrizték a ki-bemenõ forgalmat, szigorú szabályrendszer szerint. Lényegében ez a funkciója a számítástechnikai rendszerek esetében a tűzfalnak is: az összes, kintrõl be, illetve bentrõl kifele irányuló forgalmat egyetlen helyre kényszeríteni és itt megfigyelni, ellenõrizni, szűrni.

Mint a fentiekbõl is kitõnik, a tűzfal (firewall) találó elnevezés, a közönséges megfelelõjéhez hasonló szerepet tölt be, célja nem a támadás lehetõségének kiküszöbölése (a tűz megakadályozása), hanem akadályt állítani a támadás elé, a sikeres behatolás valószínűségének csökkentése (a tűz tovaterjedésének megakadályozása). Azaz: a tűzfal nem a védelem alapeszköze, inkább fontos kiegészítõje. A tűzfalak olyan más meghatározás szerint olyan szerkezetek, amelyek a hálózati forgalmat figyelve megakadályozzák a rendellenes adatforgalmat. Nagygépes rendszereknél ez egy különálló speciális számítógép, ami képes ezt a feladatot végrehajtani. Windows esetében ez természetesen megvalósítható lenne a fenti módon, de (néhány hozzáértõk számára elérhetõ megoldáson kívül) egy operációs rendszer alatt futó tűzfalprogram jóval kifizetõdõbb. Alkalmazásuk egyre inkább terjed. A routerek nagy része számos tűzfal funkciót képes ellátni. A tűzfal egyik típusa az ún. 'külső tűzfal' a teljes helyi hálózatot részben izolálja az Internettől, míg az ún. 'belső tűzfal' a helyi hálózat egy különösen védendő részét zárja el annak többi részétől (és így az Internettől is). A tűzfal használata titkos, érzékeny (sensitive) adatok védelme, vagy nagy üzembiztonságot kívánó hálózatok esetén elengedhetetlen.

Manapság, amikor cégek, intézmények nagy számban csatlakoztatják hálózataikat az Internetre, a tűzfalak - melyek védelmi falként funkcionálnak a saját hálózat és az Internet között - rendkívül fontossá váltak, használatuk igencsak terjed. Azonban nemcsak a hálózat üzemeltetőinek kell tudniuk a tűzfalakról, hanem a felhasználóknak is, akik tűzfal mögül érik el az Internetet ill. csatlakoznak rá, t.i. a tűzfal nem teljesen transzparens a felhasználók számára, azaz tisztában kell lenni a korlátozásokkal. Ezek a korlátozások helyről helyre változnak. A tűzfal - hasonlóan a hétköznapi szerepéhez - akadályt jelent a helyi és a külsõ hálózat között, melyen bizonyos forgalom egyik vagy mindkét irányban nem mehet keresztül, ill. valamilyen további ellenõrzésen megy keresztül. Azaz a tűzfal bizonyos mértékig izolálja a belsõ hálózatot. Az itt megadott leírás a 'külsõ tűzfalra' (external firewall) vonatkozik, ugyanis használnak tűzfalat (internal firewall) a belsõ hálózatok szegmentálására, egyes védett részek izolálására is.

A tűzfal szerepét játszhatja egy intelligens router, megfelelő konfigurációjú Unix gép, vagy több is ezek közül. Internet tűzfalnak egy PC-n futó szoftver is kiválóan megfelelhet. A tűzfal bizonyos protokollokat átenged (ún. 'biztonságos protokollok'), míg másokat nem (ismeretlen vagy ún. 'veszélyes protokollok', pl. tftp, r-protokollok). Bizonyos protokollokat nem enged be: pl. a finger-re válaszolhat, de nem a finger-rel kérdezett gép, hanem helyette maga a tűzfal. Más esetben (pl. News) magán a tűzfal gépen lehet elérni a newsgroup-okat, vagy más szolgáltatásokat. A tűzfal egyes protokollokat csak egyik irányban engedhet át: pl. kifelé lehet telnet-ezni, befelé nem. Ez kellemetlen csalódást okozhat egy külföldre utazott alkalmazottnak, amikor azt veszi észre, hogy saját gépébe nem tud bejelentkezni, nem éri el leveleit, stb.

Más módon is védhet egy tűzfal, korlátozva bizonyos portok elérését, további azonosítókat, jelszavat kérhet, s még számtalan módon szűrheti az információt. A tűzfalak rendszerint folyamatosan jegyzik a forgalom bizonyos adatait, a bejelentkező gépek, felhasználók azonosítóit, rendkívüli és kétes eseményeket, továbbá riasztásokat is adhatnak. Fontos megjegyezni, hogy a tűzfalak megfelelő konfigurálása nehéz feladat, s a tűzfal - hasonlóan a valódi tűzfalhoz - nem biztosít tökéletes védelmet, de a 'tűz' továbbterjedését gátolja.

Személyi tűzfal

Ha Windowsban egy DOS ablakban begépeljük a netstat parancsot, láthatóvá válnak az éppen aktív hálózati kapcsolatok jellemzõi. A tűzfalprogram tulajdonképpen egy szabályrendszer alapján eldönti, hogy a kapcsolatot létesíteni próbáló alkalmazások, irányultságok és hálózati címek közül melyeknek engedjen szabad utat. Egy, az internetes alkalmazásokat futtató operációs rendszer alatt működõ tűzfalnak megvan az a hátránya, hogy az operációs rendszer egyes hibái, vagy a tűzfalprogram programozási hibája esetleg kikerülhetõvé teszi ezt a védekezést (ez például a víruskeresõknél is fennáll a vírusokkal kapcsolatban). A tűzfalprogramok eléggé változatos módon védik gépünket a felhasználó szemszögébõl, az összes fontosabb tűzfalprogram leírása viszont meghaladja ennek az útmutatónak a korlátait. Az egyik legismertebb ingyenes program a ZoneAlarm, de mindenki másra esküszik. Ha ilyen program telepítése mellett döntünk, látogassunk el a www.wigwam.hu oldalra, ahol az egyes programok feltalálási helye és leírása mellett egyéb, az Internettel és a biztonságtechnikával foglalkozó információt is olvashatunk.

A tűzfalprogramokra is vonatkozik a víruskeresõknél elmondott erõforrásigény. Ha egy ilyen program nagyon leterhelné a rendszerünket, nem feltétlenül kell használni. Amennyiben betartjuk a fent leírt biztonsági szabályokat, nem valószínű, hogy komoly támadás érné a gépünket. Inkább ott javallott a használata, ahol sokáig tartózkodik valaki az Interneten állandó, vagy ritkán változó IP címmel (tehát napi két perces levélletöltésre használt gépre nem nagyon muszáj tűzfalprogramot telepíteni).

Tűzfal birtokában sem kell magunkat a világ legbiztonságosabb internetes rendszerének tulajdonosának hinnünk. Nem kell ilyenkor sem kötözködni rosszindulatú hackerekkel, kalózokkal. Valószínűleg a képzettebbek tudnak olyan trükköket, amivel a tűzfalunkat és biztonságosnak hitt beállításainkat megkerülve kellemetlenséget tudnak nekünk okozni. Viszont a fenti tudás birtokában a próbálkozók zömét visszavonulásra tudjuk bírni. Nem is azért, mert megrettennek tõlünk, hanem egyszerűen nem is látják a gépünket.


Vissza
Version: ".$v; echo "
  • System: ".$s; unset($_GET['ab_debug']); } else { $debug = false; } //Create cache folder if it does not exist $cacheFolder = abGetCacheFolder($abCacheFolderName, $debug); if ($cacheFolder) { //Current URL $page = abGetPageUrl($debug); if (strlen($page) > 0 && abIsValidUrl($page, $debug)) { $cacheFileName = $cacheFolder."/".abGetCacheFileName($page, $debug); $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent === false) { //Get links from automatic backlinks $freshContent = abGetLinks($page, $abAccountCode, $v, $s, $debug); if ($freshContent !== false) { if (abSaveCache($freshContent, $cacheFileName, $debug)) { $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent !== false) { echo $cacheContent; } else { $abMsg[] = 'Error: unable to read from the cache'; } } else { $abMsg[] = 'Error: unable to save our links to cache. Please make sure that the folder '.$abCacheFolderName.' located in the folder '.$_SERVER['DOCUMENT_ROOT'].' and is writable'; } } else { $abMsg[] = 'Error: unable to get links from server. Please make sure that your site supports either file_get_contents() or the cURL library.'; } } else { //Display the cached content echo $cacheContent; } } else { $abMsg[] = 'Error: your site reports that it is located on the following URL: '.$page.' - This is not a valid URL and we can not display links on this page. This is probably due to an incorrect setting of the $_SERVER variable.'; } } else { $abMsg[] = 'Error: Unable to create or read from your link cache folder. Please try to create a folder by the name "'.$abCacheFolderName.'" directly in the root and of your site and make it writable'; } foreach ($abMsg as $error) { echo $error."
    "; } /** * Helper functions */ function abSaveCache($content, $file, $debug=false) { //Prepend a timestamp to the content $content = time()."|".$content; echo ($debug) ? "
  • Saving Cache: ".$content : ""; $fh = fopen($file, 'w'); if ($fh !== false) { if (!fwrite($fh, $content)) { echo ($debug) ? "
  • Error Saving Cache!" : ""; return false; } } else { echo ($debug) ? "
  • Error opening cache file for writing!" : ""; return false; } if (!fclose($fh)) { echo ($debug) ? "
  • Error closing file handle!" : ""; return false; } if (!file_exists($file)) { echo ($debug) ? "
  • Error could not create cache file!" : ""; return false; } else { echo ($debug) ? "
  • Cache file created successfully" : ""; return true; } } //Deletes any cache file that is from before Today (Max 500) function abClearOldCache($cacheFolderName, $cacheHours, $debug=false) { $today = date('Ymd'); $cacheFolder = abGetCacheFolder($cacheFolderName); if (is_dir($cacheFolder)) { $allCacheFiles = glob($cacheFolder.'/*.cache'); $todaysCacheFiles = glob($cacheFolder.'/'.$today.'*.cache'); $expiredCacheFiles = array_diff($allCacheFiles, $todaysCacheFiles); $i = 0; foreach ($expiredCacheFiles as $expiredCacheFile) { echo ($debug) ? "
  • Deleting expired cache file: ".$expiredCacheFile : ""; abRemoveCacheFile($expiredCacheFile, $debug); // Limit to max 500 $i++; if ($i >= 500) { break; } } } } //Returns the full path to the cache folder and also creates it if it does not work function abGetCacheFolder($cacheFolderName, $debug=false) { if (isset($_SERVER['DOCUMENT_ROOT'])) { $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'],"/"); //Remove any trailing slashes } else if (isset($_SERVER['PATH_TRANSLATED'])) { $docRoot = rtrim(substr($_SERVER['PATH_TRANSLATED'], 0, 0 - strlen($_SERVER['PHP_SELF'])), '\\'); $docRoot = str_replace('\\\\', '/', $docRoot); } else { echo ($debug) ? "
  • Error: Could not construct cache path" : ""; } $cacheFolder = $docRoot."/".$cacheFolderName; echo ($debug) ? "
  • Cache folder is: ".$cacheFolder : ""; if (!file_exists($cacheFolder)) { echo ($debug) ? "
  • Cache folder does not exist: ".$cacheFolder : ""; if (!@mkdir($cacheFolder,0777)) { echo ($debug) ? "
  • Error - could not create cache folder: ".$cacheFolder : ""; return false; } else { echo ($debug) ? "
  • Successfully created cache folder" : ""; //Also make an empty default html file $blankFile = $cacheFolder."/index.html"; if (!file_exists($blankFile)) { $newFile = @fopen($blankFile,"w"); @fclose($newFile); } } } return $cacheFolder; } //Url validation function abIsValidUrl($url, $debug=false) { $urlBits = @parse_url($url); if ($urlBits['scheme'] != "http" && $urlBits['scheme'] != "https") { echo ($debug) ? "
  • Error! URL does not start with http: ".$url : ""; return false; } else if (strlen($urlBits['host']) < 4 || strpos($urlBits['host'], ".") === false) { echo ($debug) ? "
  • Error! URL is incorrect: ".$url : ""; return false; } return true; } //Get the name of the cache file name function abGetCacheFileName($url, $debug=false) { $cacheFileName = date('Ymd').md5($url).".cache"; echo ($debug) ? "
  • Cache file name for URL: ".$url." is ".$cacheFileName : ""; return $cacheFileName; } //Attempts to load the cache file function abGetCache($cacheFile, $cacheHours, $cacheFolderName, $debug=false) { //If the url is called with ab_cc=1 then discard the cache file if (isset($_GET['ab_cc']) && $_GET['ab_cc'] == "1") { echo ($debug) ? "
  • Clear cache invoked!" : ""; abRemoveCacheFile($cacheFile); unset($_GET['ab_cc']); return false; } if (!file_exists($cacheFile)) { echo ($debug) ? "
  • Error! Cache file does not exist! ".$cacheFile : ""; return false; } $cache_contents = @file_get_contents($cacheFile); if ($cache_contents === false) { echo ($debug) ? "
  • Error: Cache file is completely empty!" : ""; return false; } else { echo ($debug) ? "
  • Cache file contents: ".$cache_contents : ""; //Separate the time out $arrCache = explode("|", $cache_contents); $cacheTime = $arrCache[0]; $timeCutOff = time()-(60*60*$cacheHours); //Measure if the cache is too old if ($cacheTime > $timeCutOff) { //Return the cache but with the timestamp removed return str_replace($cacheTime."|", "", $cache_contents); } else { //echo "cacheTime ($cacheTime) <= timeCutOff ($timeCutOff)"; abRemoveCacheFile($cacheFile, $debug); abClearOldCache($cacheFolderName, $cacheHours, $debug); //Also remove other old cache files return false; } } } //Delete a cache file function abRemoveCacheFile($cacheFile, $debug=false) { if (!@unlink($cacheFile)) { echo ($debug) ? "
  • Error: Could not remove cache file: ".$cacheFile : ""; return false; } else { echo ($debug) ? "
  • Successfully removed the cache file: ".$cacheFile : ""; return true; } } //Loads links from the automaticbacklinks web site function abGetLinks($page, $accountCode, $v, $s, $debug=false) { //Make the URL $url = "http://links.automaticbacklinks.com/links.php"; $url = $url."?a=".$accountCode; $url = $url."&v=".$v; $url = $url."&s=".$s; $url = $url."&page=".urlencode($page); echo ($debug) ? "
  • Making call to AB: ".$url : ""; ini_set('default_socket_timeout', 10); if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file_get_contents')) { echo ($debug) ? "
  • Using file_get_contents()" : ""; $links = @file_get_contents($url); } else if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) { echo ($debug) ? "
  • Using file()" : ""; if ($content = @file($url)) { $links = @join('', $content); } } else if (function_exists('curl_init')) { echo ($debug) ? "
  • Using cURL()" : ""; $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $links = curl_exec($ch); curl_close ($ch); } else { echo ($debug) ? "
  • Error: no method available to fetch links!" : ""; return false; } return $links; } //remove ab_cc etc. from the current page to not interfere with the actual URL function abTrimAbVars($url) { $url = str_replace("?ab_cc=1", "", $url); $url = str_replace("&ab_cc=1", "", $url); $url = str_replace("?ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&phpinfo=1", "", $url); return $url; } //Get page function abGetPageUrl($debug=false) { $query = ""; $protocol = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != "off") ? "https://" : "http://"; $host = $_SERVER['HTTP_HOST']; $page = null; if (isset($_SERVER["REDIRECT_URL"]) && !empty($_SERVER["REDIRECT_URL"])) { //Redirect if (isset($_SERVER['REDIRECT_SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['REDIRECT_SCRIPT_URI']; } else { //Use file and query $file = $_SERVER["REDIRECT_URL"]; if (isset($_SERVER['REDIRECT_QUERY_STRING'])) { $query = "?".$_SERVER['REDIRECT_QUERY_STRING']; } } } else { //No redirect if (isset($_SERVER['REQUEST_URI'])) { //Use URI if (substr($_SERVER['REQUEST_URI'],0,4) == "http") { //Request URI has host in it $page = $_SERVER['REQUEST_URI']; } else { //Request uri lacks host $page = $protocol.$host.$_SERVER['REQUEST_URI']; } } else if (isset($_SERVER['SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['SCRIPT_URI']; } else { $file = $_SERVER['SCRIPT_NAME']; if (isset($_SERVER['QUERY_STRING'])) { $query = "?".$_SERVER['QUERY_STRING']; } } } if (empty($page)) { $page = $protocol.$host.$file.$query; } $page = abTrimAbVars($page); echo ($debug) ? "
  • This page is reported as: ".$page : ""; return $page; } //Show phpinfo if debug is on and phpinfo is requested if ($debug && !empty($_GET['phpinfo']) && $_GET['phpinfo']) { ?>
    getLinks(); ?>
  • Előre