サーバー管理 · 6 min read · Dec 24, 2025

CentOS 7.0 における PureFTPd と MySQL を使用した仮想ホスティング (クォータおよび帯域幅管理を含む)

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

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

このチュートリアルは CentOS 7.0 に基づいています。基本的な最小限の CentOS 7 システムをすでにセットアップしている必要があります。

このハウツーは実用的なガイドとして意図されており、理論的な背景についてはカバーしていません。それらはウェブ上の他の多くの文書で扱われています。

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

1 予備ノート

このチュートリアルでは、ホスト名 server1.example.com と IP アドレス 192.168.0.100 を使用します。これらの設定はあなたの環境によって異なる場合があるため、適切な場所で置き換える必要があります。

2 MySQL と phpMyAdmin のインストール

まず、CentOS システムで EPEL リポジトリを有効にします。このチュートリアルの過程でインストールするいくつかのパッケージは、公式の CentOS 7.0 リポジトリにはありません。

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

次に、CentOS システムで EPEL リポジトリを有効にします。このチュートリアルの過程でインストールする多くのパッケージは、公式の CentOS 7 リポジトリにはありません。

yum -y install epel-release
yum -y install yum-priorities

/etc/yum.repos.d/epel.repo を編集します…

nano /etc/yum.repos.d/epel.repo

… そして [epel] セクションに priority=10 の行を追加します:

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]

次に、システム上の既存のパッケージを更新します:

yum update

これで、次のように MySQL と phpMyAdmin をインストールできます:

yum install mariadb mariadb-server phpmyadmin httpd php

次に、phpMyAdmin を構成します。phpMyAdmin が localhost からの接続だけでなく、他の接続も許可するように Apache 設定を変更します( スタンザ内のすべてをコメントアウトし、Require all granted の行を追加します):

vi /etc/httpd/conf.d/phpMyAdmin.conf

ファイルが次のようになるようにします:

# phpMyAdmin - Web based MySQL browser written in php
#
# Allows only localhost by default
#
# But allowing phpMyAdmin to anyone other than localhost should be considered
# dangerous unless properly secured by SSL

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin


#  
#     # Apache 2.4
#     
#       Require ip 127.0.0.1
#       Require ip ::1
#     
#   
#   
#     # Apache 2.2
#     Order Deny,Allow
#    # Deny from All
#     Allow from 127.0.0.1
     Options Indexes
     AllowOverride None
     Require all granted
#     Allow from ::1
#   




   
     # Apache 2.4
     
       Require ip 127.0.0.1
       Require ip ::1
     
   
   
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   


# These directories do not require access over HTTP - taken from the original
# phpMyAdmin upstream tarball
#

    Order Deny,Allow
    Deny from All
    Allow from None



    Order Deny,Allow
    Deny from All
    Allow from None



    Order Deny,Allow
    Deny from All
    Allow from None


# This configuration prevents mod_security at phpMyAdmin directories from
# filtering SQL etc.  This may break your mod_security implementation.
#
#
#    
#        SecRuleInheritance Off
#    
#

次に、MySQL と Apache のシステム起動リンクを作成します(システムが起動するたびに自動的に両方が開始されるように)し、両方のサービスを開始します。さらに、ファイアウォールによって両方のサービスが許可される必要があります:

firewall-cmd --permanent --zone=public --add-service=http  
firewall-cmd --permanent --zone=public --add-service=https  
firewall-cmd --reload
systemctl enable mariadb.service  
systemctl start mariadb.service
systemctl enable httpd.service  
systemctl start httpd.service

MySQL ユーザー root のパスワードを作成します(yourmariadbpassword を使用したいパスワードに置き換えます):

mysql_secure_installation

[root@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!

MariaDB にログインしてセキュリティを確保するには、root ユーザーの現在のパスワードが必要です。  MariaDB をインストールしたばかりで、まだ root パスワードを設定していない場合、パスワードは空白になりますので、ここでは Enter を押してください。 <–ENTER
Enter current password for root (enter for none): <–ENTER
OK, successfully used password, moving on…

root パスワードを設定することで、適切な認証なしに誰も MariaDB root ユーザーにログインできないようにします。

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

デフォルトでは、MariaDB インストールには匿名ユーザーがあり、誰でもユーザーアカウントを作成せずに MariaDB にログインできます。  これはテスト用にのみ意図されており、インストールを少しスムーズにするためのものです。  本番環境に移行する前に削除する必要があります。

Remove anonymous users? [Y/n] <–ENTER
… Success!

通常、root は ‘localhost’ からのみ接続を許可されるべきです。  これは、誰かがネットワークから root パスワードを推測できないようにするためです。

Disallow root login remotely? [Y/n] <–ENTER
… Success!

デフォルトでは、MariaDB には誰でもアクセスできる ‘test’ という名前のデータベースがあります。  これはテスト用にのみ意図されており、本番環境に移行する前に削除する必要があります。

Remove test database and access to it? [Y/n] <–ENTER

  • Dropping test database…
    … Success!
  • Removing privileges on test database…
    … Success!

特権テーブルをリロードすることで、これまでに行ったすべての変更が即座に有効になります。

Reload privilege tables now? [Y/n] <–ENTER
… Success!

Cleaning up…

すべて完了しました!  上記のすべての手順を完了した場合、MariaDB インストールは安全になっているはずです。

MariaDB を使用していただきありがとうございます!
[root@server1 ~]#

3 MySQL サポートを使用した PureFTPd のインストール

CentOS の PureFTPd パッケージは、MySQL、PostgreSQL、LDAP などのさまざまなバックエンドをサポートしています。したがって、通常の PureFTPd パッケージをインストールするだけで済みます:

yum install pure-ftpd

次に、すべての仮想ユーザーがマッピングされる ftp グループ (ftpgroup) とユーザー (ftpuser) を作成します。グループ ID とユーザー ID 2001 を、システム上で空いている番号に置き換えます:

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

ftp サービスは、次のように firewall-cmd によって許可される必要があります:

firewall-cmd --permanent --zone=public --add-service=ftp  
firewall-cmd --reload

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;

ご覧のとおり、quit; コマンドで MySQL シェルを終了し、Linux シェルに戻りました。

ところで、(あなたの FTP サーバーシステムのホスト名が server1.example.com であると仮定しています)ブラウザで http://server1.example.com/phpMyAdmin/ にアクセスし、ユーザー pureftpd としてログインできます。次に、データベースを確認できます。後で phpMyAdmin を使用して PureFTPd サーバーを管理できます。

5 PureFTPd の構成

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

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

ChrootEveryone 設定により、PureFTPd はすべての仮想ユーザーをそのホームディレクトリに chroot させるため、ユーザーはホームディレクトリの外のディレクトリやファイルを参照できなくなります。CreateHomeDir 行により、ユーザーがログインしたときにユーザーのホームディレクトリが存在しない場合、PureFTPd はそのホームディレクトリを作成します。

次に、/etc/pure-ftpd/pureftpd-mysql.conf を編集します。次のようになります:

cp /etc/pure-ftpd/pureftpd-mysql.conf /etc/pure-ftpd/pureftpd-mysql.conf_orig  
cat /dev/null > /etc/pure-ftpd/pureftpd-mysql.conf  
vi /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/lib/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.service  
systemctl enable pure-ftpd.service

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

/home/www.example.com(exampleuser のホームディレクトリ)が自動的に作成され、ftpuser と ftpgroup(ステップ 2 の最後で作成したユーザー/グループ)が所有していることがわかります:

[root@server1 ~]# ls -l /home/  
total 0  
drwx------. 2 administrator administrator 59 Sep 26 10:35 administrator  
drwxr-xr-x. 2 ftpuser       ftpgroup      22 Sep 26 12:07 www.example.com  
[root@server1 ~]#

7 データベース管理

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

PHPMyAdmin インターフェース

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

ftpd テーブル:

  • User: 仮想 PureFTPd ユーザーの名前(例: exampleuser)。
  • status: 0 または 1。0 はアカウントが無効であり、ユーザーはログインできません。
  • Password: 仮想ユーザーのパスワード。MySQL の MD5 関数を使用して、パスワードを MD5 文字列として暗号化して保存することを確認してください:
    ftpd テーブル
  • 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 ではなく MB!)。0 は無制限を意味します。
  • QuotaFiles: FTP サーバーに仮想ユーザーが保存できるファイルの数。0 は無制限を意味します。

8 匿名 FTP

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

/home/ftp を使用する場合は、/etc/passwd を開き、ftp ユーザーのホームディレクトリを /var/ftp から /home/ftp に変更します(/var/ftp を使用する場合はこれを行わないでください):

vi /etc/passwd
[...]
#ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
ftp:x:14:50:FTP User:/home/ftp:/sbin/nologin
[...]

次に、/var/ftp を /home に移動します(/var/ftp を使用する場合はこれを行わないでください):

mv /var/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/

(/var/ftp を使用する場合は、上記のコマンドで /home/ftp を /var/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
[...]
AntiWarez                   no
[...]
AnonymousBandwidth            8
[...]
AnonymousCantUpload         no
[...]

(AnonymousBandwidth 設定はオプションです - 匿名ユーザーのアップロードおよびダウンロード帯域幅を制限することができます。8 は 8 KB/sec を意味します。任意の値を使用するか、帯域幅を制限したくない場合は行をコメントアウトしてください。)

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

systemctl restart pure-ftpd.service

9 リンク

Share: X/Twitter LinkedIn

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

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