Miten autentikoidaan SSH-yhteys valmiiksi tarvitsematta kirjoittaa salasanaa joka kerta

2. lokakuuta 2000, (C) Joona I Palaste

Määritelmät:

Jos asiakkaan ja palvelimen välillä on sallittu .shosts -tiedoston käyttö, kaikki mitä tarvitaan on:

Palvelimella halutun käyttäjän kotihakemistoon luodaan tiedosto .shosts, jonka suojausarvo on 600 (omistaja saa lukea/kirjoittaa, kukaan muu ei saa tehdä mitään), ja jonka sisältö on:

koneennimi käyttäjä
missä "koneennimi" on asiakaskoneen täydellinen DNS-nimi, ja "käyttäjä" on haluttu käyttäjätunnus asiakaskoneella. Jos siis palvelinkoneella "teletran1.helsinki.fi" lukee tiedostossa "~optimus/.shosts":
mobile.helsinki.fi prime
niin käyttäjän tarvitsee vain kirjoittaa:
prime@mobile: ssh optimus@teletran1
ja SSH autentikoi hänet ilman salasanaa.

Useimmissa ympäristöissä .shosts -tiedoston käyttö ei ole sallittua, koska jokin kolmas kone voi tekeytyä asiakaskoneeksi nyysimällä sen DNS-nimen. Tällöin tarvitaan RSA-autentikointia.

Ensimmäiseksi, kummassakin koneessa ajetaan ssh-keygen. Tämä luo koneille yksityisen avaimen ".ssh/identity" ja julkisen avaimen ".ssh/identity.pub". Yksityinen avain näyttää tutkittaessa kasalta käsittämätöntä roskaa, julkinen avain näyttää pitkältä heksadesimaalirimpsulta, jonka perässä on koneen DNS-nimi.

Tämän jälkeen asiakaskoneen julkinen avain lisätään palvelinkoneella tiedostoon ".ssh/authorized_keys". (Julkinen avain on vain yksi ainoa rivi, authorized_keys -tiedostossa on siis yksi rivi per asiakaskone.)

Kun SSH-yhteys halutaan muodostaa, asiakaskoneella tulee ajaa ssh-agent. Se tulostaa komennot, jolla asetetaan pari ympäristömuuttujaa. Kun muuttujat on asetettu, ajetaan ssh-add, ja RSA-avaimet on otettu käyttöön. Nyt asiakas voi autentikoitua suoraan palvelimelle. Esimerkki:

[prime@mobile:~]% ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-prime/ssh-9080-agent; export SSH_AUTH_SOCK;
SSH_AGENT_PID=9081; export SSH_AGENT_PID;
echo Agent pid 9081;
[prime@mobile:~]% SSH_AUTH_SOCK=/tmp/ssh-prime/ssh-9080-agent; export SSH_AUTH_SOCK;
[prime@mobile:~]% SSH_AGENT_PID=9081; export SSH_AGENT_PID;
[prime@mobile:~]% ssh-add
identity added: ~prime/.ssh/identity (prime@mobile)
[prime@mobile:~]% ssh optimus@teletran1

SSH:lle voidaan antaa parametrina UNIX-komento, jolloin SSH ottaa yhteyden palvelinkoneeseen, suorittaa siinä komennon, ja poistuu. Komennon tulostus tulee tavalliseen stdout-tietovirtaan, jolloin se voidaan napata tiedostoon esim:

[prime@mobile:~]% ssh optimus@teletran1 "cat Salainen_Suunnitelma.txt"
>Salainen_Suunnitelma_Kopio.txt

Ohjelmien ajaminen Java-sovelluksesta

Javassa ohjelmia voi ajaa java.lang.Runtime.exec() -metodin avulla. Sille annetaan parametriksi ajettava komento, ja se palauttaa arvonaan java.lang.Process -olion, jolle voi sitten kutsua waitFor() -metodia, joka odottaa, että komento on ehtinyt mennä loppuun asti. Poikkeukset java.io.IOException ja java.lang.InterruptedException täytyy siepata. Esimerkkikoodi ajaa komennon "xterm" tuoden ruudulle uuden xterm- ikkunan.

Process p = null;
try {
    p = Runtime.getRuntime().exec("xterm");
}
catch (java.io.IOException e) {
}

if (p != null) {
    try {
        p.waitFor();
    }
    catch (InterruptedException e) {
    }
}