このドキュメントでは、実際のシステムユーザーの代わりにMySQLデータベースの仮想ユーザーを使用するProftpdサーバーをインストールする方法について説明します。これははるかにパフォーマンスが高く、1台のマシンに数千人のftpユーザーを配置できます。それに加えて、この設定でのクォータの使用法を示します。
MySQLデータベースの管理には、このハウツーにもインストールされるphpMyAdminなどのWebベースのツールを使用できます。 phpMyAdminは快適なグラフィカルインターフェイスであるため、コマンドラインをいじくり回す必要はありません。
このチュートリアルはDebianLenny(Debian 5.0)に基づいています。このチュートリアルの最初の7つの章で説明されているように、基本的なDebianLennyシステムをすでにセットアップしているはずです。https://www.howtoforge.com/perfect-server-debian-lenny-ispconfig2
このハウツーは実用的なガイドとして意図されています。理論的背景については説明していません。それらは、Webの他の多くのドキュメントで扱われます。
このドキュメントには、いかなる種類の保証もありません。このようなシステムを構築する方法はこれだけではありません。この目標を達成する方法はたくさんありますが、これが私のやり方です。これがあなたのために働くという保証はありません!
1予備メモ
このチュートリアルでは、ホスト名server1.example.comとIPアドレス192.168.0.100を使用します。これらの設定はユーザーによって異なる場合があるため、必要に応じて置き換える必要があります。
2MySQLとphpMyAdminをインストールします
これはすべて、1つのコマンドでインストールできます:
aptitude install mysql-server mysql-client phpmyadmin apache2
MySQLルートユーザーのパスワードを入力するように求められます。このパスワードは[メール保護]ユーザーと[メール保護]ユーザーに有効であるため、後でMySQLルートパスワードを手動で指定する必要はありません。
MySQLの「root」ユーザーの新しいパスワード:<-yourrootsqlpassword
MySQLの「root」ユーザーのパスワードを繰り返します:<-yourrootsqlpassword
これに加えて、次の質問が表示されます:
自動的に再構成するWebサーバー:<-apache2
3MySQLサポートを使用してProftpdをインストール
Debianの場合、事前設定されたproftpd-mysqlパッケージが利用可能です。次のようなスタンドアロンデーモンとしてインストールします:
aptitude install proftpd-mod-mysql
次の質問があります:
proftpdを実行します:<-スタンドアロン
次に、すべての仮想ユーザーがマップされるftpグループ(ftpgroup)とユーザー(ftpuser)を作成します。グループIDとユーザーID2001を、システムで無料の番号に置き換えます。
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
4Proftpd用のMySQLデータベースを作成する
次に、ftpという名前のデータベースとproftpdという名前のMySQLユーザーを作成します。このユーザーは、後でproftpdデーモンがftpデータベースに接続するために使用します。
mysql -u root -p
CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
文字列passwordを、MySQLユーザーproftpdに使用するパスワードに置き換えます。引き続きMySQLシェルで、必要なデータベーステーブルを作成します。
USE ftp;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTP group table';
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL default '0',
files_in_avail int(10) unsigned NOT NULL default '0',
files_out_avail int(10) unsigned NOT NULL default '0',
files_xfer_avail int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM;
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTP user table';
quit;
お気づきかもしれませんが、やめます。コマンドMySQLシェルを終了し、Linuxシェルに戻りました。
ところで、(ftpサーバーシステムのホスト名はserver1.example.comであると想定しています)http://server1.example.com/phpmyadmin/でphpMyAdminにアクセスできます(server1の代わりにIPアドレスを使用できます。 example.com)をブラウザに表示し、proftpdとしてログインします。次に、データベースを確認できます。後で、phpMyAdminを使用してProftpdサーバーを管理できます。
5Proftpdを構成する
/etc/proftpd/modules.confを開きます...
vi /etc/proftpd/modules.conf
...そして次の3つのモジュールを有効にします:
[...] # Install proftpd-mod-mysql or proftpd-mod-pgsql to use this LoadModule mod_sql.c [...] # Install proftpd-mod-mysql to use this LoadModule mod_sql_mysql.c [...] # Install proftpd-mod-pgsql or proftpd-mod-mysql to use this LoadModule mod_quotatab_sql.c [...] |
次に、/ etc / proftpd/proftpd.confを開きます。クォータセクションをコメントアウトし、インクルード/etc/proftpd/sql.conf行のコメントを解除します:
vi /etc/proftpd/proftpd.conf
[...] #<IfModule mod_quotatab.c> #QuotaEngine off #</IfModule> [...] # # Alternative authentication frameworks # #Include /etc/proftpd/ldap.conf Include /etc/proftpd/sql.conf [...] |
次に、/ etc / proftpd / sql.confを開き、次のように表示します。
vi /etc/proftpd/sql.conf
# # Proftpd sample configuration for SQL-based authentication. # # (This is not to be used if you prefer a PAM-based SQL authentication) # <IfModule mod_sql.c> # # Choose a SQL backend among MySQL or PostgreSQL. # Both modules are loaded in default configuration, so you have to specify the backend # or comment out the unused module in /etc/proftpd/modules.conf. # Use 'mysql' or 'postgres' as possible values. # #SQLBackend mysql # #SQLEngine on #SQLAuthenticate on # # Use both a crypted or plaintext password #SQLAuthTypes Crypt Plaintext # # Use a backend-crypted or a crypted password #SQLAuthTypes Backend Crypt # # Connection #SQLConnectInfo [email protected] proftpd_user proftpd_password # # Describes both users/groups tables # #SQLUserInfo users userid passwd uid gid homedir shell #SQLGroupInfo groups groupname gid members # DefaultRoot ~ SQLBackend mysql # The passwords in MySQL are encrypted using CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # used to connect to the database # [email protected] database_user user_password SQLConnectInfo [email protected] proftpd password # Here we tell ProFTPd the names of the database columns in the "usertable" # we want it to interact with. Match the names with those in the db SQLUserInfo ftpuser userid passwd uid gid homedir shell # Here we tell ProFTPd the names of the database columns in the "grouptable" # we want it to interact with. Again the names match with those in the db SQLGroupInfo ftpgroup groupname gid members # set min UID and GID - otherwise these are 999 each SQLMinID 500 # create a user's home directory on demand if it doesn't exist CreateHome on # Update count every time user logs in SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Update modified everytime user uploads or deletes a file SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # User quotas # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off </IfModule> |
SQLConnectInfo!
の行で、文字列パスワードをMySQLユーザーproftpdの実際のパスワードに置き換えてください。次に、Proftpdを再起動します:
/etc/init.d/proftpd restart
6データベースにデータを入力してテストする
データベースにデータを入力するには、MySQLシェルを使用できます:
mysql -u root -p
USE ftp;
まず、テーブルftpgroupにエントリを作成します。これには、ステップ2の最後に作成したftpグループ/ユーザーのグループ名、グループID、およびユーザー名が含まれます(2001以外のグループIDを使用する場合は、グループIDを適切に置き換えてください)。
INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');
これで、テーブルftpgroupが完成しました。ここでさらにエントリを作成する必要はありません。新しい仮想ftpユーザーを作成するときはいつでも、テーブルftpquotalimitsおよびftpuserでこれを行います。それでは、15MBのクォータとパスワードシークレットを使用して最初のユーザーexampleuserを作成しましょう(まだMySQLシェルにいます):
INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quit;
(このチュートリアル以外の値を使用している場合は、最後のINSERTステートメントでgroud-およびuserid 2001を適切に置き換えることを忘れないでください!)
次に、ワークステーションでFTPクライアントプログラム(Windowsシステムの場合はWS_FTPやSmartFTP、Linuxデスクトップの場合はgFTPなど)を開いて、接続してみます。 server1.example.com(またはシステムのIPアドレス)を使用するホスト名として、ユーザー名はexampleuserであり、パスワードはシークレットです。
接続できれば-おめでとうございます!そうでない場合は、問題が発生しました。
さて、実行すると
ls -l /home/
ディレクトリ/home/www.example.com(exampleuserのホームディレクトリ)が自動的に作成され、ftpuserとftpgroup(ステップ2の最後に作成したユーザー/グループ)によって所有されていることがわかります。
>server1:~# ls -l /home/
total 12
drwxr-xr-x 2 administrator administrator 4096 2009-02-16 13:18 administrator
drwxr-xr-x 2 ftp nogroup 4096 2009-06-09 17:37 ftp
drwx------ 2 ftpuser ftpgroup 4096 2009-06-09 17:59 www.example.com
server1:~#
7データベース管理
ほとんどの人にとって、MySQLのグラフィカルなフロントエンドがあれば簡単です。したがって、phpMyAdmin(この例ではhttp://server1.example.com/phpmyadmin/の下)を使用してftpデータベースを管理することもできます。
新しいユーザーを作成するときはいつでも、ftpquotalimitsテーブルとftpuserテーブルにエントリを作成するだけでよいので、ここでこれらのテーブルの列について説明します。
ftpuserテーブル:
重要な列は次のとおりです(他の列はMySQLまたはProftpdによって自動的に処理されるため、手動で入力しないでください!):
- userid:仮想Proftpdユーザーの名前(例:exampleuser)。
- passwd:ユーザーの暗号化されていない(つまり、クリアテキストの)パスワード。
- uid:ステップ2の最後に作成したftpユーザーのユーザーID(例:2001)。
- gid:ステップ2の最後に作成したftpグループのグループID(例:2001)。
- homedir:仮想Proftpdユーザーのホームディレクトリ(例:/home/www.example.com)。存在しない場合は、新しいユーザーがFTP経由で初めてログインしたときに作成されます。仮想ユーザーはこのホームディレクトリに投獄されます。つまり、ホームディレクトリ外の他のディレクトリにアクセスすることはできません。
- shell:デフォルトで/ sbin/nologinをここに入力しても問題ありません。
ftpquotalimitsテーブル:
重要な列は次のとおりです(他の列はMySQLまたはProftpdによって自動的に処理されるため、手動で入力しないでください!):
- name:仮想Proftpdユーザーの名前(例:exampleuser)。
- quote_type:ユーザーまたはグループ。通常、ここではユーザーを使用します。
- per_session:trueまたはfalse。 trueは、クォータ制限がセッションに対してのみ有効であることを意味します。たとえば、ユーザーに15 MBの割り当てがあり、現在のセッション中に15 MBをアップロードした場合、それ以上アップロードすることはできません。ただし、ログアウトして再度ログインすると、15MBが使用可能になります。 falseは、ユーザーがログアウトして再度ログインするかどうかに関係なく、ユーザーが15MBを持っていることを意味します。
- limit_type:ハードまたはソフト。ハードクォータ制限は決して超えられない制限ですが、ソフトクォータは一時的に超過する可能性があります。通常、ここではハードに使用します。
- bytes_in_avail:アップロード制限(バイト単位)(例:15 MBの場合は15728640)。 0は無制限を意味します。
- bytes_out_avail:ダウンロード制限(バイト単位)。 0は無制限を意味します。
- bytes_xfer_avail:転送制限(バイト単位)。ユーザーが実行できるアップロードとダウンロードの合計。 0は無制限を意味します。
- files_in_avail:ファイルのアップロード制限。 0は無制限を意味します。
- files_out_avail:ファイルのダウンロード制限。 0は無制限を意味します。
- files_xfer_avail:ファイルの転送制限。 0は無制限を意味します。
ftpquotatalliesテーブルはProftpdによって内部的に使用され、クォータを管理するため、そこにエントリを作成する必要はありません!
8匿名FTP
匿名のftpアカウント(誰もがパスワードなしでログインできるftpアカウント)を作成する場合は、次のように実行できます。
まず、anonymous_ftpという名前のユーザーとグループを作成します。ユーザーはホームディレクトリ/home/ anonymous_ftp:
を持っていますgroupadd -g 2002 anonymous_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c "Anonymous FTP User" -g anonymous_ftp anonymous_ftp
(2002を、システム上で無料のグループ/ユーザーIDに置き換えます。)
次に、匿名ユーザーがファイルをアップロードできるようにするディレクトリ/ home / analogmous_ftp/incomingを作成します。
mkdir /home/anonymous_ftp/incoming
chown anonymous_ftp:nogroup /home/anonymous_ftp/incoming
最後に、/ etc / proftpd / proftpd.confを開き、次のディレクティブを追加します。
vi /etc/proftpd/proftpd.conf
[...] <Anonymous ~anonymous_ftp> User anonymous_ftp Group nogroup # We want clients to be able to login with "anonymous" as well as "ftp" UserAlias anonymous anonymous_ftp # Cosmetic changes, all files belongs to ftp user DirFakeUser on anonymous_ftp DirFakeGroup on anonymous_ftp RequireValidShell off # Limit the maximum number of anonymous logins MaxClients 10 # We want 'welcome.msg' displayed at login, and '.message' displayed # in each newly chdired directory. DisplayLogin welcome.msg DisplayChdir .message # Limit WRITE everywhere in the anonymous chroot <Directory *> <Limit WRITE> DenyAll </Limit> </Directory> # Uncomment this if you're brave. <Directory incoming> # Umask 022 is a good standard umask to prevent new files and dirs # (second parm) from being group and world writable. Umask 022 022 <Limit READ WRITE> DenyAll </Limit> <Limit STOR> AllowAll </Limit> </Directory> </Anonymous> |
最後にProftpdを再起動します:
/etc/init.d/proftpd restart
これで、匿名ユーザーはログインでき、/ home / analogmous_ftpからファイルをダウンロードできますが、アップロードは/ home / analogmous_ftp / incomingに制限されます(ファイルが/ home / analogmous_ftp / incomingにアップロードされると、ファイルを読み取ったりダウンロードしたりすることはできません。そこで、サーバー管理者は最初に/ home / anonymous_ftpに移動して、他のユーザーが利用できるようにする必要があります。
(注意:IPアドレスごとに匿名のftpアカウントを1つだけ持つことができます!)
9つの参照
Mandrake 10.1-Proftpd + MySQL認証+クォータハウツー:http://www.khoosys.net/single.htm?ipg =848
10リンク
- Proftpd:http://www.proftpd.org
- MySQL:http://www.mysql.com
- phpMyAdmin:http://www.phpmyadmin.net
- Debian:http://www.debian.org