Fjärrmaskiner

Det har blivit allt vanligare att programmerare använder fjärrservrar i sitt dagliga arbete. Om du behöver fjärrservrar för att driftsätta backendprogramvara, eller behöver en server med högre beräkningskapacitet, kommer du att använda Secure Shell (SSH). Som med de flesta verktyg vi tar upp är SSH mycket konfigurerbart, så det är värt att lära sig ordentligt.

Köra kommandon

En ofta förbisedd funktion i ssh är möjligheten att köra kommandon direkt.

SSH-nycklar

Nyckelbaserad autentisering använder publik nyckelkryptografi för att bevisa för servern att klienten äger den hemliga privata nyckeln, utan att avslöja själva nyckeln. På så sätt behöver du inte skriva in lösenordet varje gång. Den privata nyckeln (t.ex. ~/.ssh/id_rsa) är dock i praktiken ditt lösenord, så behandla den därefter.

Om du har konfigurerat push till GitHub med SSH-nycklar har du sannolikt redan följt stegen här och har ett giltigt nyckelpar. För att kontrollera om du har lösenfras och verifiera nyckeln kan du köra ssh-keygen -y -f /path/to/key.

cat .ssh/id_dsa.pub | ssh foobar@remote 'cat >> ~/.ssh/authorized_keys'

En enklare lösning är ssh-copy-id där det finns tillgängligt.

ssh-copy-id -i .ssh/id_dsa.pub foobar@remote

Kopiera filer över SSH

Det finns många sätt att kopiera filer över SSH.

Bakgrundsprocesser

Som standard dödas barnprocesser till det överordnade skalet när en SSH-anslutning avbryts. Det finns ett par alternativ.

Om du till sist har gjort disown på ett program och vill återansluta det till aktuell terminal, kan du titta på reptyr. reptyr PID tar processen med id PID och kopplar den till din nuvarande terminal.

Portvidarebefordran

I många scenarier stöter du på program som fungerar genom att lyssna på portar på maskinen. När det sker lokalt använder du bara localhost:PORT eller 127.0.0.1:PORT, men vad gör du på en fjärrserver där portarna inte är direkt tillgängliga över nätet/internet? Detta kallas portvidarebefordran, och finns i två varianter: lokal portvidarebefordran och fjärrportvidarebefordran (se bilderna för mer detaljer, bilderna kommer från detta SO-inlägg).

Lokal portvidarebefordran Lokal portvidarebefordran

Fjärrportvidarebefordran Fjärrportvidarebefordran

Det vanligaste scenariot är lokal portvidarebefordran, där en tjänst på fjärrmaskinen lyssnar på en port, och du vill koppla en port på din lokala maskin till den fjärrporten. Om vi till exempel kör jupyter notebook på fjärrservern och den lyssnar på port 8888, kan vi vidarebefordra till lokal port 9999 med ssh -L 9999:localhost:8888 foobar@remote_server och sedan surfa till localhost:9999 på vår lokala maskin.

Vidarebefordran av grafik

Ibland räcker inte portvidarebefordran, eftersom vi vill köra ett GUI-baserat program på servern. Du kan alltid använda fjärrskrivbordsprogram som skickar hela skrivbordsmiljön (t.ex. RealVNC, Teamviewer, osv). Men för ett enstaka GUI-verktyg erbjuder SSH ett bra alternativ: vidarebefordran av grafik.

Att använda flaggan -X säger åt SSH att vidarebefordra.

För betrodd X11-vidarebefordran kan flaggan -Y användas.

Sista notering: för att detta ska fungera måste sshd_config på servern innehålla följande inställningar.

X11Forwarding yes
X11DisplayOffset 10

Roaming

Ett vanligt problem vid anslutning till en fjärrserver är frånkopplingar när datorn stängs av/går i vila eller när nätverk byts. Dessutom kan SSH bli frustrerande om anslutningen har hög latens. Mosh, det mobila skalet, förbättrar SSH, och stödjer roaminganslutningar, intermittent uppkoppling och intelligent lokal eko.

Mosh finns i vanliga distributioner och pakethanterare. Mosh kräver att en SSH-server fungerar på servern. Du behöver inte vara superanvändare för att installera mosh, men det kräver att portar 60000 till 60010 är öppna på servern (vilket de ofta är, eftersom de inte ligger i det privilegierade intervallet).

En nackdel med mosh är att det inte stöder roaming för port-/grafikvidarebefordran, så om du använder det ofta hjälper mosh inte särskilt mycket.

SSH-konfiguration

Klient

Vi har gått igenom många argument som kan skickas med. Ett frestande alternativ är att skapa skalalias som ser ut som alias my_server="ssh -X -i ~/.id_rsa -L 9999:localhost:8888 foobar@remote_server", men det finns ett bättre alternativ: använd ~/.ssh/config.

Host vm
    User foobar
    HostName 172.16.174.141
    Port 22
    IdentityFile ~/.ssh/id_rsa
    RemoteForward 9999 localhost:8888

# Konfigurationen kan också använda jokertecken
Host *.mit.edu
    User foobaz

En ytterligare fördel med ~/.ssh/config jämfört med alias är att andra program, som scp, rsync, mosh, osv, också kan läsa filen och översätta inställningarna till motsvarande flaggor.

Observera att ~/.ssh/config kan betraktas som en dotfile, och i allmänhet är det okej att ha den tillsammans med övriga dotfiles. Men om du gör den publik, tänk på vilken information du potentiellt ger främlingar på internet: serveradresser, användarnamn, öppna portar, osv. Detta kan underlätta vissa typer av attacker, så tänk efter noga innan du delar din SSH-konfiguration.

Varning: inkludera aldrig dina RSA-nycklar (~/.ssh/id_rsa*) i ett publikt kodförråd.

Serversidan

Serversidans konfiguration finns oftast i /etc/ssh/sshd_config. Här kan du göra ändringar som att stänga av lösenordsautentisering, ändra SSH-port, aktivera X11-vidarebefordran, osv. Du kan även ange inställningar per användare.

Fjärrfilsystem

Ibland är det smidigt att montera en fjärrmapp. sshfs kan montera en mapp på en fjärrserver lokalt, så att du kan använda en lokal redigerare.

Övningar

  1. För att SSH ska fungera måste värden köra en SSH-server. Installera en SSH-server (som OpenSSH) i en virtuell maskin så att du kan göra resten av övningarna. För att ta reda på maskinens IP-adress kör du ip addr och tittar efter fältet inet (ignorera posten 127.0.0.1, den motsvarar loopback-gränssnittet).

  2. Gå till ~/.ssh/ och kontrollera om du har ett SSH-nyckelpar där. Om inte, generera ett med ssh-keygen -t rsa -b 4096. Rekommendationen är att använda lösenfras och ssh-agent, läs mer här.

  3. Använd ssh-copy-id för att kopiera nyckeln till din virtuella maskin. Testa att du kan SSH:a utan lösenord. Redigera sedan sshd_config på servern och stäng av lösenordsautentisering genom att ändra värdet på PasswordAuthentication. Stäng även av root-inloggning genom att ändra PermitRootLogin.

  4. Redigera sshd_config på servern för att ändra SSH-port och kontrollera att du fortfarande kan SSH:a in. Om du har en publik server minskar icke-standardport och nyckelbaserad inloggning mängden automatiserade angrepp betydligt.

  5. Installera mosh på servern/VM:n, etablera en anslutning och koppla sedan bort nätverksadaptern för servern/VM:n. Kan mosh återhämta sig korrekt?

  6. Ett annat användningsområde för lokal portvidarebefordran är att tunnla en viss värd via servern. Om ditt nätverk filtrerar en webbplats som reddit.com kan du tunnla den via servern så här:

    • Kör ssh remote_server -L 80:reddit.com:80
    • Sätt reddit.com och www.reddit.com till 127.0.0.1 i /etc/hosts
    • Kontrollera att du når webbplatsen via servern
    • Om det inte är uppenbart, använd en webbplats som ipinfo.io där resultatet ändras beroende på värdens publika IP.
  7. Portvidarebefordran i bakgrunden går lätt att göra med ett par extra flaggor. Ta reda på vad flaggorna -N och -f gör i ssh och förstå vad ett kommando som ssh -N -f -L 9999:localhost:8888 foobar@remote_server gör.

Referenser


Edit this page.

Licensed under CC BY-NC-SA.