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.
- Zorg dat de
/home
-map eigendom is vanroot
en voor niemand anders schrijfbaar is.
sudo chown root:root /home;
sudo chmod 755 /home;
- Voeg een nieuwe gebruiker toe aan de server
sudo adduser --shell /bin/false arthur;
- Maak de
arthur
-map lees- en schrijfbaar voor niemand behalvearthur
sudo chmod 700 /home/arthur;
- Installeer de OpenSSH-server
sudo apt install openssh-server;
- Maak de lokale poort (meestal
TCP 22
) vanaf internet bereikbaar - 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
- 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