Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Linux Forum Linux-Web.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

CIU

Fortgeschrittener

  • »CIU« ist männlich
  • »CIU« ist der Autor dieses Themas

Beiträge: 540

Wohnort: Dresden

  • Nachricht senden

1

07.06.2006, 10:41

[gelöst] userscript zur überprüfung

hallo leute...
hab da jetzt ei script geschrieben welches mir benutzer (für ftp) anlegt.
dieses script wollte ich mal reinstellen und mal schauen ob jemand nen fehler sieht/findet oder ob jemand verbesserungen vorschlagen kann.

also dann mal los

über php/apache wird auf dem system eine datei erzeugt die in etwa so ausschaut

Quellcode

1
2
3
ftpuser1:123456
ftpuser2:234567
ftpuser3:345678


dann läuft das script als cronjob und fragt alle paar minuten die datei ab und legt die benutzer an.
ftp ist so eingerichtet das die angelegten benutzer auf ihr ~home beschränkt sind
so, jetzt das script

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
#set -x

n=1
while read line ; do
eval "line$n="$line""

USR=`echo $line | cut -d: -f1`
PAS=`echo $line | cut -d: -f2`

if [ "$USR" == "" ];

    then
    echo "kein username"

elif [ "$PAS" == "" ];

    then
    echo "kein passwort"

elif [ "$USR" == "`cat /etc/passwd | cut -d: -f1 | grep $USR`" ];

    then
    echo "benutzer vorhanden"

    else
    useradd -G ftpuser -m -d /home/ftp/$USR -s /bin/ftp $USR
    echo $USR:$PAS | chpasswd
    echo $USR:$PAS >>/home/andre/list_ftp

fi

n=`expr $n + 1`
done < /var/www/ftpuser

>/var/www/ftpuser


wäre dankbar wenn sich das mal einer anschauen kann

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CIU« (07.06.2006, 10:52)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

2

07.06.2006, 15:39

RE: userscript zur überprüfung

Zeile 4 was willst du damit erreichen?
ob der user existiert, würde ich mit id <USERNAME> testen (exit-status testen, meldungen nach devnull)
Zeile 36 ??? wozu ist das gut, nur um die datei zu leeren?
ein test des usernamen auf gültigkeit wäre sinnvoll (nur kleinbuchstaben+ziffern)
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

CIU

Fortgeschrittener

  • »CIU« ist männlich
  • »CIU« ist der Autor dieses Themas

Beiträge: 540

Wohnort: Dresden

  • Nachricht senden

3

07.06.2006, 16:43

ok, erst mal danke für die antwort

die prüfung des namens wegen der gültigkeit wird in der php datei bei der eingabe der daten gepüft. also dort abgefangen, genau so wie eigentlich die prüfung ob eines der beiden felder, sprich passwd und username.

ja, zeile 36 ist einach nur dazu da die datei zu leeren... =D, dachte mir das ich es mir so etwa übersichtlicher mache.
naja, schaden tut es ja nicht.

wo liegen die vorteile wenn ich id nutze statt meinem umständlichen string?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CIU« (07.06.2006, 16:44)


4

07.06.2006, 16:52

Zitat

Original von CIU
wo liegen die vorteile wenn ich id nutze statt meinem umständlichen string?


Weil Dein String umständlich ist? *SCNR*
Und weil Du das Ergebnis, das Du brauchst schneller mit id bekommst..
Just because an OS holds 90% of the market doesn`t mean it`s superior.
Remember 90% of all animals are insects.

Wer sucht der findet..

CIU

Fortgeschrittener

  • »CIU« ist männlich
  • »CIU« ist der Autor dieses Themas

Beiträge: 540

Wohnort: Dresden

  • Nachricht senden

5

07.06.2006, 16:58

ok, da schaue ich mir das mal mit id an...

bei zeile 4 stehe ich grad etwas auf dem schlauch... :?

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

6

08.06.2006, 15:16

ja, ok.
hier die antwort auf deine pn.
mit zeile 4 hab ich ein problem, denn durch die eval-anweisung werden in deinem script nacheinander die variablen line1, line2,.... erzeugt und der inhalt der gelesenen zeile darin abgelegt. diese variablen werden jedoch nirgends benutzt, also wozu das ganze.
wenn die variablen dennoch einen sinn haben, da sie eventuell weiter unten im evtl "unveröffentlichten" teil des scriptes verwenden werden, dann hätte ich ein array benutzt, das handling ist einfacher.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

CIU

Fortgeschrittener

  • »CIU« ist männlich
  • »CIU« ist der Autor dieses Themas

Beiträge: 540

Wohnort: Dresden

  • Nachricht senden

7

08.06.2006, 15:28

danke dir...
jetzt stehe ich nicht mehr so auf dem schlauch...

nee, die vier variablen brauche ich nicht... geht ja auch so.
hab die ratschläge mal versucht umzusetzen und das klappt wunderbar...

danke schön

aber an sich ists ok?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CIU« (08.06.2006, 15:31)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

8

08.06.2006, 16:23

ja, mal von dem generellen sicherheitsloch, das dadurch entsteht mal abgesehen.
wenn auf der datei mit der userliste das apache-userid recht liegt, könnte jemand anderes diese datei überschreiben, der ebenfalls php auf dem system ausführen darf (abhängig von der php/apache-konfiguration). damit könnte er im prinzip einen usernamen einschleusen, der optionen beinhaltet, denn das script führt ja keinen test mehr durch.
er könnte also zb den usernamen "-e root" eingeben. durch die parametersubstitution der shell würde der name dann zu root mit der vorangestellten option -e. id endet dann mit exit-status 1, da eine unerlaubte option angegeben wurde. das würde das script als nicht existenten user deuten und es ginge mit useradd weiter. useradd erzeugt mit option -e wahrscheinlich ebenfalls einen fehler. das echo in zeile 28 würde -e als option interpretieren und root:neuespasswd an chpasswd weitergeben, damit wäre das root-passwort geändert.
dann würde useradd zwar den user root nicht neu anlegen, aber chpasswd würde das passwort überschreiben und derjenige hätte root-zugang.
abhilfe
1. test von username und passwort in das script aufnehmen (ungültige zeichen mit tr löschen, zb. alle shell-sonderzeichen - . $ { } [ ] <space> <newline> etc.
2. variablen wie $USR immer mit "$USR" in kommandos einfügen (hilft auch nicht imer)
3. exitstatus von useradd abfragen und wenn der user nicht angelegt werden konnte, chpasswd nicht ausführen. der exit-status von useradd gibt detailiert auskunft)
4. auf ausgabelisten zb /home/andre/list_ftp würde ich ein chmod 600 und ein chown ausführen lassen, damit sie nicht zufällig other-readable sind und von allen gelesen werden können.

so, mehr paranoia fallen mir momentan nicht ein :)
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

CIU

Fortgeschrittener

  • »CIU« ist männlich
  • »CIU« ist der Autor dieses Themas

Beiträge: 540

Wohnort: Dresden

  • Nachricht senden

9

08.06.2006, 17:05

wow, das nenn ich mal ne antwort
danke für die ausführungen...
das hilft weiter und ich sehe das ich noch etwas mehr zu tun habe...

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

10

11.06.2006, 13:05

hallo,
vielleicht mal noch ein nachtrag.
es wäre uu sinnvoll, dein script etwas umzuschreiben und mit inetd als server zu betreiben. das hätte gewisse vorteile:
1. php nimmt über das loop kontakt mit dem inetd auf, der das script startet. die datenübertragung von php-script-> userscript erfolg über eine interne netzwerkverbindung. es wird kein file angelegt, dass unverschlüsselte zugangsdaten erhält auf das ein user eventuell lese- oder sogar schreibrechte hat.
2. die kontaktaufnahme kann durch ein passwort gesichert werden, das mit übermittelt werden muss
3. der ftpuser wird quasi sofort angelegt, und nicht erst wenn crond das script ausführt
4. das php-script bekommt sofort eine rückmeldung, ob der user angelegt werden konnte, oder ob ein fehler aufgetreten ist.

das sind aus meiner sicht mehrere vorteile und das script wird im prinzip nicht komplizierter.

gruss
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

CIU

Fortgeschrittener

  • »CIU« ist männlich
  • »CIU« ist der Autor dieses Themas

Beiträge: 540

Wohnort: Dresden

  • Nachricht senden

11

12.06.2006, 13:00

das hoert sich interesant an...
sehr sogar...
aber da scheitert es an meinem wissen, zumindest bräuchte ich da mal hilfe und nen anfang.
also mal ne nähere beschreibung dessen was ich wie tun muss/kann

hab das jetzt eigentlich soweit das alles läuft.. aber mit den änderungen in die von dir beschriebene richtung wäre es sicher besser...

also wenn du so nett wärst würde ich mich da über ein paar einführenden stichpunkte und so freuen...

thx

edit: also zu punkt 1 und 4. initd stellt nicht das problem dar. sondern eher der rest..
punkt 2 kann von meiner sicht her vernachlässigt werden...
aber wenn man es mit einbinden kann wärs auch nicht schlecht...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CIU« (12.06.2006, 13:06)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

12

12.06.2006, 15:28

ja, kein problem.
das schöne an der sache ist, dass es so einfach ist.
erst einmal suchst du dir in der /etc/services ein freies port, zb durch den eintrag der zeile
ftpuser 8999/tcp # anlegen eines ftpusers, der name ftpuser ist frei erfunden, portnummer ist 8999, tcp-protocol.
dann der eintrag in /etc/inetd.conf. der soll auf dem port lauschen und bei bedarf das script userscript starten. der eintrag in /etc/inetd sieht dann so aus
ftpuser stream tcp nowait root /pfad_da_hin/userliste
dann noch ein kill -HUP <prozessnummer_von_inetd>, damit inetd die conf neu liest.
wenn du nun eine verbindung auf den rechner auf port 8999 aufmachst, zb telnet <rechner_ip> 8999, dann wird das script aufgerufen und stdin, stdout, stderr sind mit der netzwerkverbindung verknüpft. alles was du in die netzwerkverbindung hineinschreibst, landet im script auf stdin. alle ausgaben (echo, etc) werden in die netzwerkverbindung geschrieben.
dein script muss also nur eine zeile von stdin lesen, zerlegen, user erzeugen und zum schluss eine echo-meldung schreiben, wie es ausgegangen ist. also zb

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# lesen einer zeile aus der netzwerkverbindung
read line
AUTH=`echo $line | cut -d: -f1`
USR=`echo $line | cut -d: -f2`
PAS=`echo $line | cut -d: -f3`
# test der authorisierung
if [ "$AUTH" = "passwort" ]; then
  # usertest etc
  useradd -G ftpuser -m -d /home/ftp/$USR -s /bin/ftp $USR"
  if  exitstatus .... blabla
   echo " $USR:$PAS | chpasswd"
   echo "Der User wurde angelegt"  # diese meldung geht in die netzwerkverbindung
  else
    echo "es ist ein fehler aufgetretet" ..blabla
  fi
fi
# wenn das authorisierungspasswort falsch ist, erfolgt keine reaktion
# script für root lesbar und ausführbar machen, alle anderen dürfen nichts

die schleife ist nicht nötig, da mit jedem kontakt ein user angelegt wird.
über telnet kannst du das dann testen.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

13

13.06.2006, 06:19

noch ein nachtrag, die authorisierung muss auf jeden fall rein, da sonst jeder beliebige user das script über telnet kontaktieren kann.
realisierung entweder durch eine simple übermittlung des passwortes oder etwas besser zb durch die übermittlung einer md5-summe, die über den string username:passwort:authorisierung ermittelt wird und dann wird username:passwort:md5summe übertragen und im userscript wieder getestet.
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

CIU

Fortgeschrittener

  • »CIU« ist männlich
  • »CIU« ist der Autor dieses Themas

Beiträge: 540

Wohnort: Dresden

  • Nachricht senden

14

13.06.2006, 10:46

ok, da hab ich jetzt folgende probleme...

1. geht das ganze auch irgendwie nur mit php?
also die übergabe der daten.
wie geschrieben solls eigentlich nur über den browser gehen...
hab das mal mit fsockopen probiert aber will nicht wirklich.
bekomme da nur nen timeout

das formular wird ausgefüllt --> auf senden gedrückt --> das script ausgeführt -->
der user wird angelegt

eintrag inetd.conf

Quellcode

1
2
#<off># ftp     stream  tcp     nowait  root    /usr/sbin/tcpd /usr/sbin/proftpd
addftp          stream  tcp     nowait  root    /home/andre/./addftp


eintrag /etc/services

Quellcode

1
addftp          9222/tcp                        # anlegen eines ftpusers


das script (da ist jetzt noch der lange string drin statt des ID)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash

#set -x

read line

AUTH=`echo $line | cut -d: -f1`
USR1=`echo $line | cut -d: -f2`
PASS=`echo $line | cut -d: -f3`
USR=`echo $USR1 | tr -d ' =$&][}{><ÄÖÜäöü\-%!' | tr [A-Z] [a-z]`

if [ "$AUTH" != "password" ];

    then
    echo ""

elif [ "$USR" == "" ];

    then
    echo "kein benutzernamen"

elif [ "$PASS" == "" ];

    then
    echo "kein passwort"

elif [ "$USR" == "root" ];

    then
    echo "arschloch"

elif [ "$USR" == "`cat /etc/passwd | cut -d: -f1 | grep "$USR"`" ];

    then
    echo "benutzer vorhanden"

    else
    useradd -G ftpuser -m -d /home/ftp/"$USR" -s /bin/ftp "$USR"
    echo "$USR":"$PASS" | chpasswd
    echo "$USR":"$PASS" >>/home/andre/list_ftp
    chmod 600 /home/andre/list_ftp
fi

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »CIU« (13.06.2006, 10:53)


linuxerr

Prof. Dr. Schlaumeier

  • »linuxerr« ist männlich

Beiträge: 8 557

Wohnort: Mecklenburg, zur Entwicklungshilfe in Chemnitz/Sachsen ;-)

  • Nachricht senden

15

13.06.2006, 12:32

teste die funktion des scriptes mit telnet
telnet ip_des_rechners portnummer
also zb
telnet localhost 9222
wenn die escape-charakter anzeige erscheint, gibst du den string
passwort:username:userpasswort ein und enter und es sollte die ausgabe des scriptes in telnet erscheinen. wenn das funktioniert, kannst du in php das teil connectieren

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<body>
<? 
$fd=fsockopen("ip_des_scriptrechners",9222,$errno,$errstr,30);
echo "FD= $fd";
if ( $fd ){
 # absenden des string, newline am ende des string nicht vergessen, sonst kann read im script nicht abschliessen und es gibt einen timeout.
 fputs($fd,"passwort:ich:hallo\n");
 # antwortzeile lesen, bei mehreren zeilen eine schleife nehmen
 $antwort=fgets($fd);
 echo $antwort;
 fclose($fd);

}else{
 echo "Es konnte keine Verbindung hergestellt werden";
}
?>
</body>
</html>
Die Rechtschreibfehler in diesem Beitrag sind nicht urheberrechtlich geschützt.
Jeder der einen findet darf ihn behalten und in eigenen Werken weiterverwenden.

CIU

Fortgeschrittener

  • »CIU« ist männlich
  • »CIU« ist der Autor dieses Themas

Beiträge: 540

Wohnort: Dresden

  • Nachricht senden

16

13.06.2006, 15:43

so, jetzt läuft alles zufriedenstellend und so wie ich es wollte.

ein ganz großes lob an dich und besten dank für die hilfe ohne die ich nicht weiter gekommen wäre.

werd das alles nochmal zusammenfassen und hier posten damit das noch nen ordentlichen abschluss hat.

also, danke

Thema bewerten