サーバー設定 · 5 min read · Dec 24, 2025

PureFTPd、MariaDB、および仮想ユーザーを使用したFTPサーバー(クォータおよび帯域幅管理を含む)のCentOS 7.2上の設定

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

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

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

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

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

1 前提条件

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

2 MySQLおよびphpMyAdminのインストール

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

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

これで、Apache Webサーバー、PHP、MariaDB、およびphpMyAdminを次のようにインストールできます。

yum -y install mariadb mariadb-server phpmyadmin httpd php

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

nano /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

  
    AddDefaultCharset UTF-8
#  
#     # 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のシステム起動リンクを作成します(システムが起動するたびに自動的に両方が起動するようにします)および両方のサービスを開始します。

CentOSファイアウォール「firewalld」がサーバーにインストールされている場合は、httpおよびhttpsポートを開きます。

firewall-cmd --permanent --zone=public --add-service=http  
firewall-cmd --permanent --zone=public --add-service=https  
firewall-cmd --reload

次に、MariaDBとApacheを起動します。

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 / MariaDBサポートを持つPureFTPdのインストール

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

yum -y install pure-ftpd

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

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用のデータベースの作成

次に、pureftpdという名前のデータベースと、PureFTPdデーモンが後でpureftpdデータベースに接続するために使用するpureftpdという名前のMariaDBユーザーを作成します。

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

5 PureFTPdの構成

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

nano /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  
nano /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の行で、ftpdpassという文字列をMySQLユーザーpureftpdの実際のパスワードに置き換えることを確認してください! MYSQLCryptメソッドとしてmd5を使用することに注意してください。これは、ユーザーのパスワードをデータベースにMD5文字列として保存することを意味し、プレーンテキストパスワードを使用するよりもはるかに安全です!

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

systemctl enable pure-ftpd.service  
systemctl start 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システムの場合はFileZilla、Linuxデスクトップの場合はgFTPなど)を開き、接続を試みます。ホスト名にはserver1.example.com(またはシステムのIPアドレス)を使用し、ユーザー名はexampleuser、パスワードはsecretです。

FileZillaを使用してFTPサーバーに接続します。

接続できた場合は、おめでとうございます! 接続できない場合は、何かがうまくいかなかったことになります。

次に、

ls -l /home

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

[root@server1 ~]# ls -l /home  
total 0  
drwx------. 2 administrator administrator 59 Jun 21 16:13 administrator  
drwxr-xr-x. 2 ftpuser ftpgroup 22 Jul 4 18:30 www.example.com  
[root@server1 ~]#

7 データベース管理

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

PHPMyAdminダッシュボード

pure-ftpd MySQLデータベース

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

FTPDテーブル:

  • User: 仮想PureFTPdユーザーの名前(例: exampleuser)。
  • status: 0または1。0はアカウントが無効であり、ユーザーはログインできません。
  • Password: 仮想ユーザーのパスワード。MySQLのMD5関数を使用してパスワードを暗号化されたMD5文字列として保存することを確認してください:
    FTPユーザーを追加します。
  • 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アカウント)を作成する場合は、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を使用する場合はこれを行わないでください):

nano /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を開き、次の設定が含まれていることを確認します。

nano /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 このCentOS 7.2サーバーを仮想マシンとしてダウンロード

このセットアップは、howtoforgeのサブスクライバー向けにova/ovf形式(VMWareおよびVirtualboxと互換性あり)で仮想マシンダウンロードとして利用可能です。

VMのログイン詳細

  • rootパスワードは: howtoforge
  • 「administrator」ユーザーのパスワードは: howtoforge

最初のログイン時に両方のパスワードを変更してください。

  • VMのIPアドレスは192.168.1.100です。

10 リンク

Share: X/Twitter LinkedIn

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

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