PostgreSQL · 2 min read · Dec 17, 2025
PostgreSQLとProftpd
FTPサーバーをセットアップしたい、先進的な機能が必要で、どこに向かえばよいかわからない? proftpdを試してみてください。
パート1: PostgreSQLバックエンドを使用したproftpdの設定
このチュートリアルは非常にニッチです。私はproftpdのみを扱い、Postgresで動作させるための範囲に限定します。proftpdとPostgresの基本的な理解があることを前提としています。このチュートリアルでは、proftpdを非常に迅速に立ち上げ、データベースを利用する方法を説明します。このデータベースにトリガーがある場合、この構成の可能性はほぼ無限です。
Proftpdの入手
まず、proftpdが必要です。私はUbuntuのDapperを使用します。Francesco Paolo Lovergineによって準備されたメタパッケージ「proftpd-pgsql」があり、これにより次のモジュールでコンパイルされたproftpdのコピーがセットアップされます。余談ですが、proftpdにはモジュールが付属していますが、confファイルは標準のproftpdの雛形です。mod_sqlのドキュメントを確認することを強くお勧めします。これはあまり良くありませんが、便利です – proftpdサイトのドキュメントは非常に古いので、こちらを代わりに使用してください: ドキュメントへのリンク。また、バージョンに注意してください。proftpdは現在1.3ですが、私は1.2.10を使用します – Dapperで使用されているバージョンです。
このバージョンのproftpdにコンパイルされているモジュールは次のとおりです。
mod_core.c
mod_xfer.c
mod_auth_unix.c
mod_auth_file.c
mod_auth.c
mod_ls.c
mod_log.c
mod_site.c
mod_auth_pam.c
mod_quotatab.c
mod_sql.c
mod_sql_postgres.c
mod_quotatab_sql.c
mod_ratio.c
mod_tls.c
mod_rewrite.c
mod_radius.c
mod_wrap.c
mod_quotatab_file.c
mod_delay.c
mod_readme.c
mod_ifsession.c
mod_cap.cproftpd-pgsqlを取得するためのコマンドを実行してください:
apt-get install proftpd-pgsqlパーミッションの設定
私の目的のために、(覚えておいてください、私は宇宙の中心です)必要だったのは1次元の構造だけでした。なぜなら、グループはUnixのパーミッションとは異なるレベルに保存されるからです。したがって、すべてのファイルは静的なパーミッションで来るべきです – 私は所有者と所有者のグループだけを気にしています。私の計画は、proftpdのデフォルトユーザーftpを、私が作成する適切に名付けられたグループ「ftp」に所属させることでした。その後、Postgresをこのグループのメンバーにするつもりでした。理由についてはパート2を参照してください。同じグループのメンバーである必要があり、proftpdのchrootフォルダーを775に設定する必要がありました。これにより、グループ全体がファイルを追加(移動)できるようになります。また、フォルダーはユーザー「ftp」が所有し、グループ「ftp」に設定しました。これを次のスクリプトで達成しました。
groupadd ftp
usermod -G ftp ftp
usermod -G ftp,postgres postgres
chown ftp:ftp ./ftp_directory/
chmod 775 ./ftp_directory/Postgresの設定
次に、SQLテーブルを準備します。私はスキーマを利用して設計しており、テーブルのプレフィックス「ftp.」はそのためのものです。すべてのテーブルをftpスキーマに配置しました。注意すべきことが1つあります。このプロジェクトでは、mod_sqlがどれほど安全か分からないため、パーミッションを非常に制限しています。このため、データベース内のproftpd用に特別なユーザー「proftp」を作成しました(これはproftpdよりも多くのアプリケーションで利用されます)。このユーザーはauth_tableに対する選択とfile_logテーブルへの挿入に制限されています。このポリシーの何らかの形を採用することを強くお勧めします。少なくとも、これはmod_sqlコードが私たちが考えるほど安全でない場合に、ある程度の壊滅的なSQLインジェクション攻撃や情報漏洩を防ぎます。Googleで調べると、mod_sqlコードベースに以前のセキュリティ問題があったことがわかります。mod_sqlがデータベースに送信する各クエリには「LIMIT 1」句が追加され、mod_delayもデフォルトで構成されているため、私はこのプロジェクトには十分だと考えています。
私のSQL初期化スクリプトは次のとおりです。
ALTER USER proftp UNENCRYPTED PASSWORD 'dealermadeftp';
CREATE SCHEMA ftp;
GRANT USAGE ON SCHEMA ftp TO proftp;
CREATE TABLE ftp.users (
pkid serial PRIMARY KEY,
userid text NOT NULL UNIQUE,
passwd text,
uid int,
gid int,
homedir text,
shell text
);
GRANT SELECT ON ftp.users TO proftp;
INSERT INTO ftp.users ( userid, passwd ) VALUES ( 'ecarroll', 'adm1n' );
INSERT INTO ftp.users ( userid, passwd ) VALUES ( 'jgallagher', 'adm1n' );
CREATE TABLE ftp.file_log (
pkid serial PRIMARY KEY,
userid text REFERENCES ftp.users(userid),
abs_path text,
file text,
dns text,
time_transaction text,
ts_in timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP
);
GRANT INSERT ON ftp.file_log TO proftp;
GRANT UPDATE ON TABLE ftp.file_log_pkid_seq TO proftp;データベースに接続し、次のコマンドを実行します:
\i script_nameまたは、コマンドライン引数として--file script_nameをpsqlに送信できます。
このチュートリアルをmysqlで使用している場合、テキストをvarcharに置き換えたいかもしれませんが、Postgresの設計上、これには利点がありません。
proftpdの設定
この部分は難しく、1.3を使用している場合はわずかに異なります – このチュートリアルは1.2.10用です。
私は/etc/proftpd.confにあるデフォルトのproftpd雛形confにこの部分を追加しました:
AuthOrder mod_sql.c
SQLAuthTypes Plaintext Empty
SQLAuthenticate users
SQLConnectInfo proftpd@localhost proftp dealermadeftp
SQLDefaultUID 110 # /etc/passwdで見つかるFTPユーザーのUIDに変更
SQLDefaultGID 1001 # /etc/groupsで見つかるFTPユーザーのGIDに変更
SQLDefaultHomedir /home/ftp
RequireValidShell off
SQLUserInfo ftp.users userid passwd uid gid homedir shell
SQLNegativeCache off
SQLLogFile /var/log/proftpd-sql
SQLLog STOR newfile
SQLNamedQuery newfile FREEFORM "INSERT INTO ftp.file_log(userid,abs_path,file,dns,time_transaction) VALUES ('%U','%f','%J','%V','%T')"
# %U => userid
# %D => --何もなし,
# %f => abs_path
# %J => file
# %h => dns_remote, %V => dns_local
# %a => remote_ip, %L => local_ip
# %t => localtime
# %T => transfer_time- テンプレート変数はコメントアウトされており、あなた自身の参考のためのものです。confの簡単な説明は以下の通りです:
- ここでAuthOrderをmod_sql.cに設定し、mod_sqlを有効にします。
- プレーンテキストパスワードを使用することを選択しました。パスワードを割り当てない場合は、空のパスワードを許可します。(後でデータベース内のパスワードをSHA1にするトリガーを実装します。)
- 次にSQLAuthenticateをusersに設定しました。このプロジェクトではグループを使用しないことにしました。グループが必要な場合は、こちらのウェブサイトでグループに関する情報を見つけることができます。
- SQLConnectInfoは「database@host user password」の形式のDSNです。
- SQLDefaultUID、SQLDefaultGID、SQLDefaultHomedirはデフォルトを設定し、ほとんどの列をNULLのままにします。これをオーバーライドすることはほとんどありません。
- RequireValidShellもオフに設定されています。これをオンに設定し、無効なシェルを与えると、認証に失敗します。
- SQLUserInfoはPostgresのテーブルに対応しており、リテラルマッピングです。再度「ftp.」は認証テーブルのスキーマを指定します。
- SQLNegativeCacheは認証失敗をキャッシュします。
- SQLLogFileはサーバーの構成中に詳細なログを記録します。運用時には無効にします。
- SQLLogは、どのFTPアクションをログに記録したいかを指定します。私のユーザーはアップロードのみができるため、STORのみをログに記録します。形式は「ftpaction query_to_execute」です。
- SQLNamedQueryは、より良い説明のためにドキュメントで構文を確認してください。私が使用する形式は「qryname FREEFORM custom_query_here」です。これは、proftpdのテンプレート変数を多くキャプチャしたいからです。他にももっとシンプルな構文があります。
それで終わりです。すべてが計画通りに進めば、あなたは稼働しているはずです。今、誰かがファイルをアップロードすると、次のような結果が得られるはずです:
proftpd=# select * from ftp.file_log;
pkid | userid | abs_path | file | dns | time_transaction | ts_in
------+----------+------------------------+---------------+-------+------------------+-------------------------------
1 | ecarroll | /home/ftp/foo/testfile | /foo/testfile | AMD64 | 0.000 | 2006-06-11 20:49:12.623375-05
(1 row)パートII: 「動作する」以上
…しかし、動作するだけでは十分ではありませんよね? 次に、proftpdの設定FAQに掲載されている次の質問に答えましょう: アップロード後にアップロードディレクトリからファイルを回転させることはできますか?
その答えは、もちろんできます。私はストアドプロシージャを通じてこれを実現します。これにより、ファイルが正しい方法で移動されます – オンザフライで – デーモンなしで。
まず、システムにuntrusted plperluをインストールする必要があります。これは次のコマンドで実行できます。
apt-get install postgresql-plperl-8.1次に、データベースにplperluをインストールする必要があります。
createlang plperlu your_database_here次に、ftp_logテーブルへの各挿入時にヒットするクイックPerlスクリプトトリガーを作成する必要があります。
CREATE OR REPLACE FUNCTION ftp_file() RETURNS TRIGGER AS $$
use warnings;
use Cwd;
use File::Basename;
use File::Spec;
use File::Copy;
move (
$_TD->{new}{abs_path},
File::Spec->catfile( '/home/ftp/', basename($_TD->{new}{file}) )
);
return;
$$ LANGUAGE 'plperlu' VOLATILE;
CREATE TRIGGER ftp_file
BEFORE INSERT
ON ftp.file_log
FOR EACH ROW
EXECUTE PROCEDURE ftp_file()
;このSQLスクリプトは、前のスクリプトと同じ方法でインストールできます。(テーブルを作成するために使用したもの)
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。