Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: LINUX - tworzenie konta uzytkownika z poziomu PHP
Forum PHP.pl > Forum > PHP
grohu
czy mozna utworzyc konto uzytkownika z poziomu php questionmark.gif?

polecenia linuxowe mozna wywolywac przez funkcje system().

polecenia typu system("ls /home") dzialaja prawidlo,
jednak system("adduser nowy_uzytkownik") nie dziala jak
powinno.
na pewno chodzi o uprawnienia do tworzenia nowych kont.

czy istnieje jakis inny sposob zeby przez skrypt php
utworzyc konto uzytkownika pod linuxem (bedac rootem)

questionmark.gif?
adwol
Cytat
czy istnieje jakis inny sposob zeby przez skrypt php
utworzyc konto uzytkownika pod linuxem (bedac rootem)

questionmark.gif?

Po pierwsze zobacz w shellu czy napewno uruchomienie polecenia adduser nowy_uzytkownik zadziała prawidłowo. Nie na każdym linuksie musi być akurat taka komenda i w takiej składni (mogą być np. wymaganae jakieś parametry).
Po drugie sprawdź z prawami jakiego użytkownika uruchamiane są skrypty php. Najczęściej serwer www nie jest uruchamiany z prawami roota. Wtedy musisz użyć jakiegoś wrappera, chociaż odradzałbym takie rozwiązanie na rzecz umieszczania przez php zleceń w bazie i asynchronicznego wykonywania ich przez jakiś skrypt.
grohu
adduser nazwa_uzytkownika dziala prawidlowo na moim linuxie.

ale nie mam pojecia o wrapperach,wiec jesli mozesz to napisz mi jak ty bys to rozwiazal...
g0blin
Innym rozwiazaniem jest to aby trzymac cala zawartosc o uzytkownikach systemu w bazie sql zamaist w pliku /etc/passwd. Widzialem gdzies jzu chwile temu opisy konfiguracji takiego systemu wiec musial bys sobie poszukac o tym na google
Koshin
jeszcze innym rozwiazaniem jest tworzenie pliku txt, w ktorym sa zawarte informacje o nowych kontach, a cron wykonuje polecenia zalozenia konta

skrypt php, pobiera dane, sprawdza bezpieczenstwo (konta juz istnieja, znaki w nazwie, itp, itd) tworzy plik txt i tyle.
adwol
Cytat
adduser nazwa_uzytkownika dziala prawidlowo na moim linuxie.

ale nie mam pojecia o wrapperach,wiec jesli mozesz to napisz mi jak ty bys to rozwiazal...

Ja bym założył bazę do której bym wrzucał w phpie żądania założenia konta, a w jakimś asynchornicznym skrypcie odpalanym np. z crona co minute wyciągał je i rezlizował. Format bazy mógłby być np. taki:
[sql:1:b7099ddeaf]create table users (nazwa char(20), haslo char(50), opis char(100))[/sql:1:b7099ddeaf]
Ten skrypt zakładający musiałby pracować z prawmi roota oczywiście.
grohu
z cronem to dobry pomysl.

dzieki !
grohu
ale jest jeszcze problem z haslem.

w takim skrypcie ktory odpala sie z crona byloby
na przyklad:

adduser nazwa_uzytkownika;
passwd nazwa_uzytkownika;
...

ale nie moge ustawic hasla.

echo "haslo"|passwd nazwa_uzytkownika;

nie dziala,haslo ma byc wpisywane z klawiatury wiec
jak to obejsc i zautomatyzowac dzialanie skryptu questionmark.gif?
adwol
Cytat
adduser nazwa_uzytkownika;
passwd nazwa_uzytkownika;
...

ale nie moge ustawic hasla.

echo "haslo"|passwd nazwa_uzytkownika;

Zgadza się. passwd zawsze pobiera hasło z terminala.
Cytat
nie dziala,haslo ma byc wpisywane z klawiatury wiec
jak to obejsc i zautomatyzowac dzialanie skryptu questionmark.gif?

Zainteresuj się programem chpasswd. Powinien być w jednej paczce z passwdem. On przyjmuje uzytkownika i hasło ze stdina.
grohu
chpasswd to dobry pomysl.

ale jest jeszcze taka sprawa ze:

po zapisaniu hasla do pliku ,z ktorego skrypt odpalany co godzine bedzie pobieral dane do zakladania nowego konta bedzie odkodowane.i kazdy bedzie mogl sobie przejrzec ten plik.

czy dalo by sie przed zapisaniem do pliku haslo kodowac ,a przez chmod zmieniac nowemu uzytkownikowi haslo podajac te juz zakodowane (z pliku).
to bylaby juz o wiele bezpieczniejsza wersja...
adwol
Cytat
chpasswd to dobry pomysl.

ale jest jeszcze taka sprawa ze:

po zapisaniu hasla do pliku ,z ktorego skrypt odpalany co godzine bedzie pobieral dane do zakladania nowego konta bedzie odkodowane.i kazdy bedzie mogl sobie przejrzec ten plik.

czy dalo by sie przed zapisaniem do pliku haslo kodowac ,a przez chmod zmieniac nowemu uzytkownikowi haslo podajac te juz zakodowane (z pliku).
to bylaby juz o wiele bezpieczniejsza wersja...

A musisz to robić na plikach? W bazie byłoby to o wiele prostsze. Zakładasz dwóch użytkowników, jeden ma prawo tylko do wkładania danych do bazy (bez możliwości wyciągania i kasowania) i jego używa skrypt php, a drugi ma prawo do wyciągania i kasowania (ew. zmieniania) i jego używa skrypt z crona.
Jeśli chcesz koniecznie robić to na plikach (co odradzam) to możesz zapisywać od razu zaszyfrowane crypt()'em hasła bo chpasswd potrafi je przyjąć w takiej postaci.
grohu
taka komenta dziala poprawnie i zmienia haslo,dla podanego
uzytkownika.

echo "nazwa_uzytkownika:nowe_haslo"|chpasswd

wedlug manuala zeby podac zakodowane haslo nalezaloby wykonac
operacje:

echo "nazwa_uzytkownika:zakodowane_haslo"|chpasswd -e


zakodowane haslo w systemie wyglada taK:

$1$Jd6.FfMf$.aB8Ge.8RpQBu3DNGTI9I0 ,wiec sa to chasla zakodowne
w trybie MD5.

php: funkcja crypt() koduje hasla i tez w tym trybie,wiec to jest
ok,ale po wykonaniu

echo "nazwa_uzytkownika:zakodowane_haslo"|chpasswd -e

haslo sie nie zgadza,a jak sprawdzam w pliku shadow to po
uzyciu chpasswd -e jest szyfrowane jeszcze raz.

i tu juz sie dzieja krzaki.

co z tym kodowaniem zrobic questionmark.gif?




ps. w jakim jezyku z poziomu skryptow w shellu moglbym korzystac zeby obslugiwac baze mySQL questionmark.gif?
uboottd
$1$Jd6.FfMf$.aB8Ge.8RpQBu3DNGTI9I0 dla shela nie oznacza $1$Jd6.FfMf$.aB8Ge.8RpQBu3DNGTI9I0 tylko ciag zmiennych. musisz zaescapowac wszystkie znaki specjalne.
kris_
Cytat
echo "nazwa_uzytkownika:nowe_haslo"|chpasswd

Wszystko pieknie ale to oznacza ze:
- masz suida na chpasswd
- kazdy uzytkownik systemu moze odpalic suidowane pliki
To naprawde dosyc powazne zagrozenie dla bezpieczenstwa systemu.
Wystarczy jakis bug w twoim skrypcie php, apachu albo chpasswd aby narobic strasznej kaszany w systemie lub zdobyc uprawnienia root'a.
Aby to mialo rece i nogi zrobil bym miedzy php a chpasswd jakiegos wrappera ktory mial by suida na jakiegos uzytkownika i dopiero ten uzytkownik moglby odpalac chpasswd z suidem jako jedyny w systemie.
Skompilowal bym tez skrypt php aby utrudnic analize kodu osobie ktorej udalo by sie wylistowac zawartosc twoich skryptow php byc chociaz troche utrudnic jej wlamanie.
Koshin
adduser wymaga z klawiatury, ale useradd juz chyba nie?

ja wiem ze na swoim systemie mialem to zrobione tak, ze calosc robilo sie z lini polecen. i nie trzeba bylo hasla wpisywac z konsoli (terminala)

dodatkowo mozna rowniez haslo i dane usera zapisac w bazie, co jest dobre, gdy chcesz mu pomoc w odzyskaniu zapomnianego hasla (ale to sie wiaze dodatkowo z lepszymi zabezpieczeniami, aby nikt niepowolany nie "przypomnial" sobie obcego hasla.
adwol
Cytat
Wszystko pieknie ale to oznacza ze:
- masz suida na chpasswd
- kazdy uzytkownik systemu moze odpalic suidowane pliki
To naprawde dosyc powazne zagrozenie dla bezpieczenstwa systemu.

Wcale tego nie oznacza. Właśnie o tym była mowa, że chpasswd jest uruchamiany ze skryptu puszczanego z rootowego crona, który czyta zlecenia z bazy. Skrypt w php wszada do tej bazy tylko zlecenia. Nikt tu nie mówi o odpalaniu chpasswda bezpośrdenio z phpa, a tym bardziej o zakładaniu na nim suida.
grohu
oka, to jest dobry pomysl.

tylko w jakim jezyku napisac skrypt shellowy,ktory te dane z bazy pobierze.
jak dotad mySQL uzywalem tylko z php...
wiem ze C ma takie mozliwosci,ale czy jakis inny jezyk tez questionmark.gif?

a jesli tak to czy ktos wie gdzie w necie jest opis obslugi mySQL przez ten jezyk/jezyki ...

?
adwol
Cytat
tylko w jakim jezyku napisac skrypt shellowy,

Skrypt shellowy to chyba w shellu, nie? winksmiley.jpg winksmiley.jpg
Cytat
jak dotad mySQL uzywalem tylko z php...
wiem ze C ma takie mozliwosci,ale czy jakis inny jezyk tez questionmark.gif?

a jesli tak to czy ktos wie gdzie w necie jest opis obslugi mySQL przez ten jezyk/jezyki ...

Ale możesz go napisać w phpie. Generalnie lepiej napisać w języku który się zna nawet jeśli będzie to skrypt niż w C, którego się nie zna, bo można tylko głupich błędów narobić. Zrób go jako normalny skrypt phpowy tylko uruchamiany z interpretera w postaci binarki a nie z modułu w serwerze www.
grohu
faktycznie ,uzycie php w skrypcie shellowym to dobry pomysl.

niestety mam jakiegos wybrakowanek linuksa (mandrake 9.1) ,bo jak wpisuje 'php' to wyskakuje ze zle polecenie...
i w ogole po insalacji linuksa nie moglem sie laczyc z mysql'em ani uzywac funckji do obslugi pop3 bo nie bylo pliku php.ini ,musialem go sobie sam recznie przekopiowac i skonfigurowac.

musze skompilowac sobie od nowa php questionmark.gif?

jak tak to czeka tez to mnie na serwerze ktory bede robil, bo na nim tez nie mozna uzywac 'php' .

prosze o jakies rady co do tego bo pomysl uzywania php do pisania skryptow w shellu jest dobry i...jakos mi to wczesniej do glowy nie przyszlo sad.gif
grohu
POWYZSZE PYTANIE JEST JUZ NIEAKTUALNE,ale nie caly temat...

sciagnelem sobie php-4.3.3 ,bisona,flexa i zainstalowalo sie bez wiekszych problemow.

skrypty mozna juz odpalac z powloki.
kris_
Pomysl z odpalaniem skryptu z crona rzeczywiscie jest jakims wyjsciem ale jest to dosc prynitywne. Po 1 to co ile minut bedziesz odpalal ten skrypt? zeby bylo online musisz co minute a jakie wtedy bedzie obciazenie? Jak sprawdzisz czy poprzednio podane haslo jest prawidlowe?
A odpalenie skryptu co 10 minut zeby nie obciazac servera moze spowodowac panike wsrod uzytkownikow ze zadne haslo im juz nie dziala. To by bylo tzw: Security by obscurity. Widzialem takie systemy gdzie wszystkie hasla co 5 minut generowaly sie z mysqla do /etc/passwd i /etc/shadow , to narazie jedyny sposob jaki mi przychodzi zeby sprawdzic prawidlowosc poprzedniego hasla, ale nie musze mowic jakie to generuje obciazenie servera i jak latwo ukrasc wszystkie hasla uzytkownikow przy najkmniejszym bledzie w programoie czy konfiguracji.

Pozdrawiam

Kris
adwol
Cytat
Po 1 to co ile minut bedziesz odpalal ten skrypt?

Np. co minute.
Cytat
zeby bylo online musisz co minute a jakie wtedy bedzie obciazenie?

Niewielkie. Ile zajmuje połączenie się z bazą, wydanie jednego prostego zapytania, ew. ustawienie kilku haseł? (Nie wierzę żeby w ciągu minuty nagle chciało zmieniać hasło aż tyle osóB).
Cytat
Jak sprawdzisz czy poprzednio podane haslo jest prawidlowe?

Użytkownik musi podać stare i nowe hasło. Mogą być oba wrzucane do bazy i skrypt z crona sprawdza czy jest poprawne lub lepiej może robić to sam skrypt w phpie i odrzucać próby zmiany hasła gdy obecne hasło jest błędne.
Cytat
A odpalenie skryptu co 10 minut zeby nie obciazac servera moze spowodowac panike wsrod uzytkownikow ze zadne haslo im juz nie dziala. To by bylo tzw: Security by obscurity.

Dlaczego niby panikę? Zawsze któreś działa. Jeśli nie nowe to jeszcze stare.
Poza tym nie widzę tu security by obscurity. Wiesz co to pojęcie oznacza? Zabezpieczanie czegoś przez ukrycie lub zagmatwanie mechanizmu działania a tym samym i ew. błędów. Całość bazuje na tym, że atakujący nie wie jak zaatakować bo nie zna zasad jakie obowiązują. Klasyczny przykład SbO to umieszczanie klucza do drzwi pod wycieraczką.
Cytat
Widzialem takie systemy gdzie wszystkie hasla co 5 minut generowaly sie z mysqla do /etc/passwd i /etc/shadow

Generowanie co najwyżej kilku haseł co minutę obciąża system, ale już generowanie całej bazy co 5 minut tego nie robi, tak?
Cytat
latwo ukrasc wszystkie hasla uzytkownikow przy najkmniejszym bledzie w programoie czy konfiguracji

Takie niebezpieczeństwo istnieje zawsze jeśli nie ma odpowiednich zabezpieczeń lub jeśli się popełni błąd. A jeśli chodzi o ścisłość to Twoje rozwiązanie pod tym względem akurat jest gorsze bo zawsze trzymasz wszystkie hasła w bazie, więc ewentualne włamanie do niej powoduje ich utrate. Moje natomiast trzyma hasła tylko na chwile (do minuty) i tylko te które są zmieniane. Później są usuwane i w stanie ustalonym baza jest pusta.
N1c0N
Cytat
Najczęściej serwer www nie jest uruchamiany z prawami roota.


serwery, np. apache przewaznie sa na prawach nobody.
kris_
Cytat
Cytat
Jak sprawdzisz czy poprzednio podane haslo jest prawidlowe?

Użytkownik musi podać stare i nowe hasło. Mogą być oba wrzucane do bazy i skrypt z crona sprawdza czy jest poprawne lub lepiej może robić to sam skrypt w phpie i odrzucać próby zmiany hasła gdy obecne hasło jest błędne..

No ale wtedy uzytkownik nie dowie sie czy udalo mu sie zmienic haslo czy nie!. A jezeli zrobi to obecny skrypt w phpie to bedzie mial dostep z dodatkowymiuprawnieniemi do pliku shadow lub trzymal kopie zakryptowanych hasel w bazie. Oba rozwiazania sa beznadziejne z punktu widzenia bezpieczenstwa!

Cytat
Cytat
A odpalenie skryptu co 10 minut zeby nie obciazac servera moze spowodowac panike wsrod uzytkownikow ze zadne haslo im juz nie dziala. To by bylo tzw: Security by obscurity.

Dlaczego niby panikę? Zawsze któreś działa. Jeśli nie nowe to jeszcze stare..

Ty chyba nigdy w providerni nie pracowales.

Cytat
Widzialem takie systemy gdzie wszystkie hasla co 5 minut generowaly sie z mysqla do /etc/passwd i /etc/shadow

>Generowanie co najwyżej kilku haseł co minutę obciąża system, ale już >generowanie całej bazy co 5 minut tego nie robi, tak?
hmm obciaza system w 5x mniejszym stopniu

Cytat
Cytat
latwo ukrasc wszystkie hasla uzytkownikow przy najkmniejszym bledzie w programoie czy konfiguracji

Takie niebezpieczeństwo istnieje zawsze jeśli nie ma odpowiednich zabezpieczeń lub jeśli się popełni błąd. A jeśli chodzi o ścisłość to Twoje rozwiązanie pod tym względem akurat jest gorsze bo zawsze trzymasz wszystkie hasła w bazie, więc ewentualne włamanie do niej powoduje ich utrate. Moje natomiast trzyma hasła tylko na chwile (do minuty) i tylko te które są zmieniane. Później są usuwane i w stanie ustalonym baza jest pusta.

Npisales ze bedziesz autoryzowal stare haslo w takim razie jak to zrobisz przy takim ukladzie?
adwol
Cytat
No ale wtedy uzytkownik nie dowie sie czy udalo mu sie zmienic haslo czy nie!.

Można to z dużym prawdopodobieństwem przewidzieć. Generalnie może się to nie powieść z kilku powodów:
:arrow: podane bieżące hasło jest nieprawidłowe
:arrow: podane nowe hasło jest niepoprawne ze względów formalnych (np. za krótkie)
:arrow: brak użytkownika, któremu chcemy zmienić hasło
:arrow: użytkownik, któremu chcemy zmienic hasło jest zablokowany lub nie ma prawa zmiany hasła
:arrow: wysypała się procedura zmiany hasła
Pierwsze 4 można wykryć już na etapie interakcji z uzytkownikiem w skrypcie phpowym. Ostatni, z mojego doświadczenia, występuje tak rzadko, że można w tym przypadku powiadomić o tym administratora, aby rozwiązał problem ręcznie. Jak nie zadziała poprawnie napisany program do zmiany haseł to problem prawdopodobnie jest na tyle złożony (np. pad systemu lub dysku), że niepowiadomienie użytkownika jest błahostką.
Cytat
Ty chyba nigdy w providerni nie pracowales.

I akurat tu się pomyliłeś winksmiley.jpg. Owszem, pracuje od ładnych paru lat, mam na kilku maszynach tego typu rozwiązania do zmiany haseł i jeszcze nigdy nikt mi się nie skarżył (a używane jest to 3-4 razy dziennie), że zmienił sobie hasło przez www i mu nie działa (w przeciwieństwie do nagminnych przypadków gdy któś zgłasza, że nie może odebrać poczty i sie okazuje, że outlook jakoś magicznie ,,zgubił'' hasło, padł windows itp.).
Cytat
hmm obciaza system w 5x mniejszym stopniu

Chyba żartujesz! Wiesz, mam jedną maszynę na której jest ok. 7000 użytkowników. Nadal uważasz, że przenoszenie 7000 haseł _zawsze_ co 5 minut robi 5 razy mniejsze obciążenie niż raz na jakiś czas przeniesienie kilku?
Cytat
Npisales ze bedziesz autoryzowal stare haslo w takim razie jak to zrobisz przy takim ukladzie?

W skrypcie php. Od prymitywnego łączenie się po loopbacku do serwera POP3 i próby autentykacji, przez PAM, aż po autorskie programy przyjmujące na wejściu użytkownika i hasło i zwracające dwie wartości: haslo dobre, hasło złe.
kris_
ad1: nadal twierdze ze bez odpowiednich uprawnien tego nie zrobisz
ad2: generalnie po prostu jak cos sie robi to musi dzialac niezawodnie w 100% i nie mozna isc na zadne kompromisy jezeli idzie o stabilnosc i uzytecznosc. A jezeli masz stycznosc z klientami i nie zatruli tobie zycia mimo ze piszesz soft ktory powoduje irracjonalne dla nich zachowanie aplikacji to masz duzo szczescia;0
ad3: ja zupelnie nie chwale rozwiazan generujacych pliki passwd z bazy co x minut stwierdzilem tylko fakt, sam wczesniej proponowales robienie tego co minute!
ad4: z tego co slyszalem pop3auth mial kiedys dziure i wogole podejrzany kod zrodlowy, a wlasnie rozwiazania to wlasnie to do czego caly czas zmierzam, ale bez zadnych cronow i innych dziwactw tylko z prawidlowo dzialajacym wrapperem uprawnien
Jabol
//PREEDIT
DAMN, chyba przeczytalem tylko pierwsza strona i nie zauwazylem, ze pytanie jest jusz out of date
//


sprawdz sobie co musisz wpisac jak dodajesz z konsoli, a potem jak juz znajdziesz wszystkie znaki jakie wklepujesz z klawiatury tworzysz taki plik ( o takie strukturze, czyli np. )
Kod
jabol

password

/home/jabol

/bin/false

Jabol;-)
nia zapominaj o enterach (plik jest calkowicie z glowy, tylko dla uswiadomienia jak to ma wygladac, a potem dajesz taki korzik php.[php:1:8099053ba9]<?php
$fpfopen( "/tmp/file", "w" );
fputs( $fd, "jabol
ble
ble
"); // nie zapominaj o ostatnim enterze
fclose( $fd );
print ( $result=`useradd < /tmp/file` );
unlink( "/tmp/file" );
?>[/php:1:8099053ba9]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.