利用VSFTP架設Linux下的FTP網站1. 聲明
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 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
-
-----------------------------------------------------------
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
-----------------------------------------------------------
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模組仍然不是很完善 等待添加... ...
10. FAQ
http://www.vsftpdrocks.org/faq/ 中文版參閱:http://wolfg.iblog.cn/index.phpp=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.