Πρώτο commit
Αυτό το commit περιλαμβάνεται σε:
commit
8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές
198
content/articles/28/05_passwd.md
Κανονικό αρχείο
198
content/articles/28/05_passwd.md
Κανονικό αρχείο
|
@ -0,0 +1,198 @@
|
|||
+++
|
||||
title = 'Password encoding in UNIX systems'
|
||||
date = '2000-11-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Νίκος Μαυρογιαννόπουλος'
|
||||
issue = ['Magaz 28']
|
||||
issue_weight = 5
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Password encoding σε UNIX συστήματα, τι είναι, τι εναλλακτικές λύσεις έχουμε, και άλλες πληροφορίες.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
**1. Τι είναι το Password encoding;**
|
||||
--------------------------------------------------------------
|
||||
|
||||
**2. DES Password Encoding**
|
||||
-----------------------------------------------------
|
||||
|
||||
**3. MD5 crypt**
|
||||
-----------------------------------------
|
||||
|
||||
**4. Blowfish crypt (bcrypt)**
|
||||
-------------------------------------------------------
|
||||
|
||||
**5. Cracking Passwords**
|
||||
--------------------------------------------------
|
||||
|
||||
**6. Συμπεράσματα και γεγονότα**
|
||||
---------------------------------------------------------
|
||||
|
||||
**7. Παραπομπές**
|
||||
------------------------------------------
|
||||
|
||||
|
||||
### [1. Τι είναι το Password encoding;]{#s1}
|
||||
|
||||
Τα UNIX συστήματα μιας και είναι πολυχρηστικά, χρειάζονται κάποιο τρόπο για να ξεχωρίζουν τους χρήστες. Ο κάθε χρήστης διαθέτει ένα μοναδικό αριθμό (user id),
|
||||
το οποίο αντιστοιχεί σε κάποιο όνομα χρήστη (username). Οι παραπάνω αντιστοιχίες καθορίζονται στο αρχείο \"/etc/passwd\", ονομασμένο έτσι για ιστορικούς λόγους.
|
||||
Μια καταχώριση στο αρχείο αυτό θα μπορούσε να είναι:
|
||||
|
||||
nmav:x:500:4:Nikos Mavroyanopoulos:/home/nmav:/bin/bash
|
||||
|
||||
\
|
||||
Τα πεδία σε αυτό το αρχείο ξεχωρίζουν απο την ανω-κάτω τελεία \':\', ενώ τα πεδία που μας ενδιαφέρουν είναι το 1 που περιέχει το όνομα χρήστη - nmav - καθώς και
|
||||
το πεδίο 3 όπου αναφέρεται η ταυτότητα του χρήστη - 500.
|
||||
|
||||
Τα περισσότερα UNIX σύστηματα, για να πιστοποιήσουν την ταυτότητα του χρήστη χρησιμοποιούν συνθηματικές λέξεις, ή απλώς συνθηματικά (passwords). Αυτά τα
|
||||
συνθηματικά αλλάζουν με την εκτέλεση του \"/usr/bin/passwd\" προγράμματος, το οποίο ανανεώνει τη βάση συνθηματικών του συστήματος. Σε απλά συστήματα αυτή η βάση
|
||||
είναι ένα εκτυπώσιμο αρχείο, και στα περισσότερα παλαιά συστήματα αυτό ήταν το ίδιο το \"/etc/passwd\". Στα πιο νέα συστήματα είναι ένα αρχείο αναγνώσιμο μόνο
|
||||
απο τον διαχειριστή του συστήματος, και συνήθως είναι το \"/etc/shadow\".
|
||||
|
||||
Αντίθετα με αυτό που θα περίμενε κανείς, η βάση συνθηματικών του συστήματος δεν περιέχει τα ίδια τα συνθηματικά. Τα συνθηματικά κωδικοποιούνται μέσω ενός
|
||||
αλγορίθμου μίας φοράς ( [1](05_passwd-7.html#1)) και αποθηκεύονται. Με αυτόν τον τρόπο δεν μπορεί ούτε ο διαχειριστής του συστήματος να δει τα συνθηματικά των
|
||||
χρηστών (μπορεί όμως να τα αλλάξει). Μιας και τα συνθηματικά δεν υπάρχουν στην βάση ίσως να αναρωτηθήτε πως γίνεται η πιστοποίηση του χρήστη. Αν υποθέσουμε ότι
|
||||
ο αλγόριθμος μίας φοράς είναι PW(x), με x να είναι το συνθηματικό, τότε κατά την εισαγωγή του συνθηματικού(x) το σύστημα αρκεί να υπολογίσει πάλι το PW(x) και
|
||||
να το συγκρίνει με το αποθηκευμένο στην βάση.
|
||||
|
||||
|
||||
### [2. DES Password Encoding]{#s2}
|
||||
|
||||
Τα πρώτα UNIX συστήματα κωδικοποιούσαν τα συνθηματικά χρησιμοποιώντας ένα τροποποιημένο DES αλγόριθμο, με τετοιο τρόπο έτσι ώστε να μην μπορεί απο την
|
||||
κωδικοποιημενη μορφή να προκύψει το αρχίκο συνθηματικό. Ο μόνος τρόπος για να προκύψει το αρχικό συνθηματικό είναι η δοκιμή όλων των δυνατών συνδιασμών
|
||||
συνθηματικών (η διαδικασία αυτή συχνά καλείται brute force attack). Αυτό το είδος επίθεσης, ενώ αρχικά ήταν πρακτικά αδύνατο να εφαρμοστεί, τα τελευταία χρόνια,
|
||||
με την πρόοδο των υπολογιστών, μπορεί να εφαρμοστεί χωρίς ιδιαίτερα ακριβό εξοπλισμό. Ενα τυπικό UNIX έχει καταχώρισεις στο \"/etc/shadow\" της μορφής:
|
||||
|
||||
nmav:ZKZ/wHem5Uv:11000:0:99999:7:::
|
||||
|
||||
\
|
||||
Το δευτερο πεδίο περιέχει μια εκτυπώσιμη μορφή του DES encoded συνθηματικού. Τα δύο πρώτα του ψηφία είναι η εκτυπώσιμη μορφή ενός τυχαίου salt που αποτελείται
|
||||
απο 12 bits ( [2](05_passwd-7.html#2)). Χρησιμοποιείται ώστε να διαφοροποιεί την έξοδο του αλγορίθμου, ακόμα και σε ίδια συνθηματικά. Ενα συνθηματικό μπορεί να
|
||||
αποθηκευτεί με 212 τρόπους το πολύ.
|
||||
|
||||
Ο αλγόριθμος DES (Data Encryption Standard) είναι κρυπτογραφικός αλγόριθμος που λειτουργεί με 64 bit μπλοκ. Ήταν πρότυπο τις δεκαετίες του \'70 και \'80, αλλά
|
||||
είναι ξεπερασμένος σήμερα. Ο τρόπος με το οποίο χρησιμοποιείται είναι:
|
||||
|
||||
- εκκίνηση του DES
|
||||
- Μετατροπή του Expansion Permutation συναρτήσει του salt
|
||||
- Κρυπτογράφηση για 25 φορές 8 null bytes χρησιμοποιώντας σαν κλειδί το συνθηματικό του χρήστη
|
||||
- Το τελικό αποτέλεσμα είναι η εκτυπώσιμη μορφή των κρυπτογραφημένων 64 bit μαζί με τα 12 bit του salt.
|
||||
|
||||
Ο παραπάνω αλγόριθμος είναι ουσιαστικά αλγόριθμος μιας φοράς, αφού δεν υπάρχει τρόπος αντιστροφής της διαδικασίας και εξαγωγής του συνθηματικού απο την
|
||||
κωδικοποιημένη μορφή, χωρίς να δοκιμάσουμε όλους τους δυνατούς συνδυασμούς. Έχει το λιγότερο, την ασφάλεια του DES, αλγόριθμου δοκιμασμένου για αρκετά χρόνια.
|
||||
Ένας περιορισμός που έχει είναι ότι τα συνθηματικά περιορίζονται στους 8 χαρακτήρες από τους οποίους χρησιμοποιούνται τα 56 bits (λόγω του μικρού ευρους
|
||||
κλειδιών του DES).
|
||||
|
||||
Μιας και τα E-boxes του DES είναι σταθερά ανά salt, είναι δυνατό με κάποιο δυνατό υπολογιστή να δοκιμάσουμε όλα τα πιθανά συνθηματικά σε λογικό χρόνο. Ο DES
|
||||
όπως είδαμε χρησιμοποιεί μόνο 56 bits για κλειδί οπότε όλοι οι πιθανοί συνδιασμοί που πρέπει να δοκιμάσει κανείς είναι 256, αριθμός οχι υπερβολικά μεγάλoς.
|
||||
|
||||
Έτσι ενώ αρχικά τα κωδικοποιημένα συνθηματικά αποθηκεύονταν στο \"/etc/passwd\", αρχείο αναγνώσιμο απο όλους τους χρήστες του συστήματος, τα τελευταία χρόνια
|
||||
μεταφέρθηκαν σε ειδικό αρχείο αναγνώσιμο απο τον διαχειριστή μόνο του συστήματος. Αυτό η κίνηση φανέρωσε την αδυναμία του αλγορίθμου κωδικοποίησης να
|
||||
προστατέψει αποτελεσματικά τα συνθηματικά των χρηστών.
|
||||
|
||||
|
||||
### [3. MD5 crypt]{#s3}
|
||||
|
||||
Λύση στο παραπάνω πρόβλημα και στο ότι ο DES είναι κρυπτογραφικός αλγόριθμος και υπήρχε παλαιότερα δυσκολία εξαγωγής του από τις Η.Π.Α, κυρίως για τα μη
|
||||
εμπορικά UNIX λειτουργικά, έδωσε ο Paul-Henning Kamp για το FreeBSD λειτουργικό. Σχεδιάσε ένα αλγόριθμο κωδικοποίησης συνθηματικών βασισμένο στον MD5 (
|
||||
[3](05_passwd-7.html#3)) hash αλγόριθμο. Ο MD5 είναι απο τον σχεδιασμό του μίας φοράς (one-way), οπότε οι μετατροπές σε αυτόν ήταν μικρές, ενώ προστέθηκε salt
|
||||
απο 12 μέχρι 48 bits.
|
||||
|
||||
Ο αλγορίθμος αυτός σε γενικές γραμμές κωδικοποιεί το salt και το συνθηματικό, με τον MD5, με αρκετούς διαφορετικούς τρόπους, έτσι ώστε να καθυστερήσει την
|
||||
διαδικασία. Ο MD5 αλγόριθμος παράγει ένα 128 bit hash και αφού μετατραπεί σε εκτυπώσιμη μορφή μαζί με το salt αποθηκεύεται στο αρχείο συνθηματικών. Ενα τυπικό
|
||||
σύστημα με MD5 κωδικοποιημένα συνθηματικά θα έχει καταχωρίσεις στο /etc/shadow της μορφής:
|
||||
|
||||
nmav:$1$4Wcrq7pj$l8uWovJXI1QBP6MXRrWdt0:11000:0:99999:7:::
|
||||
|
||||
\
|
||||
Οι χαρακτήρες \'\$1\$\' καθορίζουν τον συγκεκριμένο αλγόριθμο που χρησιμοποιείται (versioning) και μιας και η DES κωδικοποίηση δεν χρησιμοποιεί τον χαρακτήρα
|
||||
\'\$\', δεν είναι πρόβλημα για ένα πρόγραμμα να τα διακρίνει. Το salt ξεχωρίζει απο την έξοδο του MD5 με τον χαρακτήρα \'\$\'.
|
||||
|
||||
O MD5 δεν έθετε πρακτικούς περιορισμούς στο μέγεθος του συνθηματικού του χρήστη. Είχε όμως το πρόβλημα του DES encoding\... έχει συγκεκριμένη πολυπλοκότητα και
|
||||
κάποια στιγμή στο μέλλον θα ήταν εφικτή η brute force attack και σε αυτόν, άρα θα έπρεπε να αντικατασταθεί και πάλι.
|
||||
|
||||
|
||||
### [4. Blowfish crypt (bcrypt)]{#s4}
|
||||
|
||||
Την λύση σε αυτή την αδυναμία δίνει ένας αλγόριθμος σχεδιασμένος απο τον Niels Provos και τον David Mazieres για το OpenBSD σύστημα. Ο αλγόριθμος αυτός είναι
|
||||
βασισμένος στον blowfish ( [4](05_passwd-7.html#4)) αλγόριθμο, με εκθετικά μεταβαλλόμενη πολυπλοκότητα O (2n), και το n καθορίζεται απο τον διαχειριστή του
|
||||
συστήματος. Ο τροποποιημένος αλγόριθμος καλείται eksblowfish, ή πιο αναλυτικά Expensive Key Schedule Blowfish.
|
||||
|
||||
Η επιλογή του blowfish έγινε λόγω του ότι διαθέτει s-boxes εξαρτώμενα από το κλειδί, και συνεπώς έχει πολύ μεγαλύτερη πολυπλοκότητα, κατά την εκκίνηση του, από
|
||||
τον DES αλγόριθμο. Επιπρόσθετα έχει πολύ μεγαλύτερο εύρος κλειδιών (448 bits), κάτι που δεν θέτει πρακτικούς περιορισμούς στο μέγεθος των συνθηματικών (55
|
||||
bytes).
|
||||
|
||||
Ο eksblowfish χρησιμοποιεί μια τροποποιημένη μορφή της δημιουργίας των s-boxes του αλγορίθμου, και ένα 128 bits salt. Σε γενικές γραμμές η λειτουργία του
|
||||
αλγορίθμου συνοψίζεται στο:
|
||||
|
||||
- Εκκίνηση του Blowfish (δημιουργία των s-boxes)
|
||||
- Από 1 μέχρι 2n τροποποίηση των s-boxes και των sub-keys συναρτήσει του salt και συναρτήσει του κλειδιού
|
||||
- Κρυπτογράφιση 64 φορές, μιας αλυσίδας χαρακτήρων (192 bits) με το κλειδί
|
||||
|
||||
Το κωδικοποιημένο string είναι η εκτυπώσιμη μορφή του salt και της εξόδου του αλγορίθμου. Ενα σύστημα με Bcrypt κωδικοποιημένα συνθηματικά θα έχει καταχωρίσεις
|
||||
στο /etc/shadow της μορφής:\
|
||||
|
||||
nmav:$2a$05$abcdefghijklmnopqrstuu5s2v8.iXieOjg/.AySBTTZIIVFJeBui:11000:0:99999:7:::
|
||||
|
||||
\
|
||||
Οπως παρατηρούμε και αυτός ο αλγόριθμος χρησιμοποιεί τους πρώτους χαρακτήρες (\'\$2a\$\'), του κωδικοποιημένου συνθηματικού για να δείξει την έκδοση του
|
||||
αλγορίθμου, ενώ πάλι ο χαρακτήρας \'\$\' χρησιμοποιείται σαν σημείο διαχωρισμού πεδίων. Το πρώτο πεδίο όπως είδαμε περιέχει την έκδοση του αλγορίθμου, το
|
||||
δεύτερο το μέγεθος του κόστους(n), ενώ το τρίτο περιέχει το 128 bits salt και το κωδικοποιημένο συνθηματικό.
|
||||
|
||||
Μια πρόχειρη υλοποίηση του bcrypt, καθώς και ένα patch για το Linux pam\_unix module, βρίσκεται στο <http://members.hellug.gr/nmav/bcrypt>. Στο
|
||||
<http://www.openbsd.org>, μπορούν να βρεθούν περισσότερες πληροφορορίες για τον αλγόριθμο, καθώς και η αρχική υλοποίηση του.
|
||||
|
||||
|
||||
### [5. Cracking Passwords]{#s5}
|
||||
|
||||
Η αδυναμία του DES encoding, να προσαρμοστεί στον χρόνο και στην συνεχώς αυξανόμενη υπολογιστική δύναμη, προκάλεσε την δημιουργία προγραμμάτων που προσπαθούσαν
|
||||
απο την κωδικοποιημένη μορφη να παράξουν το συνθηματικό σε σχετικά μικρό χρόνο. Τα προγράμματα αυτά ονομάστηκαν password crackers, και βασίζοντουσαν στην χαλαρή
|
||||
επιλογή συνθηματικών απο τους χρήστες, αλλά καθώς το υλικό βελτιωνώταν, το «σπάσιμο» ενός όχι πολυ σύνθετου συνθηματικού έγινε εφικτό. Αρχικά βασίζονταν κυρίως
|
||||
σε κάποιο λεξικό που κρατάει συνθηματικά που επιλέγαν πιο συχνά οι χρήστες (dictionary attack). Πιο τελευταία προγράμματα χρησιμοποιούν αρκετά πιο εξελιγμένες
|
||||
τεχνικές.
|
||||
|
||||
Μερικά προγράμματα είναι:
|
||||
|
||||
- John the Ripper του \"Solar Designer\"
|
||||
- QCrack του \"Crypt Keeper\"
|
||||
- Crack του Alec Muffett
|
||||
|
||||
Μια ενδιαφέρουσα ερευνα για τις cracking εφαρμογές και την αποδοσή τους έγινε από τον Kurt Hockenbury και μπορεί να βρεθεί στο
|
||||
<http://attila.stevens-tech.edu/~khockenb/crypt3.html>. Στο κείμενο αυτό παρουσιάζεται η αναποτελεσματικότητα του DES σε συνθηματικά με λιγότερους απο 6
|
||||
χαρακτήρες και σε ορισμένες μορφές συνθηματικών με 8 χαρακτήρες, ενώ το hardware που χρησιμοποιήθηκε είναι εύκολα προσβάσιμο απο οποιονδήποτε φοιτητή στο
|
||||
πανεπιστήμιο του.
|
||||
|
||||
|
||||
### [6. Συμπεράσματα και γεγονότα]{#s6}
|
||||
|
||||
Γενικά οι περισσότεροι διανομείς και εταιρίες παραγωγής UNIX χρησιμοποιούν ακόμα την DES κωδικοποίηση, αν και ξεπερασμένη, για λόγους συμβατότητας. Αυτοί οι
|
||||
λόγοι συνήθως προκύπτουν όταν διαφορετικά συστήματα διαμοιράζονται αρχεία συνθηματικών πχ. με NIS ή NIS+. Ακόμα χειρότερα, μερικές εταιρίες ακόμη χρησιμοποιούν
|
||||
την παλιά μορφή του \"/etc/passwd\", που περιέχει το κωδικοποιημένο συνθηματικό.
|
||||
|
||||
Η \'bcrypt\' κωδικοποίηση δεν χρησιμοποιείται, μέχρι σήμερα, σε άλλα λειτουργικά πέρα απο το OpenBSD, κυρίως επειδή χρησιμοποιεί κρυπτογραφικό αλγόριθμο με
|
||||
μεγάλο εύρος κλειδιών, οπότε και η εξαγωγή απο τις Η.Π.Α (στις οποίες έχουν την έδρα τους οι περισσότερες επιχειρήσεις) δεν ήταν μέχρι πρόσφατα, νόμιμη.
|
||||
Ορισμένα συστήματα, όπως το QNX ( [5](05_passwd-7.html#5)), επέλεξαν διαφορετικούς τρόπους αποθήκευσης των συνθηματικών, αλλά απέτυχαν στον σχεδιασμό των
|
||||
αλγορίθμων τους. Περισσότερες πληροφορίες για την συγκεκριμένη αδυναμία του αλγορίθμου θα βρείτε στο <http://www.i-opener-linux.net/decrypt/>.
|
||||
|
||||
Βέβαια δεν αρκεί ένας καλός αλγόριθμος κωδικοποίησης για να είναι ασφαλής ένας λογαριασμός. Ο χρήστης έχει σημαντικό ρόλο στην ασφάλεια του λογαριασμού του και
|
||||
αυτό γιατί η επιλογή του συνθηματικού ανήκει σε αυτόν. Οσο μεγάλο και να είναι το salt, όσο καλός και να είναι ο αλγόριθμος, αν το συνθηματικό είναι \'12345\'
|
||||
είναι ζητημα δευτερολέπτων να βρεθεί. Για την αποφυγή ευκολων συνθηματικών από τους χρήστες η shadow μορφή των συνθηματικών, καθώς και η πιστοποίηση με PAM
|
||||
(Plugable Authentication Modules), επιτρέπουν στον διαχειριστή του συστήματος να θέσει μέγιστο χρόνο ζωής ενός συνθηματικού, επιτρεπόμενο χρόνο αλλαγής ενός
|
||||
συνθηματικού, λήξη λογαριασμών κλπ, κάτι που επιβάλεται σε ένα σύστημα που προορίζεται για ασφαλές. Επίσης υπάρχει η CrackLib του Alec Muffett, που μπορεί να
|
||||
χρησιμοποιηθεί απο το πρόγραμμα αλλαγής συνθηματικών, για να απορρίπτει τα πολύ εύκολα από αυτά.
|
||||
|
||||
|
||||
### [7. Παραπομπές]{#s7}
|
||||
|
||||
[]{#1} φοράς: Έστω y=A(x). Σε ένα αλγόριθμο μιας φοράς(A) αν γνωρίζουμε το y, είναι δύσκολο να υπολογίσουμε το x.
|
||||
|
||||
[]{#2} bits: 8 bit == 1 byte
|
||||
|
||||
[]{#3} MD5: Ο MD5 (ή Message Digest 5) είναι Αλγόριθμος που παράγει ένα 128 bits χαρακτηριστικό αριθμό για κάθε μηνύμα. Σχεδιαστηκε απο τον Ron Rivest και
|
||||
περιγράφεται στο RFC1321
|
||||
|
||||
[]{#4} blowfish: κρυπτογραφικός συμμετρικός αλγόριθμος σχεδιασμένος από τον Bruce Schneier []{#5} QNX: Real-time λειτουργικό σύστημα
|
||||
|
Φόρτωση…
Προσθήκη πίνακα
Προσθήκη υπερσυνδέσμου
Παράθεση σε νέο ζήτημα