Pureftpd

更新時間: 2017-01-31

介紹

在linux上有不少 ftp server 的包, 那 pureftpd 憑什麼脫穎而出呢 ??

那相信是它本身已經支援虛擬用戶, 而且還有自己的 backend,

在佈置上相當方便 !!!

以下所用的 pureftpd 版本是 1.0.21

事前有兩點必須要提醒的

  1. PureFTPD 是以目錄來控制存取權限的, 亦即是說如果一帳戶有一目錄的 "rwx", 他就可以無視檔案本身的權限
  2. Overwrite 檔案是沒有 log 的 (transfer.log)

 


Debian 安裝

 

# 大家可以選用其他認證方式, 比如 mysql, ldap ...
# 不同的認證方式有不同的包, 如 pure-ftpd-mysql 包是用 mysql 作 backend 的
# 而 pure-ftpd-ldap 則是 ldap 作 backend 的 ~

apt-get install pure-ftpd-common pure-ftpd

 


改用 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 []:ROOT@DATAHUNTER.SERVEHTTP.COM
---------------------------------------------

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 內的更改會即時生效 !!!

 


在 OpenVZ 上行 Pureftpd

 

pure-ftpd v1.0.21

compiled  --without-capabilities

Unable to switch capabilities : Operation not permitted

cat /proc/sys/kernel/cap-bound

#vzctl set <VEID> --capability capname:on|off

capabilities library (libcap)
in order to enhance security

如果用 OpenVZ 的朋友要在設定檔上加上以下設定值

CAPABILITY="CHOWN:on DAC_READ_SEARCH:on SETGID:on SETUID:on NET_BIND_SERVICE:on NET_ADMIN:on SYS_CHROOT:on SYS_NICE:on "

 


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