Symfoware

Symfowareについての考察blog

Pure-FTPdの認証情報をMySQL(MariaDB)で管理する

セキュアが売りのFTP Server
Pure-UTPd
https://www.pureftpd.org/project/pure-ftpd

FTPに接続するユーザー情報をデータベースで管理できる模様。
今回はMariaDBに作成したテーブルでユーザー情報を管理してみます。

サーバーはDebian 8 + MariaDBは10.0.30です。


こちらのドキュメントを参考にしました。
Virtual Hosting With PureFTPd And MySQL (Incl. Quota And Bandwidth Management) On Ubuntu 14.04LTS




MariaDB



MariaDBのインストールはapt-getで行いました。


# apt-get install mariadb-server



※参考
Debian 8にMariaDB 10.1をインストールし、外部接続を許可する




MySQLサポート付きのPureFTPd



MySQLで認証を行うため、pure-ftpd-mysqlパッケージをインストールします。


# apt-get install pure-ftpd-mysql




ユーザー認証情報はMariaDBで管理しますが、接続後に実際にファイルを操作するユーザーが必要です。
「ftpdgroup」グループを作成し「ftpduser」を作成しました。

このftpduserではログインできないようにしておきます。


# groupadd -g 2001 ftpdgroup
# useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpdgroup ftpduser







ユーザー管理用のテーブル作成



MariaDBにユーザー管理用のデータベース、テーブルを作成します。
ローカルのMariaDBに接続


# mysql -u root -p




pureftpdデータベースを作成。
pureftpdユーザーも合わせて作成し、接続許可を与えます。


MariaDB [(none)]> CREATE DATABASE pureftpd;
MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';
MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';
MariaDB [(none)]> FLUSH PRIVILEGES;





作成したpureftpdに切り替え、ユーザー情報を保存するテーブル「ftpd」を作成します。
ユーザー名「testuser」、パスワード「password」でユーザーを作成。
最後にquitで接続を終了します。


MariaDB [(none)]> USE pureftpd;

MariaDB [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=InnoDB;

MariaDB [pureftpd]> INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`)
VALUES ('testuser', '1', MD5('password'), '2001', '2001', '/var/www', '200', '200', '', '*', '10', '0');

※アップロードやダウンロード速度を無制限にするには(後で気がついた)
MariaDB [pureftpd]> INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`)
VALUES ('testuser', '1', MD5('password'), '2001', '2001', '/var/www', '0', '0', '', '*', '0', '0');


MariaDB [pureftpd]> quit





testuserには、ftp接続時「/var/www」を公開するよう指定しましたので、
このディレクトリにアクセス権を付与しておきます。


# chown -R ftpduser /var/www









PureFTPdの設定



MariaDBとの接続情報は「/etc/pure-ftpd/db/mysql.conf」に記載します。
既存のファイルをリネームしてバックアップ。
新規にファイルを作成して、設定内容を記載します。


# mv /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf_orig
# vi /etc/pure-ftpd/db/mysql.conf




/etc/pure-ftpd/db/mysql.confの内容は以下の通り


MYSQLSocket     /var/run/mysqld/mysqld.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")





すべてのユーザーがchrootを使うように指定
これによりPureFTPdは自分のホームディレクトリ内のすべての仮想ユーザをchrootし、ホームディレクトリ以外のディレクトリやファイルを参照することはできません。


# echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone




以下、必要であれば設定。

ログインしたユーザーのホームディレクトリが存在しない場合、自動的に作成する。


# echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir




DNSによるホスト名検索を抑止し、接続を高速化。


# echo "yes" > /etc/pure-ftpd/conf/DontResolve





今回は、ChrootEveryoneとDontResolveだけyesにしました。

ここまで設定できたらサービスを再起動。


# service pure-ftpd-mysql restart




これでテーブルに作成したとおり、ユーザー「testuser」、パスワード「password」で
ftp接続できました。




ULBandwidthとDLBandwidth



テストとして20MBの画像ファイルをアップロードしてみたのですが、90秒かかりました。


ftp> put photo3.jpg
local: photo3.jpg remote: photo3.jpg
200 PORT command successful
150 Connecting to port 49109
552-16 Kbytes used (0%) - authorized: 10240 Kb
552 Quota exceeded: [photo3.jpg] won't be saved
20123547 bytes sent in 92.43 secs (212.6082 kB/s)



遅い上にファイルが保存されない。



ULBandwidth:アップロード速度の制限
DLBandwidth:ダウンロード速度の制限
QuotaSize:アップロードしたファイルサイズの制限

という意味のようです。
制限を解除するには「0」で更新すればOK


UPDATE ftpd SET ULBandwidth = 0, DLBandwidth = 0,QuotaSize = 0 WHERE User = 'testuser';




更新後、ftpで再接続。
再度アップロードしてみると、一瞬で処理が終了しました。


ftp> put photo3.jpg
local: photo3.jpg remote: photo3.jpg
200 PORT command successful
150 Connecting to port 58102
226-File successfully transferred
226 0.029 seconds (measured here), 660.93 Mbytes per second
20123547 bytes sent in 0.02 secs (835.6765 MB/s)





【参考URL】

Virtual Hosting With PureFTPd And MySQL (Incl. Quota And Bandwidth Management) On Ubuntu 14.04LTS
Connect Pure-FTPd with MySQL and manage users
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/04/17(月) 21:51:37|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PHP ftp接続でディレクトリの存在チェック | ホーム | ブラウザ(JavaScript)で複数のファイルを一括ダウンロードさせる>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1979-65abec8f
この記事にトラックバックする(FC2ブログユーザー)