Veilige Samba (Linux en Windows)

New! Op deze pagina (een onderpagina van mijn Linux pagina's) wat aandacht over hoe de files te benaderen vanuit Linux met behulp van Samba, on omgedraaid ook weer hoe vanaf Linux je Windows files te benaderen...

Wat is Samba: de Linux SMB server... SMB is het 'Server Message Block' is het netwerkprotocol dat gebruikt wordt om in Microsoft Windows bestandsuitwisseling tussen meerdere computers mogelijk te maken (file sharing), Samba is een open source project om dit ook vanuit Linux etc aan te kunnen bieden (al heeft Microsoft officieel de specificaties niet vrijgegeven). Dus als je op de linux-box een samba-server draait, kan je de files daar vanuit Windows gewoon als disk zien.

Maar, je kan het ook vanaf andere Linux-systemen benaderen. Op deze pagina's hier wat uitleg over, en met name over hoe je dit op een veilige manier over het externe internet kan doen. Geen uitleg over de samba server zelf (en de ssh-gateway daarop), maar daarover kan je wel wat lezen op mijn NSLU2 met Debian Linux pagina.

Samba File Server/Windows files vanuit Linux benaderen

Ik heb een mooie file server aan mijn netwerk hangen (NSLU2), maar: wel met een Windows file system (SMB gebaseerd). Hoe kan ik hier vanuit Linux bij? Grote kans dat je zo je netwerk- en gedeelde drives al in de verkenner ziet. Zo niet: in de 'verkenner' (bijvoorbeeld Konqueror in Knoppix, Nautilus in Ubuntu) is het pad bijvoorbeeld 'smb://mycomputername/mydirectory' .

Windows files op dezelfde computer, maar een andere disk/partitie (fat of ntfs), zijn gewoon vanuit Ubuntu en Knoppix te lezen (en voor nieuwere versies ook te schrijven).

Helaas, niet alle programma's kunnen zulke smb:-paden aan. In plaats daarvan (of er naast) kan ik zo'n drive ook 'mounten', zodat de files via normale Linux-paden (ik kies hier voor het min of meer standaard pad /media/smb (Ubuntu, of /mnt/smb op sommige andere linux-systemen), bij meerdere servers kan je ze bijvoorbeeld nummeren als smb1, smb2, of meer functionele namen geven) bereikbaar zijn.

Let op, afhankelijk van je Linux-versie eerst éénmalig het 'mount-punt' aanmaken:
    sudo mkdir /media/smb
en evt de samba file system driver laden:
    sudo apt-get install smbfs

Voorbeeld: als de computer netdisk2 heet, en de share (map) "DISK 1" (onderstaande is één regel, en de stukjes tussen < en > (inclusief de < en > ) moet je vervangen door de voor jouw systeem toepasselijke waarden):

sudo smbmount "//netdisk2/DISK 1" /media/smb -o username=<je_username>,password="<je_wachtwoord>",uid=<je_username>,gid=<je_username>

Geef je nu 'ls /mnt/smb' (zo iets als 'dir N:' voor de DOS prompt) dan zie je de files op die disk. De uid/gid (user id, group id) parameters zorgen dat de files op je gemounte disk als van jou zijn, en niet van 'root'. Meer info ook op de Nederlandse Linux Wiki.

Ps: bij een van mijn computers met Ubuntu werd de computernaam NetDisk niet gevonden (mogelijk omdat ik tijdens die sessie al te veel had zitten rommelen): dan kan het ook via IP-adres, als iun de regel hieronder. Alternatief is de naam toevoegen in de /etc/hosts file (maar alleen bij gebruik van een vast IP adres!).

sudo smbmount "//192.168.1.9/DISK 1" /media/smb -o ...' 

En ja, nu kan ik ook in Ubuntu met IrfanView in Wine de plaatjes op mijn netwerkdisk bekijken...

Samba over SSH: veilig vanaf het internet

Tot zo ver werkt het goed op het interne netwerk. Ik kan het file systeem ook veilig via het internet benaderen: via een 'SSH tunnel' waarmee alle communicatie via sterke encryptie verloopt. Wat uitleg over SSH op mijn SSH pagina. Naar keuze kan je dit gebruiken met een password, of met de (naar mijn idee veiliger) aanpak met key files en pass phrases, kijk hiervoor op uitleg over het SSH protocol.

Contact leggen met je thuisserver via het internet? Bij veel providers heb je geen vast IP adres. Dank zij de services van DynDNS kan je een naam koppelen aan je (wisselende) externe IP adres, en zo je server via naam benaderen (zie ook mijn server page).

Op linux werkt deze aanpak heel eenvoudig, en kan je het filesysteem vervolgens normaal mounten: zie ook de Samba over SSH tunnel mini-howto. Ik pak het iets moderner aan dan in de how-to uitgelegd, en gebruik de opvolger cifs over poort 445 in plaats van smbfs over poort 139. In Ubuntu als volgt: eerst een ssh-verbinding opzetten in de achtergrond, vul bij ssh het goede externe ip-adres en poortnummer in. Let wel, de -L parameter vraagt juist niet het externe adres, maar het interne adres waar de samba-server lokaal te vinden is (is overigens bij mij hetzelfde kastje als de ssh gateway, de NSLU2). Onderstaande code is één regel!

ssh -2 -f -N -p <port> -L 12345:192.168.1.9:445 <ssh_username>@<ipaddress>

En vervolgens met mount de netwerk-disk mounten via het lokale einde van de ssh-tunnel op 127.0.0.1:12345, als de aangemaakte directory (ook weer als één regel):

sudo mount -t cifs //netdisk2/shared /media/netdisk2 -o username=<samba username>,password=<samba password>,ip=127.0.0.1,port=12345,rw,uid=<username>

Alternatief (met name op de MAC, die de ip= optie blijkbaar niet kent), hier gaat wel om het wachtwoord gevraagd worden:

sudo mount -t smbfs //<samba_username>@127.0.0.1:12345/shared /media/netdisk2 -o rw,uid=<username>

Let op: ik gebruik lokaal een afwijkend poortnummer 12345, omdat poort 445 (en 139) een systeempoort is, en deze alleen als root gereserveerd kunnen worden. Maar, als ik ssh met sudo als root draai, kan'ie weer niet bij mijn ssh-agent en dan is inloggen met keyfiles weer lastig.
Let op: wel ooit éénmalig een keer van te voren het mountpunt aanmaken, bijvoorbeeld sudo mkdir /media/netdisk2

Merkwaardig genoeg werkt credentials= niet zo maar... Je moet eerst smbfs installeren (waar blijkbaar een vollediger cifs in zit). Dus eenmalig:

sudo apt-get update
sudo apt-get install smbfs

Je samba/cifs username en wachtwoord kan je overigens veiliger in een credentials file opslaan (zet dan wel de rechten op user read-only); zie man smbmount, -o credentials=<filename>,... Door de juiste aanpassingen in /etc/fstab is het ook mogelijk zulke shares automatisch met booten al te laten mounten (al hebben sommige problemen, soms is het netwerk dan nog niet voldoende actief opgestart; misschien beter in een init.d script als een der laatsten, of met delay?), voeg de volgende (één!) regel toe (met credentials file in /root), bijvoorbeeld:

//netdisk2/shared /media/netdisk2 cifs auto,credentials=/home/<user>/.smb_credentials,ip=127.0.0.1,port=12345,user 0 0

Windows vanaf het externe internet is wat lastiger: zie verderop op deze pagina over de NetDrive aanpak, of Samba over SSH for Windows). Maar, op windows kan je dan ook WinSCP of FileZilla/SFTP gebruiken in plaats van Samba.

Alternatief (Linux): de SSHFS aanpak

Met dank aan Cybertinus en sverrips van het NedLinux forum (nog niet door mij uitgetest):

Mocht je Linux gebruiken, dan moet je eens kijken naar sshfs. Daarmee kan je ook SFTP servers mouten op bepaalde directories. Hoe sshfs werkt durf ik niet te zeggen. Nog nooit wat mee gedaan. Maar ik weet vrij zeker dat er op internet howto's te vinden zijn over hoe het werkt.

Installeren met apt-get install sshfs. Daarna moet je een map kunnen mounten aan een ssh verbinding. Dat doe je als volgt:

sshfs stephan@everywheredomain.nl:/map1 map2

map1 moet de map op de server zijn en map2 een lokale map.

NetDrive aanpak: veilig vanuit Windows

Via WinSCP of FileZilla/SFTP kan je vanuit Windows ook bij je files via een SSH-beveiligde verbinding. Maar, wil je de drive echt op een drive letter (als N:) kunnen mappen? Kijk hier. Met dank aan Cybertinus van het NedLinux forum, die onderstaand verhaal voor mij heeft ingetypt op een vraag hierover (nog niet door mij uitgetest):

Gebruik je Windows? Kijk dan eens naar de tool NetDrive. Daar kan je FTP en WebDAV shares mee mounten op een driveletter. Dat werkt best leuk. Ik heb het net ff geïnstalleerd op m'n virtuele 32 bit Windows XP en ik heb gewoon netjes een share gemaakt naar de SSH server die op de Linux Host staat.

Netdrive werkt op de volgende manier (ik heb hem in het Engels geinstalleerd, ik hoop dat het toch duidelijk is als jij hem Nederlands hebt geïnstalleerd):

  1. Als je NetDrive installeert begin je met het aanmaken van een site. Onderaan het linker gedeelte van het scherm staan een hele hoop grijze knopjes, de meest linker moet je hebben.
  2. Even een naam bedenken voor de share, dat is een kwestie van gewoon invullen
  3. Dan kan je nu naar het rechter gedeelte gaan kijken. Bij "Site IP or URL" vul je het het externe IP in van jouw thuis, dus het IP wat je nu al gebruikt om extern verbinding te krijgen met SSH. Je kan hier natuurlijk ook een hostname invullen als je een hostname aan je thuis-IP hebt gehangen.
  4. Het "Server Type" moet je op FTP laten staan. Je zal zien dat bij "Port" nu nog 21 staat (en niet 22, waar SSH op draait). Dat komt straks goed.
  5. Bij "Drive" kies je de driveletter waar deze share voortaan op moet gaan draaien.
  6. Bij "Account" vul je de gebruikersnaam in waarmee je normaal via SSH verbind.
  7. Bij "Password" vul je het wachtwoord van die gebruiker in. Of je het vinkje "Save pasword" aan laat staan moet je zelf even bepalen. Het is natuurlijk een stuk makkelijker, maar het is ook een risico mocht iemand anders achter de computer van je zoon terecht komen.
  8. "Automatic login when system starts" en "Automatic login when NetDrive starts" zijn wel handige vinkjes om aan te zetten als je altijd toegang wil hebben tot deze share. Als je deze 2 vinkjes aanzet wordt de share meteen aangekoppeld als Windows start.
  9. Nu moet je even eerst even naar de Advanced instellingen gaan (weer in die rij grijze knopjes, het meest rechtse knopje moet je nu hebben). Dan zie je de de optie "SSL" staan en die staat standaard ingesteld op "No SSL". Als je dat boxje open klikt en daar "SFTP using SSH2" van maakt, dan ga je daarna over SFTP (dus via je SSH server) werken. Als je op OK klikt dan zie je dat in het "Port" veldje nu ook netjes poort 22 staat.
  10. Klik nu op "Save" om de verbinding op te slaan en daarna op "Connect". Als het goed is zie je nu een explorer venster verschijnen met daarin de inhoud van de share thuis.

Hopelijk heb je wat aan mijn informatie en ik hoop dat je een verbinding opgezet krijgt naar jouw thuis.