Geek-Side

このエントリーをはてなブックマークに追加  

2004/08/19

ProFTPDとPostgresqlの連携

ProFTPDとPostgresqlを連携する事により、FTPに接続するユーザーとパスワードをデータベースで
管理する事ができます。後々ユーザー管理用のWebアプリを作り、管理を簡単にすることができます。
FTPの用途としては、コンテンツ管理を主な目的としているので、anonymous FTPは許可しない
設定とします。

ProFTPDの再インストール

ProFTPDインストール時にUSEフラグに"postgres"が有効になっていなかった場合はProFTPDを
再インストールする必要があります。
$ emerge  -C net-ftp/proftpd
$ USE="postgres" emerge  net-ftp/proftpd

インストールされたProFTPのバージョンは1.2.9-r2 でした。

mod_sqlの設定

ここで、FTPサーバーの使用条件を以下の様に設定します。
  • anonymous FTPは使用しない。
  • FTPサーバーを用いて公開する領域は1つ(/home/ftp/)のみとする。

ProFTPdの認証をPostgreSQLと連携して行うために、PostgreSQL側の準備をします。
mod_sqlはグループを使用する等、細かな設定ができますが、ここでは最低限のテーブルと
カラムを作成します。テーブル ftp_userは以下の2つのカラムから成ります。

テーブル:ftp_user
user_id passwd
接続時のユーザー名を記録します。 接続時のパスワードを記録します。
パスワードは暗号化して記録します。
以下のSQL文でテーブルを作成します。
create table ftp_user (
user_id varchar(20) NOT NULL,
passwd varchar(20) NOT NULL
);

今回mod_sqlでは、nobodyユーザーでPostgreSQLに接続するよう設定します。
このため、nobodyユーザーの作成と、ftp_userテーブルのSELECT権限の
追加を行います。

$ createuser nobody
以下のSQL文で権限の追加を行います。
grant select on ftp_user to nobody;
設定ファイルの内容は下記の通りです。
#接続時に表示される文字
ServerName          "ProFTPD Default Installation"

#proftpdのプロセスを立ち上げっぱなしにする場合はstandalone
#inetd 経由で立ち上げる場合は inetd
ServerType          standalone

DefaultServer       on

#ServerTypeにstandaloneを指定している時に、proftpdが使用するポート
#を指定します。デフォルトのままでよいでしょう。
Port                21

# 新しく作成されたファイルやディレクトリのパーミッションを指定します。
Umask               022

#ServerTypeにstandaloneを指定している時の最大クライアント接続数
MaxInstances        30

# ProFTPDを動作させるユーザーとグループを指定します。
User                nobody
Group               nogroup

#ファイルへの上書きを許可します。
<Directory />
  AllowOverwrite     on
</Directory>

#ホームディレクトリより上の階層へ移動できない
DefaultRoot      ~


#ユーザーテーブルでの認証を行う
SQLAuthenticate users

#パスワードにCRYPT方式の暗号化を使用する
SQLAuthTypes Crypt

#PostgreSQLへの接続情報
SQLConnectInfo hoge@localhost:5432 nobody

#mod_sqlのログ出力先
SQLLogFile      /var/log/proftpd

#ユーザーテーブルのテーブル名とカラム名
SQLUserInfo     d_user user_id passwd Null Null Null Null

#デフォルトのUID
SQLDefaultUID   21

#デフォルトのGID
SQLDefaultGID   21

#デフォルトのホームディレクトリ
SQLDefaultHomedir "/home/ftp/"

#有効なシェルを設定しなくてよくなります
RequireValidShell off

SQLConnectInfo hoge@localhost:5432 nobody
PostgreSQLへの接続情報を記述しています。例では以下のように指定されています。
データベース名  :hoge
接続先          :localhostのポート5432
ユーザー名      :nobody
パスワード      :なし
パスワードはユーザー名の後にスペースを空けて記述しますが、設定ファイルに
パスワードを記録されるのが嫌なので、パスワードなしで接続するようにしました。
変わりにnobodyユーザーには最低限の権限しか与えないようにします。

SQLUserInfo ftp_user user_id passwd Null Null Null Null
ユーザー情報が記録されるテーブルおよびカラム名を記述します。構文は以下の様になります。

SQLUserInfo users userid passwd uid gid homedir shell

users    :ユーザーテーブル名
userid  :ユーザーIDカラム名
passwd   :パスワードカラム名
uid      :UIDカラム名
gid      :GIDカラム名 
homedir  :ホームディレクトリカラム名
shell    :シェルカラム名

例ではテーブル名をftp_user、ユーザーIDが記録されているカラムをuser_id、
パスワードが記録されているカラムをpasswdとし、他のカラムは使用しないので
NULLとしています。

設定完了後、proFTPdを起動してください。
/etc/init.d/proftpd start

暗号化パスワードの生成

今回の設定ではパスワードとしてCRYPT方式の暗号化を使用するようにしました。
そこでCRYPT方式の暗号化パスワードを生成する方法を説明します。
暗号化するパスワードを hogehoge とすると、
$ perl -e 'print crypt("hogehoge", "xx");'
とすると、暗号化されたパスワードが生成されます。"xx"の部分は自由に英数字2文字を
設定します。
Index
ProFTPDのインストールと基本設定
ProFTPDとPostgresqlの連携

このエントリーをはてなブックマークに追加   ツイート