Page 1 of 1

Διαδικασία login σε Linux

Posted: Wed May 12, 2004 6:31 pm
by crontab
Μεταφορά από 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 ?

Posted: Wed May 12, 2004 9:04 pm
by HdkiLLeR
crontab wrote:...
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())
Σωστός, βασικά παράδειγμα ήθελα να δώσω παραπάνω αλλά μιας και προσφέρθηκες να το αναλύσεις :-D .
crontab wrote:...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.
Εδώ να σου πώ την αλλήθεια δεν το θυμόμουνα καθόλου,είχα την εντύπωση πως η getty έκανε fork() -> στο child process exec() για το login και εαν δεν ήταν επιτυχές το login επέστρεφε στην αρχική getty(parent).
crontab wrote:**Aμα όμως κάνει κάποιος ps -ef (από κάποιο virtual terminal ,αλλά σε κάποιο άλλο να είναι logged in)
θα δει πως τρέχει '/bin/login --' που το -- σημαίνει το τέλος των ορισμάτων.Παράξενο δεν είναι ?
Πως στον **** παίρνει το όρισμα το login ?
Εδώ δεν το έπιασα,που είναι το παράξενο;
crontab wrote:...Σε περίπτωση unusuccessful login η διεργασία προτρέπει το χρήστη να ξαναδώσει τα στοιχεία ( ο αριθμός των φορών καθορίζεται από το
/etc/login.defs ) και εάν πάλι μετά απο X προσπάθειες η σύνδεση δεν είναι εφικτή η login πεθαίνει(προφανώς
στέλνοντας κάποιο σήμα στον init) και το "βλέπει" αυτό ο init και κάνει 'respawn' το getty .
Κάτι ακόμη σε περίπτωση που χρησιμοποιείται το PAM Module* τότε το/τα conf/confs για τις auth(γενικά) εργασίες(πχ login/su κλπ) είναι στο etc/pam.conf ή etc/pam.d/.

*)PAM

Linux-PAM Is a system of libraries that handle the authentication tasks of applications (services) on the
system. The library provides a stable general interface (Application Programming Interface - API) that
privilege granting programs (such as login(1) and su(1)) defer to to perform standard authentication
tasks.

Posted: Sat May 15, 2004 7:30 pm
by crontab
OK.Ισως να μην το περιέγραψα σωστά.Κάνε το εξης:
Κάνε login στο tty1..
Στο tty2 κάνε login:some_username και πάτα Enter ετσι ώστε να σου βγάλει το prompt
Password: (δηλαδή στην ουσία να κληθεί η διεργασία login )
Τώρα πήγαινε πάλι στο tty1 και κάνε ps -ef.Παρατήρησε πως υπάρχει στη λίστα των διεργασιών
η διεργασία με cmd /bin/login --
To -- ως γνωστόν στις περισσότερες εντολές που έχουν υλοποιηθεί στο gnu project σημαίνει τέλος
λίστας ορισμάτων (πχ η εντολή rm -- -rf σημαίνει πλέον μείωση των σκληρών συνδέσμων του αρχείου
με ονομασία -rf κατά 1 και η εντολή rm δεν το βλέπει σαν όρισμα (-r=recursive -f=force ) )
Αυτό που θέλω να πω είναι πως κανονικά θα έπρεπε να είναι /bin/login some_username.

Posted: Mon May 17, 2004 1:36 pm
by HdkiLLeR
Ναι οκ σε έπιασα..Ιδεά δεν έχω πάντος τι παίζει εκει και γιατί δεν βγάζει το login name.