1. 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,這一點請特別注意,尤其是在使用防火牆的企業裏,這一點非常關鍵,如果設置錯了,那麼客戶將無法連接。
2. 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/ 在這裏可以被視作一個反面的例子,因爲它在過去的幾年中出現了太多的安全缺陷。
3. VSFTPD的基本配置
3.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 access. 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的日誌文件
man vsftpd.conf
或參閱: 我翻譯的VSFTPD.CONF聯機手冊 http://etony.9966.org/doc/other/vsftpd-man-zh.html
4.2 系統的啓動與停止
啓動服務
/etc/init.d/vsftpd start
重啓服務
/etc/init.d/vsftpd restart
停止服務
/etc/init.d/vsftpd stop
也可以使用 rcconf 工具設置vsftpd 服務是否在系統引導時啓動
5. 配置示例
一個示例文件
# 以獨立模式啓動
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
6. 爲VSFTPD配置虛擬用戶(文本方式)
6.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
6.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
6.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
6.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
6.5 啓動vsftpd
/etc/init.d/vsftpd start|restart
$ 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.
7. 爲VSFTPD配置虛擬用戶(數據庫方式)
7.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>
7.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()函數加密存儲
7.4 其他配置
同 爲VSFTPD配置虛擬用戶(文本方式)
7.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用戶密碼
8. 關於日誌
libpam-mysql 0.6.2-1模塊仍然不是很完善 等待添加... ...
9. FAQ
http://www.vsftpdrocks.org/faq/ 中文版參閱:http://wolfg.iblog.cn/index.phpop=ViewArticle$articleId=50969
Q) 爲什麼設置了chroot_local_user=YES後,符號鏈接(symlink)就不起作用了呢?
A) 這是chroot()這種安全機制如何工作的結果。可選地,看一下硬連接(hard links),或者,你用的是"現代的"Linux,看一下強大的"mount --bind"命令。
Q) 求助!我得到了"refusing to run with writable anonymous root"錯誤信息。
A) vsftpd是不允許"危險(不安全)"的配置的。出現這個錯誤信息的原因通常是ftp的家(home)目錄的屬主權限不正確。 家(home)目錄的屬主不應該是ftp用戶自己,而且ftp用戶也不能有寫的權限。解決的方法是: chown root ftp; chmod -w ftp
Q) 求助!上傳或其他"寫"命令都報"500 Unknown command.".
A) 默認情況下"寫"命令(上傳和建新目錄等)都是被禁止的. 這是一種安全的方法. 要允許寫命令需要在配置文件/etc/vsftpd.conf中加入write_enable=YES.
Q) 求助!上傳後的文件權限是-rw-------。
A1) 根據上傳用戶是本地用戶還是匿名用戶,修改local_umask或anon_umask選項。例如,設置anon_umask=022指定匿名上傳的文件權限爲-rw-r--r--。注意,22前面的0不能少。
A2) 也可以看看vsftpd.conf的man幫助中的新選項file_open_mode。