筍子工作雜記

十一月 18, 2009

Proftpd 支援 UTF-8 + MYSQL 虛擬帳號 + Quota 限制

Filed under: FreeBSD,ftp,Services — 標籤:, , , , — shinnlu @ 11:20 下午

原文參考:[FreeBSD & Linux Ubuntu] Proftpd 支援 UTF-8 + MYSQL 虛擬帳號 + Quota 限制
原始文章中有一些錯誤,我會在內文中更正這些錯誤

安裝之前準備工作
[cc lang="c"]portsnap fetch && portsnap update
Mysql 要先安裝好[/cc]

安裝時才不會安裝到不支援 UTF8 的舊版本,本次安裝為 proftpd-1.3.2b
實驗環境:
FreeBSD 7.2-Release
proftpd 1.3.2b

安裝方式
cd /usr/ports/ftp/proftpd-mysql
make install clean

選擇
NLS
Quota
Mysql
Ratio

建立資料庫

CREATE DATABASE `ftp` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

建立使用者資料表,這個資料表是紀錄使用者的所有資料

# username 使用者帳號
# uid 系統的 uid 這個可以自己隨便給個數字,不要重複到系統帳號
# gid 系統的 gid 這個看你用途是什麼來去對應
# password 使用者密碼
# homedir 使用者家目錄
# shell 使用者的 shell 最好是填 /sbin/nologin
# accessed 使用者最後登入的時間
# count 登入次數
#這個部份增加了兩個欄位 accessed, count ,因為使用者登入時,會執行 updatecount 的SQL語法,但沒有這兩個欄位,會寫不進去
#其實還少了 modified 欄位,但是我想不出來儲存這個欄位有什麼用途,所以不修正

DROP TABLE IF EXISTS `ftp`;
CREATE TABLE IF NOT EXISTS `ftp` (
`username` varchar(60) default NULL,
`uid` int(11) NOT NULL,
`gid` int(11) default NULL,
`password` varchar(30) default NULL,
`homedir` varchar(60) default NULL,
`shell` varchar(32) default ‘/usr/bin/nologin’,
`accessed` datetime NOT NULL,
`count` int(11) NOT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

接下來建立 group 資料表

# groupname 群組帳號
# gid 系統的 gid 這個對應到系統 /etc/group 的 gid 值,也可以不用,看你怎麼用
# members 這個群組的成員

CREATE TABLE IF NOT EXISTS `groups` (
`groupname` varchar(30) NOT NULL DEFAULT “,
`gid` int(11) NOT NULL DEFAULT ’0′,
`members` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

members 欄位,以逗點隔開每一個成員,所以一個群組可以許多個成員,例如

test1,test2,test3

接下來修改 proftpd.conf

UseReverseDNS off
#建議開啟 Log,登入發生錯誤時,也比較好抓問題
SystemLog /var/log/proftpd/ftp.log
DefaultAddress ::
#
# 使用 mysql 資料庫為主
#
SQLBackend mysql

# SQLAuthTypes Backend
# 密碼認證 已 PASSWORD() 產生為主
# 密碼使用明碼 Plaintext
SQLAuthTypes Plaintext

#
# 開啟認證
#
SQLAuthenticate on
#
# MySQL 連線資訊,資料庫名稱@主機 帳號 密碼
#
SQLConnectInfo ftp@localhost root wwwadmin080225
#
# 使用者資料庫欄位
#
SQLUserInfo ftp username password uid gid homedir shell
#
# 群組資料庫欄位
#
SQLGroupInfo groups groupname gid members
#
# SQL Log 檔
#
SQLLogFile /var/log/proftpd/sql.log
#
# 當 Home 目錄不存在,會自己產生。
#
SQLHomedirOnDemand on
#
# SQL Log 格式,當正確登入時,要執行的 SQL 語法
#
SQLLog PASS updatecount
#
# updatecount 增加登入跟時間
#
SQLNamedQuery updatecount UPDATE “count=count+1, accessed=now() where userid=’%u’" ftp
#
# SQL Log 格式,當儲存或刪除檔案時,要執行的 SQL 語法
#
SQLLog STOR,DELE modified
#
# modified 語法
#
SQLNamedQuery modified UPDATE “modified=now() where userid=’%u’" ftp

以下Quota 的部份尚未測試,先整個貼過來

接下來是要介紹如何設定 quota ,然後建立 mysql 相關資料表
#
#quota_type 硬碟限額的鑒別,可以設置單各使用者,也可以設置一各組中的全部使用者,還可以設置全部使用者
#bytes_in_avail 上傳最大位元組數,就是FTP使用者空間容量 (設置個字段的時候是以byte(位元組)為單位,如果要限額在10M,那就是10240000,下面也一樣)
#bytes_out_avail 下載最大位元組數,需要注意的是,這個字段中記錄的是使用者總共能從伺服器上下載多少資料,資料是累計的。
#bytes_xfer_avail 總共可傳輸的文件的最大位元組數(上傳和下載流量)需要注意的是,這個字段中記錄的是使用者總共能傳輸文件的最大位元組數,資料是累計的。
#files_in_avail INT 總共能上傳文件的數目
#files_out_avail INT 能從伺服器上下載文件的總數目
#files_xfer_avail INT 總共可傳輸文件的數目(上傳和下載)
#
CREATE TABLE quotalimits (
name VARCHAR(30),
quota_type ENUM(“user", “group", “class", “all") NOT NULL,
per_session ENUM(“false", “true") NOT NULL,
limit_type ENUM(“soft", “hard") NOT NULL,
bytes_in_avail FLOAT NOT NULL,
bytes_out_avail FLOAT NOT NULL,
bytes_xfer_avail FLOAT NOT NULL,
files_in_avail INT UNSIGNED NOT NULL,
files_out_avail INT UNSIGNED NOT NULL,
files_xfer_avail INT UNSIGNED NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE quotatallies (
name VARCHAR(30) NOT NULL,
quota_type ENUM(“user", “group", “class", “all") NOT NULL,
bytes_in_used FLOAT NOT NULL,
bytes_out_used FLOAT NOT NULL,
bytes_xfer_used FLOAT NOT NULL,
files_in_used INT UNSIGNED NOT NULL,
files_out_used INT UNSIGNED NOT NULL,
files_xfer_used INT UNSIGNED NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
再來是修改 proftpd.conf 的檔案

#
# 硬碟限額部分
#
QuotaDirectoryTally on
#
#硬碟限額單位 b | Kb | Mb| Gb
#
QuotaDisplayUnits “Kb"
#
# 啟動 Quota
#
QuotaEngine on
#
# 硬碟限額日誌記錄
#
QuotaLog “你的LOG路徑"
#
# 打開硬碟限額資訊,當登陸FTP帳戶後,使用命令 “quote SITE QUOTA" 後可顯示當前使用者的硬碟限額
#
QuotaShowQuotas on
#
#以下是SQL調用語句,不用修改直接拷貝過去
#
SQLNamedQuery get-quota-limit SELECT “name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM quotalimits WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’"

SQLNamedQuery get-quota-tally SELECT “name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM quotatallies WHERE name = ‘%{0}’ AND quota_type = ‘%{1}’"

SQLNamedQuery update-quota-tally UPDATE “bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = ‘%{6}’ AND quota_type = ‘%{7}’" quotatallies

SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies

接下來,先建立一個 group 給 ftp

# FreeBSD 建立 FTP group
pw group add ftp
mkdir /home/ftp
chown appleboy:ftp /home/ftp
#
# ftp 這個群組的都可以在資料夾底下新增刪除
#
chmod 775 /home/ftp


#
# 新增 sql 語法
#
INSERT INTO `ftp` (`username`, `uid`, `gid`, `password`, `homedir`, `shell`) VALUES
(‘test1′, 1500, 1004, ’1234′, ‘/home/ftp’, ‘/usr/sbin/nologin’);
INSERT INTO `groups` (`groupname`, `gid`, `members`) VALUES
(‘ftp’, 1004, ‘appleboy,test1,test2′);
INSERT INTO `quotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES
(‘test1′, ‘user’, ‘false’, ‘soft’, 1024000, 0, 204800, 500, 0, 10);

錯誤訊息以及說明:

USER test 1 (Login failed): Invalid shell: ‘/sbin/nologin’
系統不允許使用這個 shell 請在 /etc/shells 加入一行
/usr/sbin/nologin

如果檔案無法上、下傳、刪除,請檢查權限
ftp 資料表中的 uid, gid 就是檔案系統中的權限,必須設定相對應的權限才能正常運作.

無迴響 »

仍無迴響。

此篇文章迴響的訂閱源料 TrackBack URL

發表迴響

Powered by WordPress