Egyszerű FTP szolgáltatás (Wheezy)
Ebben a leírásban egyszerű, technikai célokra szolgáló FTP szervert alakítunk ki a vsftpd segtségével. Hangsúlyozottan nem a rendeltetésszerű fájlmegosztás a cél, hanem más protokollt nem ismerő FTP kliens eszközök (pl. scannerek, egyéb adatküldők) kiszolgálása.
Valódi felhasználók számára pl. a ProFTPd alapú, ticket kezelést is támogató, robosztus FTP szerver, vagy egy ownCloud-jellegű felhőmegoldás lehet használható.
Házirend
- Az FTP tárterülete izolált, a szigorúan csatolt /var partíción (esetleg szigorúan csatolt önálló partíción) helyezkedik el (/var/opt/ftp) és az ftp:ftp Linux (rendszer)felhasználó és csoport birtokában van. Other's jogok kerülendőek.
- Az FTP tárhely más szolgáltatással (pl. webbel) nincs megosztva, azaz az FTP nem használatos pl. webtartalom feltöltésére. Másképp fogalmazva, az FTP tárterület állományai csak FTP-vel érhetőek el.
- Az FTP felhasználók virtuálisak, azaz nem Linux felhasználók. Minden FTP művelet az ftp:ftp Linux (rendszer)felhasználó és csoport nevében történik.
- Minden felhasználónak különálló, egymást át nem fedő tárterülete van, és az FTP kapcsolat során ebbe chroot-olva dolgozik.
- A távoli hozzáférést lehetőség szerint tűzfallal kell korlátozni. Anonymous R/W hozzáférést csak ilyen korlátozással (dedikált, pl. izolált technikai hálózatnak) adunk ki.
TODO!
Telepítés
Sajnos a Debian Wheezy-ben lévő vsftpd tartalmaz egy szerencsétlen korlátozást: FTP-vel a felhasználó tárterületének gyökérkönyvtára nem írható, csak annak előre elkészített alkönyvtárai. Ezt a korlátozást a későbbi változatokban visszavonták, így ha a korlátozást meg szeretnénk kerülni, opcionálisan érdemes patchelt vsftpd csomagot telepíteni, ami jelenleg pl. a Cyconet repository-ból érhető el. Ehhez készítsünk egy beállító állományt, amiben felvesszük a Cyconet tárolóját is a forráslistába:
-rw-r--r-- root root /etc/apt/sources.list.d/wheezy-updates.cyconet.list [...] # Unofficial patch for vsftpd deb http://ftp.cyconet.org/debian wheezy-updates main non-free contrib
Ezután frissíthetjük a csomaglistát:
apt-get update # Letöltődik a Cyconet csomaglistája is, de még nem hiteles apt-get install debian-cyconet-archive-keyring # Publikus kulcs telepítése (hitelesítés nélkül) apt-get update # Most már nincs hibaüzenet
Fenti előkészítés után telepíthetjük a vsftpd-t:
apt-get install -t wheezy-updates vsftpd # Opcionálisan a Cyconet tárolóból telepítve apt-cache policy vsftpd # Itt ellenőrizhető, hogy tényleg a Cyconet tárolóból települt-e apt-get install ftp libpam-pwdfile # FTP kliens teszteléshez, libpam-pwdfile alapszintű (virtuális) felhasználó-kezeléshez
Állítsuk le a még konfigurálatlan FTP szervert:
/etc/init.d/vsftpd stop
Megjegyzés: a Cyconet biztosítja a biztonsági frissítések követését is. A Debian következő kiadásában (Jessie) már nem lesz szükség patchelt verzió használatára.
Beállítások
Ebben a szakaszban magát az FTP szolgáltatást állítjuk be.
FTP tárterület
Készítsünk egy dedikált FTP tárterületet, amelyben minden virtuális FTP felhasználónak lesz egy-egy gyökér alkönyvtára. A Debian telepítő script ezt a /srv/ftp helyen hozza létre, de a házirendünknek jobban megfelel a nem futtatható /var/opt/ftp hely:
mkdir -m 2751 /var/opt/ftp # o+x az esetleges Amanda mentésekhez kell chown root:ftp /var/opt/ftp rmdir /srv/ftp ln -s /var/opt/ftp /srv/ftp # Léteznie kell, mert ez az ftp Linux (rendszer)felhasználó home könyvtára
Teszteléshez készítsük el az anonymous felhasználó gyökér- és feltöltési könyvtárát:
mkdir -m 2750 /var/opt/ftp/anonymous chown root:ftp /var/opt/ftp/anonymous # Ez a könyvtár nem lehet írható! mkdir -m 2750 /var/opt/ftp/anonymous/upload chown ftp:ftp /var/opt/ftp/anonymous/upload # Ide lehet anonym módon feltölteni
Naplózás
A vsftpd logok számára készítünk egy naplókönyvtárat:
mkdir -m 2750 /var/log/vsftpd chown ftp:adm /var/log/vsftpd
és a maintainer által biztosított logrotate beállító állomány módosításával gondoskodjunk a könyvtárban lévő valamennyi log napi rotálásáról (a Munin monitorozáshoz a napi rotálás a hetinél célszerűbb):
-rw-r--r-- root root /etc/logrotate.d/vsftpd /var/log/vsftpd/*.log { create 640 root adm # ftpd doesn't handle SIGHUP properly missingok notifempty rotate 30 daily }
A vsftpd beállításai
Mentsük el a vsftpd beállító állományát, és készítsünk egy újat:
mv /etc/vsftpd.conf /etc/vsftpd.conf.bak mcedit /etc/vsftpd.conf
amelyben egyelőre engedélyezzük az anonym használatot is:
-rw-r--r-- root root /etc/vsftpd.conf # vsftpd configuration for anonymous and/or few virtual users. # ftpd_banner=FTP service ready. # Standalone with IPv4 only. listen=YES listen_ipv6=NO connect_from_port_20=YES # Log settings. syslog_enable=NO dual_log_enable=YES vsftpd_log_file=/var/log/vsftpd/vsftpd.log xferlog_enable=YES xferlog_std_format=YES xferlog_file=/var/log/vsftpd/xfer.log # Anonymous account - handle with care at all! anonymous_enable=YES anon_root=/var/opt/ftp/anonymous anon_world_readable_only=NO ## Double check firewall settings! anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_umask=027 ## nopriv_user=ftp chown_uploads=YES chown_upload_mode=0640 chown_username=ftp # Virtual users. local_enable=YES local_root=/var/opt/ftp/$USER chroot_local_user=YES write_enable=YES local_umask=027 file_open_mode=0640 virtual_use_local_privs=YES guest_enable=YES guest_username=ftp user_sub_token=$USER hide_ids=YES ## Needs vsftpd v3+! allow_writeable_chroot=YES ## # Debian customization. pam_service_name=vsftpd rsa_cert_file=/etc/ssl/private/vsftpd.pem secure_chroot_dir=/var/run/vsftpd/empty
Ügyeljünk arra, hogy az allow_writeable_chroot direktíva a Wheezy-beli vsftpd számára nem érvényes - ha ezt használjuk, a vonatkozó sort kommentezzük ki!
Ezután elindíthatjuk a vsftpd-t:
/etc/init.d/vsftpd start; /etc/init.d/vsftpd status
Gyorsteszt
A parancssori ftp klienssel, a localhostról egy szövegfile anonym feltöltését fogjuk tesztelni, így nem szükséges a tűzfal kinyitása.
cd /root/tmp echo "Ez csak teszt." >teszt.txt # Ez lesz a tesztállomány
Az FTP session valahogy így fog kinézni (üres jelszót is megadhatunk, nem kell email címnek lennie):
ftp localhost Connected to localhost. 220 FTP service ready. Name (localhost:admin): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd upload 250 Directory successfully changed. ftp> put teszt.txt local: teszt.txt remote: teszt.txt 200 PORT command successful. Consider using PASV. 150 Ok to send data. 226 Transfer complete. 15 bytes sent in 0.00 secs (165.8 kB/s) ftp> quit 221 Goodbye.
Ellenőrizzük a tesztfájl meglétét és a jogosultságokat a /var/opt/ftp/anonymous/upload könyvtárban:
ls -la /var/opt/ftp/anonymous/upload drwxr-s--- 2 ftp ftp . drwxr-s--- 3 root ftp .. -rw-r----- 1 ftp ftp teszt.txt
illetve az adatátvitel naplózását a /var/log/vasftpd/vsftpd.log és /var/log/vsftpd/xfer.log állományokban! Sikeres teszt esetén rendelkezünk egy primitív, anonym FTP szolgáltatással.
Biztonsági megjegyzés: lehetőleg ne használjunk anonym módon elérhető szolgáltatást! Anonym feltöltést csak izolált, védett hálózaton engedélyezzünk, azaz mindenképpen korlátozzuk tűzfallal a szolgáltatáshoz való hozzáférést!
Egyszerű felhasználó-kezelés
Opcionális szakasz; kihagyható, ha csak anonym forgalomra van szükségünk.
A virtuális FTP felhasználók azonosítását a libpam-pwdfile modullal, a /etc/vsftpd.passwd jelszóállományban tárolt felhasználói adatokkal fogjuk megvalósítani. Sajnos a PAM modul beállító állománya nem jó (TODO!), ezért mentsük el és cseréljük ki az alábbira:
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak mcedit /etc/pam.d/vsftpd
-rw-r--r-- root root /etc/pam.d/vsftpd # Customized login using htpasswd file auth required pam_pwdfile.so pwdfile /etc/vsftpd.passwd account required pam_permit.so # Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.
Hozzuk létre a jelszóállományt és vegyünk fel egy teszt felhasználót:
touch /etc/vsftpd.passwd chown root:ftp /etc/vsftpd.passwd chmod 640 /etc/vsftpd.passwd htpasswd -d /etc/vsftpd.passwd teszt # -d: hagyományos crypt, sajnos a vsftpd bajlódik az MD5-tel
Egyszerű jelszót is megadhatunk, hiszen ezt a felhasználót hamarosan törölni fogjuk.
Hozzuk létre a felhasználó gyökérkönyvtárát, és ha Wheezy-beli vsftpd-t használunk (azaz a gyökérkönyvtár csak olvashatónak kell lennie), a feltöltési könyvtárat is:
mkdir -m 2750 /var/opt/ftp/teszt # Wheezy chown root:ftp /var/opt/ftp/teszt # Wheezy-beli vsftpd esetén ez a könyvtár nem lehet írható! mkdir -m 2750 /var/opt/ftp/teszt/upload chown ftp:ftp /var/opt/ftp/teszt/upload # Csak ide lehet majd feltölteni # Cyconet chown ftp:ftp /var/opt/ftp/teszt # Patchelt vsftpd esetén engedélyezhető az írható gyökérkönyvtár
Gyorstesztként ismételjük meg az anonym működés ellenőrzésére használt feltöltést a most létrehozott teszt felhasználó nevével és jelszavával belépve:
ftp localhost Connected to localhost. 220 FTP service ready. Name (localhost:admin): teszt 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. # Wheezy-beli vsftpd esetén a gyökérkönyvtárba nem lehet feltölteni, # patchelt vsftpd esetén nem kell könyvtárat váltani! ftp> cd upload 250 Directory successfully changed. ftp> put teszt.txt local: teszt.txt remote: teszt.txt 200 PORT command successful. Consider using PASV. 150 Ok to send data. 226 Transfer complete. 15 bytes sent in 0.00 secs (332.9 kB/s) ftp> quit 221 Goodbye.
Ellenőrizzük a tesztfájl meglétét és a jogosultságokat a /var/opt/ftp/teszt (vagy a /var/opt/ftp/teszt/upload) könyvtárban:
ls -la /var/opt/ftp/teszt ls -la /var/opt/ftp/teszt/upload drwxr-s--- 2 ftp ftp . drwxr-s--x 3 root ftp .. -rw-r----- 1 ftp ftp teszt.txt
illetve az adatátvitel naplózását a /var/log/vasftpd/vsftpd.log és /var/log/vsftpd/xfer.log állományokban!
Siker esetén töröljük a teszt felhasználót és tárterületét:
htpasswd -D /etc/vsftpd.passwd teszt rm -R /var/opt/ftp/teszt
Fentiekkel a virtuális felhasználó-kezelést előkészítettük.
Biztonsági megfontolások
- Mielőtt a nyilvános hozzáférést engedélyezzük, gondoljuk át, hogy szükség van-e az anonym hozzáférésre! Ha van rá lehetőségünk, az anonym hozzáférést a vsftpd beállításai között tiltsuk le, illetve korlátozzuk csak letöltésre:
-rw-r--r-- root root /etc/vsftpd.conf [...] # Anonymous account - handle with care at all! anonymous_enable=NO [...] anon_upload_enable=NO [...]
Anonym feltöltést csak izolált, védett hálózaton engedélyezzünk, azaz mindenképpen korlátozzuk tűzfallal a szolgáltatáshoz való hozzáférést!
- Gondoljuk át továbbá, hogy feltétlenül szükség van-e a gyökérkönyvtárba történő feltöltésre. Ha van rá lehetőségünk, ezt az opciót tiltsuk le, és használjunk dedikált upload könyvtárat:
-rw-r--r-- root root /etc/vsftpd.conf [...] allow_writeable_chroot=NO [...]
- A változtatásokat a vsftpd újraindításával érvényesítsük:
/etc/init.d/vsftpd restart; /etc/init.d/vsftpd status
Mindennapi műveletek
A szolgáltatás adminisztrációjára nincs felület, azt rendszergazdaként belépve, parancssorból végezzük.
- Felhasználó felvétele
export USERNAME="felhasznalonev"; echo $USERNAME htpasswd -d /etc/vsftpd.passwd $USERNAME # Tárterület mkdir -m 2750 /var/opt/ftp/$USERNAME # Ha dedikált upload könyvtárt használunk (javasolt!) chown root:ftp /var/opt/ftp/$USERNAME # Wheezy-beli vsftpd esetén ez a könyvtár nem lehet írható! mkdir -m 2750 /var/opt/ftp/$USERNAME/upload chown ftp:ftp /var/opt/ftp/$USERNAME/upload # Csak ide lehet majd feltölteni # Írható gyökérkönyvtár - patchelt vsftpd kell! chown ftp:ftp /var/opt/ftp/$USERNAME # Patchelt vsftpd esetén engedélyezhető az írható gyökérkönyvtár
- Felhasználó jelszavának megváltoztatása
htpasswd -d /etc/vsftpd.passwd felhasznalonev
- Felhasználó és tárterülete törlése
export USERNAME="felhasznalonev"; echo $USERNAME htpasswd -D /etc/vsftpd.passwd $USERNAME if [ -d "/var/opt/ftp/$USERNAME" ]; then rm -R "/var/opt/ftp/$USERNAME"; fi
Környezeti beállítások
Az alábbi (részben opcionális) beállítások nem közvetlenül az FTP szolgáltatás működtetéséhez, hanem annak monitorozásához illetve a hozzáférés korlátozásához kapcsolódnak.
Monitorozás Muninnal
A munin-plugins csomag tartalmaz néhány, az FTP forgalom (primitív) monitorozására használható Munin plugint. Ezeket pl. az alábbi parancsokkal telepíthetjük:
cp -p /usr/local/share/munin/plugin-conf.d/ftpd /etc/munin/plugin-conf.d/vsftpd ln -s /usr/local/share/munin/plugins/ftpd_bytes /etc/munin/plugins/vsftpd_bytes ln -s /usr/local/share/munin/plugins/ftpd_count /etc/munin/plugins/vsftpd_count
Noha a pluginok eredetileg a ProFTPd monitorozására íródtak, változtatás nélkül használhatóak itt is. A használatba vételhez indítsuk újra a munin-node-ot:
invoke-rc.d munin-node restart
A vsftpd bejegyzése a Tiger által felismert démonok listájába
Az FTP szerver az ftp Linux felhasználó nevében állandóan fut és a 21-es TCP portot figyeli, így a biztonsági figyelmeztetések elkerülése érdekében be kell azt jegyezni a tigerrc állományba:
-rw-r--r-- root root /etc/tiger/tigerrc [...] Tiger_Listening_ValidUsers='[...]|ftp|[...]' [...] Tiger_Listening_ValidProcs='[...]|vsftpd|[...]' [...] Tiger_Running_Procs='[...] /usr/sbin/vsftpd [...]' [...]
Az FTP forgalom engedélyezése a bástyagép tűzfalán
A kifelé menő FTP kérések a tűzfal policy-ban eleve engedélyezettek. A trs zónából beérkező kérés átengedéséhez állítsuk be az alábbi Shorewall szabályt:
-rw-r----- root root /etc/shorewall/rules [...] FTP/ACCEPT trs fw [...]
ami engedélyezi az FTP igénybe vételét ezen zóna felől (a szükséges conntrack betöltéséről a Shorewall gondoskodik). A változtatás érvényesítéséhez a Shorewall-t újra kell indítani:
/etc/init.d/shorewall restart