Spring naar hoofdtekst

Inhoudsopgave

Bestanden delen met sFTP

Geplaatst op door ,
Laatste aanpassing op .

Inleiding

Toen mij laatst iemand vroeg om een aantal grote bestanden te delen, had ik een paar opties. Voor gelegenheidsdownloads maak ik soms gebruik van WeTransfer, een Amerikaans bedrijf dat (grote) bestanden aanneemt en, eventueel voor meerdere gebruikers, als download aanbiedt. In dit geval wilde ik echter meer controle en de data niet onnodig over de Atlantische oceaan pompen.

Als tweede mogelijkheid dacht ik aan het oud vertrouwde FTP. Maar dit heeft voor mij als grootste nadeel dat er geen enkele vorm van beveiliging aan te pas komt. Zowel het aanmelden (gebruikersnaam, wachtwoord) als het transport van de data zelf gaan onversleuteld van A naar B. Dit moest toch beter kunnen?

SSH to the rescue

De veiligste methode om met een GNU/Linux server te communiceren is Secure Shell (SSH). In de meeste gevallen meld je je met een gebruikersnaam en een bijbehorend wachtwoord aan. Dan krijg je een commandoprompt (shell) alsof je live met een terminal van de server verbonden zou zijn.

In dit geval wilde ik de gebruiker echter geen volledige shell-toegang geven, maar wel de bestanden kunnen laten downloaden. Op dat moment schoot de veelzijdigheid van het SSH-protocol te hulp. Er bestaat namelijk een soort FTP via SSH genaamd sFTP. Cliëntprogramma's als FileZilla en WinSCP ondersteunen deze variant volledig.

Installatie

Als voorbeeld zal ik hieronder de gebruiker arthur toevoegen.

  1. Zorg dat de /home-map eigendom is van root en voor niemand anders schrijfbaar is.
$ sudo chown root:root /home;
$ sudo chmod 755 /home;
  1. Voeg een nieuwe gebruiker toe aan de server
  $ sudo adduser --shell /bin/false arthur;
  1. Maak de arthur-map lees- en schrijfbaar voor niemand behalve arthur
$ sudo chmod 700 /home/arthur;
  1. Installeer de OpenSSH-server
$ sudo apt install openssh-server;
  1. Maak de lokale poort (meestal TCP 22) vanaf internet bereikbaar
  2. Voeg de onderstaande regels aan /etc/ssh/sshd_config toe:
AllowUsers fwiep arthur
Subsystem sftp internal-sftp
Match User arthur
    ChrootDirectory /home
    AllowTCPForwarding no
    X11Forwarding no
    ForceCommand internal-sftp
  1. Herstart de SSH service
$ sudo service ssh restart;

Efficiënt delen

In bovenstaande situatie wilde ik één bepaalde map op mijn harde schijf delen met de SFTP-gebruiker. In plaats van die map te kopiëren of te verplaatsen, koos ik voor het opnieuw mount-en van de map in zijn /home-map. Daartoe moest die map daar wel bestaan en de juiste eigenaar hebben:

$ sudo -u arthur mkdir /home/arthur/HugeFiles;

Daarna voegde ik aan mijn /etc/rc.local het volgende commando toe, zodat dit bij elke systeemstart zou worden uitgevoerd:

# Maak een (alleen-lezen) link tussen twee mappen
mount --bind -o ro /mnt/DATA/fwiep/HugeFiles /home/arthur/HugeFiles;

# Zorg dat onderstaand commando als laatste staat
exit 0;

Beveiliging

Met adviezen over adequate netwerkbeveiliging kun je complete bibliotheken vullen. Ik niet, dus doe ik hieronder slechts een simpele poging om te vertellen wat ik weet en wat zich in mijn praktijk heeft bewezen.

Poort 22

De standaard netwerkpoort van een SSH-server is 22. Dit is wereldwijd bekend en daarom verbaasde het mij niet dat er met de regelmaat van de klok computers uit China, Ukraine en de rest van de wereld aan mijn deur klopten. Een mogelijkheid om het leeuwendeel van deze slechteriken buiten de deur te houden is te kiezen voor een andere TCP poort.

Voeg de onderstaande regel aan /etc/ssh/sshd_config toe:

# What ports, IPs and protocols we listen for
Port 54364

Public Key Authentication

In plaats van met een wachtwoord, kan SSH ook overweg met Public Key Authentication, een methode om met publieke en bijpassende privé sleutels te kunnen inloggen.

Als eerste zul je op de cliënt computer een sleutelpaar moeten aanmaken. Dat kan met ssh-keygen -b 4096. Daarna moet de publieke sleutel naar de server worden gekopieerd: ssh-copy-id user@servername.

De volgende regels in /etc/ssh/sshd_config schakelen daarna wachtwoorden uit, en de veiligere manier van aanmelden in:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no