Η ενσωμάτωση της ασφάλειας στον κύκλο ζωής μιας εφαρμογής (από το σχεδιασμό μέχρι την τελική ανάπτυξη) μπορεί να βοηθήσει σημαντικά στην αποφυγή λαθών και ευπαθειών κατά τη χρησιμοποίηση της εφαρμογής.
Μπορεί να βελτιωθεί το επίπεδο ασφάλειας κατά ένα προβλέψιμο και επαναλαμβανόμενο τρόπο; Υπάρχει τρόπος να συνδεθεί η ανάπτυξη της εφαρμογής με σωστές διαδικασίας ασφάλειας; Υπάρχει ένα σύνολο τεχνικών που μπορεί να εφαρμοστεί με εγγυημένα αποτελέσματα; Σε αυτό και στα επόμενα άρθρα, θα προσπαθήσουμε να δώσουμε απαντήσεις στα παραπάνω ερωτήματα και θα δούμε συγκεκριμένες διαδικασίες, τις οποίες οι σχεδιαστές ασφαλών εφαρμογών μπορούν να εφαρμόσουν και να ενσωματώσουν σε αυτό που λέμε software development life-cycle.
Μερικές λανθασμένες προσεγγίσεις
Είστε επικεφαλής μιας ομάδας που αναπτύσσει μια εφαρμογή, η οποία πρόκειται να χρησιμοποιηθεί «εκεί έξω». Πώς μπορείτε να είστε βέβαιος ότι πήρατε όλα τα μέτρα ώστε η εφαρμογή σας να είναι ασφαλής; Το πιθανότερο είναι να αναπτύξατε πρώτα την εφαρμογή και στη συνέχεια να προσπαθήσατε να την κάνετε και ασφαλή. Αυτή είναι η προσέγγιση του τύπου «κάνε το να δουλέψει και μετά κάνε το σωστά», η οποία είναι δυστυχώς και η πιο διαδεδομένη στην ανάπτυξη εφαρμογών. Αυτή η μεθοδολογία οδηγεί σε μια διαδικασία που αγνοεί την ασφάλεια μέχρι την τελική φάση ελέγχου, με αποτέλεσμα, στη συνέχεια να πρέπει να διορθώσετε όλα τα λάθη που έγιναν σε προηγούμενα στάδια. Η υπόθεση εργασίας εδώ είναι ότι εύκολα μπορεί κάποιος να προσθέσει στο τέλος όση ασφάλεια χρειάζεται, για να ολοκληρωθεί σωστά η εφαρμογή. Δυστυχώς, η αδυναμία αυτής της προσέγγισης είναι ότι μια λανθασμένη επιλογή στην αρχή, μπορεί να έχει δυσάρεστες συνέπειες αργότερα. Έτσι, οι προοπτικές που ανοίγονται μπροστά σας είναι μόνο δύο: Ή θα παρακάμψετε τις χρονοβόρες διαδικασίες, υποβιβάζοντας την ασφάλεια ακόμα περισσότερο ή θα επεκτείνετε το χρόνο παράδοσης, ρισκάροντας να μείνετε πίσω στο χρονοδιάγραμμα της εφαρμογής. Το μεγάλο λοιπόν ερώτημα είναι: αν αφήνετε τις σημαντικότερες αποφάσεις για το τέλος, πώς μπορείτε να είστε βέβαιοι ότι έχετε αναπτύξει την εφαρμογή σας, έτσι ώστε να πετύχετε τους αντικειμενικούς σας στόχους;
Αντίστοιχα, το να προσπαθήσει να εξετάσει κανείς όλα τα πιθανά προβλήματα ασφαλείας στην αρχή, είναι εξίσου λανθασμένη προσέγγιση. Σε αυτήν την περίπτωση, έχοντας καλύψει όλες τις δυνατές επιλογές αρχικά, δεν ασχολείστε με την ασφάλεια ξανά, έως ότου δείτε την πρώτη ευπάθεια στο απελευθερωμένο προϊόν. Γενικά, αν και το να εξετάζει κανείς τα προβλήματα ασφαλείας από την αρχή δεν είναι άσχημη επιλογή, ωστόσο η προσέγγιση αυτή αγνοεί ότι οι αποφάσεις (όχι απαραίτητα για ζητήματα ασφαλείας) που παίρνετε κατά τη διάρκεια ανάπτυξης της εφαρμογής, μπορεί να έχουν επιπτώσεις αργότερα στην ίδια την ασφάλεια της εφαρμογής.
Τέλος, το να χρησιμοποιεί κάποιος διαδεδομένες πρακτικές, δεν σημαίνει απαραίτητα ότι πετυχαίνουμε καλύτερη ασφάλεια. Σε αυτήν την περίπτωση, είναι κοινό να ακούμε εκφράσεις όπως: «είμαστε ασφαλείς, έχουμε ένα firewall» ή «είμαστε ασφαλείς, χρησιμοποιούμε SSL». Το πρόβλημα εδώ είναι ότι δεν έχουμε καταλάβει ποιος είναι ο στόχος και όλη η προσπάθεια είναι συχνά χωρίς όφελος. Περισσότερη ασφάλεια δεν σημαίνει απαραίτητα καλύτερη ασφάλεια. Στην πραγματικότητα, μπορεί να επιβαρύνετε τη χρησιμότητα, τη συντηρησιμότητα ή την απόδοση του συστήματος, χωρίς καθόλου να βελτιώνετε την ασφάλεια.
Η σωστή προσέγγιση
Για να σχεδιάσετε, χτίσετε, αλλά και να αναπτύξετε χρήσιμες και ασφαλείς εφαρμογές, πρέπει να ενσωματώσετε την ασφάλεια στον κύκλο ζωής ανάπτυξης των εφαρμογών σας. Αυτό επιτυγχάνεται χρησιμοποιώντας κατά την ανάπτυξη λογισμικού, δραστηριότητες, σχετικές με την ασφάλεια. Οι δραστηριότητες αυτές περιλαμβάνουν κατ’ ελάχιστον τα εξής: προσδιορισμό των στόχων ασφάλειας, εφαρμογή σωστών τεχνικών και αρχών σχεδιασμού, δημιουργία μοντέλου απειλών, αναθεώρηση της αρχιτεκτονικής και του κώδικα της εφαρμογής, εκτέλεση δοκιμών με έμφαση στην ασφάλεια κ.ο.κ. Επιπλέον, η ενσωμάτωση της ασφάλειας στον κύκλο ζωής ανάπτυξης μιας εφαρμογής, αποτελεί έναν πρακτικό τρόπο για να ισορροπηθεί η ασφάλεια με άλλες ποιοτικές ιδιότητες, όπως η απόδοση, η ευελιξία, και η δυνατότητα χρησιμοποίησης της εφαρμογής.
Οι βασικές αρχές της παραπάνω μεθόδου μπορούν να συνοψιστούν στα εξής:
- Μην αφήνετε την ασφάλεια για το τέλος: Το σχέδιο ασφάλειας, οι ασφαλείς πρακτικές κωδικοποίησης, και η δοκιμή για την ασφάλεια, πρέπει να αποτελούν ένα αναπόσπαστο τμήμα των διαδικασιών ανάπτυξης των εφαρμογών σας.
- Προσδιορίστε τους στόχους σας: Κατανοήστε από την αρχή ποιοι είναι οι στόχοι και οι απαιτήσεις ασφάλειας της εφαρμογής σας. Αυτοί οι στόχοι θα διαδραματίσουν έναν κρίσιμο ρόλο στη διαμόρφωση του μοντέλου απειλών, την αναθεώρηση του κώδικα αλλά και τις τελικές δοκιμές.
- Γνωρίστε τον εχθρό σας: Αναλύστε την εφαρμογή σας με ένα δομημένο και συστηματικό τρόπο, για να αναγνωρίσετε τυχόν απειλές και ευπάθειες. Η δραστηριότητα αυτή θα σας επιτρέψει να προσδιορίσετε και να καταλάβετε καλύτερα τις απειλές και τους κινδύνους που κάθε απειλή εισάγει, αλλά και να αποκαλύψετε τυχόν ευπάθειες που θα σας καθοδηγήσουν στην υλοποίηση της εφαρμογής.
- Χρησιμοποιήστε μια επαναληπτική προσέγγιση: Μερικές δραστηριότητες, όπως η αναθεώρηση κώδικα, η μοντελοποίηση των απειλών και ο έλεγχος (testing) πρέπει να εκτελεστούν πολλές φορές κατά τη διάρκεια της ανάπτυξης, ώστε να μεγιστοποιηθεί η ασφάλεια της εφαρμογής.
Βασικές δραστηριότητες ανάπτυξης
Οι τρεις βασικές δραστηριότητες του κύκλου ζωής μιας εφαρμογής (Σχήμα 1) περιλαμβάνουν την ανάλυση απαιτήσεων, το σχεδιασμό/αρχιτεκτονική και τον έλεγχο της εφαρμογής [1,2,3].
Η ανάλυση των απαιτήσεων έχει σαν στόχο να καθορίσει επακριβώς τι απαιτείται για το χτίσιμο μιας εφαρμογής. Συνήθως υπάρχει μια αφηρημένη ιδέα αυτού που θέλουμε να πετύχουμε, αλλά όχι τι μπορεί να χρησιμοποιηθεί για να φτάσουμε στον τελικό στόχο. Οι ελλιπείς, διφορούμενες ή ακόμα και αντιφατικές απαιτήσεις, θα πρέπει να αναγνωριστούν και να αφαιρεθούν. Επιπλέον, η ανάλυση θα βοηθήσει να εντοπίσουμε το είδος των υποδομών που θα απαιτηθούν για να παραδοθεί η εφαρμογή. Αυτό σημαίνει ότι θα πρέπει να εντοπιστούν οι επιδράσεις των απαιτήσεων πάνω στην ΙΤ υποδομή, στους προμηθευτές, στην ασφάλεια, δικτύωση, ικανότητα υποστήριξης κ.ο.κ.
Η αρχιτεκτονική αναφέρεται σε μια πιο αφηρημένη αντιπροσώπευση της εφαρμογής, που στόχο έχει να ελέγξει αν η υπό ανάπτυξη εφαρμογή θα καλύψει τις απαιτήσεις, καθώς επίσης και να εξασφαλίσει ότι τυχόν νέες απαιτήσεις θα μπορέσουν να ενσωματωθούν σχετικά εύκολα, αργότερα. Η δραστηριότητα αυτή εξετάζει επίσης τις διεπαφές (interfaces) με άλλα συστήματα λογισμικού, καθώς επίσης με το hardware και το λειτουργικό σύστημα. Η αναθεώρηση της αρχιτεκτονικής είναι μια άσκηση, η οποία είναι πολύτιμη όταν γίνεται νωρίς, ώστε να βοηθήσει στη διαμόρφωση του τελικού σχεδιασμού.
Ο έλεγχος (testing) αποτελεί ένα σημαντικό τμήμα της διαδικασίας ανάπτυξης της εφαρμογής, καθώς εξασφαλίζει ότι τα τυχόν λάθη (bugs) θα γίνουν αντιληπτά όσο το δυνατό νωρίτερα.
Οι δραστηριότητες αυτές, μαζί με κάποιες ακόμα, φαίνονται επίσης στην πρώτη στήλη του Σχήματος 2. Στο ίδιο σχήμα φαίνονται επίσης οι δραστηριότητες με έμφαση στην ασφάλεια, οι οποίες θα πρέπει να ενσωματωθούν στον κύκλο ζωής της εφαρμογής.
Οι σχετικές με την ασφάλεια δραστηριότητες που πρέπει να αποτελούν αναπόσπαστο τμήμα του κύκλου ζωής της εφαρμογής, εξετάζονται πιο αναλυτικά στη συνέχεια:
- Στόχοι ασφάλειας: Καθορίστε τους στόχους και τις απαιτήσεις ασφάλειας νωρίς στη διαδικασία ανάπτυξης της εφαρμογής. Οι στόχοι ασφάλειας θα επηρεάσουν την εμπιστευτικότητα, την ακεραιότητα και τη διαθεσιμότητα των δεδομένων και της εφαρμογής σας. Αν δεν γνωρίζετε ποιοι είναι αυτοί οι στόχοι, θα είναι δύσκολο να αναπτύξετε μια ασφαλή εφαρμογή. Οι στόχοι αυτοί χρησιμοποιούνται μεταξύ άλλων για να σας καθοδηγήσουν στη μοντελοποίηση απειλών, στην αναθεώρηση του κώδικα, στον προγραμματισμό του ελέγχου και των δοκιμών ασφαλείας κ.ο.κ.
- Ενδεδειγμένες πρακτικές για την ασφάλεια: Για να αποφύγετε πολλές από τις ευπάθειες που εισάγονται από φτωχές σχεδιαστικές επιλογές, η δραστηριότητα σχεδιασμού θα πρέπει να χρησιμοποιεί ενδεδειγμένες πρακτικές και αρχές. Υιοθετώντας ένα σύνολο διαδεδομένων πρακτικών, θα μπορέσετε να αποφύγετε κοινά λάθη και να εστιάσετε σε εκείνες τις περιοχές, όπου τα λάθη ασφάλειας είναι τα πιο συχνά.
- Μοντελοποίηση απειλών: Η μοντελοποίηση απειλών είναι η διαδικασία που θα σας βοηθήσει να προσδιορίσετε τις απειλές, τις επιθέσεις, τις ευπάθειες αλλά και τα αντίμετρα που σχετίζονται με την εφαρμογή σας. Η μοντελοποίηση απειλών χρησιμοποιείται για να προσδιορίσετε πότε και πού απαιτούνται περισσότεροι πόροι για τη μείωση των απειλών, καθώς είναι μάλλον απίθανο ή/και πολυέξοδο να χρειαστεί να έχετε μια απάντηση για όλες τις δυνατές απειλές.
- Αρχιτεκτονική και σχεδιασμός για την ασφάλεια: Η διαδικασία αναθεώρησης αρχιτεκτονικής αναλύει την αρχιτεκτονική και το σχεδιασμό από μια προοπτική ασφάλειας. Εξετάζει διάφορες πτυχές, συμπεριλαμβανομένης της υποδομής και του περιβάλλοντος που θα τρέξει η εφαρμογή σας, σας βοηθά να δώσετε έμφαση στα σημεία που σχετίζονται με το πλαίσιο ασφάλειας της εφαρμογής σας (επικύρωση και αυθεντικοποίηση δεδομένων, χρήση κρυπτογραφίας, exception management, auditing και logging κ.λπ.) και σας επιτρέπει να αποτιμήσετε τις επιλογές που σχετίζονται με τα διαφορετικά επίπεδα της εφαρμογής σας (presentation, business και data layers). Επιπλέον, ενσωματώνοντας τακτικές αναθεωρήσεις της αρχιτεκτονικής ασφάλειας, θα αποφύγετε δαπανηρές επαναλήψεις αργότερα, στον κύκλο ζωής της εφαρμογής.
- Αναθεώρηση κώδικα με έμφαση στην ασφάλεια: Όλος ο κώδικας πρέπει να υπόκειται σε διαρκείς επιθεωρήσεις, όπου η έμφαση θα πρέπει να είναι στον προσδιορισμό των αδυναμιών ασφάλειας. Αυτό πρέπει να αποτελεί μια συνεχή δραστηριότητα κατά τη διάρκεια των φάσεων ανάπτυξης και δοκιμής του κύκλου ζωής της εφαρμογής. Η διαδικασία αυτή θα σας επιτρέψει να ελαχιστοποιήσετε τα λάθη υλοποίησης, πριν η εφαρμογή χρησιμοποιηθεί σε πραγματικό περιβάλλον. Αν και τα σχεδιαστικά λάθη είναι τα πιο ακριβά για να διορθωθούν, τα λάθη υλοποίησης είναι τα πιο συχνά.
- Δοκιμές ασφάλειας: Χρησιμοποιήστε μια προσέγγιση βασισμένη σε κινδύνους (risk based) και τα αποτελέσματα της μοντελοποίησης απειλών, για να καθορίσετε το πεδίο δραστηριοτήτων ελέγχου και των σχεδίων δοκιμών σας. Ο έλεγχος θα πρέπει να γίνεται επίσης για την επιβεβαίωση των σχεδιαστικών επιλογών που έγιναν σε προηγούμενες φάσεις.
- Deployment reviews: Η δραστηριότητα αυτή θα σας βοηθήσει να εξασφαλίσετε ότι configuration προβλήματα γίνονται αντιληπτά, προτού οδηγήσουν σε ευπάθεια της εφαρμογής σας. Ακόμα και η πιο ασφαλής εφαρμογή μπορεί να τεθεί σε κίνδυνο από κάποιο deployment πρόβλημα σε ένα δίκτυο ή σε κάποιο host.
Συμπέρασμα
Η ενσωμάτωση της ασφάλειας στον κύκλο ανάπτυξης μιας εφαρμογής, θα σας βοηθήσει να στρέψετε συστηματικά τις προσπάθειές σας στις περιοχές εκείνες όπου τα λάθη είναι τα πιο συχνά. Συνοπτικά, αναφέρουμε ξανά μερικά από τα βήματα που πρέπει να ακολουθούνται κατά το σχεδιασμό εφαρμογών ασφαλείας:
- Συγκεκριμενοποίηση των απαιτήσεων και των στόχων ασφαλείας της εφαρμογής
- Μοντελοποίηση απειλών
- Σχεδιασμός
- Επαλήθευση στόχων και έλεγχος
- Αναθεώρηση αρχιτεκτονικής και σχεδιασμού
- Αναθεώρηση κώδικα
- κ.ο.κ.
Είναι σημαντικό, όμως, κάθε επιμέρους δραστηριότητα να μην αντιμετωπίζεται ξεχωριστά, αλλά σε συνδυασμό με τις υπόλοιπες δραστηριότητες, ώστε τα αποτελέσματά τους να μπορούν να επηρεάσουν και αυτές. Για παράδειγμα, οι στόχοι ασφάλειας θα πρέπει να εξετάζονται παράλληλα με άλλους κρίσιμους επιχειρησιακούς στόχους, όπως την απόδοση, τη διαθεσιμότητα και την αξιοπιστία της εφαρμογής. Η μοντελοποίηση των απειλών θα πρέπει να γίνεται όχι μόνο για να αναγνωρίζονται οι τυχόν απειλές και ευπάθειες, αλλά και για να τροποποιούνται αποφάσεις που αφορούν το σχεδιασμό, την ανάπτυξη και τον έλεγχο της εφαρμογής. Τυχόν ζητήματα που προκύπτουν κατά τον έλεγχο και την αναθεώρηση του κώδικα, θα πρέπει να μπορούν να οδηγήσουν στην καταγραφή νέων απειλών που θα προστεθούν στο υπάρχον μοντέλο, το οποίο στη συνέχεια θα οδηγεί σε νέες αποφάσεις κατά τη διάρκεια του ελέγχου και της αναθεώρησης κώδικα.
Όλα αυτά ελπίζουμε ότι θα γίνουν αντιληπτά σε επόμενα άρθρα, καθώς θα εμβαθύνουμε σε κάθε μία από τις παραπάνω δραστηριότητες πιο αναλυτικά.
Βιβλιογραφία
[1] Software development process. http://en.wikipedia.org/wiki/Software_lifecycle
[2] Understanding Software Development Lifecycle
http://www.webopedia.com/DidYouKnow/Computer_Science/2008/Software_Development_Life_Cycle_SDLC.asp
[3] Web Application Security Engineering, ΙΕΕΕ Security & Privacy.
Τάσος Δημητρίου, PhD
Καθηγητής, Επικεφαλής, Αλγόριθμοι και Ασφάλεια Συστημάτων
Athens Information Technology
www.ait.edu.gr