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

Εξέλιξη και έννοιες ασφάλειας Java, Μέρος 3: Ασφάλεια εφαρμογών

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

Αυτό το άρθρο, το τρίτο της σειράς, θα καλύψει τις διάφορες απαιτήσεις για την ασφαλή εκτέλεση κώδικα Java που έχει ληφθεί από ένα δίκτυο. Αν και ο κωδικός κινητής τηλεφωνίας δεν είναι μια επαναστατική ιδέα, η Java και το Διαδίκτυο παρουσιάζουν μερικές μοναδικές προκλήσεις για την ασφάλεια των υπολογιστών. Η εξέλιξη της αρχιτεκτονικής Java και ο αντίκτυπός της στην πυρήνα της ασφάλειας Java συζητήθηκε στα Μέρη 1 και 2. Αυτό το άρθρο ακολουθεί μια διαφορετική αντιμετώπιση: μια πρακτική προσέγγιση για τη σύνδεση όλων των εννοιών, αναπτύσσοντας μια απλή μικροεφαρμογή που γράφει στο τοπικό σύστημα αρχείων .

Εξέλιξη και έννοιες ασφάλειας Java: Διαβάστε ολόκληρη τη σειρά!

  • Μέρος 1: Μάθετε τις έννοιες και τους όρους ασφάλειας του υπολογιστή σε αυτήν την εισαγωγική επισκόπηση
  • Μέρος 2: Ανακαλύψτε τα πλεονεκτήματα της ασφάλειας Java
  • Μέρος 3: Αντιμετώπιση της ασφάλειας της μικροεφαρμογής Java με αυτοπεποίθηση
  • Μέρος 4: Μάθετε πώς τα προαιρετικά πακέτα επεκτείνουν και ενισχύουν την ασφάλεια της Java
  • Μέρος 5: Το J2SE 1.4 προσφέρει πολλές βελτιώσεις στην ασφάλεια της Java

Στο παράδειγμα, ο πυρήνας της μικροεφαρμογής είναι η κρυπτογράφηση δημόσιου κλειδιού, που παρουσιάστηκε νωρίτερα σε αυτήν τη σειρά. Ο κωδικός που υπογράφεται χρησιμοποιώντας το ιδιωτικό κλειδί του υπογράφοντος μπορεί να εκτελεστεί σε υπολογιστές-πελάτες όταν το δημόσιο κλειδί που αντιστοιχεί στον υπογράφοντα θεωρείται αξιόπιστο στο αντίστοιχο μηχάνημα. Θα συζητήσουμε επίσης πώς τα αρχεία πολιτικής, τα οποία παρέχουν δικαιώματα και keystore, μπορούν να χρησιμοποιηθούν ως αποθετήριο για δημόσια και ιδιωτικά κλειδιά. Επιπλέον, θα επισημάνουμε τα εργαλεία ασφαλείας Java 2 SDK και το Netscape's πινακίδα, δεδομένου ότι επιτρέπουν την ανάπτυξη.

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

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

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

Ασφάλεια εφαρμογών

Ας ξεκινήσουμε την έρευνά μας εξετάζοντας την ασφάλεια των εφαρμογών. Στο Μέρος 2 είδαμε πώς η ασφάλεια Java εξελίχθηκε από ένα μοντέλο sandbox σε ένα μοντέλο ασφαλείας. Είδαμε επίσης ότι οι εφαρμογές (τοπικός κώδικας) από προεπιλογή αποκτούν μια ελεύθερη βασιλεία και δεν υπόκεινται στον ίδιο έλεγχο με τις μικροεφαρμογές (κωδικός με δυνατότητα λήψης δικτύου), οι οποίες συνήθως θεωρούνται μη αξιόπιστες. Σε μια αλλαγή από το παρελθόν, στην Java 2 οι εφαρμογές ασφαλείας μπορούν προαιρετικά να υπόκεινται στο ίδιο επίπεδο ελέγχου με τις μικροεφαρμογές.

Πρώτον, μια γρήγορη σημείωση για writeFile.java, ο κώδικας που χρησιμοποιείται σε αυτό το άρθρο για την απεικόνιση των δυνατοτήτων ασφαλείας στην Java 2. Αυτό το πρόγραμμα είναι μια ελαφρώς τροποποιημένη έκδοση του κώδικα της μικροεφαρμογής που παρέχεται από τη Sun, διαθέσιμο μέσω του Διαδικτύου για να απεικονίσει ορισμένα από τα χαρακτηριστικά της ασφάλειας Java 2. Το πρόγραμμα, τροποποιημένο για να παρέχει υποστήριξη εφαρμογών, επιχειρεί να δημιουργήσει και να γράψει ένα αρχείο στο τοπικό σύστημα αρχείων. Η πρόσβαση σε ένα τοπικό σύστημα αρχείων ελέγχεται από τον διαχειριστή ασφαλείας. Σε αυτό το άρθρο θα δούμε πώς μπορεί να επιτραπεί αυτή η συγκεκριμένη λειτουργία με ασφαλή τρόπο.

/ ** * Από προεπιλογή, αυτό δημιουργεί μια εξαίρεση ασφαλείας ως μικροεφαρμογή. * * Με το JDK 1.2 appletviewer, * εάν ρυθμίσετε το σύστημά σας ώστε να παραχωρεί μικροεφαρμογές που έχουν υπογραφεί από το "Duke" * και κατεβάσατε από τον Ιστότοπο λογισμικού Java για να γράψετε ένα αρχείο * στον κατάλογο / tmp (ή στο αρχείο με το όνομα "C: \ tmpfoo") "σε σύστημα * Windows), τότε αυτό το applet μπορεί να εκτελεστεί. * * @version JDK 1.2 * @author Marianne Mueller * @ Τροποποιήθηκε από τον Raghavan Srinivas [Rags] * / import java.awt. *; εισαγωγή java.io. *; εισαγωγή java.lang. *; εισαγωγή java.applet. *; Η δημόσια τάξη writeFile επεκτείνει το Applet {String myFile = "/ tmp / foo"; Αρχείο f = νέο αρχείο (myFile); DataOutputStream dos; public void init () {String osname = System.getProperty ("os.name"); if (osname.indexOf ("Windows")! = -1) {myFile = "C:" + File.separator + "tmpfoo"; }} δημόσια κενή βαφή (Graphics g) {try {dos = new DataOutputStream (new BufferedOutputStream (new FileOutputStream (myFile), 128)); dos.writeBytes ("Οι γάτες μπορούν να σας υπνωτίσουν όταν το περιμένετε λιγότερο \ n"); dos.flush (); dos.close (); g.drawString ("Έγραψε με επιτυχία το αρχείο με το όνομα" + myFile + "- ρίξτε μια ματιά!", 10, 10); } catch (SecurityException e) {g.drawString ("writeFile: catch ασφάλεια εξαίρεση", 10, 10); } catch (IOException αρχ) {g.drawString ("writeFile: catch i / o εξαίρεση", 10, 10); }} δημόσιος στατικός κενός κενός (String args []) {Frame f = new Frame ("writeFile"); writeFile writefile = νέο writeFile (); writefile.init (); writefile.start (); f.add ("Κέντρο", αρχείο εγγραφής); f.setSize (300, 100); στ. εμφάνιση (); }} 

Η εκτέλεση του bytecode που δημιουργείται σε Java 2 Runtime Environment, Standard Edition (JRE) θα επιτρέψει στην εφαρμογή να τροποποιήσει το αρχείο στο τοπικό σύστημα αρχείων από προεπιλογή, καθώς η προεπιλεγμένη πολιτική δεν υποβάλλει τις εφαρμογές Java 2 σε έναν διαχειριστή ασφαλείας. Αυτή η πολιτική είναι δικαιολογημένη επειδή οι εφαρμογές συνήθως δημιουργούνται τοπικά κώδικα και δεν πραγματοποιούνται λήψεις μέσω του δικτύου. Η ακόλουθη γραμμή εντολών παράγει το παράθυρο που φαίνεται στο Σχήμα 1, υποδεικνύοντας ότι το αρχείο δημιουργήθηκε και γράφτηκε.

$ java writeFile 

Για να υποβάλετε τον κώδικα στον διαχειριστή ασφαλείας Java 2, χρησιμοποιήστε την ακόλουθη γραμμή εντολών, η οποία θα πρέπει να παράγει τα αποτελέσματα που αναφέρονται στο Σχήμα 2. Παρατηρήστε ότι η εφαρμογή δημιούργησε μια εξαίρεση ασφαλείας που προκλήθηκε από μια προσπάθεια τροποποίησης του τοπικού συστήματος αρχείων. Ο διευθυντής ασφαλείας που περιελάμβανε ρητώς δημιουργεί την εξαίρεση.

$ java -Djava.security.manager writeFile 

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

Μπορείτε να ολοκληρώσετε μια ενδιάμεση πολιτική χρησιμοποιώντας ένα αρχείο πολιτικής. Για να το κάνετε αυτό, δημιουργήστε ένα αρχείο πολιτικής που ονομάζεται όλα. πολιτική στον κατάλογο εργασίας:

παραχωρήστε {άδεια java.io.FilePermission "<>", "write"; }; 

Η εκτέλεση του ίδιου κώδικα με την ακόλουθη γραμμή εντολών θα επιτρέψει την τροποποίηση του τοπικού συστήματος αρχείων:

$ java -Djava.security.manager -Djava.security.policy = all.policy writeFile 

Σε αυτό το παράδειγμα, η εφαρμογή υπόκειται στον διαχειριστή ασφαλείας, αλλά η συνολική πολιτική διέπεται από το αρχείο πολιτικής, το οποίο επέτρεπε όλα αρχεία στο τοπικό σύστημα αρχείων που θα τροποποιηθούν. Μια αυστηρότερη πολιτική θα μπορούσε να ήταν να επιτρέπει την τροποποίηση μόνο του σχετικού αρχείου - tmpfoo σε αυτήν την περίπτωση.

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

Ασφάλεια εφαρμογών

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

Η πολιτική κώδικα Java υπαγορεύεται κυρίως από CodeSource, η οποία περιλαμβάνει δύο πληροφορίες: τον τόπο από τον οποίο προήλθε ο κωδικός και το άτομο που τον υπέγραψε.

Appletviewer

Δημιουργήστε ένα αρχείο με το όνομα writeFile.html με τα ακόλουθα περιεχόμενα:

  Παράδειγμα ασφαλείας Java: Σύνταξη αρχείων 

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

$ appletviewer writeFile.html 

Σημειώστε ότι - σε αντίθεση με αυτό που θα συνέβαινε με μια εφαρμογή - το applet δημιούργησε μια εξαίρεση, καθώς η μικροεφαρμογή υπόκειται στον διαχειριστή ασφαλείας από προεπιλογή. Η εγκατάσταση μπορεί να διέπεται από μια προσαρμόσιμη πολιτική, εάν απαιτείται. Εκτελεί την ακόλουθη γραμμή εντολών:

appletviewer -J "-Djava.security.policy = all.policy" writeFile.html 

, όπως θα περίμενε κανείς, θα επέτρεπε την τροποποίηση του tmpfoo αρχείο, καθώς αυτό επιτρέπεται σύμφωνα με το αρχείο πολιτικής.

Πρόγραμμα περιήγησης

Η ασφάλεια των εφαρμογών στα προγράμματα περιήγησης προσπαθεί να αποτρέψει τις μη αξιόπιστες μικροεφαρμογές από την εκτέλεση δυνητικά επικίνδυνων λειτουργιών, ενώ ταυτόχρονα επιτρέπει τη βέλτιστη πρόσβαση σε αξιόπιστες εφαρμογές. Η ανάπτυξη ασφάλειας Applet στα προγράμματα περιήγησης είναι ουσιαστικά διαφορετική από αυτήν που έχουμε δει μέχρι τώρα, κυρίως λόγω των ακόλουθων λόγων:

  • Μια προεπιλεγμένη έλλειψη εμπιστοσύνης στον κώδικα που έχει ληφθεί μέσω του δικτύου
  • Ανεπαρκής πρόσβαση στις επιλογές της γραμμής εντολών για την εκτέλεση του JVM, καθώς το JVM φιλοξενείται στο πλαίσιο ενός προγράμματος περιήγησης
  • Ανεπαρκής υποστήριξη για ορισμένες από τις πιο πρόσφατες δυνατότητες ασφαλείας στα JVM που συνοδεύονται από προγράμματα περιήγησης

Όσον αφορά το πρώτο πρόβλημα, για να αποφευχθούν τα πιθανά προβλήματα που προκύπτουν από την εκτέλεση μη αξιόπιστου κώδικα, παλαιότερες εκδόσεις της Java χρησιμοποίησαν το μοντέλο sandbox (βλέπε "Sidebar 1: Sandbox Model"). Η εμπιστοσύνη είναι ένα κυρίως φιλοσοφικό ή συναισθηματικό ζήτημα, παρά ένα τεχνικό ζήτημα. Ωστόσο, η τεχνολογία μπορεί να βοηθήσει. Για παράδειγμα, ο κώδικας Java μπορεί να υπογραφεί χρησιμοποιώντας πιστοποιητικά. Σε αυτό το παράδειγμα, ο υπογράφων υπονοεί έμμεσα τον κωδικό υπογράφοντάς τον. Η ευθύνη είναι τελικά ο χρήστης που εκτελεί τον κωδικό να εμπιστεύεται την υπογράφουσα οντότητα ή όχι, δεδομένου ότι αυτά τα πιστοποιητικά εγγυώνται ότι ο κώδικας έχει πράγματι υπογραφεί από το συγκεκριμένο πρόσωπο ή τον οργανισμό.

Το δεύτερο πρόβλημα οφείλεται στην έλλειψη πρόσβασης στις επιλογές για την εκτέλεση του JVM στο περιβάλλον του προγράμματος περιήγησης. Για παράδειγμα, δεν υπάρχει απλός τρόπος ανάπτυξης και χρήσης προσαρμοσμένων αρχείων πολιτικής όπως θα μπορούσαμε στο προηγούμενο παράδειγμα. Αντ 'αυτού, τέτοιες πολιτικές θα πρέπει να καθοριστούν από αρχεία που βασίζονται στην εγκατάσταση του JRE. Οι προσαρμοσμένοι φορτωτές τάξης ή οι διαχειριστές ασφαλείας δεν μπορούν να εγκατασταθούν εύκολα.

Το τρίτο πρόβλημα, η έλλειψη υποστήριξης για τις τελευταίες εκδόσεις του JRE στο προεπιλεγμένο JVM με το πρόγραμμα περιήγησης, επιλύεται με τη χρήση της προσθήκης Java (βλ. "Sidebar 2: Java Plug-in Primer"). Πράγματι, ένα βασικό ζήτημα είναι ότι η τροποποίηση των αρχείων πολιτικής δεν είναι πολύ απλή. Δεδομένου ότι οι μικροεφαρμογές μπορούν να αναπτυχθούν σε χιλιάδες ή ακόμα και εκατομμύρια υπολογιστές-πελάτες, ενδέχεται να υπάρχουν περιβάλλοντα όπου οι χρήστες ενδέχεται να μην έχουν καλή κατανόηση της ασφάλειας ή να μην εξοικειωθούν με μεθόδους τροποποίησης του αρχείου πολιτικής. Η προσθήκη Java παρέχει μια λύση, αν και συνιστάται η χρήση αρχείων πολιτικής όπου είναι πρακτικό και εφαρμόσιμο.

Στη συνέχεια, θα εξετάσουμε με περισσότερες λεπτομέρειες την ασφάλεια της μικροεφαρμογής που περιλαμβάνει παραδείγματα υπογραφής κώδικα σε περιβάλλον προγράμματος περιήγησης με προσθήκη Java. Θα περιορίσουμε τη συζήτηση στην Java έκδοση plug-in 1.3, εκτός αν αναφέρεται ρητά διαφορετικά.

Η προσθήκη Java και η ασφάλεια

Η προσθήκη Java υποστηρίζει το τυπικό Java 2 SDK, Standard Edition (J2SE), συμπεριλαμβανομένου του μοντέλου ασφαλείας. Όλες οι μικροεφαρμογές εκτελούνται σύμφωνα με τον τυπικό διαχειριστή ασφαλείας της μικροεφαρμογής, η οποία αποτρέπει δυνητικά κακόβουλες εφαρμογές από την εκτέλεση επικίνδυνων λειτουργιών, όπως η ανάγνωση τοπικών αρχείων. Οι μικροεφαρμογές με υπογραφή RSA μπορούν να αναπτυχθούν χρησιμοποιώντας την προσθήκη Java. Επιπλέον, η προσθήκη Java επιχειρεί να εκτελέσει μικροεφαρμογές με τον ίδιο τρόπο τόσο στο Netscape Navigator όσο και στον Internet Explorer, αποφεύγοντας συγκεκριμένους πόρους του προγράμματος περιήγησης. Αυτό διασφαλίζει ότι μια μικροεφαρμογή με υπογραφή RSA θα λειτουργεί ταυτόσημα και στα δύο προγράμματα περιήγησης με την προσθήκη Java. Η προσθήκη Java υποστηρίζει επίσης HTTPS, μια ασφαλή έκδοση του HTTP.

Προκειμένου ένα πρόγραμμα περιήγησης ενισχυμένο με προσθήκη να εμπιστεύεται μια μικροεφαρμογή και να του παρέχει όλα τα προνόμια ή ένα σύνολο λεπτομερών αδειών (όπως καθορίζεται σε ένα αρχείο πολιτικής J2EE), ο χρήστης πρέπει να διαμορφώσει εκ των προτέρων την κρυφή μνήμη των αξιόπιστων πιστοποιητικών υπογραφής (ο .keystore αρχείο στο JRE 1.3) για να προσθέσετε το πρόγραμμα υπογραφής του applet. Ωστόσο, αυτή η λύση δεν κλιμακώνεται καλά εάν το applet πρέπει να αναπτυχθεί σε χιλιάδες υπολογιστές-πελάτες και μπορεί να μην είναι πάντα εφικτό, επειδή οι χρήστες μπορεί να μην γνωρίζουν εκ των προτέρων ποιος υπέγραψε το applet που προσπαθούν να εκτελέσουν. Επίσης, παλαιότερες εκδόσεις της Java προσθήκης υποστηρίζουν την υπογραφή κώδικα χρησιμοποιώντας DSA, η οποία δεν είναι τόσο ευρέως διαδεδομένη όσο η RSA.

Ένας νέος φορτωτής κατηγορίας, sun.plugin.security.PluginClassLoader στο Java plug-in 1.3, ξεπερνά τους περιορισμούς που αναφέρονται παραπάνω. Υλοποιεί υποστήριξη για επαλήθευση RSA και δυναμική διαχείριση εμπιστοσύνης.

Τα εργαλεία του κιτ ανάπτυξης λογισμικού (SDK)

Τα τρία εργαλεία που σχετίζονται με την ασφάλεια, που διατίθενται ως μέρος του Java 2 SDK, είναι:

  • βασικό εργαλείο - Διαχειρίζεται keystores και πιστοποιητικά
  • βάζο - Δημιουργεί και επαληθεύει τις υπογραφές JAR
  • εργαλείο πολιτικής - Διαχειρίζεται τα αρχεία πολιτικής μέσω ενός εργαλείου που βασίζεται σε GUI

Θα εξετάσουμε μερικές από τις σημαντικές επιλογές αυτών των εργαλείων στις παρακάτω ενότητες. Ανατρέξτε στην ενότητα Πόροι για πιο λεπτομερή τεκμηρίωση που σχετίζεται με συγκεκριμένα εργαλεία.

$config[zx-auto] not found$config[zx-overlay] not found