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

Συζητήσεις σχετικά με θέματα που αφορούν λειτουργικά συστήματα (Linux, *BSD, MacOS, Windows, κτλ.) .
Post Reply
crontab
byte level
byte level
Posts: 53
Joined: Sat May 01, 2004 7:10 pm
Contact:

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

Post by crontab » 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 ?
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Wed May 12, 2004 9:04 pm

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.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
crontab
byte level
byte level
Posts: 53
Joined: Sat May 01, 2004 7:10 pm
Contact:

Post by crontab » Sat May 15, 2004 7:30 pm

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.
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Mon May 17, 2004 1:36 pm

Ναι οκ σε έπιασα..Ιδεά δεν έχω πάντος τι παίζει εκει και γιατί δεν βγάζει το login name.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------

"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Post Reply

Return to “Λειτουργικά συστήματα”