Harjoitus 4: SSHn asentaminen ja käyttö

w46 j-4 Automatisoi saman komennon ajaminen useilla koneilla ssh:n kautta. Käytä julkista avainta kirjautumiseen. Anna esimerkki ssh-agent:n käytöstä. Kopioi sama tiedosto useilta koneilta automaattisesti. Muuta ssh-palvelimen asetuksia niin, että vain tietty (tai tietyt) käyttäjät voivat kirjautua ssh:lla, ja niin, että vain protokolla ssh-2 on käytössä.

Sisällysluettelo

  1. Ajoitus
  2. Harjoitus
  3. Jälkikommentteja
  4. To-Do

Ajoitus

Suoritin harjoituksen 21.11.2005 aikana, luokassa 5013 koneella numero 05. Aikaa harjoitukseen kului kaiken kaikkiaan noin 3 tuntia, josta dokumenttien kirjoittaminen vei noin tunnin verran.


Harjoitus

Aloitin harjoituksen suorittamisen luomalla testikoneille käyttäjätunnuksen mika. Tämän jälkeen loggasin sisään kumpaankin työasemaan ssh:lla seuraavasti:

$ ssh mika@172.28.1.222 # tässä vaiheessa joudutaan antamaan vielä salasana -- mika 
$ ssh mika@172.28.1.228 # tässä vaiheessa joudutaan antamaan vielä salasana -- mika10

Yhteys kumpaankin kohdekoneeseen onnistui, joten seuraavana olikin sitten vuorossa julkisten avaimien siirto, jonka jälkeen kirjautuminen kummallekin kohdekoneelle onnistuu ilman salasanaa.

Mikäli tämän suorittaa manuaalisesti, tulee ensin luoda itsellensä ssh-avaimet. Tämä onnistuu komennolla:

$ ssh-keygen -t dsa

"ssh-keygen"-ohjelma kysyy muutamaan kysymykseen vastauksia, kuten esim. mille nimelle haluat että luotavat tiedostot tallennetaan ja minkä haluat laittaa avaimen salasanafraasiksi. Oletukset ovat ok, ja salasanaa ei määritellä, jotta voimme suorittaa kirjautumisen toisille koneille ilman salasanojen antamista. Vastaa siis kaikkiin kysymyksiin painamalla enteriä...

Tämän jälkeen kopioidaan avaimet kohdekoneille scp komennoilla:

$ cd
$ cd .ssh
$ scp id_dsa.pub mika@172.28.1.222: # tässä vaiheessa joudutaan antamaan vielä salasana -- mika
$ scp id_dsa.pub mika@172.28.1.228: # tässä vaiheessa joudutaan antamaan vielä salasana -- mika10

Kun tiedostot on kopioitu kohdekoneille, tulee ne vielä siirtää käyttäjän kotihakemistossa olevaan .ssh-hakemistoon ja uudelleen nimetä nimelle authorized_keys. Lisäksi tunnilla nousikin esiin se, että .ssh-hakemistoon ei saa olla muilla mitään oikeuksia, jotta homma toimisi. Nämä asiat hoidetaan tekemällä seuraavat stepit molemmissa kohdekoneissa.

$ ssh mika@172.28.1.22x
$ mv id_dsa.pub .ssh/authorized_keys 
(tee mv ainoastaan silloin kun kohdefile on tyhjä. Jos kohdefile ei ole tyhjä tee näin: cat id_dsa.pub >> authorized keys)
$ chmod -R 700 .ssh

Nyt pitäisi kirjautuminen kohdekoneille toimia ilman salasanoja. Testasin tämän käyttämällä opettajan taululla näyttämää esimerkkiä:

for SERVER in 172.28.1.222 172.28.1.228; do ssh mika@$SERVER w; done

Kaikki oli kunnossa sillä ylläolevan komennon suorittaminen toimi odotetusti ja tuotti tämännäköistä tavaraa:

[mika@localhost bin]$ for SERVER in 172.28.1.222 172.28.1.228; do ssh mika@$SERVER w; done
 18:37:01 up 46 min,  5 users,  load average: 0.00, 0.02, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
mustavi1 :0       -                18:12   ?xdm?  21.57s  0.20s /usr/bin/gnome-
mustavi1 pts/1    :0.0             18:12   19:29   0.04s  1.95s /usr/bin/gnome-
mustavi1 pts/2    :0.0             18:12    5:20   0.05s  0.05s bash
mustavi1 pts/3    :0.0             18:17    3:13   0.04s  0.00s man sshd
mustavi1 pts/4    :0.0             18:36    1.00s  0.01s  1.95s /usr/bin/gnome-
 18:37:05 up 48 min,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
paunha   :0       -                17:52   ?xdm?  26.84s  0.20s /usr/bin/gnome-
paunha   pts/1    :0.0             18:29    2.00s  0.02s  0.02s bash
[mika@localhost bin]$

Ylläoleva oli samalla myös esimerkki siitä, miten voidaan ajaa sama komento useammalla koneella ssh:n avulla.

Ylläolevan pitkän proseduurin voi tehdä myös melkoisen automaattisesti hyödyntämällä opettajan tekemää "ssh-uploadkeys"-nimistä skriptiä, joka automatisoi kaikki toimenpiteet avainten siirrossa. "ssh-uploadkeys"-skriptillä homma hoituu seuraavasti:

Käydään ensin hakemassa opettajan sivuilta ko. skripti ja tallennetaan se omaan kotihakemiston alle bin-hakemistoon. Omassa kotihakemistossa oleva bin-hakemisto on oletuksena lisätty polkuun, joten näin skripti toimii missä tahansa hakemistossa.

$ cd
$ mkdir bin
$ cd bin
$ wget http://myy.helia.fi/~karte/ssh-uploadkeys/ssh-uploadkeys
$ chmod u+x ssh-uploadkeys 

chmod-komennolla lisätään skriptille ajo-oikeus, jota ilman ei ohjelmia Unix/Linux-ympäristöissä voi suorittaa...

Tämän jälkeen otetaan ensin yhteys normaalisti kohdepalvelimille:
$ ssh mika@172.28.1.222 # tässä vaiheessa joudutaan antamaan vielä salasana -- mika 
$ ssh mika@172.28.1.228 # tässä vaiheessa joudutaan antamaan vielä salasana -- mika10

Jonka jälkeen vain annetaan komento :

$ ssh-uploadkeys mika@172.28.1.222
$ ssh-uploadkeys mika@172.28.1.228

Komennon jälkeen ohjelma ilmoittaa, mikäli siirto on onnistunut, jonka jälkeen vain testataan toimiiko kirjautuminen toiseen koneeseen ilman salasanaa komennoilla:

$ ssh mika@172.28.1.222 
$ ssh mika@172.28.1.228

Ja kuten arvata saattaa, niin kyllähän asiat toimivat kuten luvattukin ;)

Seuraavaksi voisikin jo sitten hiukan konfiguroida ssh-serverin asetuksia ja sallia ainoastaan protokolla 2, sekä vain halutut käyttäjät. Tämä onnistuu muokkaamalla /etc/ssh/sshd_config-nimistä tiedostoa ja asettamalla sinne päälle parametrit: Protocol 2, sekä AllowUsers user1 user2. Ohessa mallina eräs sshd_config tiedosto.

Vinkki: käyttäjien hallinnassa voi toki käyttää myös päinvastaista mallia ja kieltää pääsyn vain tietyiltä käyttäjiltä parametrilla: DenyUsers user1 user2 etc...

Seuraavaksi päästiinkin jo hiukan vähemmän tuttuihin ssh:n hyödyntämistapoihin, eli ssh-agent ja tiedostojen hakujen skriptaamiseen.

Yhden tiedoston kopioiminen monelta koneelta automaagisesti

Hetken aikaa asiaa tutkiskeltuani totesin, että Ville Myllymäen ratkaisu oli parempi kuin mihin itse pystyisin, joten päätin kokeilla käyttää Villen ohjelmaa tässä osassa harjoitusta. Ja kuten odottaa saattoikin, toimi Villen ohjelma hienosti ja juuri niinkuin pitikin, eli kopioi yhden tiedoston useammalta koneelta omalle testikoneelleni ja muutti tiedostojen nimiä, jolla vältetään tiedoston päällekirjoitus. Ohessa on vielä kopioi Villen ohjelmasta:

$ cat ~/bin/goffmh 
#!/bin/sh
# goffmh - Get one file from many hosts
# Copyleft (c) Ville Myllymäki
# 2005-11-24  hakemistoihin viittaus ei toimi parametrina,  muutettu ohjetta.
#             Vaatisi sed tms. säätöä, että tiedostoparametrina voitaisiin 
#              tiedostoon, ja sitten hakemistopolku vain parsittaisiin pois.
# 2005-11-18  'ohjelma' tehty

#Onko alle 2 parametria?
if [ $# -lt 2 ]
then
  echo "Käyttö: goffmh tiedosto tunnus@kone1 tunnus@kone2 ..."
  exit 1
fi

# muuttujaan TIEDOSTO ensimmäinen parametri
TIEDOSTO="$1"

# Siirretään parametrien järjestystä yksi vasemmalle
shift

#pyöritetään loput parametrit silmukan läpi
for f in $@ 
do
  scp $f:$TIEDOSTO ./$f-$TIEDOSTO
done    

Täytyy kyllä tosin tunnustaa, että kokeilin alustavasti samankaltaisen ohjelman tekemistä interaktiivisena, mutta totesin, että ohjelman tekeminen parametrein on kyllä mukavampi tapa kuin kirjoitella interaktiivisesti jokaista user@hostname parametriä...

ssh-agent

Aikaisempaa kokemusta ssh-agentista minulle ei ole, sillä tähän mennessä en ole kokenut salasanojen kirjoittelua liian haasteelliseksi. Asiaa hiukan tutkailtuani löysin aiheeseen liittyvät ohjesivut täältä. Löytämieni ohjeiden avulla sain ssh-agentin toimimaan ilman sen suurempia ponnisteluja.

Nelosharjoitus oli näin kokonaisuudessaan suoritettu onnistuneesti ;)


Jälkikommentteja

Harjoituksen aihe oli tuttu, joten sinällään tässä ei skriptausharjoituksia ja ssh-agentin käyttöä lukuunottamatta ollut mitään uutta. Opettajan ssh-uploadkeys skripti oli tosin niin hyvä, että se tarttui talteen myöhempää käyttöäkin varten.


To-Do

Harjoituksista ei jäänyt mitään sen kummempaa selviteltävää jäljelle, joten to-do listalle ei tälläkertaa jäänyt mitään.