vsftpd: virtual users uit text file

Na eerder vsftpd te hebben opgezet met “echte” unix gebruikers, kreeg ik als reactie op die blogpost de vraag voorgelegd hoe vsftpd ingesteld kan worden om gebruik te maken van virtuele gebruikers via PAM.

PAM staat voor Pluggable authentication module en is een algemene authenticatie module die o.a. voor ssh en ftp gebruikt kan worden.

Er zijn een tweetal veel gebruikte manieren om de gebruikers van vsftpd te beheren en op te slaan. Hierbij wordt geregeld een Berkeley database gebruikt, maar om het beheer zo eenvoudig mogelijk te houden is het ook mogelijk om dit in een text file te doen. Dat laatste is wat we deze tutorial gaan realiseren.

Requirements

Voor het genereren van de hashes van de wachtwoorden gebruikt deze tutorial de tool htpasswd. Deze wordt standaard met apache meegeleverd.

Installeren

Allereerst moeten we een tweetal packages installeren, te weten vsftpd zelf en een module voor PAM voor password files genaamd libpam-pwdfile.

sudo apt-get install vsftpd libpam-pwdfile

Configureren vsftpd

Nu vsftpd geïnstalleerd is moet deze geconfigureerd worden. Het is altijd verstandig eerst een backup te maken van config files voordat je deze aanpast. De config file van vsftpd staat in /etc/vsftpd.conf. Mijn ervaring is dat het prettig is de backup een datum mee te geven, zo is het mogelijk om meerdere backups te maken (bijv. voor iedere wijziging) zodat een specifieke config van een bepaalde datum teruggezet kan worden indien nodig.

sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak_20130129

Let op: aangezien er redelijk wat veranderd moet worden aan de configuratie wordt het configuratie bestand hier verplaatst i.p.v. gekopieerd! Normaliter zal je hier i.p.v. mv (move) eerder cp (copy) gebruiken.

Hierna is het tijd om een nieuw configuratiebestand te maken, gebruik hiervoor de gewenste editor (in dit geval wordt er gebruik gemaakt van nano.

sudo nano /etc/vsftpd.conf

Zet hierin de volgende configuratie en sla deze op.

listen=YES
# geen anonieme gebruikers
anonymous_enable=NO
# sta lokale gebruikers toe
local_enable=YES
# staat virtuele gebruikers toe
guest_enable=YES 
# variabele waarin username komt
user_sub_token=$USER 
# pad waarin de bestanden van de user staan
local_root=/srv/ftp/$USER 

# virtuele gebruikers hebben dezelfde privileges als lokale gebruikers
virtual_use_local_privs=YES 
# sta enkel het eigen pad toe
chroot_local_user=YES 
# sta schrijfacties toe 
write_enable=YES 
# privileges voor nieuwe bestanden
local_umask=022 

# gebruik user vsftpd als owner en rechten
nopriv_user=vsftpd
guest_username=vsftpd
hide_ids=YES

Deze vsftpd.conf is ook te downloaden.

Virtuele gebruikers aanmaken

Nu moeten er een aantal mappen worden gemaakt. Allereerst maken we een vsftpd map in /etc aan. Hier kunnen we vsftpd gerelateerde bestanden opslaan.

sudo mkdir /etc/vsftpd

Hierin gaan we de password file maken, waarin de username i.c.m. een password hash komt te staan. Deze password file hoeft nog niet gevuld te worden maar alleen te bestaan. Dat kan met het touch commando.

sudo touch /etc/vsftp/ftp.passwd

Hierna is het mogelijk om deze file te gaan vullen, hiervoor wordt gebruik gemaakt van de htpasswd tool.

sudo htpasswd -d /etc/vsftpd/ftp.passwd [USERNAME]

Hierna zal er direct om een wachtwoord gevraagd worden die, voor de zekerheid, tweemaal ingevoerd moet worden.

Vervang [USERNAME] door de gewenste gebruikersnaam. Voor deze tutorial gaan we van user1 uit.

De -d parameter staat voor forceer MD5.

Virtuele gebruikers uitzetten

Wanneer een gebruiker geen toegang meer heeft, volstaat het plaatsen van een ‘#’ voor de lijn waarin de gebruiker staat in de ftp.passwd file. Deze lijn is te herkennen aan de gebruikersnaam.

PAM configureren

De volgende stap is het configureren van PAM. Dit heeft mij de nodige hoofdbrekens opgeleverd aangezien ik eerst niet begonnen ben met een lege file maar de bestaande regels had aangevuld. Daarom start ik in deze tutorial dan ook met een lege file.

Uiteraard maken we eerst weer een backup van de PAM vsftpd config file:

sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak_20130129

Hierna openen we het nieuwe bestand in de editor:

sudo nano /etc/pam.d/vsftpd

In deze configfile moet het volgende staan, waarin onder andere de verwijzing naar de password file staat.

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftp.passwd
account required pam_permit.so

Nu is PAM geconfigureerd voor het gebruik van deze gebruikersgegevens.

Lokale gebruiker aanmaken voor rechten

Wanneer de virtuele gebruiker verbinding maakt met de FTP server, zal de data van het filesystem de rechten moeten hebben/krijgen van een lokale gebruiker. Hiervoor maak ik een lokale gebruiker aan zonder shell rechten (kan dus niet inloggen op ssh of ftp).

sudo useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

Een reeds bestaande gebruiker de shell rechten ontnemen? Zie Unix: geen shell toegang voor unix gebruiker.

Mappen maken en rechten instellen

In de vsftpd config file hebben we het pad ingesteld op /srv/ftp/$USER. Dit pad voldoet aan de “Filesystem Hierachy Standard” die voor het /srv pad het volgende voorschrijft:

/srv: Data for services provided by this system

Voor het gemak wordt er in dit gedeelte uitgegaan van de gebruikersnaam user1. Vervang user1 uiteraard door de gekozen gebruikersnaam.

We gaan uit van de volgende mappen structuur:

root: /srv/ftp/user1
data: /srv/ftp/user1/data

Uiteraard kan je data ook anders noemen of nog andere mappen toevoegen.

Het bovenstaande pad moet echter wel eerst worden gemaakt en worden voorzien van de juiste rechten.

sudo mkdir -p /srv/ftp/user1/data

De -p parameter zorgt ervoor de bovenliggende mappen die niet bestaan ook worden gemaakt. Zo wordt de map ftp en user1 ook aangemaakt indien deze nog niet bestaat i.p.v. een melding krijgen dat de map data niet kan worden gemaakt.

Nu moeten de rechten goed worden gezet, we beginnen met het weghalen van schrijfrechten bij de ftp user zijn root directory:

sudo chmod -w /srv/ftp/user1

Hierna zetten we de rechten op 755 voor de data directory:

sudo chmod -R 755 /srv/ftp/user1/data

Voor meer informatie over rechten in unix, zie Numerical Permissions.

Als laatste moeten we zorgen dat de gebruiker vsftpd de eigenaar is van de gehele map en onderliggende mappen:

sudo chown -R vsftpd:nogroup /srv/ftp/user1

Nu staan de rechten goed ingesteld.

Herstarten

Na alles te hebben ingesteld is het tijd dat vsftpd herstart wordt.

sudo /etc/init.d/vsftpd restart

of

sudo service vsftpd restart

Hierna kunnen de virtuele gebruikers inloggen op de ftp server!

FileZilla

Gebruiker toevoegen script

Om het toevoegen van gebruikers eenvoudiger te maken heb ik het volgende script geschreven. Dit script voegt een virtuele gebruiker toe, maakt de mapppen aan en stelt de rechten goed in.

#!/bin/bash
base="/srv/ftp/"
username=$1

# only root can run this script
if [[ $EUID -ne 0 ]]; then
   echo "Permission denied, must be run as superuser."
   exit 1
fi

# determine if valid user is given
if [ -z "$username" ]; then
   echo 'Username is required!'
   echo ''
   echo 'Command:  addftpuser USER'
   exit 1
fi

# if user dir doesn't exist, create new one
if [ ! -d "$base$username/" ]; then
   # add the user
   htpasswd -d /etc/vsftpd/ftp.passwd "$username"
       
   # create the directories
   mkdir -p "$base$username/data"

   # set the correct rights
   chmod -w "$base$username"
   chmod -R 755 "$base$username/data"
   chown -R vsftpd:nogroup "$base$username"

   echo 'ftpuser created!'
else 
   echo 'ftpuser directory already exists!'
   exit 1
fi

Sla dit script op als ftpuser of download deze en maak deze uitvoerbaar met:

sudo chmod +x ftpuser

Nu is het script aan te roepen als volgt:

sudo ./ftpuser [USERNAME]

Met als resultaat:

ftpuser

Dit script is enkel aan te roepen vanuit de map waarin deze is opgeslagen. Wil je dit script server wide beschikbaar maken, zie dan Unix: directory toevoegen aan de global path.

Update 19-02-2013: nu ook een download link voor vsftpd.conf toegevoegd aangezien het kopieren niet altijd goed gaat.

Leave a Reply

Your email address will not be published. Required fields are marked *