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

Σε προηγούμενο άρθρο είχαμε αναφερθεί στην ανάγκη ενσωμάτωσης της ασφάλειας στον κύκλο ζωής ανάπτυξης μιας εφαρμογής χρησιμοποιώντας διαδικασίες σχετικές με την ασφάλεια. Στο σημερινό άρθρο θα αναφερθούμε σε κατευθυντήριες γραμμές ή πρακτικές ασφάλειας (security guidelines) οι οποίες μπορούν να χρησιμοποιηθούν για να μειώσουν τους κινδύνους που συνδέονται με το σχεδιασμό ασφαλών εφαρμογών. Η υιοθέτηση τέτοιων πρακτικών μπορεί να οδηγήσει στην αντιμετώπιση επιθέσεων μειώνοντας κάποια κοινά λάθη που μπορεί να εμφανιστούν κατά την ανάπτυξη της εφαρμογής.

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

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

Επίσης ανάλογα με την υπό σχεδίαση εφαρμογή, οι τύποι ζητημάτων που πρέπει να αντιμετωπιστούν ποικίλλουν. Για παράδειγμα, όταν σχεδιάζετε μια ασφαλή εφαρμογή Ιστού, είναι σημαντικό να εφαρμόζετε πρακτικές που εξασφαλίζουν την αποτελεσματική αυθεντικοποίηση των χρηστών, να προστατεύετε τα δεδομένα καθώς διαβιβάζονται μέσα από δημόσια δίκτυα, να αποτρέπονται επιθέσεις όπως session hijacking, κλπ. Μερικά από τα ζητήματα που πρέπει να αντιμετωπιστούν φαίνονται στο Σχήμα 2.
Συνήθως οι πρακτικές αυτές οργανώνονται με βάση κάποιες κατηγορίες ευπαθειών όπου τα λάθη είναι πιο συχνά. Οι κατηγορίες αυτές μπορούν να σχετίζονται με θέματα επικύρωσης δεδομένων, αυθεντικοποίησης, έγκρισης εισόδου, κρυπτογράφησης ευαίσθητων δεδομένων, ελέγχου και καταγραφής συμβάντων. Ο Πίνακας 1 απαριθμεί το σύνολο των κατηγοριών που είναι κοινές για τους περισσότερους τύπους εφαρμογής μαζί με τα σχετικά πιθανά προβλήματα που μπορούν να εμφανιστούν λόγω κακής σχεδίασης.
Μια καλή οδηγία, εντούτοις, θα πρέπει να είναι κάτι περισσότερο από μια περιγραφή. Θα πρέπει να καθοδηγεί τον developer στην εφαρμογή της οδηγίας. Ας δούμε μερικά παραδείγματα σε σχέση με κάποιες από τις κατηγορίες που εμφανίζονται στον Πίνακα 1.

Επικύρωση δεδομένων
Η σωστή μορφή των δεδομένων που δίνονται σαν είσοδο σε μια εφαρμογή αποτελεί την πρώτη γραμμή άμυνας ενάντια σε επιθέσεις όπως XSS, SQL injection, buffer overflows, κλπ. Παρόλα αυτά όμως δεν υπάρχει μοναδική απάντηση στο τι αποτελεί σωστή αλλά και κακόβουλη είσοδος μεταξύ εφαρμογών. Μερικές πρακτικές που μπορείτε να εφαρμόσετε είναι οι παρακάτω:

  • Υποθέστε το χειρότερο: Η επικύρωση εισόδου πρέπει να ξεκινά με την υπόθεση ότι η είσοδος είναι κακόβουλη (μέχρι αποδείξεως του αντιθέτου). Αν η είσοδος έρχεται από κάποιο σημείο που δεν ανήκει στο κύκλο εμπιστοσύνης της εφαρμογής σας (αρχείο, χρήστης, βάση δεδομένων, κλπ.) πάντα ελέγχετε την είσοδο. Για παράδειγμα, αν περιμένετε δεδομένα από κάποια εξωτερικό web service πρέπει να είστε σίγουροι ότι στα δεδομένα δεν περιλαμβάνονται και κακόβουλες εντολές.
  • Μην βασίζεστε στον client: Μια εφαρμογή που τρέχει σε κάποιον server δε θα πρέπει να βασίζετε σε client κώδικα για έλεγχο της εισόδου. Αναρωτηθείτε τι θα γίνει αν ένας εισβολέας παρακάμψει τον client ή τις διαδικασίες ελέγχου. Χρησιμοποιείστε τον client για ένα πρώτο φιλτράρισμα αλλά μην βασιστείτε σε αυτόν για ασφάλεια.
  • Χρησιμοποιείστε μια default “deny” προσέγγιση: Ορίστε τι αποτελεί αποδεκτή είσοδο για τα πεδία της εφαρμογής σας (όσον αφορά το μήκος, τον τύπο τους, κλπ.) και απορρίψτε όλες τις άλλες εισόδους.

Αυθεντικοποίηση
Η αυθεντικοποίηση είναι η διαδικασία με την οποία επιβεβαιώνουμε την ταυτότητα ενός client ή την προέλευση ενός μηνύματος. Θα πρέπει να καθορίζουμε πότε χρειάζεται αυθεντικοποίηση (συνήθως όταν διασχίζεται ένα trust boundary) και να γνωρίζουμε με «ποιον» μιλάμε καθόλη τη διάρκεια ενός session (χρήση authentication tokens).
Η συνηθέστερη μέθοδος αυθεντικοποίησης είναι με τη χρήση user names και passwords. Μερικά ζητήματα που πρέπει να προσέξουμε εδώ περιλαμβάνουν τα εξής:

  • Αποφυγή επισφαλών καναλιών για τη μετάδοση των passwords: Σε αντίθεση περίπτωση είναι εύκολη η συλλογή των δεδομένων αυτών από έναν εισβολέα που παρακολουθεί το συγκεκριμμένο κανάλι. Η συνηθέστερη μέθοδος προστασίας εδώ είναι η χρήση SSL για τη δημιουργία ενός ασφαλούς καναλιού μετάδοσης των δεδομένων.
  • Αποφυγή αποθήκευσης των passwords ή άλλων πιστοποιητικών σε plaintext μορφή: Σε αντίθεση περίπτωση ένας εισβολέας που αποκτά πρόσβαση στο σύστημα μπορεί να διαβάσει όλο το password file ή να δημιουργήσει νέους λογαριασμούς. Αντίθετα, τα passwords πρέπει να αποθηκεύονται σε «encrypted» μορφή και να γίνεται ο έλεγχος κατά τη διαδικασία του logon. Προστασία από dictionary attacks μπορεί να επιτευχθεί με τη χρήση τυχαίων τιμών (salt) κατά τη διαδικασία αποθήκευσης του password.
  • Προστασία authentication tokens: Μετά την αρχική αυθεντικοποίηση χρειάζονται επιπλέον μέτρα ώστε να μην είναι δυνατές session hijacking attacks. Αλλιώς η κλοπή ενός authentication token μπορεί να οδηγήσει σε απόκτηση πρόσβασης από έναν εισβολέα.

Άλλες πρακτικές που μπορούν να βελτιώσουν τη αυθεντικοποίηση εφαρμογών περιλαμβάνουν τη χρήση lockout πολιτικών, την εκπνοή των credentials έπειτα από κάποια προκαθορισμένη ημερομηνία, την χρήση strong authentication μεθόδων, κλπ.

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

  • Μην ξανα-ανακαλύπτετε τον τροχό: Ποτέ μην αναπτύσσετε τις δικές σας μεθόδους και πρωτόκολλα κρυπτογράφησης καθώς χωρίς εκτεταμένη peer review μπορεί να εισάγετε «τρύπες» τις οποίες μπορεί να εκμεταλλευτεί ένας εισβολέας. Αντίθετα χρησιμοποιείτε πρωτόκολλα που έχουν δοκιμαστεί κατά κόρον και έχουν αποδειχτεί ασφαλή στην πράξη.
  • Χρησιμοποιείτε κατάλληλους αλγόριθμους και κλειδιά που να εξασφαλίζουν το απαραίτητο επίπεδο ασφαλείας: Για παράδειγμα, μην χρησιμοποιείτε DES με μήκος κλειδιού 56 bits. Χρησιμοποιείτε αντίθετα AES με κλειδιά 128 ή και ακόμα 256 bits αν θέλουμε τα δεδομένα μας να είναι ασφαλή για μεγαλύτερα διαστήματα. Αντίστοιχα, όσον αφορά αλγόριθμους public key cryptography, χρησιμοποιείτε κλειδιά μήκους τουλάχιστον 2048 bits. Παρόλα αυτά όμως η πραγματικότητα δεν είναι ποτέ τόσο απλή. Μεγαλύτερα κλειδιά δεν σημαίνει κατ’ ανάγκην και μεγαλύτερη ασφάλεια. Συγκρίνετε ένα κρυπτογραφικό αλγόριθμο με την κλειδαριά στην πόρτα του σπιτιού σας. Μπορεί να είναι πολύ δύσκολο για κάποιον να μπει στο σπίτι σας παραβιάζοντας την κεντρική είσοδο αλλά ίσως είναι πολύ πιο εύκολο να σπάσει το παράθυρο και να μπει μέσα.
  • Προστατεύστε τα κλειδιά που χρησιμοποιούνται από τους κρυπτογραφικούς αλγόριθμους.

Έλεγχος και καταγραφή συμβάντων (Auditing/Logging)
Θα πρέπει να ελέγχετε και να καταγράφετε τις δραστηριότητες που σχετίζονται με τα διαφορετικά επίπεδα της εφαρμογής σας. Χρησιμοποιώντας logs, μπορείτε να εντοπίσετε περίεργες δραστηριότητες, να αντιμετωπίσετε εξωτερικές επιθέσεις και να καταγράψετε τις δραστηριότητες των clients ή ακόμα και εσωτερικών χρηστών του συστήματος (administrators, κλπ) ώστε να σας βοηθήσουν σε μια forensics ανάλυση.
Οι τύποι των γεγονότων που πρέπει να καταγράφονται εξαρτώνται από το τύπο της εφαρμογής, αλλά μια συνηθισμένη λίστα πρέπει να περιλαμβάνει κατ’ ελάχιστον τα εξής: επιτυχημένες ή αποτυχημένες προσπάθειες πρόσβασης σε ένα σύστημα, τροποποίηση ή ανάκτηση δεδομένων, δημιουργία accounts ή άλλες administrative εντολές, κοκ. Επίσης τα log files θα πρέπει να ασφαλίζονται από μη εξουσιοδοτημένες χρήσεις ώστε ένας εισβολέας να μη μπορεί να καλύψει εύκολα τα ίχνη του.

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

  • Δώστε έμφαση πρώτα σε εκείνες τις πρακτικές που σχετίζονται άμεσα με απαιτήσεις αρχιτεκτονικής, τεχνολογίες που θα χρησιμοποιηθούν ή συμμόρφωση με πρότυπα. Για παράδειγμα, προσέξτε τις επιπτώσεις που μπορεί να έχει μια αλλαγή στο τύπο δικτύου που υποθέσατε για την εφαρμογή σας. Πόση ασφάλεια θα χάσετε αν υλοποιήσετε κάποια συγκεκριμένη αλλαγή;
  • Μην ξανα-ανακαλύπτετε τον τροχό αλλά χρησιμοποιείστε υπάρχουσες πρακτικές για τις οποίες υπάρχει διαθέσιμη γνώση.
  • Ενσωματώστε τις πρακτικές αυτές στη διαδικασία ανάπτυξης της εφαρμογής ώστε να έχετε το μέγιστο δυνατό αποτέλεσμα.
  • Εξοικοιωθείτε με το πλαίσιο ασφάλειας του οργανισμού σας ώστε να είστε βέβαιοι ότι δεν θα παραβιάσετε κάποιες πολιτικές ασφάλειας κατά τη διάρκεια χρήσης της εφαρμογής.

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

Τάσος Δημητρίου, PhD
Καθηγητής, Επικεφαλής, Αλγόριθμοι και Ασφάλεια Συστημάτων
Athens Information Technology
www.ait.edu.gr