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.c

proftpd-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の簡単な説明は以下の通りです:
  1. ここでAuthOrderをmod_sql.cに設定し、mod_sqlを有効にします。
  2. プレーンテキストパスワードを使用することを選択しました。パスワードを割り当てない場合は、空のパスワードを許可します。(後でデータベース内のパスワードをSHA1にするトリガーを実装します。)
  3. 次にSQLAuthenticateをusersに設定しました。このプロジェクトではグループを使用しないことにしました。グループが必要な場合は、こちらのウェブサイトでグループに関する情報を見つけることができます。
  4. SQLConnectInfoは「database@host user password」の形式のDSNです。
  5. SQLDefaultUID、SQLDefaultGID、SQLDefaultHomedirはデフォルトを設定し、ほとんどの列をNULLのままにします。これをオーバーライドすることはほとんどありません。
  6. RequireValidShellもオフに設定されています。これをオンに設定し、無効なシェルを与えると、認証に失敗します。
  7. SQLUserInfoはPostgresのテーブルに対応しており、リテラルマッピングです。再度「ftp.」は認証テーブルのスキーマを指定します。
  8. SQLNegativeCacheは認証失敗をキャッシュします。
  9. SQLLogFileはサーバーの構成中に詳細なログを記録します。運用時には無効にします。
  10. SQLLogは、どのFTPアクションをログに記録したいかを指定します。私のユーザーはアップロードのみができるため、STORのみをログに記録します。形式は「ftpaction query_to_execute」です。
  11. 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スクリプトは、前のスクリプトと同じ方法でインストールできます。(テーブルを作成するために使用したもの)

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。