Διαδικασία login σε Linux
Posted: Wed May 12, 2004 6:31 pm
Μεταφορά από http://venus.cslab.aueb.gr/forum/viewtopic.php?t=169
Moderated by Einherjar
Κάποιες παρατηρήσεις σε αυτά που έγραψε ο HdKiller..
>Μόλις υπάρχει μια αίτηση για σύνδεση (πχ telnet,ssh κλπ) τότε η getty >που ακούει το τερματικό δημιουργεί μια διεργασία
>παιδί την login για την διαδικασία εισόδου/αυθεντικοποίησης.
H διαδικασία για σύνδεση δικτύου με πρωτόκολλο το telnet ή για πρωτόκολλα κρυπτογράφησης που τρέχουν πανω
απο τον Secure Sockets Layer είναι διαφορετική.Τα προγράμματα που υλοποιούν τα προαναφερθέντα πρωτόκολλα τρέχουν είτε
σαν μέρος του inetd ( ή του gnu/xinetd ) ,είτε standalone.Επειδή είναι αντι-οικονομικό απο πλευράς μνήμης να τρέχουν standalone,
κυρίως ο telnetd τρέχει μέσα απο ton internet superserver daemon.Ολα αυτά τα daemons (είτε standalone , είτε inetd based ) κάνουν
fork ένα child process για να εξυπηρετήσει τη συγκεκριμένη αίτηση ενώ ο μπαμπάς ακούει για άλλες συνδέσεις.
Για console based logins ή για logins μέσα απο serial lines η getty ( που αρχίζει απο init ) διαβάζει το username και αντικαθιστά
την εικόνα της με αυτή του /bin/login (exec())
>Μετά από ένα login επιστρέφει η login πίσω στην getty το αποτέλεσμα
>(επιτυχής σύνδεση ή όχι) και η getty ανάλογα κλείνει
>την σύνδεση ή δημιουργεί μια νέα διεργασία παιδί η οποία είναι η csh(η >bash ή sh ανάλογα με το ποιός είναι ο φλοιός σου) η
>οποία είναι η γραμμή εντολών
H διεργασία login δεν επιστρέφει τίποτα στην getty (άλλωστε δεν είναι εφικτό μιας και η getty δεν υπάρχει , έχει αντικατασταθεί )
Η login παίρνει σαν παράμετρο το username(έτσι λέι η θεωρία**) , διαβάζει το password και αφού κάνει τα δικά της ( crypt(password, salt)) ,κάνει
exec() το shell του χρήστη ( που το βρίσκει μέσα απο το δείκτη *pw_shell του struct passwd ).
Σε περίπτωση unusuccessful login η διεργασία προτρέπει το χρήστη να ξαναδώσει τα στοιχεία ( ο αριθμός των φορών καθορίζεται από το
/etc/login.defs ) και εάν πάλι μετά απο X προσπάθειες η σύνδεση δεν είναι εφικτή η login πεθαίνει(προφανώς
στέλνοντας κάποιο σήμα στον init) και το "βλέπει" αυτό ο init και κάνει 'respawn' το getty .
>Κάθε εντολή που πληκτρολογείς πχ cat file1 ο φλοιός(που είναι παιδί της >getty,η οποία είναι παιδί της init κλπ κλπ) δημιουργεί
έ>να παιδί της(fork για την ακρίβεια) και στην διεργασία παιδί εκτελείται η εν>τολή.
Ο Φλοιός είναι παιδί του init..σκέτο ( η getty δεν υπάρχει σε αυτήν τη φάση )
**Aμα όμως κάνει κάποιος ps -ef (από κάποιο virtual terminal ,αλλά σε κάποιο άλλο να είναι logged in)
θα δει πως τρέχει '/bin/login --' που το -- σημαίνει το τέλος των ορισμάτων.Παράξενο δεν είναι ?
Πως στον π**** παίρνει το όρισμα το login ?
Moderated by Einherjar
Κάποιες παρατηρήσεις σε αυτά που έγραψε ο HdKiller..
>Μόλις υπάρχει μια αίτηση για σύνδεση (πχ telnet,ssh κλπ) τότε η getty >που ακούει το τερματικό δημιουργεί μια διεργασία
>παιδί την login για την διαδικασία εισόδου/αυθεντικοποίησης.
H διαδικασία για σύνδεση δικτύου με πρωτόκολλο το telnet ή για πρωτόκολλα κρυπτογράφησης που τρέχουν πανω
απο τον Secure Sockets Layer είναι διαφορετική.Τα προγράμματα που υλοποιούν τα προαναφερθέντα πρωτόκολλα τρέχουν είτε
σαν μέρος του inetd ( ή του gnu/xinetd ) ,είτε standalone.Επειδή είναι αντι-οικονομικό απο πλευράς μνήμης να τρέχουν standalone,
κυρίως ο telnetd τρέχει μέσα απο ton internet superserver daemon.Ολα αυτά τα daemons (είτε standalone , είτε inetd based ) κάνουν
fork ένα child process για να εξυπηρετήσει τη συγκεκριμένη αίτηση ενώ ο μπαμπάς ακούει για άλλες συνδέσεις.
Για console based logins ή για logins μέσα απο serial lines η getty ( που αρχίζει απο init ) διαβάζει το username και αντικαθιστά
την εικόνα της με αυτή του /bin/login (exec())
>Μετά από ένα login επιστρέφει η login πίσω στην getty το αποτέλεσμα
>(επιτυχής σύνδεση ή όχι) και η getty ανάλογα κλείνει
>την σύνδεση ή δημιουργεί μια νέα διεργασία παιδί η οποία είναι η csh(η >bash ή sh ανάλογα με το ποιός είναι ο φλοιός σου) η
>οποία είναι η γραμμή εντολών
H διεργασία login δεν επιστρέφει τίποτα στην getty (άλλωστε δεν είναι εφικτό μιας και η getty δεν υπάρχει , έχει αντικατασταθεί )
Η login παίρνει σαν παράμετρο το username(έτσι λέι η θεωρία**) , διαβάζει το password και αφού κάνει τα δικά της ( crypt(password, salt)) ,κάνει
exec() το shell του χρήστη ( που το βρίσκει μέσα απο το δείκτη *pw_shell του struct passwd ).
Σε περίπτωση unusuccessful login η διεργασία προτρέπει το χρήστη να ξαναδώσει τα στοιχεία ( ο αριθμός των φορών καθορίζεται από το
/etc/login.defs ) και εάν πάλι μετά απο X προσπάθειες η σύνδεση δεν είναι εφικτή η login πεθαίνει(προφανώς
στέλνοντας κάποιο σήμα στον init) και το "βλέπει" αυτό ο init και κάνει 'respawn' το getty .
>Κάθε εντολή που πληκτρολογείς πχ cat file1 ο φλοιός(που είναι παιδί της >getty,η οποία είναι παιδί της init κλπ κλπ) δημιουργεί
έ>να παιδί της(fork για την ακρίβεια) και στην διεργασία παιδί εκτελείται η εν>τολή.
Ο Φλοιός είναι παιδί του init..σκέτο ( η getty δεν υπάρχει σε αυτήν τη φάση )
**Aμα όμως κάνει κάποιος ps -ef (από κάποιο virtual terminal ,αλλά σε κάποιο άλλο να είναι logged in)
θα δει πως τρέχει '/bin/login --' που το -- σημαίνει το τέλος των ορισμάτων.Παράξενο δεν είναι ?
Πως στον π**** παίρνει το όρισμα το login ?