Egyszerű FTP szolgáltatás (Jessie)

Innen: AdminWiki

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

Irodalom