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