howtos:pure-ftpd
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
howtos:pure-ftpd [15/09/2007 19:27] – domingo | howtos:pure-ftpd [02/12/2018 21:34] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Pure-FTPd with MySQL ====== | ||
+ | This is how I setup my ftp server with Pure-FTPd and MySQL as backend for authentication and user profiles | ||
+ | and sOLARiZ PureFTPd Manager as interface to MySQL. | ||
+ | |||
+ | ===== Pure-FTPd Setup ===== | ||
+ | |||
+ | Install Pure-FTPd the way you like it. As I use SuSE 9.3 I use the version bundled with the distribution and hence use the "SuSE Standard" | ||
+ | |||
+ | Start out by editing the /// | ||
+ | Mine looks like this: | ||
+ | |||
+ | < | ||
+ | ChrootEveryone | ||
+ | BrokenClientsCompatibility | ||
+ | MaxClientsNumber | ||
+ | Daemonize | ||
+ | MaxClientsPerIP | ||
+ | VerboseLog | ||
+ | AllowDotFiles | ||
+ | DisplayDotFiles | ||
+ | AnonymousOnly | ||
+ | NoAnonymous | ||
+ | SyslogFacility | ||
+ | DontResolve | ||
+ | MaxIdleTime | ||
+ | MySQLConfigFile | ||
+ | LimitRecursion | ||
+ | AnonymousCanCreateDirs | ||
+ | MaxLoad | ||
+ | Umask | ||
+ | MinUID | ||
+ | AllowUserFXP | ||
+ | AllowAnonymousFXP | ||
+ | ProhibitDotFilesWrite | ||
+ | ProhibitDotFilesRead | ||
+ | AutoRename | ||
+ | AnonymousCantUpload | ||
+ | NoChmod | ||
+ | CreateHomeDir | ||
+ | MaxDiskUsage | ||
+ | NoRename | ||
+ | CustomerProof | ||
+ | </ | ||
+ | |||
+ | |||
+ | Lets create /// | ||
+ | |||
+ | < | ||
+ | MYSQLServer | ||
+ | MYSQLPort | ||
+ | MYSQLUser | ||
+ | MYSQLPassword | ||
+ | MYSQLDatabase | ||
+ | MYSQLCrypt | ||
+ | MYSQLGetPW | ||
+ | MYSQLGetUID | ||
+ | MYSQLGetGID | ||
+ | MYSQLGetDir | ||
+ | MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User=" | ||
+ | MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User=" | ||
+ | MySQLGetQTASZ | ||
+ | MySQLGetQTAFS | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== MySQL ===== | ||
+ | |||
+ | Install MySQL on a server or use a already installed one. Again I use the one following SuSE 9.3. | ||
+ | |||
+ | I use a thirdparty PHP interface to the MySQL database called [[http:// | ||
+ | |||
+ | You can configure the MySQL database in many ways and make use of a lot of Pure-FTPd' | ||
+ | |||
+ | Create a database: | ||
+ | |||
+ | < | ||
+ | # mysqladmin -u root -p create System | ||
+ | </ | ||
+ | |||
+ | Next make the following file called // | ||
+ | |||
+ | < | ||
+ | DROP TABLE IF EXISTS ftpd; | ||
+ | CREATE TABLE ftpd ( | ||
+ | User varchar(16) NOT NULL default '', | ||
+ | status enum(' | ||
+ | Password varchar(64) NOT NULL default '', | ||
+ | Uid varchar(11) NOT NULL default ' | ||
+ | Gid varchar(11) NOT NULL default ' | ||
+ | Dir varchar(128) NOT NULL default '', | ||
+ | ULBandwidth smallint(5) NOT NULL default ' | ||
+ | DLBandwidth smallint(5) NOT NULL default ' | ||
+ | comment tinytext NOT NULL, | ||
+ | ipaccess varchar(15) NOT NULL default ' | ||
+ | QuotaSize smallint(5) NOT NULL default ' | ||
+ | QuotaFiles int(11) NOT NULL default 0, | ||
+ | PRIMARY KEY (User), | ||
+ | UNIQUE KEY User (User) | ||
+ | ) TYPE=MyISAM; | ||
+ | </ | ||
+ | |||
+ | Use this file to create the our user table: | ||
+ | |||
+ | < | ||
+ | # mysql -u root -p System < create.sql | ||
+ | </ | ||
+ | |||
+ | Use this file, // | ||
+ | |||
+ | < | ||
+ | USE mysql; | ||
+ | INSERT INTO user (Host, User, Password) VALUES (' | ||
+ | INSERT INTO db (Host, Db, User, Select_priv, | ||
+ | FLUSH PRIVILEGES; | ||
+ | GRANT SELECT, INSERT, DELETE, UPDATE ON System.* TO ftpd@localhost; | ||
+ | </ | ||
+ | |||
+ | Now run it: | ||
+ | |||
+ | < | ||
+ | # mysql -u root -p -h localhost < create-ftpd.sql | ||
+ | </ | ||
+ | |||
+ | ===== Apache2 ===== | ||
+ | |||
+ | Now copy the sOLARiZ PureFTPd Manager files into your documentroot somewhere. As we are dealing with usernames and passwords I like to use https. With SuSE 9.3 the tool // | ||
+ | |||
+ | < | ||
+ | Listen 666 | ||
+ | < | ||
+ | DocumentRoot "/ | ||
+ | ServerName localhost: | ||
+ | ServerAdmin you@example.com | ||
+ | ErrorLog / | ||
+ | TransferLog / | ||
+ | SSLEngine on | ||
+ | SSLCipherSuite ALL: | ||
+ | SSLCertificateFile / | ||
+ | SSLCertificateKeyFile / | ||
+ | < | ||
+ | SSLOptions +StdEnvVars | ||
+ | SSLRequireSSL | ||
+ | </ | ||
+ | SetEnvIf User-Agent " | ||
+ | | ||
+ | | ||
+ | CustomLog / | ||
+ | "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \" | ||
+ | < | ||
+ | AllowOverride AuthConfig | ||
+ | Order deny,allow | ||
+ | Allow from all | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | This creates an https webinterface listening on port 666/tcp. To enter this interface you browse to https:// | ||
+ | |||
+ | I would like to be the only one accessing this interface and therfor we need some authentication. Create .htaccess in the documentroot / | ||
+ | |||
+ | < | ||
+ | AuthUserFile / | ||
+ | AuthGroupFile /dev/null | ||
+ | AuthName " | ||
+ | AuthType Basic | ||
+ | |||
+ | <limit GET POST> | ||
+ | require valid-user | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Create the htpasswd file and create a admin user: | ||
+ | |||
+ | < | ||
+ | # htpasswd2 -c / | ||
+ | </ | ||
+ | |||
+ | ===== PureFTPd Manager ===== | ||
+ | |||
+ | Create a user and group called "// | ||
+ | |||
+ | Extract the PureFTPd Manager files into "/// | ||
+ | |||
+ | To make use of md5 instead of crypt I changed "// | ||
+ | |||
+ | < | ||
+ | <? | ||
+ | // Aenderungen 25.5. Uwe Ahrendt | ||
+ | // www.bildpartner.de | ||
+ | |||
+ | // READ THE README !!! | ||
+ | / | ||
+ | * PureFTP - PHP USer Manager by solariz | ||
+ | * Source (c) 2002 - www.solariz.de | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | |||
+ | include(" | ||
+ | |||
+ | ################################################################# | ||
+ | ############### | ||
+ | ################################################################# | ||
+ | // Config einlesen | ||
+ | if(!file_exists($PUREFTP_CONFIG_FILE)) DIE(" | ||
+ | $USERARRAY = array(); | ||
+ | $raw = file($PUREFTP_CONFIG_FILE); | ||
+ | foreach($raw AS $zeile): | ||
+ | if(!ereg(" | ||
+ | // Einlesen der einzelnen Zeilen als Variable | ||
+ | $tmp = split(" | ||
+ | // UNIX Tab workaround | ||
+ | if(count($tmp) < 2) | ||
+ | $tmp = explode(" | ||
+ | $var = strtoupper(trim($tmp[0])); | ||
+ | for($n=1; | ||
+ | if(!empty($tmp[$n])) { | ||
+ | $$var = trim($tmp[$n]); | ||
+ | break; | ||
+ | }#end if | ||
+ | }#end for | ||
+ | // Einlesen der Tabelle | ||
+ | if(empty($DB_TABLE) AND eregi(" | ||
+ | $tmp2 = split(" | ||
+ | $tmp2 = split(" | ||
+ | $DB_TABLE = trim($tmp2[0]); | ||
+ | unset($tmp2); | ||
+ | EndIF; | ||
+ | EndIf; | ||
+ | EndForEach; | ||
+ | if(empty($MYSQLSERVER)) $MYSQLSERVER = " | ||
+ | if(empty($DB_TABLE)) | ||
+ | // UA | ||
+ | if ($MYSQLCRYPT == " | ||
+ | |||
+ | // Current Version | ||
+ | $VERSION = " | ||
+ | $BUILD | ||
+ | |||
+ | // Setein header | ||
+ | PAGE_HEADER(); | ||
+ | |||
+ | // SQL Connection herstellen | ||
+ | DB_OPEN(); | ||
+ | |||
+ | |||
+ | // FORM SUBIT AUSWERTUNG // Globals | ||
+ | $action | ||
+ | $user = get_var(" | ||
+ | |||
+ | if( $action == " | ||
+ | // ADD value setter | ||
+ | |||
+ | if($action == " | ||
+ | $USERARRAY[' | ||
+ | // UA | ||
+ | if ($PW) {$USERARRAY[' | ||
+ | else {$USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | // UA | ||
+ | $USERARRAY[' | ||
+ | $USERARRAY[' | ||
+ | else: | ||
+ | unset($USERARRAY); | ||
+ | EndIf; | ||
+ | |||
+ | if(!empty($user) AND $user != " | ||
+ | $USERARRAY=@MYSQL_FETCH_ARRAY(DB_QUERY(" | ||
+ | }#end if | ||
+ | if(!is_array($USERARRAY)) DIE(" | ||
+ | |||
+ | echo '< | ||
+ | |||
+ | if(!empty($user)) | ||
+ | else echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | if($USERARRAY[' | ||
+ | echo '> Inactive& | ||
+ | if($USERARRAY[' | ||
+ | echo '> Active</ | ||
+ | |||
+ | if(!empty($user)) | ||
+ | echo '< | ||
+ | echo '< | ||
+ | } | ||
+ | |||
+ | else | ||
+ | |||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | // UA | ||
+ | if ($PW) { | ||
+ | echo '< | ||
+ | } else { | ||
+ | echo '< | ||
+ | } | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | // UA | ||
+ | echo '< | ||
+ | // UA | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '</ | ||
+ | echo '< | ||
+ | |||
+ | }#end edit | ||
+ | |||
+ | elseif($action == " | ||
+ | $addnew | ||
+ | $User = addslashes(get_var(" | ||
+ | |||
+ | // UA - MG Optimized ;) | ||
+ | $Password = addslashes(get_var(" | ||
+ | |||
+ | IF($Password == '< | ||
+ | ELSEif($PW) | ||
+ | |||
+ | $Uid = addslashes(get_var(" | ||
+ | $Gid = addslashes(get_var(" | ||
+ | $Dir = addslashes(get_var(" | ||
+ | $ULThrottle | ||
+ | $DLThrottle | ||
+ | $QuotaSize | ||
+ | // UA | ||
+ | $QuotaFiles | ||
+ | $comment | ||
+ | $status | ||
+ | $delete | ||
+ | $ipaccess | ||
+ | if(empty($User) || empty($Uid) || empty($Gid) || empty($Dir)) DIE(" | ||
+ | if(empty($delete)) { | ||
+ | // Mini workarounds | ||
+ | if($Password) | ||
+ | if(!$status) | ||
+ | if(!$ULBandwidth) | ||
+ | if(!$DLBandwidth) | ||
+ | if(!$QuotaSize) | ||
+ | if(!$QuotaFiles) | ||
+ | if($addnew == False) { | ||
+ | $SQL = " | ||
+ | $Q = DB_QUERY($SQL); | ||
+ | if($Q) | ||
+ | }#end if | ||
+ | else{ | ||
+ | $Q = DB_QUERY(" | ||
+ | if($Q) | ||
+ | }#end if | ||
+ | |||
+ | }#end if | ||
+ | elseif($User && !empty($delete)){# | ||
+ | $Q = DB_QUERY(" | ||
+ | if($Q) | ||
+ | }#end if | ||
+ | echo "< | ||
+ | }#end else (save) | ||
+ | |||
+ | ###### | ||
+ | elseif($action == " | ||
+ | |||
+ | echo '< | ||
+ | | ||
+ | | ||
+ | $x = 0; | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | while($x < $arraySize): | ||
+ | | ||
+ | | ||
+ | $mins = round($mins / 60); | ||
+ | if (empty($file) or !isset($file)) { | ||
+ | ( $file = " | ||
+ | | ||
+ | } | ||
+ | else { | ||
+ | if(strlen($file) > 10) | ||
+ | $file_short = substr($file, | ||
+ | $file = "<a href=\"# | ||
+ | }#end else | ||
+ | $host = gethostbyname($host); | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '</ | ||
+ | $x++; | ||
+ | EndWhile; | ||
+ | echo '</ | ||
+ | if(!$ftp_activity) echo 'No users currenty using the FTP.< | ||
+ | |||
+ | echo '< | ||
+ | echo '< | ||
+ | |||
+ | |||
+ | }#end else (ftpwho) | ||
+ | ###### | ||
+ | elseif($action == " | ||
+ | ?> | ||
+ | <font color=gray face=" | ||
+ | < | ||
+ | Version <? | ||
+ | About | ||
+ | <ul class=" | ||
+ | The first version of this Script was developed roughly at the end of 2001 in need of a simplyfied remote FTP administration. Since this many user submited changes / updates were integrated. If you got special wishes please let me know via mail.< | ||
+ | One thing to note; I don't take any guarantee either I'm not liable for possible caused damage. This script is free no need to pay for it. But if you like it im be glad for a donation. Everything is welcome e.g. a PayPAL donation:< | ||
+ | <form action=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | </ | ||
+ | <br> | ||
+ | For Information or other stuff regarding pureFTPd Manager or other scripts please visit <a href=" | ||
+ | </ul> | ||
+ | ChangeLog | ||
+ | <ul class=" | ||
+ | <? | ||
+ | $raw = file(" | ||
+ | foreach($raw AS $hline): | ||
+ | echo stripslashes($hline)."< | ||
+ | EndForEach; | ||
+ | ?> | ||
+ | </ul> | ||
+ | |||
+ | <? | ||
+ | } | ||
+ | ELSE { | ||
+ | // User auslesen und in Table darstellen | ||
+ | $viewpw = get_var(" | ||
+ | $Q=DB_QUERY(" | ||
+ | echo '< | ||
+ | echo '< | ||
+ | if($viewpw) echo '< | ||
+ | // UA | ||
+ | echo '< | ||
+ | WHILE($R=MYSQL_FETCH_ARRAY($Q)) { | ||
+ | echo '< | ||
+ | echo '< | ||
+ | if($viewpw) echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | echo '< | ||
+ | if($R[' | ||
+ | ELSE echo '< | ||
+ | if($R[' | ||
+ | ELSE echo '< | ||
+ | if($R[' | ||
+ | ELSE echo '< | ||
+ | // UA | ||
+ | if($R[' | ||
+ | ELSE echo '< | ||
+ | echo '< | ||
+ | if($R[' | ||
+ | elseif($R[' | ||
+ | echo "< | ||
+ | |||
+ | echo "</ | ||
+ | }#end while | ||
+ | echo '</ | ||
+ | ?> | ||
+ | <table width=" | ||
+ | <tr> | ||
+ | <td align=left> | ||
+ | <font color=gray> | ||
+ | PureFTP User Management.< | ||
+ | v<? | ||
+ | [<a href=" | ||
+ | </td> | ||
+ | < | ||
+ | <td align=right valign=top> | ||
+ | <? | ||
+ | // Nav Button stuff | ||
+ | echo "< | ||
+ | // Add User Button | ||
+ | ECHO "< | ||
+ | // View Password Button | ||
+ | echo '< | ||
+ | if($viewpw) | ||
+ | ELSE echo '< | ||
+ | ECHO '< | ||
+ | if(!$viewpw) echo ' class=button'; | ||
+ | ECHO '></ | ||
+ | echo '</ | ||
+ | // Status Button | ||
+ | ECHO "< | ||
+ | // Update Button | ||
+ | ECHO "< | ||
+ | echo "</ | ||
+ | ######## | ||
+ | |||
+ | echo '</ | ||
+ | }#end else | ||
+ | |||
+ | // SQL Verbindung schliessen | ||
+ | DB_CLOSE(); | ||
+ | |||
+ | |||
+ | // Seite abschliessen | ||
+ | PAGE_FOOTER(); | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | // EOC <--* | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | // Funktionen | ||
+ | |||
+ | function PAGE_HEADER() { | ||
+ | GLOBAL $VERSION, $BUILD; | ||
+ | include(" | ||
+ | }#end func | ||
+ | |||
+ | function PAGE_FOOTER() { | ||
+ | include(" | ||
+ | }#end func | ||
+ | |||
+ | function DB_OPEN() { | ||
+ | GLOBAL $MYSQLSERVER, | ||
+ | $MYSQLCON = @mysql_connect($MYSQLSERVER, | ||
+ | if(!$MYSQLCON OR @mysql_error()) DIE(" | ||
+ | if(!@mysql_select_Db($MYSQLDATABASE)) DIE(" | ||
+ | }#end func | ||
+ | |||
+ | function DB_CLOSE() { | ||
+ | GLOBAL $MYSQLCON; | ||
+ | RETURN @mysql_close($MYSQLCON); | ||
+ | }#end func | ||
+ | |||
+ | function DB_QUERY($sql) { | ||
+ | GLOBAL $MYSQLCON, | ||
+ | $Q = @MySql_DB_query($MYSQLDATABASE, | ||
+ | if(@mysql_error()) DIE("< | ||
+ | return $Q; | ||
+ | }#end func | ||
+ | |||
+ | function get_var($var){ | ||
+ | GLOBAL $$var; | ||
+ | GLOBAL $_POST, | ||
+ | $inhalt = $$var; | ||
+ | # This function checks if the _GET or _POST var is set or if an old PHP version used | ||
+ | if($_POST[$var]) RETURN $_POST[$var]; | ||
+ | elseif($HTTP_POST_VAR[$var]) RETURN $HTTP_POST_VAR[$var]; | ||
+ | elseif($_GET[$var]) RETURN $_GET[$var]; | ||
+ | elseif($HTTP_GET_VAR[$var]) RETURN $HTTP_GET_VAR[$var]; | ||
+ | elseif($inhalt) RETURN $inhalt; | ||
+ | }#end func | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | My "// | ||
+ | |||
+ | < | ||
+ | <?php | ||
+ | ###################### | ||
+ | ####### SETUP ######## | ||
+ | ###################### | ||
+ | |||
+ | // Your exactly located mysql config file for pureftpd | ||
+ | $PUREFTP_CONFIG_FILE | ||
+ | |||
+ | // The location where all the Forms directed to. (Mayby no change needed) | ||
+ | $SELF_URL | ||
+ | |||
+ | // The location of your pure-ftpdwho binary | ||
+ | $FTP_WHO | ||
+ | |||
+ | ####################### | ||
+ | # DEFAULT NEW-USER PARAMS # | ||
+ | ####################### | ||
+ | |||
+ | $DefaultUser = ""; | ||
+ | $DefaultPass = ""; | ||
+ | $DefaultUid = " | ||
+ | $DefaultGid = " | ||
+ | $DefaultDir = "/ | ||
+ | $DefaultUL = " | ||
+ | $DefaultDL = " | ||
+ | $Defaultip = " | ||
+ | $DefaultQS = " | ||
+ | $Defaultcmt = ""; | ||
+ | |||
+ | // UA | ||
+ | $DefaultQF = " | ||
+ | $PWC = " | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | |||
+ | This is basically it. Point your browser at // | ||
+ | |||
+ | |||
+ | An alternate Pure-Ftpd GUI can be found at http:// |
howtos/pure-ftpd.txt · Last modified: 02/12/2018 21:34 by 127.0.0.1