Introductie
SSH, of secure shell, is een veilig protocol en de meest voorkomende manier om op een veilige manier externe servers te beheren. Met behulp van verschillende encryptietechnologieën biedt SSH een mechanisme om een cryptografisch beveiligde verbinding tussen twee partijen tot stand te brengen, waarbij elke kant zich aan de andere authenticeren en commando’s en uitvoer heen en weer sturen.
In deze handleiding zullen we de onderliggende encryptietechnieken onderzoeken die SSH gebruikt en de methoden die het gebruikt om veilige verbindingen tot stand te brengen. Deze informatie kan nuttig zijn om de verschillende lagen van encryptie en de verschillende stappen die nodig zijn om een verbinding tot stand te brengen en beide partijen te authenticeren, te begrijpen.
Begrip van Symmetrische Encryptie, Asymmetrische Encryptie en Hashes
Om de overdracht van informatie te beveiligen, maakt SSH gebruik van verschillende soorten gegevensmanipulatietechnieken op verschillende punten in de transactie. Deze omvatten vormen van symmetrische encryptie, asymmetrische encryptie en hashing.
Symmetrische Encryptie
De relatie tussen de componenten die gegevens versleutelen en decoderen bepaalt of een versleutelingsschema symmetrisch of asymmetrisch is.
Symmetrische encryptie is een type versleuteling waarbij één sleutel kan worden gebruikt om berichten naar de tegenpartij te versleutelen, en ook om de ontvangen berichten van de andere deelnemer te decoderen. Dit betekent dat iedereen die de sleutel heeft, berichten kan versleutelen en decoderen naar iedereen die ook de sleutel heeft.
Dit type versleutelingsschema wordt vaak “gedeelde geheime” versleuteling genoemd, of “geheime sleutel” versleuteling. Er is meestal slechts één sleutel die wordt gebruikt voor alle operaties of een paar sleutels waarvan de relatie ontdekt kan worden en het eenvoudig is om de tegenovergestelde sleutel af te leiden.
Symmetrische sleutels worden door SSH gebruikt om de gehele verbinding te versleutelen. In tegenstelling tot wat sommige gebruikers aannemen, worden publiek/prive asymmetrische sleutelparen die kunnen worden gemaakt alleen gebruikt voor authenticatie, niet voor het versleutelen van de verbinding. De symmetrische encryptie maakt zelfs het wachtwoordauthenticatie mogelijk om te worden beschermd tegen bespioneren.
De klant en de server dragen beiden bij aan het tot stand brengen van deze sleutel, en het resulterende geheim is nooit bekend bij externe partijen. De geheime sleutel wordt gecreëerd via een proces dat bekend staat als een sleuteluitwisselingsalgoritme. Deze uitwisseling resulteert erin dat de server en de klant allebei onafhankelijk dezelfde sleutel bereiken door bepaalde stukken openbare gegevens te delen en ze te manipuleren met bepaalde geheime gegevens. Dit proces wordt later in meer detail uitgelegd.
De symmetrische versleutelingssleutel die door deze procedure wordt gecreëerd, is sessiegebaseerd en vormt de daadwerkelijke versleuteling voor de gegevens die tussen server en klant worden verzonden. Zodra dit is vastgesteld, moet de rest van de gegevens worden versleuteld met dit gedeelde geheim. Dit gebeurt voordat een klant wordt geauthenticeerd.
SSH kan worden geconfigureerd om verschillende symmetrische cijfersystemen te gebruiken, waaronder Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 en Arcfour. De server en de klant kunnen allebei een lijst opstellen van hun ondersteunde cijfers, geordend naar voorkeur. De eerste optie van de lijst van de klant die beschikbaar is op de server, wordt gebruikt als het cijferalgoritme in beide richtingen.
Op Ubuntu 20.04 zijn zowel de klant als de server standaard ingesteld zoals hieronder:
[email protected]
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
Dit betekent dat als twee Ubuntu 20.04 machines met elkaar verbinden (zonder de standaard cijfers te overschrijven via configuratieopties), ze altijd standaard de [email protected]
cipher zullen gebruiken om hun verbinding te versleutelen.
Asymmetrische Versleuteling
Asymmetrische versleuteling verschilt van symmetrische versleuteling omdat er twee bijbehorende sleutels nodig zijn om gegevens in één richting te verzenden. Een van deze sleutels staat bekend als de privésleutel, terwijl de andere de openbare sleutel wordt genoemd.
De openbare sleutel kan vrijelijk worden gedeeld met elke partij. Het is gekoppeld aan zijn gepaarde sleutel, maar de privésleutel kan niet worden afgeleid uit de openbare sleutel. De wiskundige relatie tussen de openbare sleutel en de privésleutel stelt de openbare sleutel in staat berichten te versleutelen die alleen kunnen worden ontsleuteld door de privésleutel. Dit is een eenrichtingsvermogen, wat betekent dat de openbare sleutel geen mogelijkheid heeft om de berichten te decoderen die het schrijft, noch kan het iets decoderen wat de privésleutel mogelijk naar het stuurt.
De privésleutel moet volledig geheim worden gehouden en mag nooit met een andere partij worden gedeeld. Dit is een belangrijke vereiste voor het werken van het openbare sleutelparadigma. De privésleutel is het enige onderdeel dat berichten kan decoderen die zijn versleuteld met de bijbehorende openbare sleutel. Op grond van dit feit heeft een entiteit die in staat is deze berichten te decoderen aangetoond dat zij de controle hebben over de privésleutel.
SSH gebruikt asymmetrische versleuteling op verschillende plaatsen. Tijdens het initiële sleuteluitwisselingsproces dat wordt gebruikt om de symmetrische versleuteling op te zetten (die wordt gebruikt om de sessie te versleutelen), wordt asymmetrische versleuteling gebruikt. In deze fase produceren beide partijen tijdelijke sleutelparen en wisselen ze de openbare sleutel uit om het gedeelde geheim te produceren dat zal worden gebruikt voor symmetrische versleuteling.
Het meer besproken gebruik van asymmetrische versleuteling met SSH komt van SSH-sleutelgebaseerde authenticatie. SSH-sleutelparen kunnen worden gebruikt om een client te authenticeren bij een server. De client maakt een sleutelpaar en uploadt vervolgens de openbare sleutel naar elke externe server waartoe het toegang wil hebben. Deze wordt geplaatst in een bestand genaamd authorized_keys
binnen de ~/.ssh
directory in de thuismap van het gebruikersaccount op de externe server.
Nadat de symmetrische versleuteling is vastgesteld om communicatie tussen de server en de client te beveiligen, moet de client zich authenticeren om toegang te krijgen. De server kan de openbare sleutel in dit bestand gebruiken om een uitdagingbericht naar de client te versleutelen. Als de client kan bewijzen dat het in staat was om dit bericht te decoderen, heeft het aangetoond dat het de bijbehorende privésleutel bezit. Vervolgens kan de server de omgeving voor de client instellen.
Hashing
Een andere vorm van gegevensmanipulatie waar SSH gebruik van maakt, is cryptografische hashing. Cryptografische hashfuncties zijn methoden om een bondige “handtekening” of samenvatting van een verzameling informatie te creëren. Hun belangrijkste kenmerken zijn dat ze nooit bedoeld zijn om omgekeerd te worden, dat ze bijna onmogelijk zijn om voorspelbaar te beïnvloeden en dat ze in praktische zin uniek zijn.
Hetzelfde hashing-algoritme en bericht zouden dezelfde hash moeten produceren; het wijzigen van een deel van de gegevens zou een volledig andere hash moeten produceren. Een gebruiker zou niet in staat moeten zijn om het oorspronkelijke bericht te produceren uit een gegeven hash, maar ze zouden in staat moeten zijn om te bepalen of een gegeven bericht een gegeven hash heeft opgeleverd.
Gezien deze eigenschappen worden hashes voornamelijk gebruikt voor doeleinden van gegevensintegriteit en om de authenticiteit van communicatie te verifiëren. Het belangrijkste gebruik in SSH is met HMAC, of hash-based message authenticatie codes. Deze worden gebruikt om ervoor te zorgen dat de ontvangen berichttekst intact en ongewijzigd is.
Als onderdeel van de eerder uitgelegde onderhandeling van symmetrische encryptie, wordt een message authenticatie code (MAC) algoritme geselecteerd. Het algoritme wordt gekozen door door de lijst met aanvaardbare MAC-keuzes van de client te werken. De eerste op deze lijst die de server ondersteunt, zal worden gebruikt.
Elk bericht dat na de onderhandeling van encryptie wordt verzonden, moet een MAC bevatten, zodat de andere partij de pakketintegriteit kan verifiëren. De MAC wordt berekend uit de symmetrisch gedeelde geheime sleutel, het pakketvolgnummer van het bericht en de eigenlijke berichtinhoud.
De MAC zelf wordt buiten het symmetrisch versleutelde gebied verzonden als het laatste deel van het pakket. Onderzoekers raden over het algemeen deze methode aan om eerst de gegevens te versleutelen en vervolgens de MAC te berekenen.
Begrijpen Hoe SSH Werkt
Je hebt waarschijnlijk al een basiskennis van hoe SSH werkt. Het SSH-protocol maakt gebruik van een client-server model om twee partijen te authenticeren en de gegevens tussen hen te versleutelen.
De servercomponent luistert op een aangewezen poort naar verbindingen. Het is verantwoordelijk voor het onderhandelen over de beveiligde verbinding, het authenticeren van de verbindende partij, en het starten van de juiste omgeving als de referenties worden geaccepteerd.
De client is verantwoordelijk voor het starten van de initiële Transmission Control Protocol (TCP) handshake met de server, het onderhandelen over de beveiligde verbinding, het controleren of de identiteit van de server overeenkomt met eerder geregistreerde informatie, en het verstrekken van referenties om te authenticeren.
Een SSH-sessie wordt in twee afzonderlijke stadia tot stand gebracht. De eerste is om overeenstemming te bereiken over en versleuteling vast te stellen om toekomstige communicatie te beschermen. Het tweede stadium is om de gebruiker te authenticeren en te ontdekken of toegang tot de server moet worden verleend.
Onderhandelen over Versleuteling voor de Sessie
Wanneer een TCP-verbinding wordt gemaakt door een cliënt, reageert de server met de protocolversies die hij ondersteunt. Als de cliënt een van de acceptabele protocolversies kan evenaren, gaat de verbinding verder. De server geeft ook zijn openbare hostsleutel, die de cliënt kan gebruiken om te controleren of dit de bedoelde host was.
Op dit punt onderhandelen beide partijen over een sessiesleutel met behulp van een versie van iets dat het Diffie-Hellman-algoritme wordt genoemd. Dit algoritme (en de varianten ervan) maken het mogelijk dat elke partij zijn eigen privégegevens combineert met openbare gegevens van het andere systeem om uit te komen op een identieke geheime sessiesleutel.
De sessiesleutel wordt gebruikt om de hele sessie te versleutelen. De openbare en privé-sleutelparen die voor dit deel van de procedure worden gebruikt, zijn volledig gescheiden van de SSH-sleutels die worden gebruikt om een cliënt bij de server te authenticeren.
De basis van deze procedure voor klassiek Diffie-Hellman zijn:
- Beide partijen zijn het eens over een groot priemgetal, dat zal dienen als een zaadwaarde.
- Beide partijen zijn het eens over een versleutelingsgenerator (meestal AES), die zal worden gebruikt om de waarden op een voorgedefinieerde manier te manipuleren.
- Onafhankelijk komt elke partij met een ander priemgetal dat geheim wordt gehouden voor de andere partij. Dit nummer wordt gebruikt als de privésleutel voor deze interactie (anders dan de privésleutel SSH die wordt gebruikt voor authenticatie).
- De gegenereerde privésleutel, de versleutelingsgenerator en het gedeelde priemgetal worden gebruikt om een openbare sleutel te genereren die is afgeleid van de privésleutel, maar die kan worden gedeeld met de andere partij.
- Beide deelnemers wisselen vervolgens hun gegenereerde openbare sleutels uit.
- De ontvangende entiteit gebruikt hun eigen privésleutel, de openbare sleutel van de andere partij en het oorspronkelijke gedeelde priemgetal om een gedeelde geheime sleutel te berekenen. Hoewel dit onafhankelijk wordt berekend door elke partij, met tegengestelde privé- en openbare sleutels, zal dit resulteren in dezelfde gedeelde geheime sleutel.
- De gedeelde geheime sleutel wordt vervolgens gebruikt om alle communicatie die volgt te versleutelen.
Dit proces stelt elke partij in staat om gelijkelijk deel te nemen aan het genereren van de gedeelde geheime sleutel, wat niet toestaat dat één uiteinde de sleutel controleert. Het bereikt ook het doel om een identieke gedeelde geheime sleutel te genereren zonder die informatie ooit over onveilige kanalen te hoeven verzenden. De gedeelde geheime versleuteling die wordt gebruikt voor de rest van de verbinding wordt genoemd binair pakketprotocol.
De gegenereerde sleutel is een symmetrische sleutel, wat betekent dat dezelfde sleutel die wordt gebruikt om een bericht te versleutelen, kan worden gebruikt om het aan de andere kant te ontsleutelen. Het doel hiervan is om alle verdere communicatie in een versleutelde tunnel te wikkelen die niet kan worden ontcijferd door buitenstaanders.
Nadat de sessieversleuteling is vastgesteld, begint het gebruikersauthenticatiestadium.
Authenticatie van de toegang van de gebruiker tot de server
De volgende stap omvat het authenticeren van de gebruiker en het beslissen over de toegang. Er zijn een paar methoden die kunnen worden gebruikt voor authenticatie, afhankelijk van wat de server accepteert.
De algemene methode is wachtwoordauthenticatie, waarbij de server de cliënt vraagt om het wachtwoord van het account waarmee ze proberen in te loggen. Het wachtwoord wordt verzonden via de onderhandelde encryptie, dus het is beveiligd tegen externe partijen.
Hoewel het wachtwoord zal worden versleuteld, wordt deze methode over het algemeen niet aanbevolen vanwege de beperkingen op de complexiteit van het wachtwoord. Geautomatiseerde scripts kunnen wachtwoorden van normale lengtes zeer eenvoudig kraken in vergelijking met andere authenticatiemethoden.
De meest populaire en aanbevolen alternatief is het gebruik van SSH-sleutelparen. SSH-sleutelparen zijn asymmetrische sleutels, wat betekent dat de twee bijbehorende sleutels verschillende functies vervullen.
De openbare sleutel wordt gebruikt om gegevens te versleutelen die alleen kunnen worden ontsleuteld met de privésleutel. De openbare sleutel kan vrij worden gedeeld, omdat, hoewel het kan versleutelen voor de privésleutel, er geen methode is om de privésleutel uit de openbare sleutel af te leiden.
Authenticatie met behulp van SSH-sleutelparen begint nadat de symmetrische encryptie is vastgesteld zoals beschreven in de vorige sectie. De procedure verloopt als volgt:
- De client begint door een ID voor het sleutelpaar dat het wil authenticeren naar de server te sturen.
- De server controleert het bestand
authorized_keys
van het account waar de client probeert in te loggen op de sleutel-ID. - Als er een openbare sleutel met een overeenkomende ID wordt gevonden in het bestand, genereert de server een willekeurig nummer en gebruikt de openbare sleutel om het nummer te versleutelen.
- De server stuurt de client dit versleutelde bericht.
- Als de client daadwerkelijk over de bijbehorende privésleutel beschikt, kan het bericht worden ontcijferd met die sleutel, waardoor het oorspronkelijke nummer wordt onthuld.
- De client combineert het ontcijferde nummer met de gedeelde sessiesleutel die wordt gebruikt om de communicatie te versleutelen, en berekent de MD5-hash van deze waarde. MD5 is een boodschap-digest-algoritme dat de hashfunctie gebruikt om een 128-bits hash-waarde te genereren.
- De client stuurt vervolgens deze MD5-hash terug naar de server als antwoord op het versleutelde bericht met het nummer.
- De server gebruikt dezelfde gedeelde sessiesleutel en het oorspronkelijke nummer dat het naar de client heeft gestuurd om de MD5-waarde zelf te berekenen. Het vergelijkt zijn eigen berekening met degene die de client heeft teruggestuurd. Als deze twee waarden overeenkomen, bewijst dit dat de client in het bezit was van de privésleutel en is de client geauthenticeerd.
Kortom, de asymmetrie van de sleutels stelt de server in staat berichten naar de client te versleutelen met de openbare sleutel. De client kan vervolgens bewijzen dat hij de privésleutel bezit door het bericht correct te decoderen. De twee soorten versleuteling die worden gebruikt (symmetrisch gedeeld geheim en asymmetrische openbare/privésleutels) kunnen elk hun specifieke sterke punten benutten in dit model.
Conclusie
Het leren over de stappen van de verbindingsonderhandeling en de lagen van versleuteling die werkzaam zijn in SSH kan je helpen beter te begrijpen wat er gebeurt wanneer je inlogt op een externe server. Nu kun je de relatie tussen verschillende componenten en algoritmen herkennen, en begrijpen hoe al deze stukjes in elkaar passen. Om meer te leren over SSH, bekijk de volgende gidsen:
- Hoe SSH Key-Based Authenticatie te configureren op een Linux Server
- Hoe SSH te gebruiken om verbinding te maken met een externe server
- Hoe SSH-sleutels in te stellen voor verschillende besturingssystemen
SSH Essentials: Werken met SSH Servers, Clients en Sleutels - SSH Essentials: Werken met SSH-servers, clients en sleutels