Nyckelhantering i OpenSSH

Från Unix.se, den fria unixresursen.

I den här artikeln kommer du att lära dig hur RSA- och DSA-autentisering fungerar. Endast version två av ssh-protokollet kommer att beskrivas eftersom version ett inte bör användas.

Innehåll

Vad är RSA/DSA-autentisering?

Som du förmodligen vet så är ssh ett program liknande telnet och rsh som kan användas för att logga in till en fjärrmaskin. Men till skillnad från telnet och rsh är ssh-protokollet väldigt säkert. SSH använder sig av så kallad "publik nyckel-kryptering". SSH kan kryptera dataströmmen, se till att den är intakt och autentisera användaren på ett säkert sätt.

Som standard använder ssh ett säkert sätt att autentisera användare med lösenord. Många gånger kan det vara jobbigt att skriva lösenord, t.ex. om man ofta loggar in till en viss maskin eller om man har ett cronjobb som behöver ansluta med ssh till en fjärrdator. Därför finns det ett alternativt autentiseringssystem.

RSA- och DSA-autentisering använder ett par krypteringsnycklar som kallas den publika och den hemliga nyckeln. Med hjälp av RSA/DSA-nycklar kan man logga in till en fjärrdator utan att använda lösenord.

Varför bör man inte använda version 1 av ssh-protokollet?

I version ett av ssh-protokollet används CRC-32 för att kontrollera dataströmmens integritet, men det är en ganska svag integritetskontroll. T.ex. finns det ett program kallat ettercap som lätt sniffar lösenord för SSH1.

Hur fungerar RSA/DSA-nycklar?

Om du t.ex. vill ansluta till en annan maskin i ditt nätverk med hjälp av ssh måste du normalt skriva in lösenordet varje gång. För att slippa det vill vi använda RSA- eller DSA-autentisering. Det första man gör då är att man skapar ett nyckelpar. De två olika nycklarna kallas den publika nyckeln och den privata nyckeln. Data som krypteras med den publika nyckeln kan bara dekrypteras med den privata nyckeln.

För att få igång RSA- eller DSA-autentisering kopierar man den publika nyckeln och placerar den i ~/.ssh/authorized_keys på fjärrdatorn.

Om man nu försöker logga in så säger ssh till fjärrdatorn att den vill använda sig av RSA/DSA-autentisering. sshd på fjärrdatorn letar då redan på authorized_keys-filen för användaren och krypterar en slumptal (förenklat) med den rätta publika nyckeln (om den finns) och skickar det till din dator. Om din dator nu har den matchande privata nyckeln så dekrypteras slumptalet och skickas tillbaka, om fjärrdatorn nu ser att talen är likadana så vet den att du innehar den matchande privata nyckeln och låter dig logga in.

Några viktiga saker att tänka på är att aldrig låta den privata nyckeln hamna i fel händer. Man behöver också bara ett par nycklar, eftersom samma publika nyckel kan användas till alla datorer du vill ansluta till.

Skapa ett DSA-nyckelpar

DSA-nycklar skapas med programmet ssh-keygen. Man använder växeln -t för att välja rätt nyckeltyp. I det här fallet så är det dsa.

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/erkki/.ssh/id_dsa): (tryck enter)
Enter passphrase (empty for no passphrase): (mata in en lösenordsfras)
Enter same passphrase again: (mata in den igen)
Your identification has been saved in /home/erkki/.ssh/id_dsa.
Your public key has been saved in /home/erkki/.ssh/id_dsa.pub.
The key fingerprint is:
4d:3g:1a:1d:f8:85:30:b2:ad:24:3f:12:3d:28:b7:df erkki@idic

Man bör aldrig under några som helst omständigheter skapa nycklar som inte har någon lösenordsfras. Varför? Jo, om någon rootar datorn med den hemliga nyckeln så har han access till alla andra fjärrdatorer där den publika nyckeln ligger. Vad ska man då ha RSA/DSA-autentisering till? Man kan använda sig av något som kallas ssh-agent som sparar en dekrypterad kopia av nyckeln i RAM så att man bara behöver skriva in lösenordsfrasen en gång (när man startar ssh-agent).

Skapa ett RSA-nyckelpar

Likadant som när man skapar ett DSA-nyckelpar fast man använder -t rsa iställer för -t dsa.

Installera publik RSA/DSA-nyckel

För att kunna använda RSA/DSA-autentisering måste man installera den publika nyckeln på den fjärrdator man vill kunna ansluta till. I det här fallet är det värden spock som jag installerar en nyckel på.

För DSA-nyckel:

$ cat ~/.ssh/id_dsa.pub | ssh erkki@spock cat \>\> ~/.ssh/authorized_keys

För RSA-nyckel:

$ cat ~/.ssh/id_rsa.pub | ssh erkki@spock cat \>\> ~/.ssh/authorized_keys

När du nu försöker logga in till fjärrdatorn borde det se ut ungefär så här:

$ ssh erkki@spock
Enter passphrase for key '/home/erkki/.ssh/id_dsa':

Då skriver du in lösenordsfrasen så loggas du in.

ssh-agent

ssh-agent är ett program som underlättar och säkrar hantering av RSA- och DSA-nycklar. Det körs i bakgrunden och mellanlagrar (cachar se cache) okrypterade privata nycklar. Man startar ssh-agent genom att skriva:

$ ssh-agent 
SSH_AUTH_SOCK=/tmp/ssh-XXzw4bnH/agent.11937; export SSH_AUTH_SOCK;
SSH_AGENT_PID=11938; export SSH_AGENT_PID;
echo Agent pid 11938;
$

Som man kan se är ssh-agentens skärmutskrift några skal-kommandon. De initierar några miljövariabler som ssh använder när det ska läsa nycklarna. Därför kan man starta ssh-agent genom följande kommando:

$ eval `ssh-agent`

Då får man miljövariablerna initierade och slipper göra det manuellt. När ssh-agent körs i bakgrunden kan man sedan lägga till nycklar genom att använda sig av programmet ssh-add.

För dsa-nycklar:

$ ssh-add ~/.ssh/id_dsa
Enter passphrase for /home/erkki/.ssh/id_dsa: 
Identity added: /home/erkki/.ssh/id_dsa (/home/erkki/.ssh/id_dsa)

För rsa-nycklar:

$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/erkki/.ssh/id_rsa: 
Identity added: /home/erkki/.ssh/id_rsa (/home/erkki/.ssh/id_rsa)

Nu när man ska ansluta till en dator som har den publika nyckeln så behöver man inte skriva något lösenord.

Det är dock väldigt jobbigt att hålla på och skriva det här hela tiden man startar en ny login-session. Man skulle kunna lägga till kommandona i ~/.bashrc, men då skulle man starta en ssh-agent för varje login-session och eftersom man bara behöver en enda ssh-agent per användare vore det ett resursslöseri. Sedan måste man också skriva in lösenordsfrasen varje gång man startar en ny login-session, det är i alla fall bättre än att behöva skriva den varje gång man ansluter till en annan värd. Lösningen heter Keychain.

Keychain

Keychain är ett skript som startar ssh-agent och lägger till nycklar. Det är skrivet av Daniel Robbins. Ladda ner det från [1] (http://www.gentoo.org/projects/keychain/). Det finns även officiella paket för debian. Jag har själv inte testat det med något annat skal än bash, men jag har för mig att det ska funka med andra.

Keychain startas från ~/.bash_profile. När keychain startas kollar det om ssh-agent redan körs. Om ssh-agent inte körs startar det ssh-agent och lagrar miljövariablerna i ~/.keychain/hostname-sh och ~/.keychain/hostname-csh. Keychain tar som argument flera filnamn till privata nycklar, tex ~/.ssh/id_rsa ~/.ssh/id_dsa.

#!/bin/bash
#exempel på  ~/.bash_profile
keychain ~/.ssh/id_rsa ~/.ssh/id_dsa
source ~/.keychain/hostname-sh > /dev/null

Om man nu skulle starta keychain igen så ser den att filen ~/.keychain/hostname-sh redan finns och startar då inte en till ssh-agent utan kontrollerar om nycklarna är laddade och avlutas om de är det.

Har man kört keychain en gång så behöver man inte mata in lösenordsfrasen några fler gånger till man startar om datorn eller dödar ssh-agent-processen.

I en X-miljö skulle man också kunna köra keychain i ~/.xsession eller ~/.xinitrc. Keychain anropar automatiskt ssh-askpass när $DISPLAY är definierad, vilket visar en fin dialogruta där man kan mata in lösenordsfrasen.

Så nu kan du använda ssh i dina cron-job, genom att ladda in ~user/.keychain/hostname-sh. Observera också att hostname är datorns värdnamn. Om man har sin hemkatalog monterad över nfs kan man köra ssh-agent på flera datorer och därför behöver man kunna skilja på filerna.

Avslutning

Läs gärna Daniel Robbins utmärkta artikelserie om nyckel-hantering. Speciellt del tre är intressant, den handlar om agent-forwarding. En ssh-agent kan autentisera dig när du t.ex. ansluter till en dator och sedan från den ansluter till en annan.

Externa länkar

Daniel Robbins artikelserie:

Personliga verktyg