1. 聲明
版本信息:
本文檔的最新版本將張貼于: LinuxSir.Org論壇 Debian 發行版討論區 ;
也可以從 http://www.debsir.org/ 獲取.
反饋:
所有評論, 錯誤報告, 其他信息以及批評, 請郵寄到 etony@tom.com ;
或在LinuxSir.Org論壇 Debian發行版討論區 張貼.
版權信息:
本文檔的版權(c)2006-2007 歸 etony C.F.AN 所有.
轉載請注明源自 http://www.debsir.org/ .
2. FTP 原理
FTP Transfer Protocol 件傳輸協議的縮寫,在RFC 959中具體說明。
FTP會話時包含了兩個通道,一個叫控制通道,一個叫數據通道。
控制通道:控制通道是和FTP服務器進行溝通的通道,連接FTP,發送FTP指令都是通過控制通道來完成的。
數據通道:數據通道是和FTP服務器進行文件傳輸或者列表的通道。
FTP協議中,控制連接均有客戶端發起,而數據連接有兩種工作方式:PORT方式和PASV方式
PORT模式(主動方式)
FTP 客戶端首先和FTP Server的TCP 21端口建立連接,通過這個通道發送命令,客戶端需要接收數據的時候在這個通道上發送PORT命令。 PORT命令包含了客戶端用什么端口(一個大于1024的端口)接收數據。在傳送數據的時候,服務器端通過自己的TCP 20端口發送數據。 FTP server必須和客戶端建立一個新的連接用來傳送數據。
PASV模式(被動方式)
在建立控制通道的時候和PORT模式類似,當客戶端通過這個通道發送PASV 命令的時候,FTP server打開一個位于1024和5000之間的隨機端口并且通知客戶端在這個端口上傳送數據的請求,然后FTP server 將通過這個端口進行數據的傳送,這個時候FTP server不再需要建立一個新的和客戶端之間的連接傳送數據。
如果從C/S模型這個角度來說,PORT對于服務器來說是OUTBOUND,而PASV模式對于服務器是INBOUND,這一點請特別注意,尤其是在使用防火墻的企業里,這一點非常關鍵,如果設置錯了,那么客戶將無法連接。
3. VSFTPD
vsftpd 是一個 UNIX 類操作系統上運行的服務器的名字,它可以運行在諸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服務器不支持的特征。比如:
非常高的安全性需求
帶寬限制
良好的可伸縮性
創建虛擬用戶的可能性
IPv6支持
中等偏上的性能
分配虛擬 IP 的可能性
高速
vsftpd 的名字代表"very secure FTP daemon", 安全是它的開發者 Chris Evans 考慮的首要問題之一。在這個 FTP 服務器設計開發的最開始的時候,高安全性就是一個目標。
一個例子就是 vsftpd 是在 chroot 模式下工作的,chroot 模式就是為程序(這里就是 vsftpd 了)單獨指定一個新的目錄,它也就不能訪問那個目錄之外的程序和文件了 --- 所以這也稱為“被鎖上的”。一個可能被潛在的攻擊者破壞的 FTP 服務器將被從系統的其他部分獨立開來,從而避免了更大的損失。
由于有了如此多的特性,其中 FTP 服務的安全性應該是最重要的,vsftpd 比其他 FTP 服務器更加優越。WU-FTPD http://www.wu-ftpd.org/ 在這里可以被視作一個反面的例子,因為它在過去的幾年中出現了太多的安全缺陷。
4. VSFTPD的基本配置
4.1 安裝
源代碼安裝
詳細參閱:http://www.vsftpdrocks.org/source/
下載源代碼
wget ftp://vsftpd.beasts.org/users/cevans/vsftpd-1.2.1.tar.gz
解壓
tar zxvf vsftpd-1.2.1.tar.gz
進入源代碼目錄
cd vsftpd-1.2.1
編譯
make
創建用戶
如果不存在 nobody用戶,請創建
useradd nobody
創建目錄
vsftpd 需要 /usr/share/empty 目錄,如果不存在,請創建:
mkdir /usr/share/empty
安裝
make install
復制配置文件到/etc目錄
cp vsftpd.conf /etc
以獨立方式啟動vsftpd服務
/usr/local/sbin/vsftpd &
4.2 使用Debian的方式安裝
# aptitude update
# aptitude install vsftpd( 2.0.5)
5. 配置文件說明
/etc/vsftpd.conf
vsftpd的主配置文件 /etc/ftpusers 記錄不允許訪問FTP服務器的用戶名單管理員可以把一些對系統安全有威脅的敏感賬戶記錄在這個文件中,以免對系統造成威脅
# /etc/ftpusers: list of users disallowed FTP aclearcase/" target="_blank" >ccess. See ftpusers(5).
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
nobody
/etc/vsftpd.user_list
此文件與userlist_file 選項有關, 也可通過userlist_file選項指定其他文件, 默認為/etc/vsftpd.user_list,設置userlist_enable=YES時方可生效, 默認(userlist_deny=YES)指定不能訪問服務器的用戶列表,如設定userlist_deny=NO,則FTP服務器僅允許此列表中的用戶訪問。
/etc/init.d/vsftpd
vsftpd的啟動腳本
/var/log/vsftpd.log
vsftpd的日志文件
5.1 配置相關內容參閱:
man vsftpd.conf
或參閱:我翻譯的VSFTPD.CONF聯機手冊 http://etony.9966.org/doc/other/vsftpd-man-zh.html
5.2 系統的啟動與停止
啟動服務
/etc/init.d/vsftpd start
重啟服務
/etc/init.d/vsftpd restart
停止服務
/etc/init.d/vsftpd stop
也可以使用 rcconf 工具設置vsftpd 服務是否在系統引導時啟動
6. 配置示例
一個示例文件
# 以獨立模式啟動
listen=YES
#同時允許200客戶端連入,每個IP最多允許4個進程
max_clients=200
max_per_ip=4
允許匿名訪問,只有下載權限。 禁止本地(系統)用戶登錄
# Access rights
anonymous_enable=YES
local_enable=NO
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
# 禁止匿名用戶下載具有全局讀取權限的文件,目錄中的用戶和組信息列取時都顯示為 "ftp".
#被動模式下,服務器端口范圍限制在50000~60000
anon_world_readable_only=YES
connect_from_port_20=YES
hide_ids=YES
pasv_min_port=50000
pasv_max_port=60000
# 生成詳細的上載和下載日志,禁止使用"ls -R"命令,
xferlog_enable=YES
ls_recurse_enable=NO
ascii_download_enable=NO
async_abor_enable=YES
# 以節省資源模式運行(針對 Linux 2.4 內核),
#遠程客戶端最大 FTP 命令間隔超過120秒,或空閑的數據連接超過300秒,都將被斷開
#匿名客戶端允許的最大數據傳輸速率50000b/s
one_process_model=YES
idle_session_timeout=120
data_connection_timeout=300
anon_max_rate=50000
7. 為VSFTPD配置虛擬用戶(文本方式)
7.1 創建虛擬與用戶數據庫
1. 創建loguser.txt,格式如下:
userid
pass
比如我創建兩個用戶:tony 密碼為tonypass,etony密碼為etonypass 則loguser.txt的內容如下:
tony
tonypass
etony
etonypass
2. 安裝數據庫生成工具:
# aptitude install libdb3-util
3. 生成數據庫:
# db_load -T -t hash -f loguser.txt /etc/vsftpd_login.db
4. 設置數據庫文件的訪問權限:
# chmod 600 /etc/vsftpd_login.db
7.2 配置PAM文件
修改/etc/pam.d/vsftpd 內容如下:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login
7.3 為虛擬用戶創建本地系統用戶
useradd -d /home/ftpsite virtual
mkdir /home/ftpsite
chown virtual.virtual /home/ftpsite
ls -ld /home/ftpsite
drwxr-sr-x 2 virtual virtual 48 2006-08-18 05:48 /home/ftpsite
在目錄下創建一些內容
echo "etony's vsftpd server" > /home/ftpsite/msg
chown virtual.virtual /home/ftpsite/msg
7.4 創建/etc/vsftpd.conf
根據需要創建/etc/vsftpd.conf,但要確保含有一下設置:
anonymous_enable=NO
local_enable=YES
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=virtual
listen=YES
listen_port=21
pasv_min_port=30000
pasv_max_port=30999
7.5 啟動vsftpd
/etc/init.d/vsftpd start|restart
7.6 測試
$ lftp localhost -u tony,tonypass
lftp tony@localhost:~> ls
-rw-r--r-- 1 1001 1001 22 Aug 17 21:49 msg
lftp tony@localhost:/> exit
$ lftp localhost -u tony,tonyp
lftp tony@localhost:~> ls
ls: Login failed: 530 Login incorrect.
8. 為VSFTPD配置虛擬用戶(數據庫方式)
8.1 安裝MySQL數據庫
# aptitude install mysql-server libpam-mysql
當前MySQL數據庫版本為5.0.24-1 libpam-mysql 0.6.2-1
tonybox:/var/log# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 5.0.22-Debian_4-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
mysql>
mysql> create database vsftpd;
Query OK, 1 row affected (0.04 sec)
mysql> use vsftpd
Database changed
mysql> create table users(name char(20), passwd char(20));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users values('tony',password('passtony'));
Query OK, 1 row affected (0.02 sec)
mysql> insert into users values('etony',password('passetony'));
Query OK, 1 row affected (0.01 sec)
mysql> grant select, insert on vsftpd.users to vsftpduser@localhost identified by 'vsftpdpass';
Query OK, 0 rows affected (0.02 sec)
8.2 創建用戶
tonybox:/var/log# mysql -u vsftpduser -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 5.0.22-Debian_4-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use vsftpd
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from users;
+----+-------+------------------+
| id | name | passwd |
+----+-------+------------------+
| 1 | tony | 2351315b1bd1bd58 |
| 2 | etony | 59c0cde4781fb0be |
+----+-------+------------------+
2 rows in set (0.00 sec)
mysql>
8.3 配置PAM文件
修改/etc/pam.d/vsftpd 內容如下:
auth required /lib/security/pam_mysql.so user=vsftpduser passwd=vsftpdpass host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2
account required /lib/security/pam_mysql.so user=vsftpduser passwd=vsftpdpass host=localhost db=vsftpd
table=users usercolumn=name passwdcolumn=passwd crypt=2
crypt 的值
0: 在數據庫中明文存儲
1: 使用crypt()函數加密存儲
2: 使用MySQL PASSWORD()函數加密存儲
8.4 其他配置
同 為VSFTPD配置虛擬用戶(文本方式)
8.5 測試
tonybox:~# lftp localhost -u etony,passetony
lftp etony@localhost:~> ls
-rw-r--r-- 1 1001 1001 22 Aug 17 21:49 msg
lftp etony@localhost:/>
注:
與mysql-server-5.0對應的libpam-mysql由于使用的PASSWORD()函數與服務器端使用的PASSWORD()不匹配, 故無法實現密碼加密,僅可實現在數據庫中明文存儲ftp用戶密碼。 mysql-server-4.1 與 libpam-mysql( 0.5.0-6)可以實現在數據庫中使用加密存儲ftp用戶密碼
9. 關于日志
libpam-mysql 0.6.2-1模塊仍然不是很完善等待添加... ...