Egyszerű FTP szolgáltatás (Jessie)
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
A szokásos módon, Debian csomagból telepíthető:
apt-get install vsftpd 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:
systemctl stop vsftpd
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 # Bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=735357 seccomp_sandbox=NO
Ezután elindíthatjuk a vsftpd-t:
systemctl start vsftpd; systemctl status vsftpd
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!
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 korábban telepített 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:
systemctl restart munin-node
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. Valamely zónából, illetve egy megadott IP címről beérkező kérés átengedéséhez állítsuk be az alábbi Shorewall szabályokat:
-rw-r----- root root /etc/shorewall/rules [...] FTP/ACCEPT ZONE fw FTP/ACCEPT net:IP.IP.IP.IP fw [...]
amelyek engedélyezik az FTP igénybe vételét ezen zóna illetve IP 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 Shorewallt újra kell indítani:
systemctl restart shorewall
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 számunkra 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ó írható gyökérkönyvtárát:
mkdir -m 2750 /var/opt/ftp/teszt chown ftp:ftp /var/opt/ftp/teszt # Nem anonym FTP 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. 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 könyvtárban:
ls -la /var/opt/ftp/teszt 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:
systemctl restart vsftpd; systemctl status vsftpd
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 chown ftp:ftp /var/opt/ftp/$USERNAME # Ha dedikált upload könyvtárt használunk (javasolt!) mkdir -m 2750 /var/opt/ftp/$USERNAME/upload chown ftp:ftp /var/opt/ftp/$USERNAME/upload # Csak ide lehet majd feltölteni
- 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