更新時間: 2021-10-25
介紹
在 Linux上有許多 ftp server 可供選擇, 那 pureftpd 憑什麼脫穎而出呢 ?
那相信是它本身已經支援虛擬用戶, 而且還有自己的 backend (mysql/pam/file),
在佈置上相當方便 !!!
安裝
Debian
# 大家可以選用其他認證方式, 比如 mysql, ldap ...
# 不同的認證方式有不同的包, 如 pure-ftpd-mysql 包是用 mysql 作 backend 的
# 而 pure-ftpd-ldap 則是 ldap 作 backend 的 ~
apt-get install pure-ftpd-common pure-ftpd
CentOS
改用 pureftpd 的虛擬認證及停用其他認證方式
ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/50pure
echo no > /etc/pure-ftpd/conf/UnixAuthentication
echo no > /etc/pure-ftpd/conf/PAMAuthentication
touch /etc/pure-ftpd/pureftpd.pdb
# PureDB 的內容是指向認證檔, 亦即 pureftpd.pdb
/etc/pure-ftpd/pureftpd.pdb
PS:
在 pureftpd 上, 所有設定都是以 file 存在, 而其內容決定項目的 on/off, yes/no
這功能是透過 pure-ftpd-wrapper 去實現的.
如果想知有什麼可以設定, 那可以 man pure-ftpd-wrapper
虛擬用戶管理
<建立本機用戶>
在使用虛擬用戶前, 必須要建立一個真實的用戶, 然後把 虛擬用戶map到真實的用戶上
groupadd -g 2001 ftpgroup
useradd -g 2001 -u 2001 ftpuser
usermod -s /bin/false -d /home/ftpsite ftpuser
這樣就建立了 ftpuser:x:2001:2001::/home/ftp:/bin/false 在 /etc/passwd
# 當虛擬用戶 map 到本機用戶時, 它們的檔案及目錄權限會跟本機用戶一樣
# 但當虛擬用戶沒有 map 時, 它只可訪問權限為 **6 的檔案 及 **7 的目錄
<建立虛擬用戶>
pure-pw useradd <login> -u <uid> -g <gid> -d <home directory>
# uid 是實體用戶的 uid, 用它來實現權限管制 (虛擬用戶 map 到本機用戶)
# 新增的用戶預設無任何限制, 即上下載速度限制, 容量及login人數等
For example:
pure-pw useradd datahunter -u 2001 -g 2001 -d /home/ftp
<建立或更改用戶密碼>
# 在指令尾加上 "-m" 會立即更新 pureftpd.pdb
pure-pw passwd datahunter
<mkdb>
pure-pw mkdb
# 將 pureftpd.passwd 轉換成 pureftpd.pdb
# pure-ftpd 是根據 pureftpd.pdb 來認證用戶的登入及限制的
# 所以一日未更新 pureftpd.pdb, 新的設定一日不會生效
!!! 注意 !!!
# pure-pw 這指令只會修改 pureftpd.passwd, ( "pure-pw mkdb" 除外)
# 它對 server 並沒有即時的影響
<列出所有虛擬用戶>
pure-pw list
# 查看有什麼虛擬用戶在本機 (只顯示用戶名, Home dir)
<查看某用戶的詳細資料>
pure-pw show datahunter
# 查看用戶 datahunter 的詳細資料
# 其中 Directory 項尾的 "./" 是指那用戶被 chroot 了
<更改用戶的屬性>
pure-pw usermod datahunter <Option>
Option:
-t, -T 設定下載及上傳頻寬 (KB/s)。
-q, -Q 設定上傳/下載比率。
-n, -N 限定最多檔案數/總容量大小 (MB)。
-z 限定用戶的有效時間 ( 如 -z 0900-1800 即在連這段時間可用)
For example:
pure-pw usermod friends -t 60 -T 80 -n 100 -N 1000 -y 3 -m
# friends 用戶的下載速度是 80k/s, 上載則是 60k/s, 最多可以有 3 條連線
# 速度是以每條連線為單位, 如果有 3 條的話, 那下載速度是 240k 了.
# 此外, 最多可以建立 100 個檔案, total size 不超過 1GB.
PS:
-y 即是 PerUserLimits, 虛擬用戶的設置會 override 系統的設置的 !!
它是指同一帳戶同時最多有幾多個 session, 它與 ip 是無關的 !!
<刪除用戶>
#刪除了名叫 testier 的用戶
pure-pw userdel tester
PS
- 每一用戶每個 connection 都有兩條進程
root 4547 0.0 0.2 6376 1540 ? Ss 20:35 0:00 pure-ftpd (SERVER) # 未有 connection 都有它 tim 4552 0.2 0.1 6384 1056 ? S 20:35 0:00 pure-ftpd (IDLE) # system user root 4553 0.0 0.0 6380 496 ? S 20:35 0:00 pure-ftpd (PRIV)
一條是 root 權限(所以什麼都可以 Delete), 另一條則是 map 用戶的權限
- Authentication methods are tried in the order you give the -l options.
- 可以同時使用當本機用戶及虛擬用戶的資料庫, 用戶是順次是根據 /etc/pure-ftpd/auth 目錄內的次序
pureftpd read only user
chroot folder 的 owner 不可以是 map 的 user
# 找出 file 可以被其他人寫入
find /home/ftp_root/mimi -perm /002
"pureftpd.passwd" 的格式
<account>:<password>:<uid>:<gid>:<gecos>:<home directory>:
<upload bandwidth>:<download bandwidth>:<upload ratio>:<download ratio>:
<max number of connections>:<files quota>:<size quota>:
<authorized local IPs>:<refused local IPs>:<authorized client IPs>:<refused client IPs>:
<time restrictions>
不過只有 account, password, uid, gid, home directory 是必須的
pureftpd.passwd ---> pure-pw mkdb ----> pureftpd.pdb
其他指令
# 查看當時 ftp 情況, 如 Login, Speed, What, IP, File 等
# -v The verbose output
# -n Don't resolve host names
pure-ftpwho -vn
+------+---------+-------+------+-------------------------------------------+ | PID | Login |For/Spd| What | File/IP | +------+---------+-------+------+-------------------------------------------+ | 4613 | tester | 00:00 | IDLE | | | '' | '' | '' | '' | -> pc.local | +------+---------+-------+------+-------------------------------------------+
# Start / Stop
# invokes the init script
# 相當於乎叫 /etc/init.d/pure-ftpd
pure-ftpd-control <start/stop/restart>
# 查看 FTP Server 現在的狀況
pure-mrtginfo
2 <-- connection 數量 (並不代表 User 數量) 2 <-- 0 days, 11:39:38 <--- uptime (並不代表 ftp server 的 uptime) myserver <--- hostname
dot file
.banner # 介紹有關本站的資訊, 必須放在用戶的根目錄
.message # 目錄資訊, 要放在有關目錄內的
設定值
設定設共有 5 類
- Boolean values ( On=1=yes / Off=0=no )
- Numerical values (n1 n2 ....)
- String values
- IP values
- File values
左手邊的是在 /etc/pure-ftpd/conf 內的設定檔, 右手邊的是設定值
"#" comment character
#### 系統基本 ####
IPV4Only On Bind 192.168.123.12,21
# 如果 FTP Server 在 Firewall 後時, 必須設定以下 Setting
ForcePassiveIP <Extenal_IP>
PassivePortRange 9001 9100
# 在 debug 時, set 它為 Off, 之後執行 pure-ftpd-wrapper,
# 那就可以看到什麼地方出錯
# 如果是 On, 那要修改 /etc/default/pure-ftpd-common
# STANDALONE_OR_INETD=standalone
Daemonize On
#### Chroot ####
# 除 root 以外所有人都被 chroot
ChrootEveryone On
# 那 GID 的用戶組不受 chroot 限制
TrustedGID N
#### 檔案 ####
# Disallow users (even non-anonymous ones) usage of the CHMOD command.
NoChmod
# 用戶不可重命名文件及目錄
NoRename
# 當上載時, 如果有同名文件存在, 那會自動重命名上載的文件
# 如: file.1, file.2, file.3, ...
# 所以當要取代同名檔時, 那先要刪除它
AutoRename
# 新建目錄及文件的umask
Umask
#格式 <max files> <max size>
Quota
# hd 消耗 over 幾多 % 後不可再 upload ( 不用註明單位 )
MaxDiskUsage
#### 功能 ####
AllowUserFXP On
AllowAnonymousFXP Off
BrokenClientsCompatibility On
# Turns on some compatibility hacks for shoddy clients
CustomerProof
# 防治用戶錯手, 如 "chmod 0 *"
CreateHomeDir
# 當 HomeDir 不存在時是否自動建立它
KeepAllFiles Off
# 系統是否可以續存(上載)檔案, 注意 !!! 當 On 時, 系統就不再可以 Delete File !!!
FortunesFile
# 歡迎詞的位置
# 檔案的權限要 > rw-r--r-- 才得 ~
#### log ####
# log file 的地方及格式
AltLog clf:/var/log/pure-ftpd/transfer.log
# 完全記錄用戶的一舉一動
VerboseLog Off
# 不啟用 syslog 功能 !!
# echo ftp > SyslogFacility 相等於 -f ftp
# rsyslog.con 要有 ftp 一項
SyslogFacility none
Syslog 會記錄以下事項:
New connection from <IP> Authentication failed for user Logout <USER> is now logged in Deleted File Success / Fail Deleted Folder Fail
#### 認證及用戶 ####
PureDB
UnixAuthentication
PAMAuthentication
NoAnonymous
#### 資源及效能 ####
# 最多可以有多少人登入
MaxClientsNumber 50 <--- Default
# 一個 IP 可以同時有多個不同 Client 登入
MaxClientsPerIP 5
DontResolve yes
# <同一個用戶最大允許的進程數量> <最大的匿名用戶進程數量>
PerUserLimits
# 最多顯示文件數目 目錄深度
LimitRecursion 1000 4
# 單位是 minute
MaxIdleTime 8
# 256:64 (256 KB/s for uploads, 64 KB/s for downloads)
UserBandwidth
#### DotFiles 處理 ####
ProhibitDotFilesRead On
ProhibitDotFilesWrite On
DisplayDotFiles Off
# 禁止一切對 "." 開頭的檔案操作
#### 安全 ####
TLS
# 加密
# 防毒
CallUploadScript
# 它同樣會影響虛擬用戶要的 map 的 UID !!
MinUID
# 只有這 ip 可以以用戶登入, 其他的只有 anonymous 登入
TrustedIP
# Force active mode.
NATmod Off
#### AllowAnonymous ####
NoAnonymous yes
AnonymousOnly no
# 當 no 時就會啟用 Anonymous 用戶
# 它的權限及Home 是與 ftp(uid:104) 一樣的
# anonymous 是特別的存在, 不可用同名的虛擬用戶去實現他
AllowAnonymousFXP
AnonymousCanCreateDirs
# 不論目錄是什麼權限, Anonymous 都不能 upload
AnonymousCantUpload
AnonymousBandwidth 1 30
# Anonymous 不可 download 用戶身份是 ftp 的檔案
AntiWarez On
# 當 load 超過此值時, anonymous 只可以 upload, 不可以 download
MaxLoad 3
啟用 TLS
<Server Side>
Step1: 設定值
在 /etc/pure-ftpd/conf/TLS 內共有 3 個選擇
0 停用(default)
1 讓登入者自己選擇
2 必須
# 通常都是用 1 的
Step2: 建立 Certificate
Pure-ftpd 的 Certificate 是在 /etc/ssl/private/pure-ftpd.pem
========================建立過程=======================
mkdir -p /etc/ssl/private/
openssl req -x509 -nodes -newkey rsa:1024 \
-keyout /etc/ssl/private/pure-ftpd.pem \
-out /etc/ssl/private/pure-ftpd.pem
------------------ 填表 ------------------
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:HK
Locality Name (eg, city) []:TKO
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DATAHUNTER HOME
Organizational Unit Name (eg, section) []:FTP SERVER
Common Name (eg, YOUR name) []:PURE-FTPD
Email Address []:[email protected]
---------------------------------------------
chmod 600 /etc/ssl/private/*.pem
====================== END =========================
<Client 設定>
FTP Client login 時選擇 "FTPES - FTP over explicit TLS/SSL" 就可以了 (它是用 Port 21 來實現 TLS 的)
Quota
pure-quotacheck -u<user> -d<directory>
Quota 的數據是儲放在 Home_Directory 目錄的 .ftpquota 檔內
它是存放目錄當時的檔案數量及已用空間.
如 501 5026270599
| |
檔案數量 已用空間
Example:
pure-quotacheck -udatahunter -d/home/ftp
PS:
- 它的功能與 -u 無關, 亦即是 -u 沒有影響力 ....
- -u 的 User 要有 Home_Directory 的寫入能力
當 Quota 用完, 會有以下 Error
Response: 550-Quota exceeded: File_Name won't be saved Response: 550-501 files used (100%) - authorized: 500 files Response: 550 4908467 Kbytes used (958%) - authorized: 512000 Kb
殺毒功能
CallUploadScript
touch antivirus.sh
chmod 700 antivirus.sh
#!/bin/sh clamscan --no-archive --quiet --no-summary --remove \ --detect-broken --detect-pua \ --max-filesize=10M --tempdir=/tmp "$1" --log=/var/log/pure-ftpd/antivirus \ > /dev/null 2>&1 &
在 shell 上測試 antivirus.sh
pure-uploadscript -r -B /etc/pure-ftpd/antivirus.sh
自動執行
/etc/default/pure-ftpd-common
UPLOADSCRIPT=/etc/pure-ftpd/antivirus.sh UPLOADUID=0 UPLOADGID=0
PS:
antivirus.sh 內的更改會即時生效 !!!
在 LXC上行 pure-ftpd
Test
pure-ftpd
Unable to switch capabilities : Operation not permitted
Fix
compiled pure-ftpd with "--without-capabilities"
原因
因為 pure-ftpd 與 libcap 一同 compile 了並自動使用了它
pure-authd
透過 pure-authd, 我們可以用自己的 backend 去認證用戶身份
(cpanel 都是用它來做認證的)
原理:
FTP server ------> pure-authd -----> authentication program
pure-authd ==送入==> program
AUTHD_ACCOUNT
AUTHD_PASSWORD
AUTHD_LOCAL_IP
AUTHD_LOCAL_PORT
AUTHD_REMOTE_IP
AUTHD_ENCRYPTED
<==== authentication program
auth_ok:1
uid:42
gid:21
dir:/home/j
end
------------------------------
throttling_bandwidth_ul
throttling_bandwidth_dl
user_quota_size
per_user_max
------------------------------
0, the user was not found(re-tried)
-1, the user was found(fatal)
uid & gid > 0
=============================
/usr/bin/ftp-auth-handler
--------------------------------------------------------------
#! /bin/sh
if test "$AUTHD_ACCOUNT" = "john"; then
echo 'auth_ok:1'
echo 'uid:69'
echo 'gid:42'
echo 'dir:/tmp'
else
echo 'auth_ok:0'
fi
echo 'end'
--------------------------------------------------------------
pure-authd -s /var/run/ftpd.sock -r /usr/bin/ftp-auth-handler &
pure-ftpd -lextauth:/var/run/ftpd.sock &
==================================================================
/usr/sbin/pure-authd -s /var/run/ftpd.sock -r /usr/sbin/pureauth
/etc/vftp
vftp -> proftpd/
USER:PW:725:721::USER_HOME:/bin/ftpsh
USER_logs:PW:725:721:USER:/usr/local/apache/domlogs/USER:/bin/ftpsh
TroubleShot