サーバー設定 · 7 min read · Nov 24, 2025

OpenSUSE 13.2 における PureFTPd と MySQL を用いた仮想ホスティング (クォータと帯域幅管理を含む)

OpenSUSE 13.2 における PureFTPd と MySQL を用いた仮想ホスティング (クォータと帯域幅管理を含む)

Version 1.0
Author: Srijan Kishore
howtoforge を Twitter でフォロー
Last edited 19/Nov/2014

この文書では、実際のシステムユーザーの代わりに MySQL データベースからの仮想ユーザーを使用する PureFTPd サーバーのインストール方法について説明します。これははるかにパフォーマンスが高く、単一のマシン上で数千の FTP ユーザーを持つことができます。さらに、この設定でのクォータとアップロード/ダウンロード帯域幅制限の使用方法も示します。パスワードはデータベース内に MD5 文字列として暗号化されて保存されます。

MySQL データベースの管理には、phpMyAdmin のようなウェブベースのツールを使用できます。この howto でもインストールされます。phpMyAdmin は快適なグラフィカルインターフェースであり、コマンドラインをいじる必要はありません。

この文書は、いかなる種類の保証もありません!このシステムを設定する唯一の方法ではないことを言いたいです。この目標を達成する方法はたくさんありますが、これが私が取る方法です。

1 予備ノート

このチュートリアルでは、ホスト名 server1.example.com と IP アドレス 192.168.0.100 を使用します。これらの設定はあなたの環境によって異なる場合があるため、適宜置き換える必要があります。このチュートリアルに記載されているように進む前に、基本的な Open Suse のインストールが必要です。

2 MariaDB、Apache2、および phpMyAdmin のインストール

MariaDB、Apache、および phpMyAdmin に必要な 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 のシステム起動リンクを作成し(システムが起動するたびに自動的に起動するように)、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

注意:ファイルの値が異なる場合は、次のように値を変更します:

これらの行をコメントアウトし、これらの行を追加します。

#  
#    Options None  
#    AllowOverride None  
#    Order deny,allow  
#   Deny from all  
#  
  
  
Options None  
AllowOverride None  
Require all denied  

次に、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) を作成します。グループおよびユーザー ID 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 デーモンが後で pureftpd データベースに接続するために使用する pureftpd という名前の MySQL ユーザーを作成します:

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 シェルにまだいる間に、必要なデータベーステーブルを作成します(はい、テーブルは 1 つだけです!):

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/ にアクセスし(server1.example.com の代わりに IP アドレスを使用することもできます)、ユーザー pureftpd としてログインできます。次に、データベースを確認できます。後で phpMyAdmin を使用して PureFTPd サーバーを管理できます。

5 PureFTPd の設定

/etc/pure-ftpd/pure-ftpd.conf を編集し、ChrootEveryone、AnonymousOnly、MySQLConfigFile、および CreateHomeDir 行が有効になっていることを確認し、次のようになります:

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 がユーザーのホームディレクトリを作成します。AnonymousOnly は「no」に設定する必要があります。そうでないと、匿名 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")  

MYSQLPassword の行で、MySQL ユーザー pureftpd の実際のパスワードに ftpdpass という文字列を置き換えることを確認してください!MYSQLCrypt メソッドとして md5 を使用しているため、ユーザーのパスワードをデータベースに MD5 文字列として保存します。これは、プレーンテキストのパスワードを使用するよりもはるかに安全です!

次に、PureFTPd のシステム起動リンクを作成し、起動します:

systemctl enable pure-ftpd  
systemctl start pure-ftpd

6 データベースをポピュレートし、テスト

データベースをポピュレートするには、MySQL シェルを使用できます:

mysql -u root -p
USE pureftpd;

次に、ユーザー exampleuser を作成し、ステータス 1(つまり、FTP アカウントがアクティブであることを意味します)、パスワード secret(MySQL の MD5 関数を使用して暗号化されて保存されます)、UID と GID 2001(ステップ 2 の最後で作成したユーザー/グループのユーザー ID とグループ ID を使用します!)、ホームディレクトリ /home/www.example.com、アップロードおよびダウンロード帯域幅 100 KB/sec(キロバイト毎秒)、および 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 システムの場合は WS_FTP や SmartFTP、Linux デスクトップの場合は gFTP など)を開き、接続を試みます。ホスト名には 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 のホームディレクトリ)が自動的に作成され、ftpuser と ftpgroup(ステップ 2 の最後で作成したユーザー/グループ)が所有していることがわかります。

7 データベース管理

ほとんどの人にとって、MySQL のグラフィカルフロントエンドがあると便利です。したがって、phpMyAdmin(この例では http://server1.example.com/phpMyAdmin/ または http://192.168.0.100/phpMyAdmin/)を使用して pureftpd データベースを管理できます。

新しいユーザーを作成するたびに、ftpd テーブルにエントリを作成する必要がありますので、このテーブルの列について説明します:

ftpd テーブル:

  • User: 仮想 PureFTPd ユーザーの名前(例:exampleuser)。

  • status: 0 または 1。0 はアカウントが無効であり、ユーザーはログインできません。

  • Password: 仮想ユーザーのパスワード。MySQL の MD5 関数を使用して、パスワードを MD5 文字列として暗号化して保存することを確認してください:


  • UID: ステップ 2 の最後で作成した FTP ユーザーのユーザー ID(例:2001)。

  • GID: ステップ 2 の最後で作成した FTP グループのグループ ID(例:2001)。

  • Dir: 仮想 PureFTPd ユーザーのホームディレクトリ(例:/home/www.example.com)。存在しない場合は、新しいユーザーが最初に FTP 経由でログインしたときに作成されます。仮想ユーザーはこのホームディレクトリに監禁され、他のディレクトリにアクセスできません。

  • ULBandwidth: 仮想ユーザーのアップロード帯域幅(KB/sec。キロバイト毎秒)。0 は無制限を意味します。

  • DLBandwidth: 仮想ユーザーのダウンロード帯域幅(KB/sec。キロバイト毎秒)。0 は無制限を意味します。

  • comment: ここに任意のコメントを入力できます(例:内部管理用)。通常、このフィールドは空のままにします。

  • ipaccess: この FTP アカウントに接続を許可されている IP アドレスをここに入力します。* は任意の IP アドレスが接続を許可されることを意味します。

  • QuotaSize: FTP サーバー上で仮想ユーザーが使用できるストレージスペース(MB 単位、ULBandwidth および DLBandwidth は KB 単位ではありません!)。0 は無制限を意味します。

  • QuotaFiles: FTP サーバー上で仮想ユーザーが保存できるファイルの数。0 は無制限を意味します。

8 匿名 FTP

パスワードなしで誰でもログインできる匿名 FTP アカウントを作成する場合は、ftp という名前のユーザーとグループが必要です。これらは、pure-ftpd パッケージをインストールしたときに自動的に作成されているため、手動で作成する必要はありません。ただし、ftp のホームディレクトリはデフォルトで /srv/ftp ですが、匿名 FTP ディレクトリを /home/ftp に作成したいと思います(通常のユーザーの FTP ディレクトリも /home にあります。例:/home/www.example.com)。もちろん、/srv/ftp ディレクトリを匿名 FTP 用に使用することもできますが、好みに応じて選択してください。

/home/ftp を使用する場合は、/etc/passwd を開き、ftp ユーザーのホームディレクトリを /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 ディレクトリを作成し、匿名ユーザーがファイルをアップロードできるようにします。/home/ftp/incoming ディレクトリには 311 の権限を与え、ユーザーがアップロードできるが、そのディレクトリ内のファイルを表示またはダウンロードできないようにします。/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 を使用する場合は、上記のコマンドで /home/ftp を /srv/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/sec を意味します。任意の値を使用するか、帯域幅を制限したくない場合は行をコメントアウトしてください。)

最後に、PureFTPd を再起動します:

systemctl restart pure-ftpd.service

9 リンク

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。