Windows - Az SQL szerver védelme a támadásoktól

Az SQL szerver a cégünk legfontosabb adatait tárolja, így számunkra a legértékesebb. Nyilvánvaló, hogy egy külső támadó ezt a pontot próbálja leginkább feltörni, hiszen innen tud számára leginkább hasznos adatokat elérni. Cikkünk arra koncentrál, hogy az SQL szervert miként védhetjük meg ezektől a támadásoktól.
Többféle módszer lehetséges arra, hogy adatokat nyerjünk ki az SQL szerverből. Írhatunk közvetlen lekérdezéseket és futtathatunk kiterjesztett tárolt eljárásokat. Ez csak két kiragadott példa, de mindkettő esetben azonosítani kell magunkat a hozzáféréshez.
Az adatlekérdezéseket kapcsolatokon keresztül valósítjuk meg. Egy adatbázis-kapcsolatnak többféle paramétere lehetséges:
  • Adatbázisforrás
  • Lekérdezés típusa
  • Adatbázis
  • Felhasználói azonosító
  • Jelszó
Nézzük, hogy milyen támadási lehetőségek adottak az SQL szerver esetében:
Direkt támadás
Az SQL szerver használatához alapértelmezésben tartozhat egy rendszergazdai fiók, amellyel teljes joggal tudunk adatbázis-műveleteket végezni. Ez a fiók az sa nevű fiók, és jelszó nélkül jön létre a telepítéskor, tehát a legfontosabb, hogy rögtön a telepítés után adjunk meg az azonosítóhoz egy jelszót.
Nem mindegy az sem, hogy milyen jelszót használunk, mert ha nagyon egyszerű a jelszó, akkor percek alatt feltörhető. Mindenképpen ajánlott, hogy legalább nyolc karakter legyen, és tartalmazzon vegyesen kis- és nagybetűket, valamint számokat, továbbá ne legyen értelmezhető szöveg. Pl: ZUjr4o57.
Tekintsük át, hogy egy támadás hogyan zajlik. A hacker keres egy SQL szervert, ami egy könnyű feladat, hiszen egy megfelelően konfigurált port scanner-t kell használjon, ami végigpásztázhat több ezer IP címet, és csak a megfelelő válaszra vár. Ha a várt választ kapja, akkor ez egy MS SQL szervert jelent. Miután összeállt egy lista, a hacker megpróbál információkat gyűjteni: verziószámot, port számot, bejövő lekérdezési módszert. Ezután megpróbálkozik a könnyű azonosítók feltörésével. Erre is külön alkalmazást használhat, és percek multával valószínűleg akad pozitív eredmény. Amint egy hackernek hozzáférése van a DBA azonosítóhoz, vagy egy egyszerű felhasználói fiókhoz, a következő lépés, hogy a fiókinformációkkal a szerverhez kapcsolódik, és megpróbál tulajdonosi jogokat szerezni az adatokhoz. Ha ez összejön neki, akkor letölthet, módosíthat és törölhet adatokat. Ennél még nagyobb kárt is okozhat, mert adminisztrátori jogokkal hozzáférése lesz a teljes fájlrendszerhez, és bármit elindíthat a szerveren. Ezt az xp_cmdshell kiterjesztett tárolt eljárás segítségével teheti meg, amellyel parancsokat futtathat.
Indirekt támadás
A közvetlen támadás nem mindig a legjobb módszer, hiszen ha egy rendszergazdai jelszó eléggé jó, akkor nagyon hosszú ideig tarthat feltörni, vagyis értelmét veszti a próbálkozás. Az SQL szerverek ezen felül tűzfal mögött is elhelyezkedhetnek, ami ismételten megnehezíti a közvetlen támadást.
Indirekt támadást egy olyan program képes végrehajtani, amely az SQL szerverrel (adatbázissal) kommunikál. Ez lehet kereső motor, hitelesítési form, vagy e-mail cím összesítő program. Ebben az esetben gyakran a hibát nem az SQL szerverben keresi a hacker, hanem a közvetítő programban. Ettől lesz indirekt a támadás.
Vegyünk egy egyszerű példát. Keresés futtatásakor, egy megadott kereső kulcsot használunk, amelyet ha beillesztünk az SQL lekérdezésbe, akkor bújtatott módon más parancsot is futtatni lehet, mivel ha egy ";" karaktert is megadunk, akkor ezzel lezártuk a parancsot, és egy újabb parancsot is megadhatunk, ami már bármi lehet: tárolt eljárás futatása, vagy adattábla törlése.
Védelem
Most, hogy megismerkedtünk a módszerekkel, tekintsük át, hogy hogyan lehet védekezni a támadások ellen.
Első dolog, amit be kell tartanunk, hogy erős jelszót alkalmazzunk a DBA azonosítóhoz. A DBA létrehozhat más azonosítókat, és azokat hozzárendelheti megadott műveletekhez vagy adatbázisokhoz. Így nem kell, hogy mindenki adminisztrátori jogokat kapjon a master adatbázisra, amellyel xp_cmdshell parancsokat futtathat.
Az alábbi karaktereket érdemes kiszűrni, mert ezek mind szükségesek az SQL indirekt támadáskor:
" , / \ * & ( ) $ % ^ @ ~ ´ ?
Érdemes a veszélyt jelentő karaktereket lecserélni más kevésbé káros karakterre.
username = replace (username, ', '')
username = replace (username, ";", "")
Ezek a parancsok eltávolítják az aposztrófokat és a pontosvesszőket, így a támadó lekérdezése hatástalan lesz, és valószínűleg szintaktikai hibával áll le.
Végül néhány változtatás elvégezhető a registry-ben, amely meggátolhatja a kiterjesztett tárolt eljárások futtatását.
Használjuk a regedit-et, hogy az alábbi értéket átállítsuk 1-re.
HKEY_LOCAL_MACHINES\Software\Microsoft\Microsoft SQL Server\ <Instance Name>\Providers\DisallowAdhocAccess
Vagy ha alapértelmezett példányt használunk,
HKEY_LOCAL_MACHINES\Software\Microsoft\MSSQLServer\[ccc] MSSQL\DisAllowAdhocAccess 
akkor ez tiltja az adhoc OLE DB lekérdezéseket az SQL szerveren.