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