PHP SSH2 biztonsági kérdés
Sziasztok!
Jó ideje foglalkozom webprogramozással, de tanácstalan vagyok egy PHP extension használatában ami a PHP-SSH2. Őszintén szólva nem örülök használatának, de sajnos jobb megoldást még nem találtam arra, hogy weben keresztül küldjek távoli szervergépre parancsot és az eredményt weben kitudjam íratni.
Próbálkoztam SSL-SOCKET programozással Perl-ben, de az sem bizonyult valami jónak mivel telneten crash-elni tudtam az egészet habár a szkript tökéletese működne ha ez a baki nem lenne. Megoldást ugyan nem találtam rá, de úgy érzem ez nem a tökéletes megoldás arra amit akarok.
Ha nem bánjátok lenne egy-két fontos kérdésem a PHP-SSH2 kapcsán.
- Mekkora biztonsági kockázat használata nagy látogatottságú rendszer esetén? Úgy hogy némely felhasználó használhatja is a PHP SSH2 Extension-t (természetesen az ő nevében root jogok nélkül és csak lekérdezésre, egyéni parancsot nem küldhet!).
- Előfordulhat, hogy a felhasználók egy időben többszörösen küldenek ki PHP SSH2-es utasítást. Ez nagyon megviseli a két szervert (local/remote) illetve nem lassul a le túlzottan a cucc? Az utasítás főként: felhaszn. létrehozás / törlés , szolg. letilt / felold, stb ...
A válaszokat előre is köszönöm.
Üdvözlettel,
Daniel
■ Jó ideje foglalkozom webprogramozással, de tanácstalan vagyok egy PHP extension használatában ami a PHP-SSH2. Őszintén szólva nem örülök használatának, de sajnos jobb megoldást még nem találtam arra, hogy weben keresztül küldjek távoli szervergépre parancsot és az eredményt weben kitudjam íratni.
Próbálkoztam SSL-SOCKET programozással Perl-ben, de az sem bizonyult valami jónak mivel telneten crash-elni tudtam az egészet habár a szkript tökéletese működne ha ez a baki nem lenne. Megoldást ugyan nem találtam rá, de úgy érzem ez nem a tökéletes megoldás arra amit akarok.
Ha nem bánjátok lenne egy-két fontos kérdésem a PHP-SSH2 kapcsán.
- Mekkora biztonsági kockázat használata nagy látogatottságú rendszer esetén? Úgy hogy némely felhasználó használhatja is a PHP SSH2 Extension-t (természetesen az ő nevében root jogok nélkül és csak lekérdezésre, egyéni parancsot nem küldhet!).
- Előfordulhat, hogy a felhasználók egy időben többszörösen küldenek ki PHP SSH2-es utasítást. Ez nagyon megviseli a két szervert (local/remote) illetve nem lassul a le túlzottan a cucc? Az utasítás főként: felhaszn. létrehozás / törlés , szolg. letilt / felold, stb ...
A válaszokat előre is köszönöm.
Üdvözlettel,
Daniel
Mi a feladat?
Egyébként ha jól nézem, az OpenSSL-hez van hozzáforgatva, szóval van esély rá, hogy normálisan működik.
Fájl műveletek, Szolgáltatás inditás / leállítás / újraindítás
De ahogy nézem tökéletesen teljesíteni tudja a kéréseket hiba nélkül, ami jó.
Nem biztonságos
A megoldás amit választottál elég messzemenő hiányosságoktól szenved. Az ilyen SSH-s, shell execes megoldásokban annyi a benézhető biztonsági hiba, hogy szinte kizárt, hogy jól meg tudd írni. Ahhoz, hogy jól megírd, ismerni kéne a rendszert, azt pedig az elmondottak alapján nem ismered, mert akkor nem ilyen megoldást választanál.
Feltételezve, hogy van egy rendszergazdád, ülj le vele beszélgetni. Nagyon jó megoldások vannak az ilyen feladatokra, nem kell újra feltalálni a kereket.
Hogy mondjak konkrétumot is, Linux alatt van a PAM nevű csoda, amihez van pl MySQL és LDAP modul is, tehát az egész felhasználói adatbázisod lakhat MySQL-ben. A fájl manipulációra meg lehet pl FTP-t használni. Ehhez mindössze egy olyan FTP daemont kell föltelepíteni a gépre, amin be tudsz menni mondjuk mester jelszóval, belső hálón. PHP-ban nagyon frankó FTP modul van ilyen feladatokra.
Egy szóval, amire van kész megoldás, arra lehetőleg használd azt, ha pedig feltétlenül parancs-végrehajtást akarsz, akkor írj egy API funkciókat biztosító szoftvert a távoli gépre, ami validálja, hogy a hozzá beérkezett kérés érvényes-e, nincs-e benne csúnyaság, stb.
Nem tudom eleget hangsúlyozni, a jelek szerint rendszer szolgáltatást építesz rendszer ismeret nélkül. Ülj le valakivel, aki ért hozzá és tanulj, tanulj, tanulj.
Valóban így van.
Köszönöm az információkat.
Kérdezz
Sajnos kicsit távol van.
Jó lesz ez!
Egy kis segítség azok számára, akik hasonló megoldást szeretnének:
Telepítés:
http://www.kevinbradwick.co.uk/2010/01/how-to-install-libssh2-on-a-centos-5-system/
Leírás:
http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/
Lib:
http://phpseclib.sourceforge.net/
Üdv,
Daniel
Howto
Igen, verziókkal lehet kőkeményen szívni is.
Jelenlegi megoldásom libssh esetén a telepítés módjának rögzítése kellemetlenebb nevén dokumentálása, valamint a beszerzési helyét még azért átnéztem: http://www.libssh2.org/download/
Köztünk szólva, hogy 1.2.7-es verzió a legújabb (2010-Aug-17) az szerintem nagyon jó. Tehát foglalkoznak a témával.
Ezen kívül apt-n is elérhető:
Daniel
Security
Van teszt környezet.
Olyan közepes config:
- 1 GB ram,
- AMD64 2,00 GHz proc,
- 80 GB HDD
De azokra a célra ami nekem kell, általában megfelel.
Visszagondolva a PHP SSH-ra van egy másik megoldás is:
Az pedig a PHP EXEC, ami egy belső szkriptet hív meg és onnan lép fel SSH-ra. Így viszont a LIBSSH2, PHP SSH2 csomagot el lehet felejteni, mivel nem kell már hozzá.
Például:
Mondjuk ez a megoldás lenne legjobb a számomra (biztonságilag is + csak ezt a kis szkriptet kellene updatelni és nem veszélyeztetné az egész webszervert + ha a process netán összeomolna -sosem lehet tudni- nem a webserver omlik össze), viszont ötletem sincs hogyan kéne megcsinálni (SSH-ra auto login? - talán egyéni kulcsfájl készítésével, de fontos lenne a felhasználó / jelszó páros módú autentikáció). A másik pedig az egyéb programozási nyelvek, mint: Perl, Python, C... ezek közül talán a Perl-t meg a Python-t értem a legjobban.
Perl-ben van a "Net::SSH::Perl" (http://www.stupidfool.org/perl/docs/perldoc/Net/SSH/Perl.html), viszont sok hibába ütköztem amikor megpróbáltam használni.
Pl: A kért parancsot kiküldte és tökéletesen meg érkezett választ. A második lekérésnél már összeomlott az egész Perl szkript.
Mutatom
Elárulom: szó nélkül le fogja törölni a merevlemezedet. Ha bármilyen szinten kompromittálódik a frontend, amin keresztül a parancsokat küldöd, megy a levesbe az egész gépparkod.
És nem ez az egyetlen probléma, van kismillió hibalehetőség, amit nem tudsz így lekezelni és ami miatt a rendszered kideríthetetlen fantomhibákat fog dobálni.
Röviden összefoglalva: rossz a koncepció. Felejtsd el az SSH-t, felejtsd el az execet, hacsak nem vágysz hosszú éjszakákon keresztüli debuggolásra és a biztonsági hibák miatti barebone recoveryra. Ismerd meg a téged kiszolgáló rendszereket és tanuld meg, hogyan lehet ezeket biztonságosan üzemeltetni!
Persze ez így van, viszont ...
Szóval a program valahogy így nézne ki:
1, amit weben exec-el elérek:
1. megvárja a választ és visszaküldi...
2. kiküldi a parancsot és nem várakozik...
A kérdés az, hogy hogyan tudjam lefuttatni a célgépen a parancsot weben keresztül?
Mi akadályozza meg?
Nem értem, miért kötöd az ebet a karóhoz az SSH-val, CSAK hátránya van. Ha ilyesmire használod, akkor a biztonsági hibák melegágya és túl sok hibalehetőség van benne ahhoz, hogy megbízhatóan lehessen használni.
Lenne más megoldás?
Természetesen filterezési folyamatokon átesik a cucc.
PAM
Ha esetleg szolgátlatást akarsz elindítani / leállítani, arra ott van a monit, aminek van egy XML-es vezérlő felülete.
Ha még valami másra vágysz, akkor KÉRDEZZ.
(A filterezést meg hagyjuk, az SSH-n keresztül küldött parancsok filterezése kb olyan rossz vicc, mint az, hogy valaki saját maga akar SQL escapelő függvényt írni a szerverhez adott helyett. Ha akarod, csinált, de a rendszer szinthez nagyon értők is be tudják nézni a végtelen számú lukat, nemhogy valaki, aki még csak most ismerkedik vele.)
Feltörni ezt azért nehéz volna szerintem.
Mivel javarészt csak számokkal kell dolgoznom az átvitel során, ezért ez nem hiszem hogy elsődleges támadási pont lenne. Az unix user neve és jelszava egy auto generált azonosító szám / jelszó.
Wow
Ha tényleg biztonságos rendszert akarsz, követned kell a layered defense elvét, mert ha még tökéletes kódot is írsz, simán találhatnak a kiszolgáló programokban (PHP, libssh) olyan sebezhetőséget, amivel megkerülhetik a védelmedet. Ezzel kapcsolatban ajánlom Tyrael előadását. (Sajnos nincs itt a link a slideokhoz, Tyrael, másold be légyszi.)
szerintem kicsit tulspirazod
irta a srac, hogy agent oldalon is van validacio, ennek ellenere en is javaslom, hogy megfelelo korultekintessel jarjon el a kod irasanal/tesztelesenel, de merlegre kell tenni, hogy mekkora az uzleti erteke annak, hogy lehessen tavolrol usert krealni a rendszerben, milyen megoldasok vannak a feladatra, melyiknek mekkora a befektetett munkaideje, illetve a biztonsagi kockazata, es ez alapjan el lehet donteni, hogy megvalosithato-e a feladat az elfogadhato biztonsagi kockazaton belul, illetve mely megoldast erdemes megvalositani.
szerintem.
amugy az eloadasom itt talalhato:
http://www.slideshare.net/Tyrael/biztonsgos-webalkalmazsok-fejlesztse
Tyrael
Nem azért, hogy védjem magam.
A téma lényegébe a LIBSSH2/PHP-SSH2 biztonsági réseinek kivesézésére szólt, de némileg megnyugodtam hogy az újabb változat már jelentősen fejlődött a 2008-as régebbi változatokhoz képest. (Szeretek biztosra menni
A védelemmel teljes mértékben tisztában vagyok, megjegyzem én sem örülök annak hogy SSH-zni kell. De ha egyszer a helyzet megköveteli?
Az Agent program megjegyzem most jár 2300 sornál és mivel úgy szól a fáma, hogy a saját programozó nem ellenőrizheti saját programját azért a vezetői rendszerprogramozónk nézte át a kódot és megfelelő biztonsági szintűnek találta (de mivel még eléggé durván dev release, ezért előfordulhatnak hibák).
Most a sorrend a következő: agent program beta release elérése, majd utána lesz értelme elkezdenem a webes parancsküldő szolgáltatást.
Felsorolok pár biztonsági réteget, hogy kicsit világosabb legyen a dolog:
1. Parancsvédelem - Remote host
Mivel a célgépen az ./Agent [...] programmal lehet összetett parancsot küldeni a szervernek, ezért a futási / olvasási jogot CSAK kizárólag arra jogosult felhasználók kapják meg (az agent által létrehozott user alapilag ezeket a filek-et nem tudják elérni)
2. Titkosítás
Az agent csak valid titkosított parancsokat fogad el, mint például: "S4da3FaGPY66S0J00kTCrKC29K7yus+/R79HiTi9PuM=". Ez egy parancsot tartalmaz, aki megfejti grat hozzá. :-)
3. Egyebek
Számtalan biztonsági pontot illetve réteget hoztunk még létre. Ha a legrosszabb eset bekövetkezik... a "box" szervert fel törik, akkor a főszerver adatbázisát is fel kell törniük plusz azt az algoritmust ami szerint az egész dolgozik (megjegyzem ezt megcsinálni gyakorlatilag nem lehetséges, még annak sem aki jól ismeri a rendszert és részt vett a programozásába).
Hát jó
Erre számtalan védelem van
SOAP
Nem jó út.
Viszont úgy néz ki, hogy egyenlőre a PHP SSH2 jelenleg bevált nekem és gyors is. Valakinek van-e negatívuma / pozitívuma a PHP SSH2 kapcsán?
Névfeloldás?
tehat ha jol ertem, akkor az
ahogy ti is irtatok, lehetne ssh-t hasznalni, viszont ebben az esetben javasolnam, hogy valami custom shell-t kapjon az a dedikalt user, akinek a neveben csatlakozik A gep a B gephez, igy viszonylag jol garantalni lehetne, hogy csak azt az N darab muveletet tudja elvegezni, amit szeretnel (viszont a unix useradd/del pont olyan muvelet, amihez kell root, ergo vagy root user neveben leptek be, vagy szukseg lesz valami sudo/suexec mokara a shell kapcsan)
ha a remote shell-t nem sikerulne beloni, akkor meg mindig meg lehetne azt csinalni, hogy mindket szerveren fut apache, es a publikus csak atdobja a kerest a hatterben a masiknak, aki localban vegrehajtja exec-cel, itt szinten kelleni fog sudo/suexec.
a harmadik megoldas idealis kornyezetben az lenne, hogy ha a geped valami kozponti user adatbazisbol dolgozik (kerberos, ldap, etc.), mert azt fel lehet ugy konfiguralni, hogy root jog nelkul lehessen usereket felvenni/torolni, persze megfelelo authentikacio mellett.
alapvetoen azt gondold vegig, hogy mi tortenik, ha kompromitalodik valamelyik gep.
akarhogyis, de ha valahogy ez megtortenik, akkor a tamado mar tovabb tud menni a rendszerben (akar a lokalis akar a tavoli kodfuttatason keresztul, vagy ha a useradatbazisba tud irni, azzal is felvehet egy felhasznalot, akivel be tud kivulrol lepni)
Tyrael
Luk luk hátán
Mint fentebb írtam, én MINDENKÉPPEN azt javaslom, hogy NE akarjon SSH-n keresztül csinálni SEMMIT. (Mi egy ilyennel majdnem megszívtuk, szerencsére volt egy pár védelmi réteg és mi vettük észre először, különben kényelmesen rootig lehetett volna verni az egyik gépünket.)
ha a hatterben futo barmi
sftp(scponly, rssh), vagy git(git shell, gitosis) is szepen elmukodik igy.
persze ha szar a kod, akkor ez sem biztonsagos, de akkor miert felteteleznenk, hogy az osszes tobbi app/service az?
Tyrael
SSH
az ssh szerintem elegge
persze ha nem frissitesz megfelelo tempoban, akkor ez problema lehet kesobbiekben, de ez mar egy masik kerdes.
az hogy ha chroot-olni akarod az ssh-t akkor nem teljesen trivialis a megoldasa, az megint csak lazan kapcsolodik a temahoz.
Tyrael
Libssh
Ez akkor most mi?
Ne vedd személyeskedésnek, csak ez itt egy nyílt beszélgetés és nyilván Te sem helyeznéd el szívesen a rendszered biztonsági algoritmusát / kódjait elemzésre. Persze jó volna, de sajnos sokan vannak akik szeretnek az ilyesmivel visszaélni (pl.: lenyúlni).
Maradjunk annyiban, hogy ez a biztonsági kérdés a részemről meg lett oldva.
Köszönöm a válaszokat és a rám szánt időt.
Üdv,
Daniel
-