// you’re reading...

FreeBSD

[教學] ProFTPD + MySQL

經過許多次的 Try & Error 終於把 ProFTPD + MySQL 架設完畢,在這邊就來做個簡單的紀錄及說明,好讓各位也能輕鬆的使 ProFTPD + MySQL 能正常的 WORK。

過多的廢話在這就不多說了,先簡單的介紹一下我所使用的環境和軟體。

Step 1. 進行安裝 ProFTPD 和 MySQL

用 FreeBSD 的 ports 來進行安裝其實是很容易的。

1
# cd /usr/ports/ftp/proftpd-mysql && make install clean

不過在這邊有一點需注意,如果你跟我一樣已經把 FreeBSD 改成 UTF-8 環境的話,在安裝 ProFTPD 時,別忘了也要安裝 mod_nls,不然可是會發生很多狀況。

Step 2. 於 MySQL 建立相關資料庫和表格

在這段開始前先提醒不熟悉 SQL 的人,如果不清楚下面的指令在做些什麼,我想你有兩個選擇。第一是使用圖形化介面來達成該目的,例:phpmyadmin、MySQL GUI Tools … 等。第二個選擇則是照本宣科的做就行了,至於要選哪個就看你自己的程度嚕。

2.1. 建立使用者帳號和對應的資料庫
1
2
3
4
mysql -u root -p
CREATE DATABASE FTPDB;
GRANT SELECT, INSERT, UPDATE, DELETE ON FTPDB.* TO 'ProFTPD'@'localhost' IDENTIFIED BY 'passwd';
FLUSH PRIVILEGES;

其中 FTPDB 為資料庫的名稱,ProFTPD 為使用該資料庫的使用者,而 passwd 則為該使用者的密碼,這邊所提的部份都可以依據需求來做更動。

2.2 建立對應的資料表

這個資料表是建立 FTP 的群組,主的依據是參照 ProFTPD 的 SQLGroupInfo 這個參數,沒有特殊需求的話就照預設的做吧。

1
2
3
4
5
6
7
CREATE TABLE FTP_Group (
ID int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
GroupName varchar(16) NOT NULL DEFAULT '',
GID smallint(6) NOT NULL DEFAULT '5000',
Members varchar(16) NOT NULL DEFAULT '',
PRIMARY KEY (ID)
) TYPE=MyISAM COMMENT='ProFTPD Group Table';

而這個則是建立 FTP 使用者的資料表,一樣是參照 SQLUserInfo 這個參數。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE FTP_User (
ID int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
Name varchar(16) NOT NULL DEFAULT '',
Passwd varchar(32) NOT NULL DEFAULT '',
UID smallint(6) NOT NULL DEFAULT '5000',
GID smallint(6) NOT NULL DEFAULT '5000',
Home varchar(255) NOT NULL DEFAULT '/home/FTP',
Shell varchar(16) NOT NULL DEFAULT '/sbin/nologin',
Count int(11) NOT NULL DEFAULT '0',
Address varchar(16) NOT NULL DEFAULT '',
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 Name (Name)
) TYPE=MyISAM COMMENT='ProFTPD User Table';

這邊主要是以我建置的實際狀況下撰寫出來的東西,所以需求可能會跟你們有些出入,如果有額外的需求其實是可以再做調整的。

Step 3. 進行 ProFTPD 的設定

由 ports 安裝的 ProFTPD ,其預設的設定檔會放在 /usr/local/etc/proftpd.conf 。開始編輯前,別忘了先複製一份當原始設定參考喔!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 沒設 off 的話,使用者將會無法登入進來,因為他們
# 的 Shell 都是設定為 /sbin/nologin
RequireValidShell off
 
# 接下就是 MySQL 的部份,ProFTPD 還有許多設定,
# 但在這我希望能專注於 MySQL 這塊,所以就不多加贅述。
 
# 告知 ProFTPD 以 MySQL 為首要認證機制
SQLBackend mysql
 
# 登入密碼所使用的 Type。 Backend 是使用 MySQL PASSWORD() 來做加密
# Plaintext 為不加密,Crypt 為 Unix 的 crypt() 加密。詳盡的部份可以再參考
# ProFTPD 的說明文件。
SQLAuthTypes Crypt Backend Plaintext
SQLAuthenticate on
 
# MySQL 連線資訊,資料庫名稱@主機 帳號 密碼
SQLConnectInfo <a href="mailto:ProFTPD@localhost">ProFTPD@localhost</a> FTPDB passwd
 
# 使用者和群組資料表欄位
SQLUserInfo FTP_User Name Passwd UID GID Home Shell
SQLGroupInfo FTP_Group Name GID Members
 
# SQL Log 檔,這算比較選擇性的參數。不過我都留著來檢查 SQL 有沒有發生
# 什麼問題,主要是用在 debug 上面。
SQLLogFile /var/log/proftpd/sql.log
 
# SQL Log 格式,當正確登入時,要執行的 SQL 語法
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "Count=Count+1, Address='%h', Accessed=now() where Name='%u'" FTP_User
 
# SQL Log 格式,當儲存或刪除檔案時,要執行的 SQL 語法
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "Modified=now() where Name='%u'" FTP_User

另外在這邊簡單解釋一下 SQLLogSQLNamedQuery 的運作方式。

SQLLog

SQLLog 的撰寫方式如下,它和 SQLNamedQuery 的關係很密切,就好比是 IF ELSE。要符合 SQLLog 的條件,SQLNamedQuery 才會啟動。

1
SQLLog 條件,[條件] 查詢名稱
SQLNamedQuery

SQLNamedQuery 如果名稱一般,就是負責執行一些 Query 的語法。已讀過文件的人,可能覺得那三個預設的查詢動作似乎有點陽春。不過 ProFTPD 也有發現到這一點,所以 FREEFORM 便因此而誕生啦!至於詳細用法與參數,在這還是希望能自行參閱說明文件。

1
2
SQLNamedQuery 查詢名稱 [INSERT | UPDATE | SELECT] 查詢語句 [資料表名]
SQLNamedQuery 查詢名稱 FREEFORM 查詢語句

設定完之後,只要重新啟動 ProFTPD 就可以成功啦!

雖然感覺都東西很多,但其實都很簡單,就只是過程瑣碎了一些。這邊只是提供一個簡單又確定可以成功的方式給大家知道,此外如果有發現錯誤的地方,也希望各位不吝賜教,謝謝。

Discussion

One comment for “[教學] ProFTPD + MySQL”

  1. [...] [教學] ProFTPD + MySQL 這篇所提到的東西外,我還重新設計了一下資料的資料表,打算利用 MySQL [...]

    Posted by 螺絲起子〔screwdriver〕 » » FTP 功能規劃表 | March 7, 2008, 3:18 pm

Post a comment