使用PureFTPd和MySQL的虚拟主机(包括配额和带宽管理)在OpenSUSE 13.2上

使用PureFTPd和MySQL的虚拟主机(包括配额和带宽管理)在OpenSUSE 13.2上 本文档介绍如何安装PureFTPd服务器

使用PureFTPd和MySQL进行虚拟托管(包括配额和带宽管理)在OpenSUSE 13.2上

本文档介绍如何安装使用MySQL数据库而不是真实系统用户的虚拟用户的PureFTPd服务器。这是更好的性能,并允许在单个机器上有成千上万的ftp用户。除此之外,我将使用此设置显示使用配额和上传/下载带宽限制。密码将作为MD5字符串加密存储在数据库中。

对于MySQL数据库的管理,您可以使用基于Web的工具,如phpMyAdmin,它也将安装在此howto中。 phpMyAdmin是一个舒适的图形界面,这意味着您不必乱用命令行。

本文档不附带任何形式的保证!我想说,这不是设立这样一个制度的唯一办法。实现这一目标有很多方法,但这是我所采取的方式。

1初步说明

在本教程中,我使用主机名  server1.example.com 与IP地址  192.168.0.100 。这些设置可能会有所不同,因此您必须在适当的情况下更换它们。如本教程所述,您必须先进行基本的Open Suse安装,然后再进行前进。

2.安装MariaDB,Apache2和phpMyAdmin

phpMyAdmin所需的MariaDB,Apache和PHP模块可以安装如下:

zypper install mariadb mariadb-client apache2 apache2-mod_php5 php5-mysql php5-mcrypt php5-mbstring php5-gd

server1:~ # zypper install mariadb mariadb-client apache2 apache2-mod_php5 php5-mysql php5-mcrypt php5-mbstring php5-gd
Loading repository data...
Reading installed packages...
Resolving package dependencies...

Problem: php5-mysql-5.6.1-4.1.x86_64 requires php5 = 5.6.1, but this requirement cannot be provided
  uninstallable providers: php5-5.6.1-1.1.x86_64[openSUSE-13.2-0]
                   php5-5.6.1-1.1.i586[repo-oss]
                   php5-5.6.1-1.1.x86_64[repo-oss]
                   php5-5.6.1-4.1.i586[repo-update]
                   php5-5.6.1-4.1.x86_64[repo-update]
 Solution 1: Following actions will be done:
  do not install php5-mysql-5.6.1-4.1.x86_64
  do not install php5-mcrypt-5.6.1-4.1.x86_64
  do not install php5-gd-5.6.1-4.1.x86_64
 Solution 2: Following actions will be done:
  do not install php5-mcrypt-5.6.1-4.1.x86_64
  do not install apache2-mod_php5-5.6.1-4.1.x86_64
  do not install php5-gd-5.6.1-4.1.x86_64
  do not install php5-mbstring-5.6.1-4.1.x86_64
  do not install php5-mysql-5.6.1-4.1.x86_64
 Solution 3: Following actions will be done:
  do not install php5-mcrypt-5.6.1-4.1.x86_64
  do not install apache2-mod_php5-5.6.1-4.1.x86_64
  do not install php5-gd-5.6.1-4.1.x86_64
  do not install php5-mbstring-5.6.1-4.1.x86_64
 Solution 4: Following actions will be done:
  do not install php5-mcrypt-5.6.1-4.1.x86_64
  do not install apache2-mod_php5-5.6.1-4.1.x86_64
  do not install php5-gd-5.6.1-4.1.x86_64
  do not install php5-mbstring-5.6.1-4.1.x86_64
 Solution 5: Following actions will be done:
  do not install php5-mcrypt-5.6.1-4.1.x86_64
  do not install apache2-mod_php5-5.6.1-4.1.x86_64
  do not install php5-gd-5.6.1-4.1.x86_64
  do not install php5-mbstring-5.6.1-4.1.x86_64
 Solution 6: Following actions will be done:
  do not install php5-mcrypt-5.6.1-4.1.x86_64
  do not install apache2-mod_php5-5.6.1-4.1.x86_64
  do not install php5-gd-5.6.1-4.1.x86_64
  do not install php5-mbstring-5.6.1-4.1.x86_64
 Solution 7: deinstallation of patterns-openSUSE-minimal_base-conflicts-20141007-2.1.x86_64
 Solution 8: break php5-mysql-5.6.1-4.1.x86_64 by ignoring some of its dependencies

Choose from above solutions by number or cancel [1/2/3/4/5/6/7/8/c] (c): <--7

然后,我们为MySQL创建系统启动链接(以便每当系统启动时,MySQL自动启动)并启动MySQL服务器:

systemctl enable mysql.service
systemctl start mysql.service

要确保MySQL安装,请运行:

mysql_secure_installation

server1:~ # mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] <--ENTER
New password: <--mariadbpassword
Re-enter new password: <--mariadbpassword
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] <--ENTER
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] <--ENTER
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] <--ENTER
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] <--ENTER
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
server1:~ #

现在你的MySQL设置应该是安全的。

然后,我们为Apache创建系统启动链接(使系统启动时自动启动)并启动它:

systemctl enable apache2.service
systemctl start apache2.service

phpMyAdmin可以安装如下:

zypper install phpmyadmin

为了确保我们可以访问phpMyAdmin编辑文件,如下所示:

vi /etc/apache2/conf.d/phpMyAdmin.conf

添加别名如下:

Alias /phpMyAdmin /srv/www/htdocs/phpMyAdmin
Alias /phpmyadmin /srv/www/htdocs/phpMyAdmin
[...]

在启动apache之前,我们需要遵循httpd.conf中的链接并进行更改

vi /etc/apache2/httpd.conf

注意:如果文件值不同,则更改值如下所示:

评论这些行并添加这些行

#<Directory />
#    Options None
   AllowOverride None
   Order deny,allow
#   Deny from all
#</Directory>

<Directory />
Options None
AllowOverride None
Require all denied
</Directory>

接下来,我们需要使phpmyadmin的配置文件为

cd /srv/www/htdocs/phpMyAdmin
cp config.sample.inc.php config.inc.php

在配置文件中,您可以看到phpmyadmin希望包含pma表的名为“phpmyadmin”的数据库:

[...]
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
[...]

所以我们创建一个:

echo "create database phpmyadmin;" | mysql -u root -p 'mariadbpassword'

并从phpmyadmin文档加载标签。

mysql -u root -p 'mariadbpassword' < /usr/share/doc/packages/phpMyAdmin/examples/create_tables.sql

现在启动Apache服务

systemctl enable apache2.service
systemctl restart apache2.service

现在我们可以访问http://192.168.0.100/phpmyadmin或http://server1.example.com上的phpmyadmin


3使用MySQL支持安装PureFTPd

OpenSUSE的PureFTPd软件包支持各种后端,如MySQL,PostgreSQL,LDAP等。因此,我们所要做的就是安装普通的PureFTPd软件包:

 zypper install pure-ftpd

然后我们创建一个ftp组( ftpgroup )和用户( ftpuser ),我们所有的虚拟用户将被映射到。 将group-and userid 2001替换为系统上免费的数字:

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

4为PureFTPd创建MySQL数据库

现在我们创建一个名为pureftpd的数据库和名为pureftpd的MySQL用户,PureFTPd后台程序稍后将使用它连接到pureftpd数据库:

mysql -u root -p

CREATE DATABASE pureftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';
FLUSH PRIVILEGES;

将字符串ftpdpass替换为您要用于MySQL用户pureftpd的任何密码。 仍然在MySQL shell上,我们创建了我们需要的数据库表(是的,只有一个表!):

USE pureftpd;

CREATE TABLE `ftpd` (
User varchar(16) NOT NULL default '',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default '-1',
Gid varchar(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default '',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccess varchar(15) NOT NULL default '*',
QuotaSize smallint(5) NOT NULL default '0',
QuotaFiles int(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
)  ENGINE=MyISAM;

quit;

您现在可以在浏览器中访问http://server1.example.com/phpMyAdmin/(您也可以使用IP地址而不是server1.example.com )访问phpMyAdmin,并以用户pureftpd身份登录。 那么你可以看看数据库。 以后可以使用phpMyAdmin管理您的PureFTPd服务器。


5配置PureFTPd

编辑/etc/pure-ftpd/pure-ftpd.conf并确保启用了ChrootEveryone,AnonymousOnly,MySQLConfigFileCreateHomeDir行,如下所示:

vi /etc/pure-ftpd/pure-ftpd.conf

[...]
ChrootEveryone              yes
[...]
AnonymousOnly               no
[...]
MySQLConfigFile              /etc/pure-ftpd/pureftpd-mysql.conf
[...]
CreateHomeDir               yes
[...]

ChrootEveryone设置将使PureFTPd在其主目录中的每个虚拟用户都能够chroot,因此他无法浏览其主目录之外的目录和文件。 当用户登录并且主目录不存在时, CreateHomeDir行将使PureFTPd创建用户的主目录。 匿名必须设置为 ,否则只允许匿名FTP会话。

然后我们创建/编辑/etc/pure-ftpd/pureftpd-mysql.conf 。 它应该是这样的:

vi /etc/pure-ftpd/pureftpd-mysql.conf

MYSQLSocket      /var/run/mysql/mysql.sock
#MYSQLServer     localhost
#MYSQLPort       3306
MYSQLUser       pureftpd
MYSQLPassword   ftpdpass
MYSQLDatabase   pureftpd
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext
MYSQLCrypt      md5
MYSQLGetPW      SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID     SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID     SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetDir     SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTASZ   SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTAFS   SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")

确保将ftpdpass字符串替换为MYSQLPassword行中MySQL用户pureftpd的真实密码! 请注意,我们使用md5作为MYSQLCrypt方法,这意味着我们将用户密码作为MD5字符串存储在数据库中,这比使用纯文本密码更安全!

现在我们为PureFTPd创建系统启动链接并启动它:

systemctl enable pure-ftpd
systemctl start pure-ftpd

6填充数据库和测试

要填充数据库,可以使用MySQL shell:

mysql -u root -p

USE pureftpd;

现在我们创建一个状态为1的用户exampleuser (这意味着他的ftp帐户是活动的),密码秘密 (将使用MySQL的MD5功能加密存储),UID和GID 2001 (使用用户/您在第二步结束时创建的组!),主目录/home/www.example.com ,上传和下载带宽为100 KB /秒。 (千字节每秒),配额为50 MB:

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');

quit;

现在,在您的工作站上打开FTP客户端程序(如果您在Windows系统上,或者在Windows桌面上使用gFTP,则会像WS_FTP或SmartFTP)并尝试连接。 作为主机名,您使用server1.example.com (或系统的IP地址),用户名为exampleuser ,密码为secret

如果你能连接 - 恭喜你! 如果没有,出现问题。

现在,如果你跑

ls -l /home/

server1:~ # ls -l /home/
total 0
drwxr-xr-x 1 administrator users    128 Nov  7 14:30 administrator
drwxr-xr-x 1 ftpuser       ftpgroup  18 Nov 19 14:32 www.example.com
server1:~ #

您应该会看到/home/www.example.com(exampleuser的主目录)目录是自动创建的,它由ftpuserftpgroup (在第二步结束时创建的用户/组)拥有:

7数据库管理

对于大多数人来说,如果他们有一个图形化的前端到MySQL,这更容易; 因此,您还可以使用phpMyAdmin(在此示例中的http://server1.example.com/phpMyAdmin/http://192.168.0.100/phpMyAdmin/ )来管理pureftpd数据库。



每当你想创建一个新的用户,你必须在表ftpd中创建一个条目,所以我将在这里解释这个表的列:

ftpd表:

  • 用户:虚拟PureFTPd用户的名称(例如exampleuser)。
  • 状态:0或1. 0表示帐户被禁用,用户无法登录。
  • 密码:虚拟用户的密码。 确保使用MySQL的MD5功能将加密的密码保存为MD5字符串:




  • UID:您在第二步结束时创建的ftp用户的用户标识(例如2001)。
  • GID:在第二步结束时创建的ftp组的groupid(例如2001)。
  • 目录:虚拟PureFTPd用户的主目录(例如/home/www.example.com)。 如果不存在,则当新用户通过FTP第一次登录时将创建它。 虚拟用户将被关入此主目录,即他无法访问其主目录以外的其他目录。
  • ULBandwidth:上传虚拟用户的带宽,单位为KB /秒。 (千字节/秒)。 0表示无限制。
  • DLBandwidth:以KB /秒的速度下载虚拟用户的带宽。 (千字节/秒)。 0表示无限制。
  • 评论:您可以在这里输入任何评论(例如您的内部管理)。 通常你将这个字段留空。
  • ipaccess:在此输入允许连接到此FTP帐户的IP地址。 *表示允许任何IP地址连接。
  • QuotaSize:允许虚拟用户在FTP服务器上使用的存储空间(以MB为单位,不包括KB,如ULBandwidth和DLBandwidth!)。 0表示无限制。
  • QuotaFiles:允许虚拟用户在FTP服务器上保存的文件数量。 0表示无限制。

8匿名FTP

如果您要创建一个匿名ftp帐户(一个ftp帐户,每个人都可以登录没有密码),您需要一个用户和一个名为ftp的组。 当您安装纯ftpd软件包时,都会自动创建两个,因此您不需要手动创建它们。 但是,ftp的homedir默认是/ srv / ftp,但是我想在/ home / ftp中创建匿名ftp目录(普通用户的ftp目录也在/ home中,例如/home/www.example。 com)。 但是,如果您愿意,您可以使用/ srv / ftp目录来进行匿名ftp。

如果要使用/ home / ftp,请打开/ etc / passwd并将ftp用户的homedir从/ srv / ftp更改为/ home / ftp(如果要使用/ srv / ftp,请不要这样做):

vi /etc/passwd

[...]
#ftp:x:40:49:FTP account:/srv/ftp:/bin/bash
ftp:x:40:49:FTP account:/home/ftp:/bin/bash
[...]

然后将/ srv / ftp移动到/ home(如果你想使用/ srv / ftp,不要这样做):

mv /srv/ftp /home

然后我们创建目录/ home / ftp / incoming,这将允许匿名用户上传文件。 我们将给出311的/ home / ftp / incoming目录权限,以便用户可以上传,但不能查看或下载该目录中的任何文件。 / home / ftp目录的权限为555,允许查看和下载文件:

chown ftp:nobody /home/ftp
cd /home/ftp
mkdir incoming
chown ftp:nobody incoming/
chmod 311 incoming/
cd ../
chmod 555 ftp/

(如果要使用/ srv / ftp,请在/ srv / ftp中替换/ home / ftp。)

匿名用户将能够登录,他们将被允许从/ home / ftp下载文件,但上传将仅限于/ home / ftp / incoming(一旦将文件上传到/ home / ftp / incoming,它不能从那里读取或下载;服务器管理员必须首先将其移动到/ home / ftp以使其可供其他人使用)。

现在我们必须为匿名ftp配置PureFTPd。 打开/etc/pure-ftpd/pure-ftpd.conf并确保您具有以下设置:

vi /etc/pure-ftpd/pure-ftpd.conf

[...]
NoAnonymous                 no

[...]
AnonymousBandwidth            8
[...]
AnonymousCantUpload         no
[...]

(AnonymousBandwidth设置是可选的 - 它允许您限制匿名用户的上传和下载带宽,8表示8 KB /秒。使用任何您喜欢的值,如果不想限制带宽,请注释掉该行)。

最后,我们重新启动PureFTPd:

systemctl restart pure-ftpd.service