password management [WAS: Peri asfaleias [was: ...]]
Nick Demou (enLogic)
ndemou at enlogic.gr
Mon Dec 19 19:48:45 EET 2005
Λιστόπουλα (aka μέλη της λίστας),
καταρχήν σας ευχαριστώ που δώσατε τόση σημασία στην προσπάθεια μου για
υλοποίηση ενός password management system λίγο διαφορετικού από τα άλλα
(με πολλούς χρήστες και κεντρική διαχείριση). Ομολογώ ότι δεν το
περίμενα γιατί πίστευα ότι δεν θα είχε ο κόσμος την όρεξη να ασχοληθεί
τόσο πολύ με τη δική μου "φαγούρα". Αυτός είναι και ο λόγος που σας
έβαλα άθελα μου να μαντεύετε τι κάνω και τι δεν κάνω με αποτέλεσμα να
σπαταλάμε όλοι μας χρόνο σε ερωτηματικά που μάλλον οφείλονται σε
παρεξηγήσεις. Γι' αυτό λοιπόν κάνω αυτό το post με μια καθαρή εξήγηση
των τεχνικών λεπτομερειών.
Με λίγη τύχη δεν θα έχω κάνει καμιά μεγάλη χαζομάρα και θα εκμεταλλευτώ
και τις γνώσεις σας για να προκύψει κάτι ακόμα καλύτερο ;-). Αν το
αποτέλεσμα σας φανεί αξιοπρεπές το δημοσιεύουμε και ως GPL κώδικα (λόγω
συνήθειας γιατί κατά τα άλλα έχει προτείνει μια καταπληκτική opensource
license η microsoft που φευ! δεν έχει πάρει OSI aproval).
Πρώτα τι θέλω να πετύχω:
έχουμε μια λίστα με not so critical passwords σαν την παρακάτω:
ΠΕΛΑΤΗΣ | Login | Password | Σχόλιο
----------------------------------------------------
Joe Smith | joe | aek123 | OTEnet account
Joe Smith | joes | 123 | acci account
...
1) θέλουμε να επιτρέπουμε σε μερικούς έμπιστους τεχνικούς να μπορούν να
μάθουν το password που κάθε φορά χρειάζονται για να βοηθήσουν τον κάθε
πελάτη.
2) Θέλουμε να ξέρουμε πότε και ποιος τεχνικός ζήτησε να δει πιο password
(ώστε να είμαστε σίγουροι ότι κοιτάνε μόνο ότι χρειάζεται για την
δουλεία τους)
3) Θέλουμε να μπορούν να δουν μόνο ένα password κάθε Χ λεπτά και εντώς
συγκεκριμένων ωρών τις ημέρας (ώστε αν κάποιος τεχνικός περάσει στην
"σκοτεινή πλευρά" να μειώσουμε το κακό στο ελάχιστο δυνατό και να
προλαβαίνουμε να αλλάξουμε τα passwords σε λογικό χρόνο).
Επιτρέπουμε όμως κάποιο burst στα queries (π.χ. 2-3) πριν θέσουμε σε
ενέργεια το όριο ένα query κάθε Χ λεπτά[1].
Και τώρα η μέθοδός που χρησιμοποίησα[4]:
(Α)
Σε ένα linux box το οποίο είναι σχετικά ασφαλές και το οποίο θα το
ονομάσω pass-server αποθήκευσα την λίστα με τα passwords σε ένα tab
delimited unencrypted[2] text file με όνομα passwords.txt
(Β)
Έφτιαξα ένα πολύ απλό πρόγραμμα (python script με όνομα query-pass.py)
το οποίο παρουσιάζει ένα command line interface που δουλεύει με τις εξής
τρεις απλές εντολές:
----------------------------------------------------------------
prompt> ? joe
10 Joe Smith | joe | OTEnet account
11 Joe Smith | joes | acci account
prompt> 10
Joe Smith | joe | aek123 | OTEnet account
prompt> passwd
----------------------------------------------------------------
Επεξηγήσεις:
1. "? joe": ο χρήστης ζήτησε να δει όλες τις εγγραφές που περιέχουν τη
λέξη joe. Το πρόγραμμα αποκρυπτογραφεί decrypts and opens το text αρχειο
και με ένα απλό σάρωμα δήχνει για κάθε matching line τα πάντα εκτός του
password συν τον αριθμό γραμμής
2. "10": ο χρήστης ζήτησε να δει το password της γραμμής #10
Η εντολή αυτή δουλέυει μόνο εφόσον το 10 ήταν στα αποτελέσματα της
τελευταίας αναζήτησης[3]
3. "passwd": καλείται η εντολή passwd του συστήματος
(Γ)
1. στον pass-server δημιούργησα έναν χρήστη για κάθε τεχνικό που πρέπει
να χρησοιμοποιεί το query-pass
2. Εφτιαξα ένα group query-pass και έκανα όλους τους χρήστες του
query-pass .py να το έχουν ως default group
3. Έβαλα το passwords.txt και το query-pass.py στο home dir του
query-pass group
4. Δήλωσα το query-pass.py ως shell για τους χρήστες (αντί του /bin/bash)
5. ρυθμισά το sshd.conf ώστε να έχουν access οι χρήστες
6. φρόντισα να μην επιτρέπω concurent logins στου χρήστες για να
απλοποιήσω τον έλεγχο του μέγιστου ρυθμού queries άνα ώρα
(δηλαδή στο /etc/security/limits.conf
a_user hard maxlogins 1)
7. εγκατέστησα το putty (ssh terminal client για windows) στα PCs των
χρηστών και φρόντισα να μπορούν να κάνουν ssh connection στον pass-server
8. θέλω να μάθω πως μπορώ να επιβάλω στους χρήστες να αλλάζουν το
password τους κάθε τόσο μέσω του συστήματος (να τους το λέω και να με
αγνοούν έχει πλάκα μόνο στην αρχή ;-) )
That's all!
Αν σας ενδιαφέρει το θέμα περιμένω με ενδιαφέρον παρατηρήσεις - απορίες.
_____________________
[1] μάλλον αξίζει τον κόπο το όριο queries/ώρα να αρχίσει να αυξάνει
εκθετικά με κάθε query αντί να είναι σταθερό. Άσε που θα έχει πλάκα και
ως κώδικας.
[2] Ο Παπαδόπουλος Γιάννης πρότεινε εξ αρχής το password.txt να είναι
encrypted. Αρχικά μου φάνηκε εύλογο αλλά τώρα δεν είμαι απόλυτα
σίγουρος. Η λογική μου είναι η εξής: Αν το αρχείο δεν είναι encrypted
τότε όλα τα passwords διαρρέουν με την μια τη στιγμή που θα γίνει
compromised το root account. Κακό αυτό. Από την άλλη ακόμα και αν το
κάνω encrypt εφόσον γίνει compromised το root account ο cracker απλά θα
περιμένει με ένα ταπεινό key-loger τον πρώτο χρήστη να δώσει password
και όλα χαθήκανε και πάλι. Βεβαία το δεύτερο σενάριο μου δίνει
περισσότερο χρόνο και ίσως καταλάβω ότι είμαι compromised πριν το κακό.
Γνώμες?
[3] τόσο για να μην βλέπει ο χρήστης κατά λάθος άλλα αντ' άλλων όσο και
για να μην έχει δικαιολογίες όταν κρυφοκοιτά passwords που δεν πρέπει.
Ίσα που σκέφτομαι να βάλω λίγη σάλτσα στον αριθμό για να μην υπάρχει
καμία περίπτωση να δεις κατά λάθος άλλο password.
[4] Υπάρχουν σίγουρα και άλλες πιθανές προσεγγίσεις.
Ο Γιάννης Παπαδόπουλος πρότεινε ήδη ένα web based περιβάλλον μέ
συνδέσεις https και database backend το οποίο προφανώς θα έκανε για τον
σκοπό μας. Ο λόγος εγώ που διάλεξα την παρούσα μέθοδο όταν έπρεπε να
κάνω την πρώτη απόπειρα υλοποίησης ήταν ότι ήθελα να είναι όσο πιο απλή
γίνεται. Αυτό αφενός γιατί έχω ελάχιστη εμπειρία σε προγραμματισμό σε
περιβάλλον linux (και αυτή μόνο σε python) και αφετέρου γιατί κάτι απλό
το ελέγχεις για τρύπες πολύ πιο εύκολα (και έχει inherently λιγότερες
έτσι κι αλλιώς).
Τώρα, αφότου έκανα τη δοκιμή μου, είδα ότι το αποτέλεσμα είναι ΟΚ:
Μπόρεσα να το φτιάξω (πολύ σημαντικό), δουλεύει (εξίσου σημαντικό),
δείχνει αξιόπιστο και είναι αρκετά απλό στη χρήση για έναν τεχνικό Η/Υ.
Το σημαντικότερο κατά τη γνώμη μου είναι ότι είναι όσο πιο απλό γίνεται
χωρίς να του λείπει κάποιο σημαντικό feature ("Everything should be made
as simple as possible, but not simpler.")
More information about the Linux-greek-users
mailing list