[PHP] Domeinrechten instellen over share

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tead
  • Registratie: November 2001
  • Laatst online: 17-09 10:14
Ik ben een Web Applicatie aan het ontwikkelen. Hier kunnen o.a. nieuwe projecten worden aangevraagd. Als een nieuw project wordt aangevraagd dan wordt er op de File Server (dus niet de Web Server waar de Web Applicatie op draait) een map aangemaakt met daaronder een aantal sub mappen.

De web applicatie is toegankelijk voor anonieme gebruikers in IIS. Deze gebruikers zijn dan normaal gesproken bekend onder het lokaal account IUSR_%HOSTNAME%. In plaats van deze lokale standaard gebruiker te nemen heb ik een Domein gebruiker aangemaakt genaamd Webservice. Deze gebruiker heeft rechten op de share waar de mappen op aangemaakt moet worden. Het aanmaken van de mappen inc submappen is geen probleem en werkt goed.

Map Structure
Projects
+ Projectname one
+ + Audio
+ + Video
+ + Other
+ Projectname two
+ + Audio
+ + Video
+ + Other

Maar nu:
Op de mappen die aangemaakt zijn moeten een aantal rechten worden verleend aan de Domein groep "Users". In de root van de "Projectname" mogen geen nieuwe mappen worden aangemaakt door de groep "Users" en in alle submappen mogen de "Users" alles, dus mappen aanmaken, bestanden verwijderen, enz.

Nu heb ik een aantal methodes geprobeerd.
  1. chmod(), deze PHP functie werkt alleen onder linux. Op php.net kwam ik tegen je met 0777 en 0444 de read-only rights kon zetten. Dit werkt niet, waarschijnlijk ook dat het over een share gaat. Heb ik ook weinig aan omdat het over een domein groep gaat.

  2. Momenteel wordt er gebruik gemaakt van een VBA script dat de rechten goed zet. Dit script maakt een batch file aan en deze wordt uitgevoerd. Hier wordt gebruik gemaakt van xCmd.exe Dit is de inhoud de batch file die aangemaakt wordt:
    code:
    1
    
    C:\xcmd \\fileserver cscript.exe C:\xcacls.vbs D:\data\projects\%PROJECTNAME% /e /p \\fileserver\_localdomainusers:X


    Nu heb ik geprobeerd met de exec() functie in PHP xCmd aan de praat te krijgen. Als dit zou werken kan ik PHP een batch bestandje laten generen en deze direct uit te voeren op de File Server. Dit is niet gelukt. Wat ik ook probeer, ik krijg altijd "Connecting to remote service ... Failed". De syntax die ik gebruik is foutloos. Als ik de zelfde regel uitvoer in me CMD op de Web Server werkt het wel. :?

  3. Het VBA script vanaf de Web Server uitvoeren en in plaats lokale map de rechten van de share goed zetten. Dit is dus ook niet mogelijk. Het VBA script moet lokaal worden uitgevoerd. En omdat de mappen fysiek op de File Server staan moet het script op deze server uitgevoerd worden.

  4. Lokaal op de Web Server de mappen aanmaken die ik nodig heb en daarvan direct de rechten goed zetten. Deze kopiëren met PHP naar de share van de File Server. Bij deze methode verliezen de mappen alle rechten en krijgt deze de rechten van de parent map waar de files naar toe wordt gekopieerd.
Uitgebreid zoeken op internet leverde mij geen resultaten op. Het zou mooi zijn als hier iemand tegen het zelfde probleem is aangelopen en hopelijk heeft opgelost.

En nog even een plaatje voor de duidelijkheid:

Afbeeldingslocatie: http://www.lipplaa.net/images/FileRightsPHP.png

[ Voor 3% gewijzigd door Tead op 28-03-2007 11:36 ]


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Eventjes een klein vraagje (het zou problemen kunnen opleveren), escape je de backslashes wel?

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Tead
  • Registratie: November 2001
  • Laatst online: 17-09 10:14
Hiervan ben ik op de hoogte. Mijn stukje PHP ziet er zo uit

PHP:
1
2
3
4
5
6
7
8
9
10
$c_tmp = "C:\\xcmd \\\\fileserver cscript.exe C:\\xcacls.vbs D:\\data\\projects\\%PROJECTNAME% /e /p \\\\fileserver\\_localdomainusers:X";
exec($c_tmp, $output, $error);
$line_number = 1;
print("output:<br />");
foreach($output as $line){
    printf("%s: %s<br />", $line_number, $line);
    $line_number++;
}
print("<br /><br />");
print("error: $error<br />");

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Ik zie net dat ik over je foutmelding heen las, "Connecting to remote service ... Failed" betekend simpelweg dat je niet kan verbinden met de server, hoogst waarschijnlijk een rechtenprobleem als het wel werkt via de commandline.

Dat is dus waarschijnlijk de kant waar je het op moet zoeken, eventueel kan je met runas testen of het werkt.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Is het uberhaupt wel verstandig om de webserver rechten te geven op alle projectmappen? Het lijkt me eerder dat je een dergelijke gebruiker behoorlijk in wilt dammen. Nu geef je uitgebreide uitvoer rechten aan de webserver user. Ikzelf zou eerder op de fileserver iets neerzetten. Denk aan een webservice oid. De toegang hiertoe zou ik redelijk dichtzetten en alelen beschikbaar maken voor de webserver. In je php script roep je vervolgens deze webservice aan.

Op die manier hoef je je webserver user geen uitgebreide rechten op je fileserver te geven. Je wilt immers niet hebben dat door een klein foutje (of een hack) de projecten van je fileserver worden gewist.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Tead
  • Registratie: November 2001
  • Laatst online: 17-09 10:14
Runas is mogelijk. Alleen is het volgens mij niet mogelijk om meerdere commando's achter elkaar in 1 exec() te gooien. Bijvoorbeeld, er wordt gevraagd om password als je runas gebruikt. Deze kan naar mijn weten niet worden ingevuld met PHP.

De Webservice gebruiker heeft alleen rechten om te schrijven op deze share. Wijzigen en verwijderen van mappen/bestanden kan deze gebruiker niet. Dus alleen rechten om mappen(/bestanden) aan te maken. Dit leek mij redelijk veilig. Er draaid geen webservice op de File Server. Anders had ik daar waarschijnlijk wel exec() kunnen gebruiken zonder gebruik te maken van xCmd. Helaas is dit momenteel nog even geen optie.

De applicatie wordt ook alleen toegankelijk via intranet. En er moet wordt ingelogd (PHP sided) om gebruik te maken van deze applicatie. Ook alles wordt gelogd, ook als iemand (per ongeluk of niet) een pagina probeert te bezichtigen die niet toegankelijk is.

Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Alleen is het volgens mij niet mogelijk om meerdere commando's achter elkaar in 1 exec() te gooien. Bijvoorbeeld, er wordt gevraagd om password als je runas gebruikt. Deze kan naar mijn weten niet worden ingevuld met PHP.
Daar zou je toch een batchfile voor kunnen gebruiken ?

't is érg insecure, maar als ik 't me goed herinner kan je het password ook 'pipen' naar runas
pseudo: runas /env /user:User_met_Rechten commandline < type filemetpassword.txt
niet dus
[edit]
[google=pipe password to runas] geeft al een aantal opties :)

[ Voor 7% gewijzigd door TheRookie op 28-03-2007 13:30 ]


Acties:
  • 0 Henk 'm!

  • ilovetechno
  • Registratie: Oktober 2001
  • Laatst online: 17:06
TheRookie schreef op woensdag 28 maart 2007 @ 13:25:
[...]

Daar zou je toch een batchfile voor kunnen gebruiken ?

't is érg insecure, maar als ik 't me goed herinner kan je het password ook 'pipen' naar runas
pseudo: runas /env /user:User_met_Rechten commandline < type filemetpassword.txt
[edit]
[google=pipe password to runas] geeft al een aantal opties :)
Er bestond volgens mij een framework voor PHP om via LDAP als een bepaalde user in te loggen op het Windows platform. De naam ben ik kwijt..

Acties:
  • 0 Henk 'm!

Verwijderd

ten eerste zou ik je willen adviceeren om gewoon forward slashes(/) te gebruiken en niet tig ge-escapede backward slashes(\). php converteerd ze automatische en het maakt je code minder error-prone.

ik zou zeggen waarom probeer je het niet via FTP. lijkt me een stuk eenvoudiger dan ingewikkeld gaan doen met RunAS of LDAP etc.

verder denk ik dat dit topic eerder thuis hoort in SEA dan in PRG maar dat is niet aan mij om te beslissen. ik zou eerst eens proberen om de boel te vereenvoudigen want je trekt nou zoveel verschillende aspecten van gebruikers tot parent root permissie's erbij dat het enorm lastig wordt om te bepalen welke user er nou werkt en welke permissie's er nou gelden.

ik wil hier geen flamewar uitlokken maar onder linux zou je gewoon een nieuwe user maken, deze in een groep stoppen en de bijbehorende chmod uit voeren. probeer deze eenvoud ook op windows toe te passen want wat heeft een website nou te maken met LDAP/Active directory en domeinnen. en timmer astublieft de server goed dicht zodat wanneer 1 site valt niet je hele directory tree bloot ligt.

Acties:
  • 0 Henk 'm!

  • Tead
  • Registratie: November 2001
  • Laatst online: 17-09 10:14
Verwijderd schreef op woensdag 28 maart 2007 @ 14:42:
ten eerste zou ik je willen adviceeren om gewoon forward slashes(/) te gebruiken en niet tig ge-escapede backward slashes(\). php converteerd ze automatische en het maakt je code minder error-prone.
Ik maak graag onderscheid tussen \ (maps/paths) en / (flags). Het was netter geweest om iets van str_replace te gebruiken. Maar dit heeft niets met mijn vraag te maken.
ik zou zeggen waarom probeer je het niet via FTP. lijkt me een stuk eenvoudiger dan ingewikkeld gaan doen met RunAS of LDAP etc.
FTP zou ook een optie zijn. Maar volgens mij kan ik dan nog steeds niet domein rechten goed zetten op desbetreffende mappen.
verder denk ik dat dit topic eerder thuis hoort in SEA dan in PRG maar dat is niet aan mij om te beslissen.
Mijn vraag is niet hoe ik dit door middel van een script iets kan oplossen, want zoals ik al zei lukt het me wel in de commando promt, maar om een "nette" oplossing in PHP.
ik zou eerst eens proberen om de boel te vereenvoudigen want je trekt nou zoveel verschillende aspecten van gebruikers tot parent root permissie's erbij dat het enorm lastig wordt om te bepalen welke user er nou werkt en welke permissie's er nou gelden.
Ik heb het over 1 groep gehad en 1 gebruiker.
Dat is de Webservice gebruiker. Deze is bekend in het domein en heeft schrijf rechten op 1 share op de File Server.
En de groep Users die dus toegang moet krijgen op de gemaakte submappen.
ik wil hier geen flamewar uitlokken maar onder linux zou je gewoon een nieuwe user maken, deze in een groep stoppen en de bijbehorende chmod uit voeren. probeer deze eenvoud ook op windows toe te passen want wat heeft een website nou te maken met LDAP/Active directory en domeinnen. en timmer astublieft de server goed dicht zodat wanneer 1 site valt niet je hele directory tree bloot ligt.
Helaas maak ik niet gebruik van Linux. Ook ga ik niet adviseren om alle servers om te gooien naar Linux. Deze "eenvoud" gaat nu dus even niet op, dus kom ik het hier even vragen. Voor de rest is mijn vraag behoorlijk eenvoudig lijkt mij. Ik zal hem nog even herhalen:

"Hoe kan ik met PHP Domeinrechten instellen op een share?"

Verder heb ik het over de beveiliging van de server zelf weinig verteld en is ook niet relevant voor mijn vraag.

Acties:
  • 0 Henk 'm!

Verwijderd

Windows en PHP hebben zo hun tekort komingen in bepaalde situaties. onder linux zou chmod of chown volstaan maar dat kan inderdaad niet 1 op 1 worden gebruikt onder windows.

de makelijkste oplossing lijkt mij inderdaad via FTP omdat daarbij zoals ook in FTP specs staat het chmod en chown commando wordt vertaalt door de FTP server om te werken in de omgeving waarin de FTP server draait. de windows omgeving in jouw geval dus.

verder was de opmerking over de slashes serieus bedoeld. schrijf gewoon atlijd 'D:/webroot/website/' in plaats van "D:\\webroot\\website\\\". al snap ik niet wat je bedoeld met flags? ik had het over path's in het algemeen.

wat mij trouwens op een andere idee brengt. waarom probeer je het niet via een netwerk schijf. deze kun je aanmaken via de windows verkenner en die wijs je dan een drive letter toe. voor PHP is het dan alsof je de schijf uit je fileserver hebt gehaald en hem in je webserver hebt gestopt. mogelijk dat andere functie's zoals PHP's chmod en chown dan wel werken. staat onder Tools -> Map network drive. je hebt dan helemaal niet meer te maken met de enigzins brake share ondersteuning in PHP.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Tead schreef op woensdag 28 maart 2007 @ 12:54:
Runas is mogelijk. Alleen is het volgens mij niet mogelijk om meerdere commando's achter elkaar in 1 exec() te gooien. Bijvoorbeeld, er wordt gevraagd om password als je runas gebruikt. Deze kan naar mijn weten niet worden ingevuld met PHP.
Ik bedoelde om te testen of het wel werkt met de webgebruiker, runas vanuit php draaien is gevaarlijk (omdat je wachtwoord in het bestand moet staan) en onpraktisch.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Tead
  • Registratie: November 2001
  • Laatst online: 17-09 10:14
Goed, even voor de volledigheid van dit topic.

Het is gelukt, en wel op de volgende manier:

De XCACLS.vbs waar al gebruik van gemaakt werd kan ook over het netwerk werken. Dit VBA Script kan de ACL (Access Control List) aanpassen van files en directories. Door deze aan te roepen met cscript in de exec functie van PHP kan ik op een andere host deze rechten toekennen. De rede dat ik hier niet eerder naar gekeken heb is dat de IT afdeling riep dat ze zelf een script geschreven hadden zonder netwerk support. :(

Hier bij het commando:
code:
1
cscript C:\XCACLS.vbs \\fileserver\projects\%PROJECTNAME% /SERVER \\fileserver /USER domain\webservice /PASS ******** /s /t /e /p \\dc\_Users:X


Dit werkt helemaal. Alleen wacht exec() tot dat het script klaar is. Nu heb ik dit artikel al gevonden en wil binnen kort daar eens naar kijken.

In ieder geval bedankt voor jullie reacties. 8)
Pagina: 1