SSH

SSH står för Secure Shell, det är ett nätverksprotokoll som tillhandahåller säkerhetsmekanismer så att två datorsystem kan kommunicera och dela krypterad data över ett osäkert nätverk som Internet. SSH används dels för att logga in på en fjärrserver för att exekvera kommandon och dels för att överföra data från ett datorsystem till ett annat.

SSH fungerar i en klient-servermodell där SSH autentiserar två kommunicerande parter och krypterar dataöverföring mellan dem genom ett osäkrat nätverk.

SSH process

SSH tillhandahåller en säkrad kommunikationskanal efter att kommunicerande parter förhandlade en TCP-anslutning. Förhandlingen omfattar SSH version, kryptoalgoritmer och skapande av ett gemensamt session-kryptonyckel. Dessa säkerhetskomponenter används för autentisering av kommunicerande parter och kryptera dataöverföring mellan dem. SSH-arbetsprocessen består av följande faser:

  1. Anslutningsinställningar – SSH server använder som standard port 22 genom vilken tar servern emot SSH klientens anslutningsförfrågning.
  2. Version – SSH finns i två versioner: SSH1.X och SSH2.0 (säkrare). SSH-servern och klienten förhandlar SSH-versionen som ska användas i följande process:
    1. SSH-servern skickar den SSH-versionsinformation till SSH-klienten.
    2. Efter att ha mottagit versionsinformationen bestämmer SSH-klienten den versionen som ska användas i kommunikationen framöver och skickar beslutet till SSH-servern.
    3. SSH-servern kontrollerar klientens beslut och verifierar att båda använder den godkända versionen.
  3. Algoritm – SSH använder flera typer av algoritmer, inklusive nyckelutbyte för att generera sessionsnycklar, symmetrisk krypteringsalgoritm för datakryptering, publik nyckelalgoritm för digital signatur och autentisering samt HMAC-algoritm för dataintegritetsskydd.
    SSH-servern och klienten förhandlar och bestämmer de algoritmer att använda i kommunikationen. Processen är som följer:

    1. SSH-servern och klienten skickar sina algoritmer till varandra.
    2. SSH-servern och klienten förhandlar fram typer av algoritmen som ska användas. Under förhandlingen av varje typ av algoritm matchar SSH-servern och klienten den algoritm som stöds av dem båda. Om någon typ av algoritm inte matchas misslyckas algoritmförhandlingen därmed kopplas SSH-anslutningen av.
  4. Utbyte av kryptonyckel – SSH-servern och klienten använder en nyckelutbytesalgoritm för att dynamiskt generera en delad sessionsnyckel och sessions-ID för att etablera en krypterad kanal. Sessionsnyckeln används för att kryptera efterföljande dataöverföring, och sessions-ID används för att identifiera den relaterade SSH-anslutningen under autentiseringsprocessen. SSH-servern och klienten genererar gemensamt en sessionsnyckel baserat på matematiska beräkningar så att kryptonyckeln inte behöver överföras via en osäker kommunikationskanal.
    Så här fungerar nyckelutbytet:

    1. SSH-servern genererar primtal G och P, och serverns privata nyckel b, och beräknar serverns publika nyckel y med följande formel: y = (G^b)%P.
    2. SSH-servern skickar primtal G och P samt serverns publika nyckel y till SSH-klienten.
    3. SSH-klienten genererar en privat nyckel a och beräknar en publik klientnyckel x med hjälp av följande formel: x = (G^a)%P.
    4. SSH-klienten skickar sin publika nyckel x till SSH-servern.
    5. SSH-servern beräknar den symmetriska nyckeln K med formeln K = (x^b)%P.
      SSH-klienten gör detsamma och beräknar den symmetriska nyckeln K med formeln  = (y^a)%P. Den matematiska beräkningen säkerställer att de symmetriska nycklarna som genereras av SSH-servern och klienten är desamma, därmed ingen behov av överföring.
  5. Användarautentisering – SSH-klienten skickar en autentiseringsbegäran till SSH-servern. SSH stöder följande autentiseringssätt:
    • Lösenordsautentisering – Klienten skickar sitt krypterade användarnamn och lösenord till servern. Servern dekrypterar användarnamnet och lösenordet, jämför dem med uppgifter lagrade i en lokal kontodatabas. Vid matchning returnerar server ett godkännande till klienten, annars skickas ett icke-godkännande.
    • Publik nyckelautentisering – Klienten använder sitt användarnamn, den publika nyckeln och den publika nyckelalgoritmen för att utbyta data med servern för autentisering.
    • Lösenordsautentisering och publik nyckelautentisering – Klienten får logga in på systemet först efter att ha autentiserats av servern med både lösenordsautentisering och autentisering med den publika nyckel.
    • Alla – Antingen lösenordsautentisering eller publik nyckel-autentisering krävs för användarautentisering. Lösenordsautentisering är enkelt, användarna behöver bara ange användarnamn och lösenord för varje inloggning. Nyckelautentisering används ofta och rekommenderas eftersom den kan implementera säkrad lösenordsfri inloggning.
  6. Lösenordsautentisering – Den grundläggande principen för lösenordsautentisering är att SSH-klienten använder serverns publika nyckel för att kryptera sitt lösenord, medan SSH-servern använder sin privata nyckel för att dekryptera lösenordet och verifiera lösenordets giltighet. Följande är processen i inloggningsprocessen:
    1. SSH-klienten skickar en inloggningsförfrågan till SSH-servern.
    2. SSH-servern skickar sin publika nyckel till SSH-klienten.
    3. Efter att serverns publika kryptonyckel har mottagits av SSH-klienten, krypterar klienten lösenordet med hjälp av serverns publika nyckel och skickar det krypterade lösenordet till SSH-servern.
    4. SSH-servern tar emot det krypterat lösenordet och använder sin privata kryptonyckel för att dekryptera det. Sedan kontrollerar SSH-servern om lösenordet är korrekt. Om så är fallet lyckas autentiseringen.

Nyckelautentisering

Nackdelen med autentisering är att det innebär risk för MITM-attacker (avlyssning). Om någon avlyssnar inloggningsförfrågan från SSH-klienten kan den utge sig för att vara SSH-servern och skickar den förfalskade publika nyckeln till SSH-klienten. På det sättet kan obehöriga komma åt användarens inloggningslösenord.

För att förhindra MITM-attacker kan du använda nyckelautentisering. Grundprincipen för nyckelautentisering är att SSH-servern använder klientens publika nyckel för att kryptera slumpmässigt innehåll, och SSH-klienten använder sin privata nyckel för att dekryptera innehållet och skickar det dekrypterade innehållet till servern för identitetsverifiering.
Så här fungerar SSH-nyckelautentiseringsbaserad inloggningsprocess:

  1. Innan en SSH-anslutning upprättas måste SSH-klienten generera sitt eget publika-privata nyckelpar och lagra sin publika nyckel på SSH-servern.
  2. SSH-klienten skickar en inloggningsförfrågan till SSH-servern.
  3. SSH-servern söker efter klientens publika nyckel baserat på information såsom användarnamnet i begäran, krypterar ett slumpmässigt nummer med den publika nyckeln och skickar det krypterade slumptalet till klienten.
  4. Vid mottagandet använder SSH-klienten sin egen privata nyckel för att dekryptera den returnerade informationen innan den skickar den dekrypterade informationen till SSH-servern.
  5. SSH-servern kontrollerar om den dekrypterade informationen som skickas av SSH-klienten är korrekt; om informationen är korrekt lyckas autentiseringen.

Session Request

Efter att autentiseringen lyckats skickar SSH-klienten en sessionsbegäran till servern och ber servern att tillhandahålla en viss typ av tjänst. Det vill säga, SSH-klienten begär att upprätta en session med servern, som sedan svarar på begäran från klienten.

Efter att en session har upprättats utbyter SSH-servern och klienten data över sessionen. Data som skickas av SSH-servern och klienten krypteras och dekrypteras med sessionsnyckeln.