Προγραμματισμός

Όλα αυτά JAAS

Χρειάστηκε ποτέ να δημιουργήσετε έναν μηχανισμό ελέγχου ταυτότητας σύνδεσης για μια εφαρμογή; Οι πιθανότητες είναι, έχετε, και πιθανώς περισσότερες από μία φορές, με κάθε νέα εφαρμογή να είναι κοντά, αλλά όχι ίδια, με την προηγούμενη. Για παράδειγμα, μια εφαρμογή μπορεί να χρησιμοποιεί μια βάση δεδομένων Oracle, μια άλλη μπορεί να χρησιμοποιεί έλεγχο ταυτότητας NT και μια άλλη, έναν κατάλογο LDAP (ελαφρύ πρωτόκολλο καταλόγου πρόσβασης). Δεν θα ήταν ωραίο να υποστηρίξετε όλους αυτούς τους μηχανισμούς ασφαλείας χωρίς να αλλάξετε κώδικα σε επίπεδο εφαρμογής;

Τώρα στον κόσμο της Java, μπορείτε με την Υπηρεσία ελέγχου ταυτότητας και εξουσιοδότησης Java (JAAS). Αυτό το σχετικά νέο API ήταν μια επέκταση στο J2SE (Java 2 Platform, Standard Edition) 1.3, είναι ένα βασικό API στο J2SE 1.4 και είναι επίσης μέρος της προδιαγραφής J2EE (Java 2 Platform, Enterprise Edition) 1.3. Σε αυτό το άρθρο, θα σας διδάξουμε τα βασικά στοιχεία του JAAS και θα σας δείξουμε πώς να εφαρμόσετε αποτελεσματικά το JAAS σε πραγματικές εφαρμογές. Βασιστήκαμε την εφαρμογή αυτού του άρθρου στις δικές μας εμπειρίες, ενσωματώνοντας το JAAS σε ένα υπάρχον σύστημα που βασίζεται σε Web Java και χρησιμοποίησε ένα RDBMS (σχεσιακό σύστημα διαχείρισης βάσεων δεδομένων) για την αποθήκευση πληροφοριών σύνδεσης χρήστη. Με το JAAS, σχεδιάσαμε πιο στιβαρούς, ευέλικτους και σταθερούς μηχανισμούς σύνδεσης και ελέγχου ταυτότητας.

Μπορείτε να κατεβάσετε ένα πλήρες σύνολο παραδειγμάτων εργασίας από τους πόρους παρακάτω (περιλαμβάνει πηγές Java, JSP (JavaServer Pages), διαμόρφωση JAAS, με σενάρια βάσης δεδομένων και build). Δοκιμάσαμε αυτά τα παραδείγματα χρησιμοποιώντας το διακομιστή Resin με JDBC (Java Database Connectivity) και τη βάση δεδομένων MySQL.

Έλεγχος ταυτότητας και εξουσιοδότηση Java: Η μεγάλη εικόνα

Πριν από το JAAS, το μοντέλο ασφαλείας της Java διαμορφώθηκε ως επί το πλείστον από την προέλευσή του ως γλώσσα ανεξάρτητη από την πλατφόρμα για κατανεμημένες, δικτυωμένες εφαρμογές. Στις πρώτες μέρες της, η Java εμφανιζόταν συχνά ως κωδικός για κινητά, όπως μικροεφαρμογές που βασίζονται σε πρόγραμμα περιήγησης και, ως εκ τούτου, το αρχικό μοντέλο ασφαλείας επικεντρώθηκε στην προστασία των χρηστών βάσει από όπου προήλθε ο κωδικός και ποιος το δημιούργησε. Πρώιμοι μηχανισμοί ασφαλείας Java όπως ΥΠΕΥΘΥΝΟΣ ΑΣΦΑΛΕΙΑΣΗ έννοια του sandbox, η υπογραφή κώδικα και τα αρχεία πολιτικής προορίζονταν για την προστασία των χρηστών από το σύστημα.

Η εφεύρεση του JAAS αντικατοπτρίζει την εξέλιξη της Java σε μια γλώσσα προγραμματισμού γενικής χρήσης, που χρησιμοποιείται για την εφαρμογή παραδοσιακών εφαρμογών πελάτη και διακομιστή που απαιτούν σύνδεση και έλεγχο πρόσβασης. Το JAAS προστατεύει το σύστημα από τους χρήστες επιτρέποντας ή αρνείται την πρόσβαση βάσει ποιος ή τι τρέχει το πρόγραμμα. Ενώ το JAAS μπορεί να εκτελέσει έλεγχο ταυτότητας και εξουσιοδότηση, σε αυτό το άρθρο, εστιάζουμε κυρίως στον έλεγχο ταυτότητας.

Το JAAS μπορεί να απλοποιήσει την ανάπτυξη ασφάλειας Java τοποθετώντας ένα επίπεδο αφαίρεσης μεταξύ της εφαρμογής σας και διαφορετικούς μηχανισμούς ελέγχου ταυτότητας και εξουσιοδότησης. Αυτή η ανεξαρτησία από πλατφόρμες και αλγόριθμους σάς επιτρέπει να χρησιμοποιείτε διαφορετικούς μηχανισμούς ασφαλείας χωρίς να τροποποιείτε τον κωδικό σε επίπεδο εφαρμογής. Όπως με τα περισσότερα API ασφαλείας Java, το JAAS επιτυγχάνει αυτήν την ανεξαρτησία υλοποίησης μέσω ενός επεκτάσιμου πλαισίου διασυνδέσιμων παρόχων υπηρεσιών (SPIs): ένα σύνολο αφηρημένων κλάσεων και διεπαφών στις οποίες αναπτύσσονται συγκεκριμένες εφαρμογές.

Το σχήμα 1 παρακάτω δίνει μια επισκόπηση υψηλού επιπέδου για το πώς επιτυγχάνει η JAAS αυτήν τη δυνατότητα σύνδεσης. Ο κώδικας επιπέδου εφαρμογής ασχολείται κυρίως με ένα Πλαίσιο σύνδεσης. Κάτω από αυτό Πλαίσιο σύνδεσης είναι ένα σύνολο ενός ή περισσότερων δυναμικά διαμορφωμένων Μονάδα σύνδεσηςs, που χειρίζονται τον πραγματικό έλεγχο ταυτότητας χρησιμοποιώντας την κατάλληλη υποδομή ασφαλείας.

Το JAAS παρέχει κάποια αναφορά Μονάδα σύνδεσης υλοποιήσεις, όπως το JndiLoginModule; μπορείτε επίσης να αναπτύξετε το δικό σας, όπως θα κάνουμε εδώ με το RdbmsLoginModule. Θα δείξουμε επίσης πώς μπορείτε να ρυθμίσετε γρήγορα μια εφαρμογή με μια επιλογή υλοποιήσεων χρησιμοποιώντας ένα απλό αρχείο διαμόρφωσης.

Εκτός από το ότι μπορεί να συνδεθεί, το JAAS είναι στοίβαγμα: στο πλαίσιο μίας μόνο σύνδεσης, ένα σύνολο λειτουργικών μονάδων ασφαλείας μπορεί να στοιβάζεται το ένα πάνω στο άλλο, το καθένα καλείται σε σειρά και το καθένα αλληλεπιδρά με διαφορετική υποδομή ασφαλείας.

Οι πτυχές του JAAS διαμορφώνονται σε κάποια γνωστά αρχιτεκτονικά πρότυπα ασφάλειας και υφιστάμενα πλαίσια. Η δυνατότητα στοίβαξης, για παράδειγμα, μοιάζει σκόπιμα με το πλαίσιο Unix Pluggable Authentication Module (PAM). Από άποψη συναλλαγής, το JAAS υιοθετεί συμπεριφορές παρόμοιες με τα πρωτόκολλα δύο φάσεων (2PC). Έννοιες διαμόρφωσης ασφαλείας του JAAS, συμπεριλαμβανομένων Πολιτική αρχεία και Άδειες, προέρχονται από τα πακέτα ασφαλείας J2SE 1.2. Η JAAS δανείζεται επίσης ιδέες από άλλα καθιερωμένα πλαίσια ασφαλείας, όπως πιστοποιητικά X.509, από τα οποία το όνομα Θέμα προέρχεται (θα μάθετε περισσότερα για Θέμα αργότερα).

Σημείωση: Το JAAS είναι ένα από τα πολλά νέα API ασφαλείας Java. Για περισσότερα σχετικά με την ασφάλεια Java, ανατρέξτε στην πλαϊνή γραμμή "Το Java Security Puzzle" και Πόροι παρακάτω.

Πελάτης και διακομιστή JAAS

Μπορείτε να εφαρμόσετε το JAAS τόσο στον πελάτη όσο και στον διακομιστή. Η χρήση του από την πλευρά του πελάτη είναι απλή, όπως θα δείξουμε σύντομα. Από την πλευρά του διακομιστή τα πράγματα γίνονται λίγο πιο περίπλοκα. Επί του παρόντος, το JAAS στην αγορά διακομιστών εφαρμογών είναι λίγο ασυνεπές. Οι διακομιστές εφαρμογών J2EE χρησιμοποιούν το JAAS ελαφρώς διαφορετικά, ανάλογα με το ποιο χρησιμοποιείτε. Για παράδειγμα, το JBossSX, χρησιμοποιώντας τη δική του αρχιτεκτονική, ενσωματώνει όμορφα το JAAS στο συνολικό πλαίσιο ασφαλείας του (το οποίο περιγράφεται λεπτομερώς στο εξαιρετικό Scott Stark JavaWorld άρθρο "Ενσωμάτωση υποδομών ασφαλείας με JBossSX" (Αύγουστος 2001)). Ωστόσο, αν και το WebLogic 6.x υποστηρίζει JAAS, οι λεπτομέρειες διαφέρουν.

Έτσι, μπορείτε να κατανοήσετε το JAAS τόσο από πλευράς διακομιστή όσο και από πλευράς πελάτη, θα δείξουμε παραδείγματα και των δύο σε αυτό το άρθρο. Και για λόγους απλότητας στον διακομιστή, θα χρησιμοποιήσουμε τον διακομιστή εφαρμογών Resin, ώστε να ξεκινήσουμε με μια καθαρότερη πλάκα (Η Resin έχει ένα δικό του σύστημα ελέγχου ταυτότητας με δυνατότητα σύνδεσης, αλλά είναι μη τυπική, οπότε η χρήση του JAAS μας δίνει περισσότερη φορητότητα επιλογές αργότερα).

Πυρήνας JAAS

Για να ξεκινήσετε με το JAAS, πρέπει πρώτα να βεβαιωθείτε ότι είναι εγκατεστημένο. Το J2SE 1.4 περιλαμβάνει ήδη JAAS. Το J2SE 1.3 δεν το κάνει. Εάν θέλετε να συνεχίσετε να χρησιμοποιείτε το J2SE 1.3, πραγματοποιήστε λήψη του JAAS από την Sun Microsystems. Μόλις κατεβάσετε και εγκαταστήσετε το JAAS σε έναν συγκεκριμένο κατάλογο, θα δείτε έναν υποκατάλογο που ονομάζεται lib, το οποίο περιέχει ένα αρχείο με το όνομα jaas.jar. Θα πρέπει να προσθέσετε αυτό το αρχείο στο classpath ή να το αντιγράψετε στον κατάλογο επεκτάσεων JRE (Java Runtime Environment) (στο \ lib \ ext, όπου είναι η τοποθεσία του JRE σας). Τότε είστε έτοιμοι για το JAAS. Σημείωση: Εάν χρησιμοποιείτε διακομιστή εφαρμογών, ενδέχεται να περιλαμβάνει ήδη το JAAS. Ελέγξτε την τεκμηρίωση του διακομιστή σας για λεπτομέρειες.

Με οποιαδήποτε από αυτές τις προσεγγίσεις, σημειώστε ότι μπορείτε να αλλάξετε ορισμένες από τις ρυθμίσεις ιδιοκτησίας συστήματος που σχετίζονται με το JAAS (καθώς και πολλές άλλες ρυθμίσεις ασφαλείας Java) στο αρχείο ιδιοτήτων ασφαλείας Java. Αυτό το αρχείο, java.security, βρίσκεται στο / lib / ασφάλεια κατάλογο και γραμμένο σε τυπική μορφή αρχείου ιδιοτήτων Java.

Η χρήση του ελέγχου ταυτότητας JAAS από την εφαρμογή σας περιλαμβάνει συνήθως τα ακόλουθα βήματα:

  1. Δημιουργώ ένα Πλαίσιο σύνδεσης
  2. Προαιρετικά περάστε α CallbackHandler στο Πλαίσιο σύνδεσης, για τη συλλογή ή την επεξεργασία δεδομένων ελέγχου ταυτότητας
  3. Εκτελέστε έλεγχο ταυτότητας καλώντας το Πλαίσιο σύνδεσης'μικρό Σύνδεση() μέθοδος
  4. Εκτελέστε προνομιακές ενέργειες χρησιμοποιώντας το επιστρεφόμενο Θέμα (υποθέτοντας ότι η είσοδος είναι επιτυχής)

Εδώ είναι ένα ελάχιστο παράδειγμα:

 LoginContext lc = νέο LoginContext ("MyExample"); δοκιμάστε το {lc.login (); } catch (LoginException) {// Ο έλεγχος ταυτότητας απέτυχε. } // Ο έλεγχος ταυτότητας ήταν επιτυχής, μπορούμε πλέον να συνεχίσουμε. // Μπορούμε να χρησιμοποιήσουμε το Επιστρεφόμενο Θέμα αν θέλουμε. Θέμα sub = lc.getSubject (); Subject.doAs (δευτερεύον, νέο MyPrivilegedAction ()); 

Κάτω από τα καλύμματα, εμφανίζονται μερικά άλλα πράγματα:

  1. Κατά την αρχικοποίηση, το Πλαίσιο σύνδεσης βρίσκει την καταχώριση διαμόρφωσης "MyExample" σε ένα αρχείο διαμόρφωσης JAAS (το οποίο διαμορφώσατε) για να προσδιορίσετε ποιο Μονάδα σύνδεσηςs για φόρτωση (βλέπε σχήμα 2)
  2. Κατά τη σύνδεση, το Πλαίσιο σύνδεσης καλεί ο καθένας Μονάδα σύνδεσης'μικρό Σύνδεση() μέθοδος
  3. Καθε Σύνδεση() Η μέθοδος εκτελεί τον έλεγχο ταυτότητας ή τις λίστες a CallbackHandler
  4. ο CallbackHandler χρησιμοποιεί ένα ή περισσότερα Επιστροφή κλήσηςγια να αλληλεπιδράσετε με τον χρήστη και να συλλέξετε πληροφορίες
  5. Ενα νέο Θέμα Το παράδειγμα συμπληρώνεται με λεπτομέρειες ελέγχου ταυτότητας όπως ΔΙΕΥΘΥΝΤΡΙΑ σχολειουs και διαπιστευτήρια

Θα εξηγήσουμε περαιτέρω λεπτομέρειες παρακάτω, αλλά για να ξεκινήσουμε, ας δούμε τις βασικές τάξεις και διεπαφές JAAS που εμπλέκονται στη διαδικασία. Αυτά χωρίζονται συνήθως στις ακόλουθες τρεις ομάδες:

Πίνακας 1. Κατηγορίες και διασυνδέσεις JAAS

ΚοινόςΘέμα, ΔΙΕΥΘΥΝΤΡΙΑ σχολειου, διαπιστευτήριο (τα διαπιστευτήρια δεν είναι συγκεκριμένη κλάση, αλλά μπορεί να είναι οποιοδήποτε αντικείμενο)
ΑυθεντικοποίησηΠλαίσιο σύνδεσης, Μονάδα σύνδεσης, CallbackHandler, Επιστροφή κλήσης
ΕξουσιοδότησηΠολιτική, AuthPermission, PrivateCredentialPermission

Οι περισσότερες από αυτές τις τάξεις και διεπαφές βρίσκονται στο javax.security.auth τα υπο-πακέτα του πακέτου, με κάποιες προεγκατεστημένες εφαρμογές στο com.sun.security.auth πακέτο, περιλαμβάνεται μόνο στο J2SE 1.4.

Σημείωση: Επειδή επικεντρωνόμαστε στον έλεγχο ταυτότητας σε αυτό το άρθρο, δεν εξετάζουμε τις κατηγορίες εξουσιοδότησης.

Συχνές: Θέματα, διευθυντές και διαπιστευτήρια

ο Θέμα Το class αντιπροσωπεύει μια επικυρωμένη οντότητα: έναν τελικό χρήστη ή διαχειριστή ή μια υπηρεσία Web, μια συσκευή ή μια άλλη διαδικασία. Η τάξη περιέχει τρία σύνολα τύπων πληροφοριών ασφαλείας:

  • Ταυτότητες: Με τη μορφή ενός ή περισσοτέρων ΔΙΕΥΘΥΝΤΡΙΑ σχολειουμικρό
  • Δημόσια διαπιστευτήρια: Όπως όνομα ή δημόσια κλειδιά
  • Ιδιωτικά διαπιστευτήρια: Όπως κωδικοί πρόσβασης ή ιδιωτικά κλειδιά

ΔΙΕΥΘΥΝΤΡΙΑ σχολειουαντιπροσωπεύουν Θέμα ταυτότητες. Εφαρμόζουν το java.security.Pr Principal διεπαφή (που προηγείται του JAAS) και java.io.Serializable. ΕΝΑ ΘέμαΗ πιο σημαντική μέθοδος είναι getName (), που επιστρέφει το όνομα συμβολοσειράς μιας ταυτότητας. Από το α Θέμα Το παράδειγμα περιέχει έναν πίνακα από ΔΙΕΥΘΥΝΤΡΙΑ σχολειουΈτσι, μπορεί να έχει πολλά ονόματα. Επειδή ένας αριθμός κοινωνικής ασφάλισης, ένα αναγνωριστικό σύνδεσης, μια διεύθυνση ηλεκτρονικού ταχυδρομείου και ούτω καθεξής, μπορούν όλοι να αντιπροσωπεύουν έναν χρήστη, πολλές ταυτότητες αποδεικνύονται κοινές στον πραγματικό κόσμο.

Το τελευταίο στοιχείο εδώ, διαπιστευτήριο, δεν είναι κλάση ή διεπαφή, αλλά μπορεί να είναι οποιοδήποτε αντικείμενο. Τα διαπιστευτήρια μπορούν να περιλαμβάνουν οποιοδήποτε τεχνούργημα ελέγχου ταυτότητας, όπως εισιτήριο, κλειδί ή κωδικό πρόσβασης, που ενδέχεται να απαιτούν συγκεκριμένα συστήματα ασφαλείας. ο Θέμα η τάξη διατηρεί μοναδική Σειράιδιωτικά και δημόσια διαπιστευτήρια, τα οποία μπορούν να ανακτηθούν με μεθόδους όπως getPrivateCredentials () και getPublicCrendentials (). Αυτές οι μέθοδοι χρησιμοποιούνται συχνότερα από υποσυστήματα ασφαλείας παρά στο επίπεδο εφαρμογής.

Έλεγχος ταυτότητας: LoginContext

Το επίπεδο εφαρμογής σας χρησιμοποιεί Πλαίσιο σύνδεσης ως κύρια κατηγορία για τον έλεγχο ταυτότητας Θέμαμικρό. Πλαίσιο σύνδεσης αντιπροσωπεύει επίσης το σημείο όπου το δυναμικό pluggability της JAAS παίζει, γιατί όταν δημιουργείτε ένα Πλαίσιο σύνδεσης, καθορίζετε μια ονομαστική διαμόρφωση για φόρτωση. ο Πλαίσιο σύνδεσης φορτώνει συνήθως τις πληροφορίες διαμόρφωσης από ένα αρχείο κειμένου, το οποίο με τη σειρά του λέει Πλαίσιο σύνδεσης οι οποίες Μονάδα σύνδεσηςs για χρήση κατά τη σύνδεση.

Οι τρεις μέθοδοι που χρησιμοποιούνται συνήθως στο Πλαίσιο σύνδεσης είναι:

Πίνακας 2. Μέθοδοι LoginContext

Σύνδεση()Εκτελεί σύνδεση, ένα σχετικά περίπλοκο βήμα που επικαλείται όλους Μονάδα σύνδεσηςορίζεται για αυτήν τη διαμόρφωση. Εάν το πετύχει, δημιουργεί ένα έλεγχο ταυτότητας Θέμα. Εάν αποτύχει, ρίχνει ένα LoginException.
getSubject ()Επιστρέφει τον έλεγχο ταυτότητας Θέμα.
Αποσύνδεση()Αποσυνδέεται ο έλεγχος ταυτότητας Θέμα και αφαιρεί το ΔΙΕΥΘΥΝΤΡΙΑ σχολειουs και διαπιστευτήρια.

Θα δείξουμε πώς να χρησιμοποιήσουμε αυτές τις μεθόδους αργότερα.

Έλεγχος ταυτότητας: LoginModule

Μονάδα σύνδεσης είναι η διεπαφή με συγκεκριμένους μηχανισμούς ελέγχου ταυτότητας. Το J2SE 1.4 αποστέλλεται με ένα σύνολο έτοιμων προς χρήση Μονάδες σύνδεσης, συμπεριλαμβανομένου:

Πίνακας 3. Μονάδες σύνδεσης στο J2SE 1.4

JndiLoginModuleΕπαληθεύει σε μια υπηρεσία καταλόγου που έχει διαμορφωθεί στο JNDI (Java Naming and Directory Interface)
Krb5LoginModuleΈλεγχος ταυτότητας χρησιμοποιώντας πρωτόκολλα Kerberos
NTLoginModuleΧρησιμοποιεί τις πληροφορίες ασφαλείας του τρέχοντος χρήστη για έλεγχο ταυτότητας
UnixLoginModuleΧρησιμοποιεί τις πληροφορίες ασφαλείας του τρέχοντος χρήστη Unix για έλεγχο ταυτότητας

Μαζί με αυτές τις μονάδες έρχεται ένα σετ από αντίστοιχο σκυρόδεμα ΔΙΕΥΘΥΝΤΡΙΑ σχολειου υλοποιήσεις στο com.sun.security.auth πακέτο, όπως NTDomainPr Principal και UnixPr Principal.

ο Μονάδα σύνδεσης η διεπαφή έχει πέντε μεθόδους:

Πίνακας 4. Μέθοδοι LoginModule

αρχικοποιώ ()Κλήθηκε μετά το Μονάδα σύνδεσης είναι κατασκευασμένο.
Σύνδεση()Εκτελεί τον έλεγχο ταυτότητας.
διαπράττω()Κλήθηκε από το Πλαίσιο σύνδεσης αφού αποδεχτεί τα αποτελέσματα από όλους Μονάδα σύνδεσηςορίζεται για αυτήν την εφαρμογή. Εκχωρούμε ΔΙΕΥΘΥΝΤΡΙΑ σχολειουs και διαπιστευτήρια για το Θέμα εδώ.
κάνω αποβολή()Κλήθηκε όταν υπάρχει Μονάδα σύνδεσης για αυτήν την εφαρμογή αποτυγχάνει (παρόλο που οι προηγούμενες ακολουθίες ενδέχεται να έχουν πετύχει - έτσι μοιάζουν με ένα μοντέλο 2PC). Οχι ΔΙΕΥΘΥΝΤΡΙΑ σχολειουs ή διαπιστευτήρια ανατίθενται στο Θέμα.
Αποσύνδεση()Αφαιρεί το ΔΙΕΥΘΥΝΤΡΙΑ σχολειουs και διαπιστευτήρια που σχετίζονται με το Θέμα.

Το επίπεδο εφαρμογής δεν καλεί καμία από αυτές τις μεθόδους απευθείας - το Πλαίσιο σύνδεσης τους επικαλείται ανάλογα με τις ανάγκες. Το παρακάτω παράδειγμά μας θα αναλύσει τις υλοποιήσεις αυτών των μεθόδων.

Έλεγχος ταυτότητας: CallbackHandlers και Callbacks

CallbackHandlers και Επιστροφή κλήσηςας α Μονάδα σύνδεσης συλλέξτε τις απαραίτητες πληροφορίες ελέγχου ταυτότητας από έναν χρήστη ή ένα σύστημα, ενώ παραμένετε ανεξάρτητοι από τον πραγματικό μηχανισμό αλληλεπίδρασης. Θα αξιοποιήσουμε αυτήν την ικανότητα στο σχεδιασμό μας - το δικό μας RdbmsLoginModule δεν εξαρτάται από τον τρόπο με τον οποίο λαμβάνονται τα διαπιστευτήρια χρήστη (όνομα χρήστη / κωδικός πρόσβασης) και μπορούν έτσι να χρησιμοποιηθούν στα διαφορετικά περιβάλλοντα εφαρμογών που θα παρουσιάσουμε (είτε από τη γραμμή εντολών είτε από ένα JSP).