Απομακρυσμένες συνδέσεις χωρίς κωδικό (passwordless ssh)

Ξεκίνησε από alkisg, 26 Οκτ 2009, 06:29:40 ΠΜ

« προηγούμενο - επόμενο »

alkisg

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

1. Εγκατάσταση openssh-server
Σε όσους υπολογιστές θέλουμε να συνδεθούμε (δηλαδή και στους clients) θα πρέπει να έχει εγκατασταθεί ο openssh-server:
sudo apt-get install openssh-server

Δεν χρειάζεται κάποια ειδική ρύθμιση.

2. Δημιουργία κλειδιού ssh
Από το λογαριασμό teacher στον server, εκτελούμε:
ssh-keygen -f ~/.ssh/id_rsa -P ''


3. Να μην ελέγχεται η IP των clients
Κάθε φορά που συνδεόμαστε σε κάποιον υπολογιστή π.χ. client01.local, το ssh αποθηκεύει την IP του στο αρχείο ~/.ssh/known_hosts του λογαριασμού μας.
Εάν ο client01.local αλλάξει IP, το ssh δεν θα μας αφήσει να συνδεθούμε για λόγους ασφαλείας, και θα πρέπει να αφαιρέσουμε την παλιά IP του με την εντολή ssh-keygen -R client01.local για να μπορέσουμε να συνδεθούμε.
Επειδή οι clients παίρνουν δυναμικά IP από τον router, ο έλεγχος της IP δεν είναι επιθυμητός. Επομένως, τον απενεργοποιούμε δίνοντας:
echo "CheckHostIP no" >> ~/.ssh/config
echo "StrictHostKeyChecking no" >> ~/.ssh/config


4. Αντιγραφή του κλειδιού στους απομακρυσμένους λογαριασμούς
Για κάθε λογαριασμό π.χ. a1 και για κάθε υπολογιστή π.χ. client01.local στον οποίο θέλουμε να συνδεόμαστε αυτόματα, δίνουμε:
ssh-copy-id a1@client01.local

Μας ζητάει τον κωδικό του a1, τον εισάγουμε, και έτοιμοι.
(Ναι, οκ, είναι κουραστικό να το κάνουμε αυτό 120 φορές αν έχουμε 12 υπολογιστές και 10 τμήματα, ενώ είναι πιθανό να μην ξέρουμε καν τον κωδικό των μαθητών, γι' αυτό η διαδικασία αυτή θα αυτοματοποιηθεί. Επίσης το τελικό αρχείο /home/a1/.ssh/authorized_keys θα προστατευθεί με την chattr +i για να μην μπορεί να το διαγράψει ο μαθητής.)

5a. Δοκιμή σύνδεσης από τερματικό
Με
ssh a1@client01.local ls

θα πρέπει να μπορείτε να δείτε τα αρχεία του χρήστη a1 στον client01.local, ενώ με σκέτο ssh a1@client01.local θα πρέπει να μπορείτε να συνδεθείτε χωρίς να σας ζητηθεί κωδικός.

5b. Δοκιμή αντιγραφής αρχείων από τερματικό, για μετέπειτα μαζικές εντολές
Δώστε για παράδειγμα την παρακάτω εντολή:
gvfs-mount sftp://a1@client01.local

Θα πρέπει να εμφανιστεί στο ναυτίλο ο φάκελος του a1 στον client01.local χωρίς να ζητηθεί κωδικός.

Συνεχίστε τη δοκιμή με:
gvfs-ls sftp://a1@client01.local/home/a1

Θα πρέπει να σας δείξει τα αρχεία του a1 στον client01.local.
Παρεμπιπτόντως, τα αρχεία του απομακρυσμένου υπολογιστή θα πρέπει να φαίνονται και στον τοπικό φάκελο "/home/teacher/.gvfs/sftp για a1 στο client01.local".

Τέλος, δοκιμάστε:
echo "Δοκιμή" > /tmp/dokimi
gvfs-copy /tmp/dokimi sftp://a1@client01.local/home/a1


Θα πρέπει να δημιουργηθεί ένα δοκιμαστικό αρχείο, και να αντιγραφεί στον απομακρυσμένο χρήστη, θέτοντας αυτόματα τον απομακρυσμένο χρήστη ως ιδιοκτήτη του!

5c. Δοκιμή αντιγραφής αρχείων από το ναυτίλο
Αν στο ναυτίλο ανοίξετε π.χ. τρεις καρτέλες,
* Τα έγγραφά σας (/home/teacher/Έγγραφα),
* Τα έγγραφα του a1 στο client01.local (sftp://a1@client01.local/home/a1/Έγγραφα)
* Τα έγγραφα του a1 στο client02.local (sftp://a1@client02.local/home/a1/Έγγραφα)
θα πρέπει να μπορείτε να αντιγράφετε αρχεία μεταξύ τους, με το gvfs να θέτει αυτόματα τους κατάλληλους ιδιοκτήτες! Έχω την εντύπωση ότι αυτό, σε συνδυασμό με scriptάκια για μαζικό mount/unmount όλης της τάξης, είναι πιο βολικό από NFS! ;)

Δημήτρης Δαλαγιώργος

Παράθεση από: alkisg στις 26 Οκτ 2009, 06:29:40 ΠΜ
4. Αντιγραφή του κλειδιού στους απομακρυσμένους λογαριασμούς
Για κάθε λογαριασμό π.χ. a1 και για κάθε υπολογιστή π.χ. client01.local στον οποίο θέλουμε να συνδεόμαστε αυτόματα, δίνουμε:
ssh-copy-id a1@client01.local

Μας ζητάει τον κωδικό του a1, τον εισάγουμε, και έτοιμοι.
(Ναι, οκ, είναι κουραστικό να το κάνουμε αυτό 120 φορές αν έχουμε 12 υπολογιστές και 10 τμήματα, ενώ είναι πιθανό να μην ξέρουμε καν τον κωδικό των μαθητών, γι' αυτό η διαδικασία αυτή θα αυτοματοποιηθεί. Επίσης το τελικό αρχείο /home/a1/.ssh/authorized_keys θα προστατευθεί με την chattr +i για να μην μπορεί να το διαγράψει ο μαθητής.)

/usr/bin/ssh-copy-id: ERROR: No identities found

Άκυρο, δικό μου λάθος.
Ενάντια στην ηλιθιότητα, ακόμα και οι θεοί, μάταια αγωνίζονται.
Friedrich Schiller

Δημήτρης Δαλαγιώργος

Παράθεση από: alkisg στις 26 Οκτ 2009, 06:29:40 ΠΜ
Δώστε για παράδειγμα την παρακάτω εντολή:
gvfs-mount sftp://a1@client01.local

Θα πρέπει να εμφανιστεί στο ναυτίλο ο φάκελος του a1 στον client01.local χωρίς να ζητηθεί κωδικός.

Σε μένα κάνει mount το filesystem του client01, όχι μόνο το home directory του (αντίστοιχου) a1
Ενάντια στην ηλιθιότητα, ακόμα και οι θεοί, μάταια αγωνίζονται.
Friedrich Schiller

Δημήτρης Δαλαγιώργος

Παράθεση από: alkisg στις 26 Οκτ 2009, 06:29:40 ΠΜ
5c. Δοκιμή αντιγραφής αρχείων από το ναυτίλο
Αν στο ναυτίλο ανοίξετε π.χ. τρεις καρτέλες,
* Τα έγγραφά σας (/home/teacher/Έγγραφα),
* Τα έγγραφα του a1 στο client01.local (sftp://a1@client01.local/home/a1/Έγγραφα)
* Τα έγγραφα του a1 στο client02.local (sftp://a1@client02.local/home/a1/Έγγραφα)
θα πρέπει να μπορείτε να αντιγράφετε αρχεία μεταξύ τους, με το gvfs να θέτει αυτόματα τους κατάλληλους ιδιοκτήτες! Έχω την εντύπωση ότι αυτό, σε συνδυασμό με scriptάκια για μαζικό mount/unmount όλης της τάξης, είναι πιο βολικό από NFS! ;)

Υπάρχει τρόπος ν' ανοίγει ο ναυτίλος κατευθείαν με 12 καρτέλες, μία για κάθε μηχάνημα/user ώστε να μη χρειάζεται να ανοίγω τις καρτέλες με το χέρι;
Ενάντια στην ηλιθιότητα, ακόμα και οι θεοί, μάταια αγωνίζονται.
Friedrich Schiller

alkisg

Παράθεση από: Δημήτρης Δαλαγιώργος στις 27 Οκτ 2009, 10:11:13 ΠΜ
Υπάρχει τρόπος ν' ανοίγει ο ναυτίλος κατευθείαν με 12 καρτέλες, μία για κάθε μηχάνημα/user ώστε να μη χρειάζεται να ανοίγω τις καρτέλες με το χέρι;

Αυτή τη στιγμή όχι, γι' αυτό και είπα για nautilus extension. Υπάρχει όμως μια προτεινόμενη ιδέα σαν τα πολλαπλά bookmarks του firefox, αν υλοποιηθεί θα μας γλυτώσει από τον κόπο του extension.

Προς στιγμή, μπορούν είτε να μπουν σε bookmarks και να ανοίγουμε από το μενού αυτά που θέλουμε ένα ένα,
ή να κάνουμε ένα μικρό script που να καλεί το gvfs-mount για όλους τους clients, ώστε να τα βγάζει στη στήλη δέντρο στα αριστερά του Ναυτίλου. Αυτό θα είναι και το πρώτο που θα υλοποιήσουμε σε script, για τα υπόλοιπα βλέπουμε αργότερα.

alkisg

Για να μπορούμε να εκτελούμε διαχειριστικές εργασίες στους clients χωρίς sudo:

Στο βήμα 4, που κάνουμε
ssh-copy-id a1@client01.local

ουσιαστικά αντιγράφουμε το τοπικό αρχείο /home/teacher/.ssh/id_rsa.pub
στο απομακρυσμένο αρχείο /home/a1/.ssh/authorized_keys

Για να κάνουμε το ίδιο για το απομακρυσμένο /root, συνδεόμαστε σαν teacher στους clients, είτε σε έναν - έναν χωριστά είτε σε όλους ταυτόχρονα με το clusterssh, και δίνουμε τις παρακάτω εντολές:
sudo scp teacher@server.local:.ssh/id_rsa.pub /root/.ssh/authorized_keys
sudo chmod 600 /root/.ssh/authorized_keys


Πλέον, από τον server μπορούμε για παράδειγμα να δώσουμε:
ssh root@client01.local rm -rf /home/a1/.mozilla

για να διαγράψουμε τελείως τις ρυθμίσεις, τα bookmarks και την cache του firefox για τον χρήστη a1 στο pc client01, χωρίς να μας ζητήσει κωδικό κτλ.

Εννοείται ότι μπορούμε να χρησιμοποιήσουμε τη δυνατότητα εκτέλεσης διαχειριστικών εργασιών χωρίς sudo και μέσα από το clusterssh: απλά του λέμε να συνδεθεί ως root@clientXX.local αντί για a1@clientXX.local.

alkisg

"Βελτίωσα" την παραπάνω μέθοδο και την κατέγραψα στο αγγλικό wiki:
https://help.ubuntu.com/community/UbuntuLTSP/PasswordlessSSH

Τα νέα sch-scripts θα εφαρμόζουν αυτήν την παραλλαγή του passwordless ssh από προεπιλογής σε thin και fat clients. Έτσι, θα είναι πανεύκολος ο απομακρυσμένος χειρισμός τους (login, logout, reboot, shutdown κτλ).

odysseas

στο εργαστήριό μου τα μηχανήματα είναι standalone, με ubuntu 9.10.

ας υποθέσουμε ότι ο βασικός λογαριασμός στον server είναι ο lab-admin, ενώ στα μηχανήματα θέλουμε να συνδεόμαστε με ssh ως student (στον οποίο επιτρέπεται να τρέξει το sudo για να εκτελέσει τοπικές διαχειριστικές εργασίες).

Παράθεση από: alkisg στις 26 Οκτ 2009, 06:29:40 ΠΜ
ssh-keygen -f ~/.ssh/id_rsa -P ''
ssh-copy-id student@client01.local


η παραπάνω μέθοδος δουλεύει μια χαρά, με την έννοια ότι το ssh και το cluster-ssh συνδέονται χωρίς να ζητείται κωδικός.
ωστόσο, εντολές που απαιτούν sudo ζητούν κωδικό, παρόλο που έχω κάνει τα παρακάτω:

Παράθεση από: alkisg στις 02 Νοε 2009, 09:31:02 ΠΜ

Για να κάνουμε το ίδιο για το απομακρυσμένο /root, συνδεόμαστε σαν teacher student στους clients, είτε σε έναν - έναν χωριστά είτε σε όλους ταυτόχρονα με το clusterssh, και δίνουμε τις παρακάτω εντολές:
sudo scp lab-admin@server.local:.ssh/id_rsa.pub /root/.ssh/authorized_keys
sudo chmod 600 /root/.ssh/authorized_keys


έχουμε καμιά ιδέα τί θα μπορούσε να φταίει;

alkisg

Μετά από τις παραπάνω ενέργειες, ΔΕΝ κάνεις sudo. Συνδέεσαι απευθείας ως root, για παράδειγμα:
ssh root@client01.local poweroff

odysseas

ευχαριστώ πολύ για την απάντηση.

πρόκειται για παρανόηση -- το να συνδέομαι οπουδήποτε ως root στο ubuntu είναι κάτι που δεν το έχω συνηθίσει με αποτέλεσμα να παρερμηνεύσω τελείως τις οδηγίες.

βέβαια απ' όσο θυμάμαι η απευθείας σύνδεση ως root είναι by default απενεργοποιημένη, αλλά θα πρέπει να το δοκιμάσω στο εργαστήριο για να δω αν θα υπάρξει πρόβλημα.

alkisg

Παράθεση από: odysseas στις 23 Φεβ 2010, 11:25:23 ΜΜ
βέβαια απ' όσο θυμάμαι η απευθείας σύνδεση ως root είναι by default απενεργοποιημένη...

Ναι, ο root δεν έχει κωδικό και έτσι δεν μπορεί κάποιος να συνδεθεί με κωδικό. Αλλά το passwordless ssh δεν θέλει κωδικούς! ;)

Όλα αυτά είναι πλήρως αυτοματοποιημένα με τους fat clients και τα sch-scripts, δηλαδή ο διαχειριστής δεν χρειάζεται να κάνει τίποτα από τα παραπάνω, το root ssh είναι στημένο από προεπιλογής.

Όποιος θέλει δοκιμάζει να ακολουθήσει τις οδηγίες εγκατάστασης,
  http://wiki.ubuntu-gr.org/sch-scripts/Εγκατάσταση
και δίνει ανατροφοδότηση για ό,τι του λείπει ώστε να τα βρουν έτοιμα όσοι βάλουν το Ubuntu 10.04 τον Απρίλη που θα βγει επίσημα.

Δημήτρης Δαλαγιώργος

Για να κάνω το ανάποδο τι χρειάζεται;

Π.χ. θέλω ν' αντιγράψω στον server όλες τις εργασίες των παιδιών. Δίνω κάτι σαν:

sudo find /home/ -name '*.odt' -execdir scp '{}' localadm@server.local:/tmp/finished/ ';'


ώστε να βρει όλα τα αρχεία του Writer και να τα αντιγράψει στον server στο φάκελο /tmp/finished. Κάθε φορά που βρίσκει ένα αρχείο και θέλει να το αντιγράψει μου ζητάει το password του localadm στον server. Μπορώ να το αλλάξω αυτό;
Ενάντια στην ηλιθιότητα, ακόμα και οι θεοί, μάταια αγωνίζονται.
Friedrich Schiller