Opsætning af ProFTPD+mod_sql

ProFTPD+mod_sql

De fleste linux distributioner kommer idag med en ftpserver. Rigtig mange bruger ProFTPD som standard ftpserver. En alm. installation af ProFTPD bruger operativsystemets egen brugerdatabase, men der er faktisk mulighed for at bruge mange andre former for login.
En af dem er modulet mod_sql, der giver mulighed for integration til en database (fx. MySQL eller Postgres). Databasen kan bruges til brugere, grupper, logning af filoverførsler mm.

Jeg vil kort fortælle hvordan ProFTPD+mod_sql kan sættes op. Selve installation af ProFTPD vil jeg ikke komme ind på. Den er som regel sat op fra starten med en standard konfiguration. Du skal muligvis selv installere mod_sql modulet - det er ikke sikkert det er med som standard (i Debian hedder pakken <code>proftpd-mysql</code> eller <code>proftpd-pgsql</code>). Alternativt kan du selv kompilere ProFTPD med de moduler du skal bruge. Du kan se hvilke moduler, der er kompileret med i den ProFTPD du kører med kommandoen: <code>proftpd -l

VIGTIGT: I denne vejledninge skal du rette en del gange i konfigurationsfilen til ftpservern. Når du retter i <code>proftpd.conf</code> filen, skal du genstarte ftpserveren hvis den kører som standalone. Brug kommandoen: <code>kill -HUP `cat /var/run/proftpd.pid`</code></p>

------------------

Systemkrav:

Krav til systemet før vi går videre:
kørende linux ;-)
installeret proftpd+mod_sql
installeret mysql (jeg kender ikke noget til Postgres)

------------------

Opret SQL tabeller

Det første der skal laves er tabellerne i MySQL. Der skal som minimum laves en bruger tabel og en gruppe tabel. Her under er der et eksempel på hvordan tabellerne kan se ud. Det er ikke andet end det mest nødvendige for at få det til at virke.

Brugertabel

mysql> CREATE TABLE users (
 userid VARCHAR(30) NOT NULL UNIQUE,
 passwd VARCHAR(30) NOT NULL,
 uid INT UNIQUE AUTO_INCREMENT,
 gid INT, homedir VARCHAR(255),
 shell VARCHAR(255)
);

Gruppetabel

mysql> CREATE TABLE groups (
 groupname VARCHAR(30) NOT NULL,
 gid INT,
 members TEXT
);

NOTE: Feltet "members" er en kommasepareret liste med brugernavne.

----------------

Opret en testbruger/-gruppe

Så skal der oprettes en bruger i databasen, der kan testes med. Brugerens passowrd kan gemmes på flere måder. Det letteste er selvfølgelig ren tekst, men så har brugere med læseadgang til databasen adgang til brugerens password - ikke smart. I stedet kan man bruge MySQLs indbygget PASSWORD() funktion. Det er der også support for i gennem ProFTPD. Så opret en bruger med:

mysql> INSERT INTO users (userid,passwd,uid,gid) values('bruger1',PASSWORD('password'),2000,2000);
mysql> INSERT INTO groups (groupname,gid) values('gruppe1',2000);

Bemærk det er ikke alle værdier, der er sat, mere om det senere.

-------------------

Ret konfigurationsfilen til
Så skal konfigurationsfilen rettes til (standard: /etc/proftpd.conf). Jeg vil ikke kommentere alle indstillingerne i konfigurationsfilen, kun dem der er relevante for mod_sql.

De følgende linier skal tilføjes til <code>proftpd.conf</code> filen:

RequireValidShell               off
DefaultRoot                     /ftp/ftproot
# --------------- mod_sql settings --------------------
SQLAuthTypes                    Backend
SQLAuthenticate                 users* groups* usersetfast groupsetfast
SQLConnectInfo                  proftpd@localhost  dbuser  dbpasswd
SQLGroupInfo                    groups groupname gid members
SQLUserInfo                     users userid passwd uid gid homedir shell
SQLDefaultHomedir               "/tmp"
# -----------------------------------------------------


SQLAuthTypes bestemmer hvordan ProFTPD skal tolke brugerens password. Bruger man MySQL, bruges MySQLs PASSWORD() funktion til at "kryptere" passwordet med. Man kan godt angive flere metoder adskilt af mellemrum - se http://www.lastditcheffort.org/~aah/proftpd/mod_sql/src/README.mod_sql-4.0">README.mod_sql-4.0</a>.</p>

SQLAuthenticate bestemmer hvad ProFTPD skal hente af oplysninger fra databasen. Hvis man bruger users* og groups* vil ftpserveren kun lede after brugere i SQL databasen. Hvis ikke '*' er med kan man også logge ind med alm. shell konti.

SQLConnectInfo er oplysninger om databasetilslutning - databasenavn@servernavn bruger password

SQLGroupInfo og SQLUserInfo fortæller hvordan database layoutet er. Her har jeg bare brugt standarden.

SQLDefaultHomedir sættes for at ungå at en bruger lige pludselig havner et sted, der ikke var tilsigtet, hvis man nu har glemt at sætte homedir for brugeren ;-)

RequireValidShell og DefaultRoot er sat fordi alle brugerne, i dette eksempel, skal ha' samme indstillinger. Hvis ikke de er sat i konfigurationsfilen, skal værdierne for de enkelte brugere gemmes i databasen!


Opret et directory til testformål og tilføj det til din konfigurationsfil

<Directory /ftp/ftproot/*>
  AllowOverwrite on
  <Limit READ>
    AllowAll
  </Limit>
  <Limit MKD RETR STOR>

    AllowGroup gruppe1
  </Limit>
  <Limit DELE RMD>
    DenyAll
  </Limit>
</Directory>

Her har jeg givet læseadgang til alle og skriveadgang til medlemmer af gruppen "gruppe1".


Hvis din server kører som standalone, skal serveren genstartes - kill -HUP `cat /var/run/proftpd.pid`. Kører den med inetd skal der ikke gøres mere.

Test serveren
Så er det tid til at logge ind og se om det virker som det skal. Prøv evt. at oprette nogne flere brugere og grupper. Hvis du har brugt <code>users*, så prøv at se om du kan logge ind som alm. shell bruger - det skulle ikke kunne lade sig gøre.

Hvis alt går godt, har du nu en server, der bruger en MySQL database til bruger-/gruppeoplysninger. Men når man nu har en database kørende, kan man jo lige så godt udnytte de muligheder det giver - så læs lidt videre.

---------------------------

Udvid databasen med flere oplysninger

Jeg har udvidet brugertabellen med et felt - "LoginAllowed" - som kan bruges til let at (de)aktivere login for brugeren, uden at skulle ændre i konfigurationsfiler. For at bruge den funkton skal <code>proftpd.conf</code> udvides med følgende:

SQLUserWhereClause              "LoginAllowed=1"

Det betyder at hvert opslag i brugertabellen får tilføjet WHERE LoginAllowed=1. Så skal feltet selvfølgelig også tilføjes til brugertabellen:

mysql> ALTER TABLE users ADD COLUMN LoginAllowed INT DEFAULT 1;

Så har jeg også udvidet brugertabellen med en login tæller, sidste login og logout tidspunkt. Felterne bruges til at se hvor mange den enkelte bruger har være logget ind og tidspunkt for sidste login og logout. Får at få det til at virke, skal der tilføjes en række linier til proftpd.conf

SQLLog PASS counter
SQLNamedQuery counter UPDATE "last_login=now(), count=count+1 WHERE userid='%u'" users

SQLLog EXIT time_logout
SQLNamedQuery time_logout UPDATE "last_logout=now() WHERE userid='%u'" users


Tabellen skal udvides med tre felter:

mysql> ALTER TABLE users ADD COLUMN count INT DEFAULT 0;
mysql> ALTER TABLE users ADD COLUMN last_login DATETIME;
mysql> ALTER TABLE users ADD COLUMN last_logout DATETIME;

-------------------------

Logning af filoverførsler

Du kan også bruge databasen til at holde øje med trafikken på din server. Du skal dog være opmærksom på at det kan generere en hel del log data. Først skal du oprette en ny tabel:

mysql> CREATE TABLE xfer_stats(
 usr VARCHAR(255),
 file VARCHAR(255),
 bytes BIGINT,
 host VARCHAR(255),
 ip VARCHAR(20),
 cmd VARCHAR(20),
 transfer_time INT,
 time DATETIME,
 status VARCHAR(5)
);

Dernæst skal du rette proftpd.conf filen til:

SQLLog RETR,STOR,APPE,STOU transfer_success
SQLNamedQuery  transfer_success INSERT "'%u', '%f', '%b', '%h', '%a', '%m', '%T', now(), 'c'" xfer_stats

SQLLog ERR_RETR,ERR_STOR,ERR_APPE,ERR_STOU transfer_error
SQLNamedQuery  transfer_error INSERT "'%u', '%f', '%b', '%h', '%a', '%m', '%T', now(), 'i'" xfer_stats

De første to linie logger filoverførsler. De næste to logger fejlede filoverførsler.

---------------------

Bemærkninger

Administration af brugere kan være lidt tung hvis du skal bruge mysql prompten. Så det vil nok være en god ide at lave nogen scripts til formålet. Jeg har selv lavet en række php scripts til administration/overvågning.

SQLLog kan bruges til alle FTP kommandoer - se listen i http://proftpd.linux.co.uk/docs/directives/linked/config_ref_Limit.html ProFTPD dokumentationen, afsnittet om LIMIT. Fejl kan logges ved at sætte "ERR_" foran kommandoen.
Der er mange muligheder med mod_sql modulet til ProFTPD. Jeg har kun vist nogen af dem - det kan laves meget avanceret, men det må du selv læse mere om.

--------------------

Referencer:

http://www.lastditcheffort.org/~aah/proftpd/mod_sql/src/README.mod_sql-4.0
http://proftpd.linux.co.uk/docs/
Brian Christensen | brian [at] jordhulen [dot] dk | www.jordhulen.dk
Dette indlæg blev udgivet i Knowledge Base, Linux, Networking, Old Base, SQL. Bogmærk permalinket.

Skriv et svar