pam-mysqlを使って仮想FTPサーバを構築する

 バックエンドにデータベースを持つ仮想FTP(File Transfer Protocol)サーバを構築することには多くの利点がある。例えばデータベースを使用することによって大量のユーザ情報を一箇所にまとめて保存することができるので管理が楽になる。また仮想サーバのユーザはFTPサーバのリソースのみにアクセスすることが可能でOSのリソースにはアクセスできないため、従来のUnix OSのユーザ認証方法よりもセキュリティを高めることもできる。さらにバックエンドのデータベースを簡単にインストール/設定/管理するための数多くのウェブツールを利用することもできる。また仮想FTPサーバはFTP自体がサポートしていない「@」を含むいくつかの特殊文字もサポートするので、例えば社員の電子メールアドレスをユーザ認証に使用する場合などに便利だ。

 pam-mysqlは広く利用されているPAM(Pluggable Authentication Modules)モジュールで、MySQLデータベースを使ってユーザ認証を行うことができる。vsftpdにはMySQLサポートが組み込まれていないのでpam-mysqlを利用する必要がある。以下では、pam-mysqlを使って仮想FTPサーバを構築する方法を紹介する(今回は例としてpam-mysql-0.5-1.i586.rpmを使用した)。必要なのは、Linuxディストリビューション、ウェブサーバ、FTPサーバ、MySQLクライアント/サーバ、PHP、php-mysql(PHPにMySQLのサポートを追加する)だ。

 今回、LinuxディストリビューションにはRed HatクローンのCentOS 4を使用した。その他にはApache 2.0MySQL 4.1PHP 4.3.9php-mysql 4.3.9vsftpd 2.0の各プログラムを、MySQLの管理プログラムにはMySQL-Admin(mysql-admin_3_4_0_full.zip)を使用した。MySQL-Adminは操作が簡単であるうえ、データ/テーブル構造/テーブルの編集機能やコンテンツのインポート/エクスポートを行うことができる機能など、幅広い機能を提供している。

インストールと設定

 CentOSのインストールとパッケージのインストールは簡単だ。インストールが完了したらルートユーザとしてログインして、コマンドラインで「rpm -ivh pam_mysql-0.5-1.i586.rpm」を実行してpam-mysqlをインストールする。MySQL-Adminを利用するためには、圧縮されたアーカイブを展開して、デフォルトのウェブページ置き場である/var/www/htmlにすべてのコンテンツをコピーすれば良い。なおMySQL-AdminはPHPプログラムなので、実行/解釈するためにはApacheとPHPを利用できるようにしておく必要がある。

 Apache、vsftpd、MySQLの各サービスは、仮想FTPサーバの設定を始める前に起動しておく必要がある。各サービスの起動と、毎日確実に起動するための設定には、ルートとして以下のコマンドを実行する。

# service (httpd | vsftpd | mysqld) start
# chkconfig --levels 2345 (httpd | vsftpd | mysqld) on

 それでは「mysql」コマンドをオプションなしで実行してMySQLサーバにアクセスしよう。なおデフォルトではルートユーザのパスワードはない。次に以下のようなSQL文を実行して、データベースとテーブルを作成する。

mysql> create database vsftpd;
mysql> use vsftpd;
mysql> create table users
-> id int AUTO_INCREMENT NOT NULL,
-> name char(128) binary NOT NULL,
-> passwd char(128) binary NOT NULL,
-> primary key(id)
-> );
mysql> create table logs (msg varchar(255),
-> user char(128),
-> pid int,
-> host char(128),
-> rhost char(128),
-> logtime timestamp
-> );

 以上でFTPサーバ用のvsftpdデータベースを作成することができた。このデータベースには、FTPユーザを保存するための「users」テーブルとログイン関連の情報を記録するための「logs」テーブルという2つのテーブルがある。それでは次にusersテーブルにユーザを挿入しよう。以下に例を示す。

mysql>insert into users (name,passwd) values('tom@cn.oracle.com',password('foo'));
mysql> insert into users (name,passwd) values('jerry@us.sun.com',password('bar'));
mysql> select * from users;
+----+-------+-------------------------------------------+
| id | name | passwd |
+----+-------+-------------------------------------------+
| 1 | tom@cn.oracle.com | *F3A2A51A9B0F2BE2468926B4132313728C250DBF |
| 2 | jerry@us.sun.com | *E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB |
+----+-------+-------------------------------------------+

 上記から分かるように、fooという暗号化パスワードを持つtom@cn.oracle.comと、barという暗号化パスワードを持つjerry@us.sun.comという2人のユーザをusersテーブルに挿入した。デフォルトではルートユーザのパスワードはないのだが、パスワードを持たないままのデータベースは脆弱なので、パスワードを作成する必要がある。以下のようなコマンドを実行すればパスワードを設定することができる。

mysql>grant all on *.* to root@localhost Identified by "password";

 MySQLの設定が完了したら、次はvsftpdのPAM認証用の設定ファイルである/etc/pam.d/vsftpdを設定しよう。以下のような内容を/etc/pam.d/vsftpdに追加する。

auth required /lib/security/pam_mysql.so user=root passwd=1wdv5rdxcvb host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime
account required /lib/security/pam_mysql.so user=root passwd=password host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime

 pam-mysql PAMモジュールの主なパラメータは次の通りだ。

  • host:MySQLデータベースサーバのIPアドレスまたはホスト名。上の例では「localhost」になっているが、これはvsftpdと同じサーバ上にあることを意味する。
  • db:vsftpdサーバのユーザ情報を保存しているデータベース名。例では「vsftpd」となっている。
  • user:vsftpdユーザデータベースにアクセスすることができるユーザ。例では「root」ユーザになっている。
  • passwd:vsftpdデータベースのパスワード。
  • table:vsftpdのユーザ情報を保存しているテーブル名。例では「users」になっている。

 MySQL-Adminは、シンプルで設定も簡単な、PHPベースのMySQLデータベース用管理ツールだ。設定は、サーバのURL(例ではhttp://localhost)をウェブブラウザで閲覧して、ブラウザに表示される指示に従って各ステップを完了すれば良いだけだ。それが完了すれば、http://localhostにアクセスすればMySQLデータベースサーバにログインすることができるようになる。ログインすれば、必要に応じてユーザの挿入/削除/更新などの操作をすることができる。

 「service vsftpd start」を実行すると、仮想FTPサーバが使用可能になる。仮想FTPサーバを停止/再起動したい場合には「service vsftpd (stop|restart)」を実行する。他のFTPサーバの場合と同様に、ユーザは好きなFTPクライアントを使用してサーバにアクセスすることができる。

 以上で、FTPユーザのユーザ情報をMySQLデータベースに一元的に保存できるようになった。FTPユーザを削除したり更新したり一時的に無効にしたりすることも、/etc/passwdに触れることなく簡単に行うことができるようになった。またFTPサーバのユーザ名として電子メールアドレスを使えば、どのユーザが何をダウンロードしたのかを簡単に追跡することができるようになる。これは大企業の管理者などにとっては便利かもしれない。

Linux.com 原文