Home / Linux / Ubuntu / ProFTPd kiszolgáló virtuális felhasználókkal

ProFTPd kiszolgáló virtuális felhasználókkal

Ebben a leírásban bemutatom, hogyan telepíthetsz FTP kiszolgálót virtuális felhasználókkal.

FTP kiszolgálónak a ProFTPd programot fogom használni, a felhasználókat pedig MySQL adatbázisban fogjuk tárolni, valamint a felhasználóknak beállíthatunk kvótákat (felhasznált tárhely, felhasznált sávszélesség, stb.)

A korábbi leírásban Ubuntu 8.04-et mutattam be, most az Ubuntu 8.10-es verzióját. Alapnak egy tiszta Ubuntu 8.10 telepítést fogok venni.

A leírásban a szerver neve kronosz.otthon.local lesz, az IP címe 192.168.1.1

Azon a gépen amin csináljuk ez nagy valószínüséggel más lesz, így majd ahol én ezeket az értékeket írom, oda majd a saját értékeket kell beírni.

Először is lépjünk be szerverünkbe (akár helyileg, akár SSH-n). Ha asztali gépen csináljuk, akkor egy Terminált (konzolt) kell nyitni.

Szerezzünk egy root jogú terminált:

sudo -s

A /bin/sh egy symlink /bin/dash programra, azonban /bin/bash nem egyenlő a /bin/dash programmal. Nekünk azonban bash kell.

ln -sf /bin/bash /bin/sh

Telepítsük a MySQL kiszolgálót, valamint a phpMyAdmint és az Apache kiszolgálót

apt-get install mysql-server mysql-client phpmyadmin apache2

A MySQL telepítéskor kér majd egy jelszót

New password for the MySQL “root” user:
Repeat password for the MySQL “root” user:

Itt majd írjuk be egy root jelszónkat (ezzel tudunk majd a MySQL adatbázishoz kapcsolódni)

A következő kérdésre:

Web server to reconfigure automatically:

pedig válasszuk az Apache2 opciót.

Most telepítsük a ProFTPd-t mysql támogatással

apt-get install proftpd-mod-mysql

Lesz a telepítőnek egy kérdése:

Run proftpd:

itt a standalone opciót válasszuk.

Hozzunk létre egy felhasználót és csoportot az FTP számára. A csoport neve ftpgroup, azonosítója 2001. A felhasználó neve ftpuser, azonosítója szinét 2001. (ha ezek az azonosítók rendszerünkön foglaltak, akkor mást is megadhatunk, csak a későbbiekben majd erre ügyeljünk).

Ennek a felhasználónak és csoportnak lesz a fájl rendszeren a tulajdonába az FTP-n keresztül feltöltött fájlok.

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

Most hozzuk létre a ProFTPd számára a szükséges MySQL táblákat és adatbázist. Ezekben fogjuk a felhasználókat, csoportokat tárolni.

Lépjünk be a mysql konzolba:

mysql -u root -p

Bekéri majd a MySQL a telepítéskor is megadott root jelszót, azt írjuk be neki.

Majd hozzunk létre egy ftp nevű adatbázist és egy proftpd nevű mysql felhasználót.

A jelszo szöveget cseréljük le egy egyedi jelszóra mind a két helyen. Ez lesz a proftpd mysql felhasználó jelszava.

CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'jelszo';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'jelszo';
FLUSH PRIVILEGES;

Hozzuk létre a szükséges táblákat az ftp adatbázisba:

USE ftp;

CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTP group table';

CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL default '0',
files_in_avail int(10) unsigned NOT NULL default '0',
files_out_avail int(10) unsigned NOT NULL default '0',
files_xfer_avail int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM;

CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM;

CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTP user table';

Majd lépjünk ki a mysql konzolból

quit;

Állítsuk be a ProFTPd kiszolgálót. Ehhez először nyissuk meg a konfigurációs fájlját:

nano /etc/proftpd/modules.conf

És engedélyezzük (tehát vegyük ki előle a # jelet) az alábbi három modult:

...
# Install proftpd-mod-mysql or proftpd-mod-pgsql to use this
LoadModule mod_sql.c
...
# Install proftpd-mod-mysql to use this
LoadModule mod_sql_mysql.c
...
# Install proftpd-mod-pgsql or proftpd-mod-mysql to use this
LoadModule mod_quotatab_sql.c
...

Tehát az engedélyezett modoluk:

  • mod_sql.c
  • mod_sql_mysql.c
  • mod_quotatab_sql.c

A nanobol való kilépéshez nyomjuk le a CTRL+X billentyűt, majd az Y (vagy I) billentyűt a mentéshez.

Most nyissuk meg szerkesztésre a /etc/proftpd/proftpd.conf fájlt

nano /etc/proftpd/proftpd.conf

És adjuk hozzá, valamint módosítsuk az opciókat az alább láthatóra:

[...]
# Choose a SQL backend among MySQL or PostgreSQL.
# Both modules are loaded in default configuration, so you have to specify the backend
# or comment out the unused module in /etc/proftpd/modules.conf.
# Use 'mysql' or 'postgres' as possible values.
#
#<IfModule mod_sql.c>
# SQLBackend                    mysql
#</IfModule>

DefaultRoot ~

SQLBackend              mysql
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users groups

# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo  ftp@localhost proftpd jelszo

# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID - otherwise these are 999 each
SQLMinID        500

# create a user's home directory on demand if it doesn't exist
CreateHome on

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

RootLogin off
RequireValidShell off
[...]

Az SQLConnectInfo sornál a jelszo szót írjuk át a korábban proftpd mysql felhasználónak megadott jelszóra!

Tehát ami nincs benne a konfigurációs fájlban az bemásoljuk, ami benne van, de ki van kommentezve (# jel a sor előtt), azt aktiváljuk (töröljük a sor elejéről a # jelet).

Majd engedélyezzük az alábbi részt (tehát töröljük a # jelet)

<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>

Mentsük a módosításokat és lépjünk ki a nanoból.

Majd indítsuk újra a ProFTPd kiszolgálót:

/etc/init.d/proftpd restart

Most hozzunk létre egy FTP felhasználót.

Először konzolban, majd phpMyAdmin segítségével.

A terminálban lépjünk be a mysql konzolba:

mysql -u root -p

Mondjuk meg, hogy az ftp adatbázist használjuk

USE ftp;

Legelőször állítsuk be, hogy milyen valós felhasználó nevében tárolódjanak a fájlok a rendszeren (korábban létrehozott ftpuser és ftpgroup csoport). Ha nem 2001-et adtunk meg a felhasználó és csoport létrehozásakor azonosítónak, akkor azt most itt írjuk át.

INSERT INTO 'ftpquotalimits' ('name', 'quota_type', 'per_session', 'limit_type', 'bytes_in_avail', 'bytes_out_avail', 'bytes_xfer_avail', 'files_in_avail', 'files_out_avail', 'files_xfer_avail') VALUES ('tesztelek', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);

INSERT INTO 'ftpuser' ('id', 'userid', 'passwd', 'uid', 'gid', 'homedir', 'shell', 'count', 'accessed', 'modified') VALUES (1, 'tesztelek', 'ajelszo', 2001, 2001, '/home/tesztelek', '/sbin/nologin', 0, '', '');

Ha kész, lépjünk ki a mysql konzolból:

quit;

Most már beléphetünk az előbb létrehozott felhasználóval FTP-n keresztül. A felhasználó mappája az első bejelentkezéskor fog létrejönni!

A felhasználóket létrehozhatjuk, törölhetjük, szerkeszthetjük a phpMyAdminon keresztül is. Ehhez írjuk be a kedvenc böngészőnkbe, hogy http://192.168.1.1/phpmyadmin (vagy ha más a szerver IP címe, akkor azt), és lépjünk be a leírás elején létrehozott proftpd felhasználóval, és annak jelszavával.

A felhasználók kezelése szempontjából csak az ftpquotalimits és ftpuser táblákkal kell foglalkozni.

ftpuser tábla:

  • userid: A virtuális felhasználó felhasználói neve (pl. peldauser).
  • passwd: A felhasználó jelszava (nincs titkosítva!)
  • uid: A gépen létező ftp felhasználó azonosítója (2001 volt, ha a gépen nem volt olyan azonosító korábról).
  • gid: A gépen létező ftp csoport azonosítója (ugyanaz mint fent, 2001).
  • homedir: A felhasználó mappája, pl. /home/peldauser. Ha nem létezik, az első bejelentkezéskor automatikusan létrejön. A felhasználó a mappájából nem tud kilátni.
  • shell: /sbin/nologin legyen

ftpquotalimits tábla:

  • name: Az ftp felhasználó felhasználó neve (akire az adott kvóta vonatkozik)
  • quota_type: user vagy group, normál esetben user
  • per_session: true vagy false. Ha true (igaz) akkor a kvóta csak az adott sessionra, munkamenetre vonatkozik, ha fals (hamis) akkor a kvóta mindig akkora marad.
  • limit_type: hard vagy soft. Hard kvótát nem lehet átlépni, míg a soft kvótát időlegesen át lehet lépni.
  • bytes_in_avail: Feltöltési limit bájtban. 0 esetén korlátlan.
  • bytes_out_avail: Letöltési limit bájtban. 0 esetén korlátlan.
  • bytes_xfer_avail: Forgalm ilimit bájtban. Le és feltöltések együtt. 0 esetén korlátlan.
  • files_in_avail: Feltöltési korlát fájlok számában. 0 esetén korlátlan.
  • files_out_avail: Letöltési korlát fájlok számában. 0 esetén korlátlan.
  • files_xfer_avail: Forgalmi korlát fájlok számában. 0 esetén korlátlan.

Ha szeretnénk névtelen (anonymous) hozzáférést is engedélyezni, akkor még a következőket kell megtegyük.

Hozzunk létre egy rendszer felhasználót, valamint egy mappát (/home/anonymous_ftp) erre a célra:

groupadd -g 2002 anonymous_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c "Anonymous FTP User" -g anonymous_ftp anonymous_ftp

A /home/anonymous_ftp mappába másoljuk majd azokat a fájlokat, amiket szeretnénk, ha névtelen felhasználók is elérjenek.

Hozzunk létre egy mappát, ahová a névtelen felhasználók feltölthetnek:

mkdir /home/anonymous_ftp/incoming
chown anonymous_ftp:nogroup /home/anonymous_ftp/incoming

Nyissuk meg szerkesztésre a /etc/proftpd/proftpd.conf fájlt, hogy engedélyezzük a névtelen hozzáférést

nano /etc/proftpd/proftpd.conf

Majd a következő sorokat másoljuk a konfigurációs fájl végére:

<Anonymous ~anonymous_ftp>
  User                                anonymous_ftp
  Group                               nogroup
  # We want clients to be able to login with "anonymous" as well as "ftp"
  UserAlias                        anonymous anonymous_ftp
  # Cosmetic changes, all files belongs to ftp user
  DirFakeUser        on anonymous_ftp
  DirFakeGroup on anonymous_ftp

  RequireValidShell                off

  # Limit the maximum number of anonymous logins
  MaxClients                        30

  # We want 'welcome.msg' displayed at login, and '.message' displayed
  # in each newly chdired directory.
  DisplayLogin                        welcome.msg
  DisplayChdir                        .message

  # Limit WRITE everywhere in the anonymous chroot
  <Directory *>
    <Limit WRITE>
      DenyAll
    </Limit>
  </Directory>

  # Uncomment this if you're brave.
  <Directory incoming>
    # Umask 022 is a good standard umask to prevent new files and dirs
    # (second parm) from being group and world writable.
    Umask                                022  022
             <Limit READ WRITE>
             DenyAll
             </Limit>
             <Limit STOR>
             AllowAll
             </Limit>
  </Directory>

</Anonymous>

Végül indítsuk újra a ProFTPd szervert:

/etc/init.d/proftpd restart

Most az anonymous felhasználók is beléphetnek az FTP siteunkra. A /home/anonymous_ftp/ mappában lévő fájlokat, mappákat letölthetik (de nem törölhetik, módosíthatják azokat), valamint a /home/anonymous_ftp/incoming mappába feltölthetnek. A feltöltött fájlokat azonban nem látják itt, azt majd nekünk kell áthelyezni, átmásolni.

Ha a feltöltést nem szeretnénk engedélyezni, akkor a Limit STOR részt módosítsuk így:

             <Limit STOR>
             DenyAll
             </Limit>


Ezen cikk alapján.

Szerző charlie

Évek óta foglalkozom informatikával, azon belül elsősorban Linux szerverek üzemeltetésével. Saját vállalkozás keretében VPS szolgáltatás nyújtásával is foglalkozok.

Olvastad?

Linux

Friss funkciókkal érkezik a Linux 5.0 „Shy Crocodile”

Linus Torvalds nemrég megjelentette a Linux kernel 5.0 verzióját, melynek a Shy Crocodile, avagy a …

10 hozzászólás

  1. Nem us tudom… Ennek talán akkor van értelme, ha nagyon sok felhasználóról van szó szerintem. Tényleg nemtudom, mert nem értek hozzá. Én ftp szervert, még csak kis igényekre szabva készítettem, de ahhoz sosem tettem fel pluszban ennyi mindent.

    Tehát ha egy szerveren nincs fent MySQl, Apache és PHP, akkor egy ftp miatt felesleges, hacsak, mint mondtam, nincs nagyon fontos oka, pl a robosztus kiszolgálói igény…

    Ha jól mondtam, akkor talán a cikk elejére tegyük be, hogy milyen felhasználásra javasolt, hogy “Pistike”, első munkahelyén egy ftp szerver telepítését ne így kezdje, mert lehet repülni fog. Gondoljunk csak bele, pl Egy jól beállított apache is sok veszélyt hordoz magában, hát még egy alap konfigos apache… PHPMyAdmin-ról nem is beszélve.

  2. Nem csak akkor jó ha sok felhasználó van. Hanem ha Single-Sign-On-t akarsz megvalósítani.

    MySQL-ba tárolod a usereket, így innét veheti a felhasználó/jelszó párost a samba, az intranetes program, a shell, stb.

    Ezek azért jók, mert így nem kell sok helyre felvinni a usert.

  3. Hello!

    Nekem valamiért időtúllépés van :S leírás alapján jártam el, charlie, kérlek mail

  4. Dani:
    nah a hibát már megtaláltam, már csak 1-2 dolgot szeretnék összehozni, egyik a mail server de az felejtős a tudásomhoz mértan, pedig szükséges lenne, itteni leirás nekem kissé magas

  5. charlie:
    Érdeklődni szeretnék és hogy lehet megvalósítani hogy UTF-8-at tudjon (szép magyar karaktereket szeretnék)mert alap esetben nem támogatja 1.3.1-12-es.
    Vagy szedjem le az 1.3.2-est ami már igen és fordítsam le?

    Esetleg tudsz mondani valami másik ftpd-t?

    Segítségedet előre is köszönöm

  6. Gratula a leíráshoz, ez már tényleg egy jó kiindulási alap a ProFTPd beállításához.

    Én mondjuk a /etc/proftpd/modules.conf beállítása után hibára futottam.

    Ezzel a hibaüzenettel találkoztam:

    – Fatal: LoadModule: error loading module ‘mod_sql_mysql.so’: Érvénytelen paraméter on line 31 of ‘/etc/proftpd/modules.conf’

    Na egy darabig gugliztam, majd arra jutottam, hogy mivel nincs meghatározva az sql típusa (mysql, postgresql stb.), ezért a proftpd alapértelmezetten a postgresql-hez akarna csatlakozni. Sajnos ez nekünk a mysql-hez nem jó. Két megoldása van:

    1. Ki kell kommentezni a /etc/proftpd/modules.conf-ból a LoadModule mod_sql_postgres.c sort. (Én ezt csináltam)

    2. A proftpd.conf-ba módosítani a következőt:
    Keresed:
    SQLAuthTypes Crypt

    Elé beszúrod:
    SQLBackEnd mysql

    Ez utána alapba a mysql-hez fog fordulni autentikációért a proftpd, így a probléma meg van oldva, és működik.

    A másik probléma amivel szembesültem az mikor fel akartam vinni felhasználókat az adatbázisba. A script sajnos nem működött.
    Helyette én ezt használtam:
    INSERT INTO ftpuser (id, userid, passwd, uid, gid, homedir, shell, count, accessed, modified) VALUES (1, ‘tesztelek’, ‘ajelszo’, 2001, 2001, ‘/home/tesztelek’, ‘/sbin/nologin’, 0, ”, ”)

    Remélem valakinek segítséget jelentett.

  7. Én az eredeti cikk alapján kezdtem konfigurálni. Működik, de van még “igényem”:
    – szeretném a jelszót kódoltan tárolni. Bugge október 21-i bejegyzésében szereplő INSERT plaintext, így minden további nélkül kiolvasható;
    – ha a user be akar jelentkezni, hogyan lehet elérni, hogy ha plaintext jelszó érkezik, akkor ne fogadja el – ugyanakkor hoigyan lehet titkosított jelszót elvárni, csak a ssh-s megoldással, vagy van egyszerűbb és értelmesebb lehetőség?

  8. charlie: Nekem egy kérdésem lenne azr hogyan tudom megoldnai hogy például egy felhasználónak adok 1MB tárhelyet és azt ne tudja meghaladni ezt hogyan tudom megoldani?:) köszi előre is !

  9. Sziasztok

    Az én problémám az lenne, hogy van a linuxon 4 felhasználo akik nem ftp felhasználok, és nemszerepelnek az ftpuser táblába se, de azokat is gond nélkül beengedi az ftp a home-jukba?!Szerintetek mit és hol rontottam el?

  10. Az ok, hogy az admin e honlapon dolgozik, nincs kérdést nagyon gyors ez lesz neves, köszönhetően a funkció tartalmát.
    – Calator prin Románia .

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

A weboldal használatának folytatásával Ön elfogadja a cookie-k használatát Adatkezelési tájékoztató és felhasználási feltételek

A süti beállítások ennél a honlapnál engedélyezett a legjobb felhasználói élmény érdekében. Amennyiben a beállítás változtatása nélkül kerül sor a honlap használatára, vagy az "Elfogadás" gombra történik kattintás, azzal a felhasználó elfogadja a sütik használatát.

Bezárás