In dit artikel hebben we onze beste tips verzameld voor een efficiƫnter gebruik van SSH. Hierin leert u hoe u:
- een tweede factor aan uw SSH-login toevoegt
- veilige agent forwarding gebruikt
- uit een vastgelopen SSH-sessie komt
- een permanente terminal openhoudt
- een externe terminalsessie met een vriend deelt (zonder Zoom!)
een tweede factor aan uw SSH toevoegt
U kunt op vijf verschillende manieren een tweede authenticatiefactor aan uw SSH-verbindingen toevoegen:
- Werk uw OpenSSH bij en gebruik een encryptiesleutel. In februari 2020 werd ondersteuning voor FIDO U2F (Universal Second Factor) encryptiesleutels toegevoegd aan OpenSSH. Dit is een geweldige nieuwe functie, maar er is een addertje onder het gras: alleen die clients en servers die zijn bijgewerkt naar versie OpenSSH 8.2 of hoger kunnen gebruikmaken van encryptiesleutels, aangezien de februari-update nieuwe types sleutels introduceert. Met het commando
ssh āVkunt u de clientversie van SSH controleren, en om de serverversie te controleren, gebruikt u het commandonc [servername] 22
De februari-update heeft twee nieuwe types sleutels toegevoegd: ecdsa-sk en ed25519-sk (samen met de bijbehorende certificaten). Om een sleutelbestand te genereren, hoeft u alleen uw encryptiesleutel in te voeren en het volgende commando uit te voeren:$ ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_skDit zal een openbare en een privƩsleutel genereren en deze aan uw U2F-apparaat koppelen. De taak van de privƩk sleutel op het U2F-apparaat is om de geheime sleutelbeschrijving op de schijf te decoderen wanneer de encryptiesleutel is geactiveerd.
Daarnaast kunt u een toegangscode voor uw sleutels als tweede factor bieden.
Een residentiƫle sleutel is een andere door OpenSSH ondersteunde manier om -sk-sleutels te genereren. Bij deze benadering wordt de descriptor op het U2F-apparaat opgeslagen, zodat u deze kunt gebruiken met de encryptiesleutel wanneer nodig. U kunt een residentiƫle sleutel genereren met het commando:
$ ssh-keygen -t ecdsa-sk -O resident -f ~/.ssh/id_ecdsa_skVervolgens, om de descriptor weer in het geheugen op een nieuw apparaat terug te brengen, steek de encryptiesleutel in en voer het volgende commando uit:
$ ssh-add -KBij het verbinden met de host moet u de encryptiesleutel nog steeds activeren.
- Maak gebruik van PIV+PKCS11 en Yubikey. Voor verbinding met apparaten met oudere SSHD-versies vereist het gebruik van een encryptiesleutel een andere benadering. Yubico heeft een gids voor het gebruik van U2F+SSH met PIV/PKCS11 (Engels). Dit is niet hetzelfde als FIDO U2F, en hoewel de methode functioneert, kost het veel moeite om te begrijpen welke magie erachter zit.
- Pas een aangepaste yubikey-agent ssh-agent toe. Filippo Valsorda heeft een SSH-agent voor Yubikeys geschreven. Het is volledig nieuw en bevat een minimum aan functies.
- Gebruik Touch ID en sekey. Sekey is een open source SSH-agent die geheime sleutels opslaat in een beveiligde enclave van de Mac en het gebruik van Touch ID voor toegang mogelijk maakt.
- Gebruik Single Sign On SSH. Ik heb een tutorial geschreven om te helpen bij het opzetten van deze methode (Engels). Een van de voordelen van single sign on SSH is de mogelijkheid om de beveiligingsbeleid van uw identiteitsprovider te gebruiken ā inclusief ondersteuning voor multi-factorauthenticatie (MFA).
Veilig gebruik van agent forwarding
In SHH staat agent forwarding een externe host toe toegang te krijgen tot de SSH-agent van uw lokale apparaat. Wanneer u SSH gebruikt met ingeschakelde agent forwarding (meestal via ssh -A), zijn er twee kanalen in de verbinding: uw interactieve sessie en een kanaal voor agent forwarding. Via dit kanaal wordt de Unix-socket, die door uw lokale SSH-agent is gemaakt, verbonden met de externe host. Dit is een risicovolle methode, aangezien een gebruiker met root-toegang op het externe apparaat toegang kan krijgen tot uw lokale SSH-agent en zich potentieel als u in het netwerk kan voordoen. Bij gebruik van de standaard SSH-agent van de Open SSH suite, merkt u misschien niet eens dat dit is gebeurd. Een U2F-sleutel (of Sekey) kan u helpen om elke poging tot ongeoorloofd gebruik van uw SSH-agent van buitenaf effectief te blokkeren.
Zelfs met deze voorzorgsmaatregelen is het een goed idee om agent forwarding zo min mogelijk te gebruiken. Gebruik het niet in elke sessie ā gebruik agent forwarding alleen wanneer u zeker bent van de noodzaak ervan voor de huidige sessie.
Afsluiten van een vastgelopen sessie
Netwerkonderbrekingen, ongecontroleerd gedrag van programma's, of een controleerbare reeks die de invoer van het toetsenbord blokkeert ā dit zijn allemaal mogelijke oorzaken van een onderbroken SSH-sessie.
Er zijn verschillende manieren om een vastgelopen sessie te beƫindigen:
- Automatisch afmelden bij netwerkonderbreking. Voeg het volgende toe aan uw .ssh/config:
ServerAliveInterval 5 ServerAliveCountMax 1ssh zal elke ServerAliveInterval seconden een echo naar de externe host sturen om de verbinding te controleren. Als meer dan ServerAliveCountMax echo's geen antwoord ontvangen, beƫindigt ssh de verbinding na time-out en logt het uit de sessie.
- Afsluiten van de sessie. ssh gebruikt standaard het teken ~ (tilde) als controleteken. Het commando ~. sluit de open verbinding en brengt je terug naar de terminal. (Controletekens kunnen alleen vanaf een nieuwe regel worden ingevoerd.) Het commando ~? geeft een volledige lijst van beschikbare commando's in deze sessie. Houd er rekening mee dat het nodig kan zijn om de ~-toets twee keer in te drukken op internationale toetsenborden.
Waarom komen vastgelopen sessies überhaupt voor? In de vroege dagen van het internet verplaatsten computers zich zelden. Wanneer je laptops gebruikt en schakelt tussen verschillende IPv4 WiFi-netwerken, verandert je IP-adres. Aangezien SSH afhankelijk is van TCP-verbindingen, die op hun beurt op een eindpunt met een stabiel IP-adres vertrouwen, missen je SSH-verbindingen steeds een socketdescriptor en raken ze feitelijk verloren telkens wanneer je van netwerken wisselt. Wanneer je IP-adres verandert, heeft je netwerkstack tijd nodig om het verloren van de descriptor te detecteren. Bij netwerkmisstanden willen we niet dat een van de knooppunten in de TCP-verbinding deze te vroeg afbreekt. Daarom probeert het protocol de gegevens nog een aantal keer opnieuw te verzenden voordat het eindelijk opgeeft. Ondertussen lijkt de sessie in je terminal vast te zitten. IPv6 voegt verschillende kenmerken toe die met mobiel gebruik te maken hebben, waardoor het apparaat zijn thuisadres kan behouden tijdens het wisselen van netwerken. Misschien is dit op een dag niet meer zo'n probleem.
Hoe houd je een constante terminal open op een externe knooppunt
Er zijn twee verschillende benaderingen om de verbinding te behouden bij het wisselen tussen verschillende netwerken of bij de wens om tijdelijk te ontkoppelen.
1. Gebruik maken van of
Als je echt een verbinding nodig hebt die niet verbroken wordt, zelfs wanneer je tussen netwerken schakelt, gebruik dan de mobiele shell Mosh. Dit is een beveiligde shell die eerst een SSH-handshake gebruikt en vervolgens overschakelt naar zijn eigen versleutelde kanaal voor de gehele sessie. Op deze manier creƫert Mosh een aparte, zeer robuuste en beveiligde verbinding die bestand is tegen zowel internetonderbrekingen, als het veranderen van het IP-adres van je laptop, ernstige netwerkbreuken en nog veel meer, allemaal dankzij de magie van UDP-verbindingen en het synchronisatieprotocol dat Mosh toepast.
Om Mosh te gebruiken, moet je het zowel op de client als op de server installeren en de poorten 60000-61000 openen voor onverbonden UDP-verkeer naar je externe host. Voor toekomstige verbindingen volstaat het om mosh user@server.
Mosh werkt op het niveau van schermen en toetsaanslagen, wat het verschillende voordelen biedt ten opzichte van het verzenden van een binaire stroom van standaardinvoer en -uitvoer tussen de client en de SSH-server. Als we alleen schermen en toetsaanslagen moeten synchroniseren, wordt het veel eenvoudiger om een onderbroken verbinding later te herstellen. Terwijl SSH alles wat er gebeurd is buffert en verzendt, hoeft Mosh alleen maar toetsaanslagen te bufferen en de laatste weergave van het terminalvenster met de client te synchroniseren.
2. Gebruik tmux
Als je wilt "komen en gaan wanneer je maar wilt" en een terminalsessie op de externe host wilt houden, gebruik dan de tmux. Ik ben dol op tmux en gebruik het constant. Als je SSH-verbinding is verbroken, hoef je alleen maar opnieuw verbinding te maken en tmux attachin te voeren. Bovendien heeft het geweldige functies zoals binnen-terminal tabs en panelen, vergelijkbaar met tabs in de iOS-terminal, en de mogelijkheid om terminalsessies te delen met anderen.
Sommigen versieren hun tmux met Byobu, een pakket dat de gebruiksvriendelijkheid van tmux aanzienlijk verbetert en vele sneltoetsen toevoegt. Byobu wordt meegeleverd met Ubuntu en is eenvoudig te installeren op Mac via Homebrew.
Een gedeelde externe terminalsessie met een vriend
Soms, bij het debuggen van complexe problemen op uw servers, ontstaat de behoefte om een SSH-sessie te delen met iemand die niet in dezelfde kamer is. Tmux is hiervoor perfect! Slechts enkele stappen zijn nodig:
- Zorg ervoor dat tmux op uw bastionnode is geĆÆnstalleerd, of op een server waarmee u wilt werken.
- Beiden moeten via SSH verbinding maken met het apparaat, met gebruik van hetzelfde account.
- Een van jullie moet tmux starten om een tmux-sessie te beginnen.
- De ander moet tmux attach starten.
- VoilĆ ! Jullie hebben een gedeelde terminal.
Als je meer geavanceerde multi-user tmux-sessies wilt, probeer dan tmate, het is een fork van tmux die gezamenlijke terminalsessies aanzienlijk vereenvoudigt.
Bron: habr.com
