Vsftpd kasutamine Debian Lennyga

Allikas: Kuutõrvaja

Sissejuhatus

FTP server võimaldab üle võrgu serveri failisüsteemi andmeid üles ja alla kopeerida ning seejuures kontrollida kasutajate ligipääse. FTP on nö klassikaline teenus võrgus ja vsftpd http://vsftpd.beasts.org/ on eeskujulik ftp serveri tarkvara, mille autorid on aktsenteerinud turvalisust ja jõudlust nt enamikul juhutumitel praktilisel kasutamisel ebaoluliseks kujunevatele funktsionaalsetele omadustele.

Tarkvara paigaldamine

Debian Lenny

Debian Lenny paketihaldus sisaldab vsftp tarkvara v. 2.0.7 ja paigaldamiseks sobib öelda

 # apt-get install vsftpd

Tarkvara paigaldamise käigus lisatakse süsteemi kasutaja ftp, kes kuulub gruppi nogroup.

Serveri seisukohast ei ole see oluline, aga praktiliselt ehk on katsetamiseks abiks ka paigaldada ftp serverisse ftp klient, operatsioonisüsteem Debian vaikimisi ei sisalda ftp kliendi, paigaldamiseks sobib öelda nt

 # apt-get install ftp

FreeBSD

# cd /usr/ports/ftp/vsftpd && make install clean

FTP tööpõhimõte

FTP protokoll on ajaloolisetel põhjustel erinev paljudest teistest klient-server protokollidest selles osas, et kliendi ja serveri vahelisel suhtlemisel kasutatakse üle tcp kahte suhtluskanalit

  • juhtimiskanal - moodustatakse alati kliendi pöördumisel oma mitteprivilegeeritud pordilt serveri 21/tcp porti (vaikimisi)
  • andmevahetuse kanal - moodustatakse aktiivsel juhul serveri pöördumisel klindi poole ja passiivsel juhul kliendi pöördumisel serveri poole

Andmevahetuse kanali moodustamiseks on kaks võimalust

  • aktiivne ftp - peale kliendi pöördumist juhtimiskanalil pöördub server oma 20/tcp src pordilt kliendi näidatud kliendi arvuti /tcp pordi poole
  • passiive ftp - peale kliendi pöördumist lepivad klient ja serveri kokku millise serveri /tcp pordi poole pöördub klienti andmevahetuseks

Seesugune asjakorraldus teeb tulemüüride seadistamise keerulisemaks, lahendust OpenBSD tulemüüri puhul on kirjeldatud aadressil http://www.openbsd.org/faq/pf/ftp.html.

Passiivne ftp

      klient                           server
        ___                              ___
       |   |-------- internet ----------|   |
       |___|                            |___|
 
  41999/tcp (suvaline)      ----->     21/tcp
  42999/tcp (suvaline)      ----->     21000/tcp (kokkulepitud)
  • esmalt algatab klienti kontrollkanali ühenduse serveri 21/tcp porti, seda ühendust mööda liiguvad ftp käsud, ls, cd, pwd jt ning lepitakse kokku andmevahetuse kanali port
  • seejärel algatab klient andmevahtuse pidamiseks ühenduse serveri 21000/tcp porti, mille kasutamine lepiti kontrollkanalil kokku (ftp serveri seadistuses saab tavaliselt fikseerida pordide vahemiku, millisest saab server kliendiga porte kokku leppida)

Aktiivne ftp

      klient                           server
        ___                              ___
       |   |-------- internet ----------|   |
       |___|                            |___|
 
  41999/tcp (suvaline)      ----->     21/tcp
  21000/tcp (kokkulepitud)  <-----     20/tcp
  • esmalt algatab klienti kontrollkanali ühenduse serveri 21/tcp porti, seda ühendust mööda liiguvad ftp käsud, ls, cd, pwd jt ning lepitakse kokku andmevahetuse kanali port
  • seejärel algatab server pordilt 20/tcp andmevahtuse pidamiseks ühenduse kliendi 21000/tcp porti, mille kasutamine lepiti kontrollkanalil kokku
  • nn legacy juhtumitel algatab aktiivsel juhtumil ftp server andmeühenduse oma 20/tcp pordilt, kuid see ei pea tingimata nii olema, ftp serverite seadistustes saab seda kontrollida tavaliselt; ftp-proxy programmil kontrollib seda -r võti

vsftpd serveri seadistamise võimalused

vsftpd serveri tööd juhib seadistusfail /etc/vsftpd.conf ja serverit saab käivitada

  • inetd superserveri abil
  • iseseisva deemonina

vsftpd kasutajad jagunevad kolme gruppi

  • anonüümne kasutaja - serveri teenuse pakkuja ei ole spetsiaalselt leppinud kasutajaga ligipääsu kokku, traditsiooniliselt kasutab kasutaja kasutajanimena 'ftp' ning paroolina oma eposti aadressi (viimasel ajal võib selle jätta näitamata)
  • lokaalsed kasutajad - operatsioonisüsteemi NSS süsteemile teadaolevad kasutajad, nt need, mis esinevad 'getent passwd' väljundid
  • virtuaalsed kasutajad - kasutajad, mis on olemas tänu /etc/pam.d/vsftpd mooduli abil välise kasutajate andmebaasi ühendusele, nt LDAP kataloog ja mis samal ajal puuduvad NSS süsteemist

Lokaalsete ja virtuaalsete kasutajate puhul tuleb tähele panna, et kui sama LDAP kataloogi vastu on seadistatud käima nii NSS kui /etc/pam.d/vsftpd, siis muidu virtuaalsed kasutajad on lokaalsed.

Üks oluline virtuaalsete ja lokaalsete kasutajate erinevus seisneb selles, milline on kasutaja kodukataloogi nimi

  • virtuaalsetel kasutajatel saab kodukataloogiks seadistada /katalooginimi/virtuaalse-kasutaja-nimi kujul esineva katalooginime
  • lokaalsetel kasutajatel on kodukataloogiks /etc/passwd failis näidatud kodukataloog või kui NSS on seadistatud vastu LDAP'i siis nt homeDirectory atribuudi väärtus

vsftpd serverit saab käivitada nt selliselt

  • anonüümne ftp server andmete alla kopeerimiseks - kõik ftp serveri kasutajad on ftp failisüsteemi operatsioonide jaoks teisendatud üheks süsteemi kasutajaks, nt ftp ning sellele kasutajale on lubatud liikuda nn ftp serveri juurfailisüsteemiks näidatud kataloogi all ning kopeerida faile; selliselt seadistatakse tavaliselt nt tarkvara ftp mirrorid
  • anonüümne ftp server andmete alla ja üles kopeerimiseks - sarnane eelmisele kuid teatud kataloogidesse saab anonüümne kasutaja kopeerida ka andmeid ülesse; tavaliselt on need nn pimedad kataloogid, st selliselt töötavate kataloogide nime on vaja eelnevalt teada kusjuures ftp serveri kasutaja ei saa katalooge juurde moodustada ning ei saa kord üles kopeeritud andmed kustutada
  • kasutajaid autentiv ftp server - ftp server autendib kasutajaid, kuid muul viisil käitub sarnaselt anonüümsele ftp serverile; nt autenditud kasutajad saavad ainult andmeid alla kopeerida; selliselt sobib seadistada mingi piiratud ligipääsuga andmete jagamine kui otsustatakse kasutada ftp protokolli ligipääsuks
  • kasutajaid autentiv ftp server - kasutaja sisse ftp serverisse sisse logida oma kasutajanime ja parooliga ning seejärel toimetada oma personaalses kodukataloogis kuhu teistel ftp serveri kasutajatel puudub ligipääs; andmeid on võimalik üles ja alla laadida, moodustada katalooge ning kustutada andmeid serverist; selliselt seadistatakse tavaliselt käima nt veebimajutuse süsteemide ligipääsukontod kui otsustatakse kasutada ftp protokolli ligipääsuks

ftp serveri seadistusfailis /etc/vsftpd.conf kasutatada olevad parameetrid jagatakse kolme gruppi

  • tõeväärtuse tüüpi parameetrid (ingl. k. boolean)
  • numbrilised parameetrid
  • tekstilised parameetrid

Anonüümse vsftpd serveri seadistamine

Vaikimisi vsftpd seadistusfail /etc/vsftpd.conf vastab anonüümse ligipääsuga ftp serverile, st ftp server on selliste omadustega

  • serverist saavad kopeerida andmeid anonüümsed kasutajad (sisselogimiseks tuleb traditsiooniliselt sisestada kasutajanimi ftp ning parooliks kirjutada oma eposti aadress või niisama enteriga mööda minna)
  • vaikimisi serveeritakse faile üle ftp protokolli ftp kasutaja kodukataloogist /home/ftp
  • lokaalne ega virtuaalne kasutaja ei saa sisse logida
 # egrep -v "^$|^#" vsftpd.conf
 listen=YES
 anonymous_enable=YES
 dirmessage_enable=YES
 xferlog_enable=YES
 connect_from_port_20=YES
 secure_chroot_dir=/var/run/vsftpd
 pam_service_name=vsftpd
 rsa_cert_file=/etc/ssl/certs/vsftpd.pem

Kataloogi saab muuta muutes /etc/passwd failis ftp kasutaja kodukataloogi asukohta.

Logi tekib faili

 # cat /var/log/vsftpd.log
 Fri Jul 31 19:49:04 2009 [pid 24044] CONNECT: Client "127.0.0.1"
 Fri Jul 31 19:49:06 2009 [pid 24043] [ftp] OK LOGIN: Client "127.0.0.1", anon password "?"

Lisaks saab privileege eemalda ftp serverilt kahe täiendava kasutaja-grupi lisamisega

 ftpsecure:x:1006:109::/home/ftpsecure:/bin/false
 ftpanon:x:1007:110::/srv/ftp:/bin/false

ning lisades seadistusfaili read

 nopriv_user=ftpsecure
 ftp_username=ftpanon

Nii seadistatud vsftpd serveri töö paistab selline

 # ps auxf | grep vsftpd
 root     10771  0.0  0.2  21524  1384 ?        S    19:01   0:00 /usr/sbin/vsftpd
 1006     10780  0.0  0.2  27792  1064 ?        Ss   19:01   0:00  \_ /usr/sbin/vsftpd
 ftpanon  10782  0.0  0.1  27816   948 ?        S    19:01   0:00  |   \_ /usr/sbin/vsftpd
 1006     10787  0.0  0.2  27792  1064 ?        Ss   19:02   0:00  \_ /usr/sbin/vsftpd
 ftpanon  10789  0.0  0.1  27816   948 ?        S    19:02   0:00  |   \_ /usr/sbin/vsftpd

kus

  • juurkasutaja protsessist forkitakse iga kliendi jaoks kaks vsftpd protsessi, mis töötavad privilegeerimata kasutajatena

Lokaalsete kasutajatega vsftpd serveri seadistamine

Lokaalsete kasutajatega kasutamiseks sobib kasutada vaikimisi /etc/pam.d/vsftpd, mis sisaldab

 auth   required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
 
 # Standard blurb.
 @include common-account
 @include common-session
 
 @include common-auth
 auth  required pam_shells.so

ning /etc/vsftpd.conf sisuga

 # egrep -v "^$|^#" /etc/vsftpd.conf
 listen=YES
 anonymous_enable=NO
 local_enable=YES
 write_enable=YES
 local_umask=022
 anon_mkdir_write_enable=NO
 anon_other_write_enable=NO
 dirmessage_enable=YES
 xferlog_enable=YES
 connect_from_port_20=YES
 chroot_local_user=YES
 secure_chroot_dir=/var/run/vsftpd
 pam_service_name=vsftpd

FreeBSD puhul pole seejuures vaja eraldi pami all seadistusi teha ning ka vsftpd konfifailis pam_service_name eraldi defineerida.

Soovites tekitada lokaalseid kasutajaid kes saavad logida vaid ftp kaudu tuleb tekitada kasutaja tavalisel viisi kuid lisades tema shelliks /bin/nologin, sellisel juhul kasutaja enam sshd kasutada ei saan.

Kusjuures, kui NSS seadistusfailis /etc/nsswitch.conf on kirjeldatud LDAP kataloogi kasutamine ning /etc/libnss-ldap.conf failis bind'itakse administraatorina

 binddn cn=admin,dc=auul
 bindpw ldapparool

siis on ka LDAP kasutajad lokaalsed. Tundub, et LDAP kasutaja lokaalsus on olemas just siis kui getent shadow abil on näha kasutaja parooli küptogramm, selle tagab piisava ligipääsuga kasutaja kasutamine libnss-ldap.conf failis

 # getent shadow | grep mart
 mart:qP9QTbkwrd1HM:14456::::::0

NSS kaudu LDAPist tuleva kasutaja parool peab olema sobivalt kodeeritud, nt CRYPT kasutamine LDAP brauseris Apache Directory Studio.

Lokaalsete kasutajate kodukataloogiks on nende NSS kaudu tulev kodukataloog, kas /etc/passwd failist või LDAP kataloogist atribuut homeDirectory.

Virtuaalsete kasutajatega vsftpd serveri seadistamine

Virtuaalseteks vsftpd kasutajateks nimetatakse selliseid kasutajaid, mida pole kirjeldatud ftp serveri /etc/passwd failis, õigemini, mida ei tea NSS teenus, aga mis esinevad nt /etc/pam.d/vsftpd kaudu kättesaadavaks tehtud andmebaasis, nt LDAP kataloogis.

Olgu eesmärgiks selliste omadustega vsftpd serveri seadistamine

  • sisse logida saavad virtuaalsed kasutajad, nt LDAP kataloogist
  • sisselogitud kasutaja saab toimetada oma kodukataloogis
  • sisselogitud kasutaja saab faile serverisse kopeerida
  • anonüümne kasutaja ei saa serverisse sisse logida

Virtuaalsete kasutajate kasutamise peamine eelis seisneb asjaolus, et sellised kasutajad esinevad süsteemi kasutajatena ainult konkreetse teenuse jaoks, nt ei saa nad ssh kaudu sisse logida.

Nt selline seadistusfail sobib eesmärgi täitmiseks

 # egrep -v "^$|^#" vsftpd.conf
 listen=YES
 anonymous_enable=NO
 local_enable=YES
 write_enable=YES
 local_umask=022
 anon_mkdir_write_enable=NO
 anon_other_write_enable=NO
 dirmessage_enable=YES
 xferlog_enable=YES
 connect_from_port_20=YES
 chroot_local_user=YES
 secure_chroot_dir=/var/run/vsftpd
 pam_service_name=vsftpd
 virtual_use_local_privs=YES

kusjuures tarvilik on sobiv LDAP kataloogi ja selle kataloogi kliendiks olemise seadistus, mida on kirjeldatud palas OpenLDAP kasutamine Debianiga ning lisaks sellise sisuga /etc/pam.d/vsftpd seadistusfail

 # cat /etc/pam.d/vsftpd
 auth       required   pam_ldap.so
 account    required   pam_ldap.so

Virtuaalse kasutaja kodukataloogi nimi konstrueeritakse etteantud prefiksist ning kasutajanimest automaatselt.

Mitme vsftpd serveri kasutamine ühes arvutis

FTP puhul ei ole üldiselt mitme erineva seadistusega serveri pidamine samal nn interneti soketil ehk ip aadressil ja pordil võimalik nii nagu seda saab teha nt http serveriga. Põhjuseks on, et ftp puhul puudub sarnaselt http protokollile nn 'Host: domeeninimi' päise kasutamise võimalus serverile esitatavates päringutes, mille alusel saab server erinevatele nn virtuaalhostidele mõeldud päringuid eristada.

Kui soovitakse kasutada samas arvutis erinevate seadistustega ftp servereid, siis tuleb nad käivitada erinevatel soketitel, selleks on kaks võimalust

  • käivitada eksemplarid samal ip aadressil ja erinevatel portidel - kuna ftp server kasutab andmevahetuseks kahte kahe ühenduskanalit, siis võib erineva pordi kasutamine tekitada omajagu lisa segadust
  • käivitada eksemplarid erinevatel ip aadressidel ja samadel portidel - soovitatav valik

Teise eksemplari käivitusskripti saab olemasolevat kopeerides ning tehes vajalikud asendused, nt

 # diff vsftpd*
 19c19
 < if [ -f /etc/vsftpd.conf ] && ! egrep -iq "^ *listen(_ipv6)? *= *yes" /etc/vsftpd.conf; then 
 ---
 > if [ -f /etc/vsftpd-file.loomaaed.tartu.ee.conf ] && ! egrep -iq "^ *listen(_ipv6)? *= *yes" /etc/vsftpd-file.loomaaed.tartu.ee.conf; then 
 24c24
 < NAME=vsftpd
 ---
 > NAME=vsftpd-file.loomaaed.tartu.ee
 33c33
 <     start-stop-daemon --start --background -m --pidfile /var/run/vsftpd/vsftpd.pid --exec $DAEMON
 ---
 >     start-stop-daemon --start --background -m --pidfile /var/run/vsftpd/vsftpd-file.loomaaed.tartu.ee.pid --exec $DAEMON /etc/vsftpd-file.loomaaed.tartu.ee.conf
 38,39c38,39
 <     start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd.pid --oknodo --exec $DAEMON
 <     rm -f /var/run/vsftpd/vsftpd.pid
 ---
 >     start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd-file.loomaaed.tartu.ee.pid --oknodo --exec $DAEMON
 >     rm -f /var/run/vsftpd/vsftpd-file.loomaaed.tartu.ee.pid
 44,46c44,46
 <     start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd.pid --oknodo --exec $DAEMON
 <     rm -f /var/run/vsftpd/vsftpd.pid
 <     start-stop-daemon --start --background -m --pidfile /var/run/vsftpd/vsftpd.pid --exec $DAEMON
 ---
 >     start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd-file.loomaaed.tartu.ee.pid --oknodo --exec $DAEMON
 >     rm -f /var/run/vsftpd/vsftpd-file.loomaaed.tartu.ee.pid
 >     start-stop-daemon --start --background -m --pidfile /var/run/vsftpd/vsftpd-file.loomaaed.tartu.ee.pid --exec $DAEMON
 51c51
 <     start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd.pid --signal 1 --exec $DAEMON
 ---
 >     start-stop-daemon --stop --pidfile /var/run/vsftpd/vsftpd-file.loomaaed.tartu.ee.pid --signal 1 --exec $DAEMON

kus

  • /var/run/vsftpd/vsftpd.pid - protsessi PID
  • /etc/vsftpd.conf - seadistusfail

Lisaks tuleb seadistusfaili seest muuta ära logi jms olulised kohad.

SSL/TLS vsftpd serveri seadistamine

Debiani pakett sisaldab SSL/TLS tuge, mis ei ole vaikimisi sisselülitatud. Kasutamiseks tuleb seadistusfaili lisada nt read

 rsa_cert_file=/etc/ssl/certs/vsftpd.pem
 ssl_enable=YES

kus failis vsftpd.pem sisaldub nii sertifikaadiahel kui võti, faili alguses võti ja seejärel kahaneva täpsusega kuni ca juurikani PKI ahel.

Vastava kliendina sobib kasutada paketist ftp-ssl paigaldatud ftp nimelist klientprogrammi, mis asendab ftp paketist paigaldatud ftp. ftp-ssl ftp programm käitub vaikimisi selliselt, et võimalusel kasutatakse turvalist andmevahetuskanalit, aga kui see pole võimalik, toimub andmevahetus nö tavaliselt. Kasutamine näeb välja nt selline

 $ ftp ftp.loomaaed.tartu.ee
 Connected to 192.168.1.4.
 220 (vsFTPd 2.0.7)
 Name (192.168.1.4:mart): mart
 234 Proceed with negotiation.
 [SSL Cipher DES-CBC3-SHA]
 331 Please specify the password.
 Password:
 230 Login successful.
 Remote system type is UNIX.
 Using binary mode to transfer files.
 ftp> 

TLS/SSL kasutamist saab kontrollida nii serveri kui kliendi poolelt hulga parameetritega, nt kas kliendil on serverit lubatud kasutada ainult üle turvalise kanali.

TLS/SSL sisselülitamisel tuleb arvestada, et seejuures lülitatakse käima hulk täiendavat OpenSSL koodi, mis on küll kvaliteetne, aga põhimõtteliselt muudab vsftpd serveri haavatavamaks.

ftp serveri kasutamine NAT tulemüüri taga

Iseenesest privaatse ip aadressiga FTP serveri kasutamisel NAT tulemüüri taga tuleb

  • näidata lisaks muudele nö tavalistele seadistusfaili direktiividele parameeteriga ftp serveri avalik aadress selleks, et passiivset andmevahetuse režiimi kasutavad kliendid saaksid teada ftp serveri poole pöördumiseks korrektse ip aaddressi (nb! 10.0.21.254 on küll faktiliselt privaatne aadress, aga sisuliselt avalik ja küllap praktilistel juhtumitel on ka avalik)
 pasv_address=10.0.21.254

Märkused

  • Selleks, et tarkvara peeglite pidamisel Google vms otsingumootor peeglit ära ei indekseeriks on otstarbekas kasutada peegli juurikas faili
 $ cat /srv/ftp/robots.txt
 User-agent: *
 Disallow: /
  • Selleks, et näidata, millises vahemikus asuvaid porte kasutab server passiivseid ühendusi pidavate klientidega, sobib kasutada nt sellised direktiive
pasv_min_port=20000
pasv_max_port=50000

Kasulikud lisamaterjalid