[PHP] shell_exec als root

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • hell4you
  • Registratie: Mei 2006
  • Laatst online: 19:28
Ik wil graag een (simpele) PHP webinterface schrijven om bepaalde root commando's in een gecontroleerde omgeving uit te voeren. Daarbij zorg ik zelf voor de adequate beveiliging op de webserver. In dit geval gaat het om de 'xm' commando's van de Xen hypervisor, maar ik heb meer toepassingen waarvoor ik dit wil gebruiken.

Nu heb ik zelf al een aantal dingen gevonden, waaronder natuurlijk sudo. Op zich werkt dit wel, maar het liefst heb ik dat het root wachtwoord nergens plaintext moet komen te staan. Ook het toestaan van een reeks commando's in sudoers is niet bepaald generiek. De bedoeling is dat de user op de webinterface inlogt met het root wachtwoord. Zo kan ik eventueel het wachtwoord encrypted opslaan in een session var en de key in een cookie aan de user geven.

Sommige websites hebben het over het zelf implementeren van (of het gebruiken van een library voor) het ssh protocol en daarmee een connectie naar localhost te maken. Eerlijk gezegd vind ik dit niet echt een oplossing maar een workaround.

Wat is in dit geval 'best practice'? :)

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 17:12

AW_Bos

Liefhebber van nostalgie... 🕰️

De opdrachten in een que zetten en met cron laten uitlezen? Dan zit je wel met een vertraging van hoogstens max. een minuut, maar op deze manier werken vele controlpanels ook, zoals DirectAdmin.

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • hell4you
  • Registratie: Mei 2006
  • Laatst online: 19:28
Bedankt voor je suggestie. Toch zie ik nog 2 grote nadelen:

- Je kunt niet direct feedback geven op de actie .. dus stel je wil een vm starten, dan moet je wachten tot de cron wordt uitgevoerd.
- In die cronjob kan alsnog elk willekeurig commando komen te staan. Veilig is anders.

Ik ben meer op zoek naar een soortgelijk 'runas' commando wat we in windows kennen. Sudo is niet gebouwd voor deze toepassing helaas (zo ver ik weet).

Draaien die soortgelijke admin panels (denk aan ipfire, open-e, vmware, webmin, enz..) dan allemaal onder user root of een user die alle benodigde rechten heeft? Je kunt natuurlijk altijd een C++ binary schrijven die luistert op een socket en fungeert als soort van proxy voor de commando's, maar hoe ver moeten we gaan is de vraag ;)

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
hell4you schreef op zaterdag 28 april 2012 @ 01:21:
Je kunt natuurlijk altijd een C++ binary schrijven die luistert op een socket en fungeert als soort van proxy voor de commando's, maar hoe ver moeten we gaan is de vraag ;)
En dat zou in C++ moeten omdat... :?
Het idee om die commando's te delegeren naar een "trusted service" is helemaal zo gek niet.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Met sudo werken is wel degelijk het makkelijkst en het best te beheren. Zeker als je alles via een of enkele shell scripts laat lopen. Alternatief is zelf een binary maken en die setuid root maken.

Inloggen op een webinterface met het root commando is lomp. Waarom zou je een gebruiker potentieel alle rechten geven als je exact weet welke commando's de gebruiker moet kunnen uitvoeren?

Acties:
  • 0 Henk 'm!

  • hell4you
  • Registratie: Mei 2006
  • Laatst online: 19:28
RobIII schreef op zaterdag 28 april 2012 @ 01:28:
En dat zou in C++ moeten omdat... :?
Het idee om die commando's te delegeren naar een "trusted service" is helemaal zo gek niet.
Nja, dat was bij wijze van spreken. Ik ben op zoek naar de 'best practice' manier en wellicht is dat inderdaad die binary.

Kent iemand toevallig een (bij voorkeur open source) voorbeeldapplicatie die het op deze manier heeft opgelost?
Verwijderd schreef op zaterdag 28 april 2012 @ 01:37:
Met sudo werken is wel degelijk het makkelijkst en het best te beheren. Zeker als je alles via een of enkele shell scripts laat lopen. Alternatief is zelf een binary maken en die setuid root maken.

Inloggen op een webinterface met het root commando is lomp. Waarom zou je een gebruiker potentieel alle rechten geven als je exact weet welke commando's de gebruiker moet kunnen uitvoeren?
Ok, mee eens. Wellicht is het root wachtwoord opgeven niet zo'n goed idee. Maar daarnaast is sudo soms gewoon niet toereikend genoeg. Als je bijvoorbeeld maar enkele parameters van het commando 'xm' toe wilt staan kun je voor elke variant een script gaan schrijven. Het geheel moet niet overbodig moeilijk worden.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:08
Het lijkt mij verre van wenselijk om root access aan te bieden via een webinterface, maar als het echt moet en je zoekt een best practice, dan ben ik het met Cheatah eens: maak een niet-geprivilegeere gebruiker met een apart wachtwoord, en gebruik sudo voor het (beperkt!) uitvoeren van commando's met root-privileges.

Sudo is niet perfect en ook niet zonder potentiële beveiligingsproblemen, maar het is in ieder geval een bekende tool. Waarschijnlijk is die veiliger dan een eigengemaakte tool. (Scheelt ook een hoop extra werk.)

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 18:36

Ventieldopje

I'm not your pal, mate!

Een kleine hint hoor ... sudoers.conf met NOPASSWD ;) Als je zegt dat sudo nu prima werkt gaat dit je een eind op weg helpen ;)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Alternatieve ideeën: schrijf een kleine daemon die als root draait en dus die commando's uit kan voeren, en praat daar tegenaan vanuit je php script. Let hierbij op dat de commando's voorgedefinieerd zijn en dat je argumenten direct meegeeft zonder dat er een shell tussen zit.

Of, maak voor elke actie die je wilt uitvoeren een los script en laat dat met setuid root draaien.

Het eerste heeft wat mij betreft de voorkeur trouwens qua beveiligingsrisico's, maar het tweede is simpeler te implementeren als de beveiliging minder belangrijk voor je is.

[ Voor 13% gewijzigd door CyBeR op 28-04-2012 03:04 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • hell4you
  • Registratie: Mei 2006
  • Laatst online: 19:28
Ik denk dat ik voor het schrijven van een deamon ga. Dit heeft als voordeel dat ik met de 'client' niet gebonden ben aan localhost én ik kan de security in de deamon regelen. Het is misschien wat meer werk, maar dat is het wel waard. Bedankt. :)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:08
CyBeR schreef op zaterdag 28 april 2012 @ 03:03:
Alternatieve ideeën: schrijf een kleine daemon die als root draait en dus die commando's uit kan voeren, en praat daar tegenaan vanuit je php script. Let hierbij op dat de commando's voorgedefinieerd zijn en dat je argumenten direct meegeeft zonder dat er een shell tussen zit.
Dit stelde de TS zelf ook al voor hè. ;) De vraag was of dat een zinnige aanpak is (naar mijn idee niet echt; naar jouw idee vermoedelijk wel, aangezien je het ook voorstelt).
Of, maak voor elke actie die je wilt uitvoeren een los script en laat dat met setuid root draaien.
Scripts kunnen niet setuid root. Dan heb je een binary wrapper nodig om ze uit te voeren. En dan heb je feitelijk een halfbakken versie van sudo gemaakt!

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Soultaker schreef op zaterdag 28 april 2012 @ 20:05:
[...]

Dit stelde de TS zelf ook al voor hè. ;) De vraag was of dat een zinnige aanpak is (naar mijn idee niet echt; naar jouw idee vermoedelijk wel, aangezien je het ook voorstelt).
TS stelt zelf voor te ssh'en naar localhost vanuit z'n php script. Dus: ssh root@localhost en voer wat commando's uit. Dat lijkt me geen goed idee. Mijn idee is een hele simpele losse daemon die alleen een paar hele specifieke commando's in implementeert.
Scripts kunnen niet setuid root. Dan heb je een binary wrapper nodig om ze uit te voeren. En dan heb je feitelijk een halfbakken versie van sudo gemaakt!
Je hebt gelijk. Ik vermijd altijd het maken van setuid spul :P

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:08
For the record, ik refereerde hieraan:
hell4you schreef op zaterdag 28 april 2012 @ 01:21:
Je kunt natuurlijk altijd een C++ binary schrijven die luistert op een socket en fungeert als soort van proxy voor de commando's, maar hoe ver moeten we gaan is de vraag ;)

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Crap. Ik heb hier duidelijk niet opgelet :P

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Zie ook supervisord en gearman dan hoef je niet zelf te klooien met pcntl_* en je kan gemakkelijk "functies" op afstand aanroepen.

Acties:
  • 0 Henk 'm!

  • hell4you
  • Registratie: Mei 2006
  • Laatst online: 19:28
Wow, dat ziet er goed uit ReenL. _/-\o_
Daar ga ik eerst even mee spelen. Als je maar weet waar je op moet zoeken toch. ;)
Pagina: 1