天天看點

Linux下用vsftpd建構FTP伺服器

在Linux下如何使用vsftpd建構FTP伺服器,建構後的FTP伺服器有哪些特點?本文将作詳細介紹。 vsftpd 是“very secure FTP daemon”的縮寫,安全性是它的一個最大的特點。vsftpd 是一個 UNIX 類作業系統上運作的伺服器的名字,它可以運作在諸如 Linux、BSD、Solaris、 HP-UNIX等系統上面,是一個完全免費的、開發源代碼的ftp伺服器軟體,支援很多其他的 FTP 伺服器所不支援的特征。比如:非常高的安全性需求、帶寬限制、良好的可伸縮性、可建立虛拟使用者、支援IPv6、速率高等。 本文以RedHat Linux 9.0為例介紹一下如何安裝和配置vsftpd伺服器。 安裝伺服器程式 程式下載下傳位址:ftp://vsftpd.beasts.org/users/cevans/,目前最新版本為2.0.3,源程式檔案名為vsftpd-2.0.3.tar.gz。 1.安裝之前的準備: 安裝之前我們應該看看使用者“nobody”和目錄“/usr/share/empty”是否存在,如果不存在需要建立這個使用者和目錄。 [[email protected] root]# useradd nobody [[email protected] root]# mkdir /usr/share/empty 如果要允許匿名通路,還需要建立ftp使用者,并将其主目錄設定為/var/ftp。在RedHat Linux 9.0中這些都已預設設定好了,隻需要建立一個/var/ftp目錄即可。 [[email protected] root]# mkdir /var/ftp 為了安全,目錄“/var/ftp”不應該屬于使用者“ftp”,也不應該有寫權限。在此,我們做如下設定: [[email protected] root]# chown root.root /var/ftp [[email protected] root]# chmod 755 /var/ftp 2.開始安裝: 以管理者身份登入Linux系統,将vsftpd-2.0.3.tar.gz複制到/root目錄下。 [[email protected] root]# tar xzvf vsftpd-2.0.3.tar.gz [[email protected] root]# cd vsftpd-2.0.3 [[email protected] vsftpd-2.0.3]# make [[email protected] vsftpd-2.0.3]# make install 3.安裝後續工作 由于采用源代碼方式安裝,很多必要的配置檔案沒有複制到系統中,需要手動複制。 複制配置檔案: [[email protected] vsftpd-2.0.3]# cp vsftpd.conf /etc 複制pam驗證檔案:(多數使用vsftpd的使用者在用源代碼安裝後都會遇到這樣的問題:匿名使用者可以登入,而本地使用者無論怎樣設定都無法登入,原因就在于vsftpd采用了PAM驗證的方式,需要複制一個驗證檔案本地使用者才能通路。) [[email protected] vsftpd-2.0.3]# cp RedHat/vsftpd.pam /etc/pam.d/ftp vsftpd的配置 vsftpd伺服器的配置檔案為/etc/vsftpd.conf,其配置選項比較多,在此我隻選擇幾個常用的配置選項介紹。 1.禁止匿名使用者通路。 anonymous_enable=NO 2.允許本地使用者登入并允許其上傳檔案。 local_enable=YES write_enable=YES 要使上述選項生效,必須複制一個pam驗證檔案到/etc/pam.d,并改名為ftp。當然也可以改為其他名稱,但必須修改pam_service_name的值,預設為ftp。 3.将本地使用者鎖定在主目錄中,不允許切換到上一級目錄中。 chroot_local_user=YES 4.禁止某些使用者通過ftp登入伺服器。 如果設定了local_enable=YES,那麼所有的使用者包括root也能通過ftp登入伺服器,出于安全考慮,需要對某些使用者進行限制。 在vsftpd.conf中有三個選項控制: userlist_deny=YES/NO userlist_enalbe=YES userlist_file=/etc/vsftpd.user_list 如果userlist_deny=YES,/etc/vsftpd.user_list中列出的使用者名就不允許登入ftp伺服器;如果userlist_deny=NO,/etc/vsftpd.user_list中列出的使用者名允許登入ftp伺服器。 我們隻要在/etc目錄下建立vsftpd.user_list檔案,檔案内容為允許登入或禁止登入的使用者名,每個使用者占一行。 5.禁止使用者通過FTP修改檔案或檔案夾的權限。 chmod_enable=NO(預設值為YES) 6.設定本地使用者上傳的檔案或檔案夾的umask值。 local_umask=022(預設值為077) umask的值設為022表示,上傳的如果是檔案将權限改為644,如果是檔案夾将權限改為755。在上傳網頁時,如果設定為077,就會出現使用者沒有權限(Permission denied)通路網頁的問題,是以建議将umask的值設為022。 7.添加一個隻能從ftp登入伺服器,而不能從本地登入的使用者。以下建立一個使用者ftpuser,不允許從本地登入,并建立該使用者的密碼。 [[email protected] root]# useradd –g ftp –s /sbin/nologin ftpuser [[email protected] root]# passwd ftpuser Changing password for user ftpuser. New password: Retype new password: passwd: all authentication tokens updated successfully. 8.讓vsftp伺服器限制總的連接配接數以及每個IP最大的連接配接數。 #最多同時允許100個客戶連接配接 max_clients=100 #每個ip位址最多允許開3個線程 max_per_ip=3 vsftpd的配置檔案中有很多選項,但個人認為,如果是架設一個簡單的ftp伺服器,以上選項就足夠了。 //------------------------------------------------------------------ vsftp配置大全---超完整版 作者: haixiao ouyang 2006-02-10 環境: RedHat AS4 說明: 如果不做說明,一般安裝指令均使用ROOT權限,用 # 表示 特别說明:無 以下文章介紹Liunx 環境下vsftpd的三種實作方法 一、軟體 ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.3.tar.gz,目前已經到2.0.3版本。假設我們已經将vsftpd-2.0.3.tar.gz檔案下載下傳到伺服器的/home/xuchen目錄 二、 代碼: # cd /home/xuchen # tar xzvf vsftpd-2.0.3.tar.gz //解壓縮程式 # cd vsftpd-2.0.3 三、三種方式的實作 1、匿名使用者形式實作 # vi builddefs.h 編輯builddefs.h 檔案,檔案内容如下: #ifndef VSF_BUILDDEFS_H #define VSF_BUILDDEFS_H #undef VSF_BUILD_TCPWRAPPERS #define VSF_BUILD_PAM #undef VSF_BUILD_SSL #endif 将以上undef的都改為define,支援tcp_wrappers,支援PAM認證方式,支援SSL # make //直接在vsftpd-2.0.3裡用make編譯 # ls -l vsftpd -rwxr-xr-x 1 root root 86088 Jun 6 12:29 vsftpd //可執行程式已被編譯成功 建立必要的帳号,目錄: # useradd nobody //可能你的系統已經存在此帳号,那就不用建立 # mkdir /usr/share/empty //可能你的系統已經存在此目錄,那就不用建立 # mkdir /var/ftp //可能你的系統已經存在此目錄,那就不用建立 # useradd -d /var/ftp ftp //可能你的系統已經存在此帳号,那就不用建立 # chown root:root /var/ftp # chmod og-w /var/ftp 請記住,如果你不想讓使用者在本地登陸,那麼你需要把他的登陸SHELL設定成/sbin/nologin,比如以上的nobody和ftp我就設定成/sbin/nologin 安裝vsftp配置檔案,可執行程式,man等: # install -m 755 vsftpd /usr/local/sbin/vsftpd-ano # install -m 644 vsftpd.8 /usr/share/man/man8 # install -m 644 vsftpd.conf.5 /usr/share/man/man5 # install -m 644 vsftpd.conf /etc/vsftpd-ano.conf 這樣就安裝完成了,那麼我們開始進行簡單的配置 # vi /etc/vsftpd-ano.conf ,将如下三行加入檔案 listen=YES listen_port=21 tcp_wrappers=YES anon_root=/var/ftp //設定匿名使用者本地目錄,和ftp使用者目錄必須相同 listen=YES的意思是使用standalone啟動vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式) # /usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf & //以背景方式啟動vsftpd 注意:每行的值都不要有空格,否則啟動時會出現錯誤,舉個例子,假如我在listen=YES後多了個空格,那我啟動時就出現如下錯誤: 500 OOPS: bad bool value in config file for: listen 測試搭建好的匿名使用者方式 # ftp 127.0.0.1 Connected to 127.0.0.1. 220 (vsFTPd 2.0.3) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (127.0.0.1:root): ftp 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 /"//" ftp> quit 221 Goodbye. # OK,已經完成了,very nice. 進階配置 細心的朋友可能已經看出來我們隻在預設配置檔案增加了四行,就實作了FTP連接配接(也證明了vsftpd的易用性),那麼讓我們傳個檔案吧,呀!!傳輸失敗了(見圖1) 為什麼呢?因為 vsftpd 是為了安全需要,/var/ftp目錄不能把所有的權限打開,是以我們這時要建一個目錄pub,當然也還是需要繼續修改配置檔案的。 # mkdir /var/ftp/pub # chmod -R 777 /var/ftp/pub 為了測試友善,我們先建立一個名為kill-ano的腳本,是為了殺掉FTP程式的 #!/bin/bash a=`/bin/ps -A | grep vsftpd-ano | awk /'{print    $1}/'` kill -9    $a 那麼現在大家看看我的匿名伺服器配置檔案吧 anonymous_enable=YES //允許匿名通路,這是匿名伺服器必須的 write_enable=YES //全局配置可寫 no_anon_password=YES //匿名使用者login時不詢問密碼 anon_umask=077 //匿名使用者上傳的檔案權限是-rw---- anon_upload_enable=YES //允許匿名使用者上傳檔案 anon_mkdir_write_enable=YES //允許匿名使用者建立目錄 anon_other_write_enable=YES //允許匿名使用者具有建立目錄,上傳之外的權限,如重命名,删除 dirmessage_enable=YES //當使用者轉換目錄,則會顯示該目錄下的.message資訊 xferlog_enable=YES //記錄使用者所有上傳下載下傳資訊 xferlog_file=/var/log/vsftpd.log //将上傳下載下傳資訊記錄到/var/log/vsftpd.log中 xferlog_std_format=YES //日志使用标準xferlog格式 idle_session_timeout=600 //用戶端超過600S沒有動作就自動被伺服器踢出 data_connection_timeout=120 //資料傳輸時超過120S沒有動作被伺服器踢出 chown_uploads=YES chown_username=daemon //上傳檔案的屬主 ftpd_banner=Welcome to d-1701.com FTP service. //FTP歡迎資訊 anon_max_rate=80000 //這是匿名使用者的下載下傳速度為80KBytes/s check_shell=NO //不檢測SHELL 現在再測試,先kill掉再啟動FTP程式 # ./kill-ano # /usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf & 上傳一個檔案測試一下,怎麼樣?OK了吧,下載下傳剛上傳的那個檔案,恩?不行,提示 550 Failed to open file. 傳輸已失敗! 傳輸隊列已完成 1 個檔案傳輸失敗 沒有關系,你記得咱們設定了anon_umask=077了嗎?是以你下載下傳不了,如果你到伺服器上touch 一個檔案(644),測試一下,是可以被下載下傳下來的,好了,匿名伺服器就說到這裡了。 2、本地使用者形式實作 # cd /home/xuchen/vsftpd-2.0.3 //進入vsftpd-2.0.3的源代碼目錄 # make clean //清除編譯環境 # vi builddefs.h 繼續編輯builddefs.h 檔案,檔案内容如下: #ifndef VSF_BUILDDEFS_H #define VSF_BUILDDEFS_H #define VSF_BUILD_TCPWRAPPERS #define VSF_BUILD_PAM #define VSF_BUILD_SSL #endif 将以上define VSF_BUILD_PAM行的define改為undef,支援tcp_wrappers,不支援PAM認證方式,支援SSL,記住啊,如果支援了PAM認證方式,你本地使用者是不能登陸的。 # make //直接在vsftpd-2.0.3裡用make編譯 # ls -l vsftpd -rwxr-xr-x 1 root root 84712 Jun 6 18:56 vsftpd //可執行程式已被編譯成功 建立必要的帳号,目錄: # useradd nobody //可能你的系統已經存在此帳号,那就不用建立 # mkdir /usr/share/empty //可能你的系統已經存在此目錄,那就不用建立 # mkdir /var/ftp //可能你的系統已經存在此目錄,那就不用建立 # useradd -d /var/ftp ftp //可能你的系統已經存在此帳号,那就不用建立 # chown root:root /var/ftp # chmod og-w /var/ftp 請記住,如果你不想讓使用者在本地登陸,那麼你需要把他的登陸SHELL設定成/sbin/nologin,比如以上的nobody和ftp我就設定成/sbin/nologin 安裝vsftp配置檔案,可執行程式,man等: # install -m 755 vsftpd /usr/local/sbin/vsftpd-loc # install -m 644 vsftpd.8 /usr/share/man/man8 # install -m 644 vsftpd.conf.5 /usr/share/man/man5 # install -m 644 vsftpd.conf /etc/vsftpd-loc.conf 這樣就安裝完成了,那麼我們開始進行簡單的配置 # vi /etc/vsftpd-loc.conf ,将如下三行加入檔案 listen=YES listen_port=21 tcp_wrappers=YES //支援tcp_wrappers,限制通路(/etc/hosts.allow,/etc/hosts.deny) listen=YES的意思是使用standalone啟動vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式),注意事項請參看匿名使用者的配置。 anonymous_enable=NO local_enable=YES //這兩項配置說不允許匿名使用者登陸,允許本地使用者登陸 # /usr/local/sbin/vsftpd-loc /etc/vsftpd-loc.conf & //以背景方式啟動vsftpd 測試搭建好的匿名使用者方式,先測試root使用者吧 :) # ftp 127.0.0.1 Connected to 127.0.0.1. 220 (vsFTPd 2.0.3) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (127.0.0.1:root): root 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 /"/root/" ftp> quit 221 Goodbye. 我們看到root使用者可以登陸到ftp,他的登陸目錄就是自己的主目錄。 再測試一個系統使用者,那我們先建立一個使用者名叫xuchen的 # useradd xuchen # passwd xuchen Changing password for user xuchen. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. 建立好了,讓我們開始測試吧!! # ftp 127.0.0.1 Connected to 127.0.0.1. 220 (vsFTPd 2.0.3) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (127.0.0.1:root): xuchen 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 /"/home/xuchen/" ftp> quit 221 Goodbye. 我們看到xuchen使用者可以登陸到ftp,他的登陸目錄也是自己的主目錄。哈哈,又完成了! 進階配置 細心的朋友可能已經看出來如果我們不支援PAM認證方式,那麼本地使用者就可以登陸,而預設編譯的vsftpd支援PAM認證方式,是以是不支援本地使用者登陸的。恩,從這點說,這也是vsftp安全的一個表現----禁止本地使用者登陸。 我們登陸後進行測試,傳一個檔案上去,得,失敗了,那下載下傳個檔案下來吧,恩,這是成功的(見圖2),而且我們發現我們可以進入到系統根目錄(見圖3),這樣很危險。 那麼改配置檔案吧,為了測試友善,我們先建立一個名為kill-loc的腳本,也是為了殺掉FTP程式的 #!/bin/bash a=`/bin/ps -A | grep vsftpd-loc | awk /'{print    $1}/'` kill -9    $a 現在提供我的本地使用者驗證伺服器配置檔案吧(在匿名裡寫過的注釋我就不在這裡寫了) listen=YES listen_port=21 tcp_wrappers=YES anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 //本地使用者檔案上傳後的權限是-rw-r-r anon_upload_enable=NO anon_mkdir_write_enable=NO dirmessage_enable=YES xferlog_enable=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES connect_from_port_20=YES chroot_local_user=YES //限制使用者在自己的主目錄 #local_root=/ftp //你可以指定所有本地使用者登陸後的目錄,如果不設定此項,使用者都會登陸于自己的主目錄,就跟咱們前面測試的結果是一樣的 local_max_rate=500000 //本地使用者的下載下傳速度為500KBytes/s idle_session_timeout=600 data_connection_timeout=120 nopriv_user= nobody //設定服務執行者為nobody,vsftpd推薦使用一個權限很低的使用者,最好是沒有家目錄(/dev/null),沒有登陸shell(/sbin/nologin),系統會更安全 ftpd_banner=Welcome to d-1701.com FTP service. check_shell=NO userlist_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd.denyuser 以上三條設定不允許登陸的使用者,使用者清單存放在/etc/vsftpd.denyuser中,一行一個帳号如果我把xuchen這個使用者加到vsftpd.denyuser裡,那麼登陸時會出現如下錯誤: # ftp 127.0.0.1 Connected to 127.0.0.1. 220 Welcome to d-1701.com FTP service. 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (127.0.0.1:root): xuchen 530 Permission denied. Login failed. 呵呵,有意思吧,自己測試吧,本地使用者登陸方式就介紹到這裡吧! 3、虛拟使用者形式實作(db及mysql形式) [已經實踐操作,非常好用] # cd /home/xuchen/vsftpd-2.0.3 //進入vsftpd-2.0.3的源代碼目錄 # make clean //清除編譯環境 # vi builddefs.h 繼續編輯builddefs.h 檔案,檔案内容如下: #ifndef VSF_BUILDDEFS_H #define VSF_BUILDDEFS_H #define VSF_BUILD_TCPWRAPPERS #undef VSF_BUILD_PAM #define VSF_BUILD_SSL (如果你系統沒裝OPENSSL,如果開啟的話,MAKE會報錯,設定成undef就好了) #endif 将以上define VSF_BUILD_PAM行的undef改為define,支援tcp_wrappers,支援PAM認證方式,支援SSL,和匿名使用者形式是一樣的。 # make //直接在vsftpd-2.0.3裡用make編譯 # ls -l vsftpd -rwxr-xr-x 1 root root 86088 Jun 6 22:26 vsftpd //可執行程式已被編譯成功 建立必要的帳号,目錄: # useradd nobody //可能你的系統已經存在此帳号,那就不用建立 # mkdir /usr/share/empty //可能你的系統已經存在此目錄,那就不用建立 # mkdir /var/ftp //可能你的系統已經存在此目錄,那就不用建立 # useradd -d /var/ftp ftp //可能你的系統已經存在此帳号,那就不用建立 # chown root:root /var/ftp # chmod og-w /var/ftp 請記住,如果你不想讓使用者在本地登陸,那麼你需要把他的登陸SHELL設定成/sbin/nologin,比如以上的nobody和ftp我就設定成/sbin/nologin 安裝vsftp配置檔案,可執行程式,man等: # install -m 755 vsftpd /usr/local/sbin/vsftpd-pam # install -m 644 vsftpd.8 /usr/share/man/man8 # install -m 644 vsftpd.conf.5 /usr/share/man/man5 # install -m 644 vsftpd.conf /etc/vsftpd-pam.conf 這樣就安裝完成了,那麼我們開始進行簡單的配置 對于用DB庫存儲使用者名及密碼的方式來說: (1)檢視系統是否有相應軟體包 # rpm –qa | grep db4 db4-devel-4.2.52-7.1 db4-4.2.52-7.1 db4-utils-4.2.52-7.1 (2)建立一個logins.txt的檔案,單行為使用者名,雙行為密碼,例如 # vi /home/logins.txt xuchen 12345 (3)建立資料庫檔案并設定檔案屬性 # db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db # chmod 600 /etc/vsftpd_login.db (4)建立認證檔案 # vi /etc/pam.d/ftp 插入如下兩行 auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login account required /lib/security/pam_userdb.so db=/etc/vsftpd_login (5)建立一個虛拟使用者 useradd -d /home/vsftpd -s /sbin/nologin vsftpd ls -ld /home/vsftpd drwx------ 3 vsftpd vsftpd 1024 Jun 6 22:55 /home/vsftpd/ (6)編寫配置檔案(注意事項請參看匿名使用者的配置,這裡不再贅述) # vi /etc/vsftpd-pam.conf listen=YES listen_port=21 tcp_wrappers=YES //支援tcp_wrappers,限制通路(/etc/hosts.allow,/etc/hosts.deny) listen=YES的意思是使用standalone啟動vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式) anonymous_enable=NO local_enable=YES //PAM方式此處必須為YES,如果不是将出現如下錯誤: 500 OOPS: vsftpd: both local and anonymous access disabled! 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=vsftpd //這兩行的意思是采用虛拟使用者形式 virtual_use_local_privs=YES //虛拟使用者和本地使用者權限相同 pasv_enable=YES //建立資料聯機采用被動方式 pasv_min_port=30000 //建立資料聯機所可以使用port 範圍的上界,0表示任意。預設值為0。 pasv_max_port=30999 //建立資料聯機所可以使用port 範圍的下界,0表示任意。預設值為0。 (7)啟動程式 # /usr/local/sbin/vsftpd-pam /etc/vsftpd-pam.conf & (8)測試連通及功能 # vi /home/vsftpd/test //建立一個檔案,内容如下 1234567890 # chown vsftpd.vsftpd /home/vsftpd/test # ftp 127.0.0.1 Connected to 127.0.0.1. 220 (vsFTPd 2.0.3) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (127.0.0.1:root): xuchen 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 /"//" ftp> size test 213 11 ftp> quit 221 Goodbye. OK,使用者名為xuchen,密碼為12345可以連接配接到FTP伺服器,看不到檔案清單,但可以下載下傳已知檔案名的檔案,不能上傳檔案,非常安全吧!! 如果我們需要使用者看到檔案,怎麼辦?也好辦,在配置檔案中加入如下語句: anon_world_readable_only=NO //匿名登入者不能下載下傳可閱讀的檔案,預設值為YES 如果需要讓使用者上傳檔案和下載下傳檔案分開,建議如下這麼做 # vi /home/logins.txt xuchen 12345 upload 45678 //首先建立虛拟使用者upload,密碼為45678 # db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db //更新資料檔案 # mkdir /home/vsftpd/upload # vi /etc/vsftpd-pam.conf 加入如下語句 user_config_dir=/etc/vsftpd_user_conf # mkdir /etc/vsftpd_user_conf # vi /etc/vsftpd_user_conf/upload 檔案内容如下 local_root=/home/vsftpd/upload write_enable=YES anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES # chmod 700 /home/vsftpd/upload # chown vsftpd.vsftpd /home/vsftpd/upload/ 這樣,xuchen使用者可以下載下傳/home/vsftpd裡的檔案及upload裡的檔案,而upload使用者可以上傳和下載下傳/home/vsftpd/upload檔案夾的東西,但不能到/home/vsftpd裡下載下傳檔案,很簡單得實作了分使用者上傳和下載下傳 對于用Mysql庫存儲使用者名及密碼的方式來說: 就是把使用者名和密碼放在mysql庫裡,實作起來也相當簡單 (1)建立一個庫并設定相應權限 # mysql –p mysql>create database ftpd; mysql>use ftpd; mysql>create table user(name char(20) binary,passwd char(20) binary); mysql>insert into user (name,passwd) values (/'test1/',/'12345/'); mysql>insert into user (name,passwd) values (/'test2/',/'54321/'); mysql>grant select on ftpd.user to [email protected] identified by /'123456/'; mysql>flush privileges; 重新整理權限設定 mysql>quit (2)下載下傳libpam-mysql進行安裝編譯 下載下傳位址如下: http://nchc.dl.sourceforge.net/s ... am_mysql-0.5.tar.gz 假設我們把它放在了/home/xuchen目錄下 # cd /home/xuchen # tar xzvf pam_mysql-0.5.tar.gz # cd pam_mysql # make # cp pam_mysql.so /lib/security (3)建立PAM認證資訊 # vi /etc/pam.d/ftp ,内容如下 auth required /lib/security/pam_mysql.so user=ftpd passwd=123456 host=localhost db=ftpd table=user usercolumn=name passwdcolumn=passwd crypt=0 account required /lib/security/pam_mysql.so user=ftpd passwd=123456 host=localhost db=ftpd table=user usercolumn=name passwdcolumn=passwd crypt=0 注意: crypt= n crypt=0: 明文密碼 crypt=1: 使用crpyt()函數(對應SQL資料裡的encrypt(),encrypt()随機産生salt) crypt=2: 使用MYSQL中的password()函數加密 crypt=3:表示使用md5的散列方式 (4)建立本地虛拟使用者 # useradd -d /home/ftpd -s /sbin/nologin ftpd (5)下面就差修改vsftpd.conf檔案了,我把我的提供給大家參考吧:) # vi /etc/vsftpd-pam1.conf anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES chroot_local_user=YES guest_enable=YES guest_username=ftpd listen=YES listen_port=21 pasv_enable=YES pasv_min_port=30000 pasv_max_port=30999 anon_world_readable_only=NO virtual_use_local_privs=YES #user_config_dir=/etc/vsftpd_user_conf 可以看出,和前面的用db庫來驗證沒有多大差別,其實就是一個東西,一個用mysql來驗證,一個用db庫,我個人比較傾向于用db庫來驗證,在這個環境下,相對于Mysql來說,安全系數更高一點。 (6)# /usr/local/sbin/vsftpd-pam /etc/vsftpd-pam1.conf & //以背景方式啟動 (7)測試連通 # ftp 127.0.0.1 Connected to 127.0.0.1. 220 (vsFTPd 2.0.3) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (127.0.0.1:root): test1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 /"//" ftp> quit 221 Goodbye. 看,成功了!!這樣就實作了mysql的認證方式,很簡單吧?? 4、為FTP增加磁盤配額,進而避免惡意使用者用垃圾資料塞滿你的硬碟 我首先要說的是這個功能是系統自帶的,而不是vsftp 的功能之一,千萬别搞混了。好了,我們先假設我們的系統使用者ftpd的主目錄是/home/ftpd,它是建立在/home分區中,那麼如果我們要對ftpd使用者進行磁盤限額,那我們需要修改/etc/fstab中根分區的記錄,将/home分區的第4個字段改成defaults,usrquota,如下: LABEL=/home /home ext3 defaults,usrquota 1 2 # reboot //重新啟動系統使設定生效 也可以用 # mount -o remount /dev/sda6 ///dev/sda6的挂接點就是/home,這樣可以不用啟動系統。 這裡我還要說明一下,如果我們對一個組進行磁配額,那我們需要增加參數grpquota,例如 LABEL=/home /home ext3 defaults,grpquota 1 2 也可以 LABEL=/home /home ext3 defaults,usrquota,grpquota 1 2 你想怎麼限制都可以,自己組合參數吧。 # quotacheck -avu 說明:a-自動開啟挂載檔案系統的配額,v-顯示資訊,u-啟用使用者配額or g-啟用組配額 # edquota ftpd //為使用者ftpd設定磁盤配額 OR # edquota -g grp //為組grp設定磁盤配額 系統會自動打開配額檔案,如下: Disk quotas for user ftpd (uid 502): Filesystem blocks soft hard inodes soft hard /dev/sda6 424 0 0 13 0 0 第一列是啟用了配額的檔案系統的名稱。第二列顯示了使用者目前使用的塊數,機關為KB。随後的兩列用來設定使用者在該檔案系統上的軟硬塊限度。inodes 列顯示了使用者目前使用的i節點數量。最後兩列用來設定使用者在該檔案系統上的軟硬i節點限度.硬限是使用者或組群可以使用的磁盤空間的絕對最大值。達到了該限度後,磁盤空間就不能再被使用者或組群使用了。軟限定義可被使用的最大磁盤空間量。和硬限不同的是,軟限可以在一段時期内被超過。這段時期被稱為過渡期(grace period),預設七天的超越。過渡期可以用秒鐘、分鐘、小時、天數、周數、或月數表示。如果以上值中的任何一個被設定為 0,那個限度就不會被設定。我設定了硬塊限度為1KB,是為了測試友善。 # quotaon -avu //打開磁盤配額監控程序,u是使用者g是組,這裡我沒設定g參數 要校驗使用者的配額是否被設定,我們可以使用以下指令: # quota ftpd Disk quotas for user ftpd (uid 502): Filesystem blocks quota limit grace files quota limit grace /dev/sda6 424* 0 1 13 0 0 # edquota –t(-g)來設定過渡期(grace period) //當然隻針對軟限制而言 和另一個 edquota 指令相似,這個指令也會在文本編輯器中打開目前的檔案系統配額: Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/sda6 7days 7days 按你的需要修改後存盤退出 用以下指令顯示磁盤配額使用狀态 # repquota -a 或 repquota /dev/sda6(使用者配額) # repquota -g -a 或 repquota -a /dev/sda6 (組的配額) 如果一切按照你的意思實施了,那麼我們就進行測試了!如下圖4 我們傳了一個>1k的檔案,沒有成功,這樣我們就成功的為使用者ftpd增添了磁盤配額,要是哪一天你不想加磁盤配額了,怎麼辦?參看如下指令: 取消某個檔案系統的配額限制 #quotaoff -vug /dev/sda6 //删除home分區的磁盤限額 #删除/etc/fstab中設定配額的部分 修改軟配額的最大超越時間 注意: /,/boot/,/proc,/mnt/cdrom等不要使用配額,沒用。而且磁盤配額不适合FAT和FAT32系統。 以後當新設定了某個使用者的配額,可以使用如下指令,馬上生效。 # quotacheck -auvgm --是不嘗試重新挂載檔案系統 備注: 1、vsftpd配置參數詳細整理 #接受匿名使用者 anonymous_enable=YES #匿名使用者login時不詢問密碼 no_anon_password=YES #匿名使用者主目錄 anon_root=(none) #接受本地使用者 local_enable=YES #本地使用者主目錄 local_root=(none) #如果匿名使用者需要密碼,那麼使用banned_email_file裡面的電子郵件位址的使用者不能登入 deny_email_enable=YES #僅在沒有pam驗證版本時有用,是否檢查使用者有一個有效的shell來登入 check_shell=YES #若啟用此選項,userlist_deny選項才被啟動 userlist_enable=YES #若為YES,則userlist_file中的使用者将不能登入,為NO則隻有userlist_file的使用者可以登入 userlist_deny=NO #如果和chroot_local_user一起開啟,那麼使用者鎖定的目錄來自/etc/passwd每個使用者指定的目錄(這個不是很清楚,很哪位熟悉的指點一下) passwd_chroot_enable=NO #定義匿名登入的使用者名稱。預設值為ftp。 ftp_username=FTP #################使用者權限控制############### #可以上傳(全局控制). write_enable=YES #本地使用者上傳檔案的umask local_umask=022 #上傳檔案的權限配合umask使用 #file_open_mode=0666 #匿名使用者可以上傳 anon_upload_enable=NO #匿名使用者可以建目錄 anon_mkdir_write_enable=NO 匿名使用者其它的寫權利(更改權限?) anon_other_write_enable=NO 如果設為YES,匿名登入者會被允許下載下傳可閱讀的檔案。預設值為YES。 anon_world_readable_only=YES #如果開啟,那麼所有非匿名登陸的使用者名都會被切換成guest_username指定的使用者名 #guest_enable=NO 所有匿名上傳的檔案的所屬使用者将會被更改成chown_username chown_uploads=YES 匿名上傳檔案所屬使用者名 chown_username=lightwiter #如果啟動這項功能,則所有列在chroot_list_file之中的使用者不能更改根目錄 chroot_list_enable=YES #允許使用/"async ABOR/"指令,一般不用,容易出問題 async_abor_enable=YES 管控是否可用ASCII 模式上傳。預設值為NO。 ascii_upload_enable=YES #管控是否可用ASCII 模式下載下傳。預設值為NO。 ascii_download_enable=YES #這個選項必須指定一個空的資料夾且任何登入者都不能有寫入的權限,當vsftpd 不需要file system 的權限時,就會将使用者限制在此資料夾中。預設值為/usr/share/empty secure_chroot_dir=/usr/share/empty ###################逾時設定################## #空閑連接配接逾時 idle_session_timeout=600 #資料傳輸逾時 data_connection_timeout=120 #PAVS請求逾時 ACCEPT_TIMEOUT=60 #PROT模式連接配接逾時 connect_timeout=60 ################伺服器功能選項############### #開啟日記功能 xferlog_enable=YES #使用标準格式 xferlog_std_format=YES #當xferlog_std_format關閉且本選項開啟時,記錄所有ftp請求和回複,當調試比較有用. #log_ftp_protocol=NO #允許使用pasv模式 pasv_enable=YES #關閉安全檢查,小心呀. #pasv_promiscuous+NO #允許使用port模式 #port_enable=YES #關閉安全檢查 #prot_promiscuous #開啟tcp_wrappers支援 tcp_wrappers=YES #定義PAM 所使用的名稱,預設為vsftpd。 pam_service_name=vsftpd #當伺服器運作于最底層時使用的使用者名 nopriv_user=nobody #使vsftpd在pasv指令回複時跳轉到指定的IP位址.(伺服器聯接跳轉?) pasv_address=(none) #################伺服器性能選項############## #是否能使用ls -R指令以防止浪費大量的伺服器資源 #ls_recurse_enable=YES #是否使用單程序模式 #one_process_model #綁定到listen_port指定的端口,既然都綁定了也就是每時都開着的,就是那個什麼standalone模式 listen=YES #當使用者登入後使用ls -al 之類的指令查詢該檔案的管理權時,預設會出現擁有者的UID,而不是該檔案擁有者的名稱。若是希望出現擁有者的名稱,則将此功能開啟。 text_userdb_names=NO #顯示目錄清單時是用本地時間還是GMT時間,可以通過mdtm指令來達到一樣的效果 use_localtime=NO #測試平台優化 #use_sendfile=YES ################資訊類設定################ #login時顯示歡迎資訊.如果設定了banner_file則此設定無效 ftpd_banner=歡迎來到湖南三辰Fake-Ta FTP 網站. #允許為目錄配置顯示資訊,顯示每個目錄下面的message_file檔案的内容 dirmessage_enable=YES #顯示會話狀态資訊,關! #setproctitle_enable=YES ############## 檔案定義 ################## #定義不能更改使用者主目錄的檔案 chroot_list_file=/etc/vsftpd/vsftpd.chroot_list #定義限制/允許使用者登入的檔案 userlist_file=/etc/vsftpd/vsftpd.user_list #定義登入資訊檔案的位置 banner_file=/etc/vsftpd/banner #禁止使用的匿名使用者登陸時作為密碼的電子郵件位址 banned_email_file=/etc/vsftpd.banned_emails #日志檔案位置 xferlog_file=/var/log/vsftpd.log #目錄資訊檔案 message_file=.message ############## 目錄定義 ################# #定義使用者配置檔案的目錄 user_config_dir=/etc/vsftpd/userconf #定義本地使用者登陸的根目錄,注意定義根目錄可以是相對路徑也可以是絕對路徑.相對路徑是針對使用者家目錄來說的. local_root=webdisk #此項設定每個使用者登陸後其根目錄為/home/username/webdisk #匿名使用者登陸後的根目錄 anon_root=/var/ftp #############使用者連接配接選項################# #可接受的最大client數目 max_clients=100 #每個ip的最大client數目 max_per_ip=5 #使用标準的20端口來連接配接ftp connect_from_port_20=YES #綁定到某個IP,其它IP不能通路 listen_address=192.168.0.2 #綁定到某個端口 #listen_port=2121 #資料傳輸端口 #ftp_data_port=2020 #pasv連接配接模式時可以使用port 範圍的上界,0 表示任意。預設值為0。 pasv_max_port=0 #pasv連接配接模式時可以使用port 範圍的下界,0 表示任意。預設值為0。 pasv_min_port=0 ##############資料傳輸選項################# #匿名使用者的傳輸比率(b/s) anon_max_rate=51200 #本地使用者的傳輸比率(b/s) local_max_rate=5120000 ######################################## 别外,如果要對每個使用者進行單獨的控制,隻需要在user_config_dir中建立username檔案,内容為資料傳輸和使用者權利裡面設定個人的合适的選項,使用者自定義檔案同樣适合用pam支援的虛拟使用者 附: FTP 數字代碼的意義 110 重新啟動标記應答。 120 服務在多久時間内ready。 125 資料鍊路埠開啟,準備傳送。 150 檔案狀态正常,開啟資料連接配接端口。 200 指令執行成功。 202 指令執行失敗。 211 系統狀态或是系統求助響應。 212 目錄的狀态。 213 檔案的狀态。 214 求助的訊息。 215 名稱系統類型。 220 新的聯機服務ready。 221 服務的控制連接配接埠關閉,可以登出。 225 資料連結開啟,但無傳輸動作。 226 關閉資料連接配接端口,請求的檔案操作成功。 227 進入passive mode。 230 使用者登入。 250 請求的檔案操作完成。 257 顯示目前的路徑名稱。 331 使用者名稱正确,需要密碼。 332 登入時需要賬号資訊。 350 請求的操作需要進一部的指令。 421 無法提供服務,關閉控制連結。 425 無法開啟資料鍊路。 426 關閉聯機,終止傳輸。 450 請求的操作未執行。 451 指令終止:有本地的錯誤。 452 未執行指令:磁盤空間不足。 500 格式錯誤,無法識别指令。 501 參數文法錯誤。 502 指令執行失敗。 503 指令順序錯誤。 504 指令所接的參數不正确。 530 未登入。 532 儲存檔案需要賬戶登入。 550 未執行請求的操作。 551 請求的指令終止,類型未知。 552 請求的檔案終止,儲存位溢出。 553 未執行請求的的指令,名稱不正确。 2、VSFTPD官方資料翻譯版(不完整版)---摘自中國Linux公社 翻譯了部分VSFTPD的官方資料。 有些知道是什麼意思,但難于翻譯。有些涉及專業的知識,我自己也不懂,隻好按字面翻譯。有些我自己看不懂,隻好盡量翻譯。 如果看了其中一部分覺得糊塗,請參閱官方文擋。 安裝篇 =============== 這個檔案詳細介紹了如何從VSFTPD的.tar.gz分發包開始,建立和安裝并運作VSFTPD。 1)建立VSFTPD 先進入解壓.tar.gz檔案後産生的目錄内。如下: cd vsftpd-2.0.1 編輯/"builddefs.h/"以操作compile-time設定。(tcp_wrappers build,等) 輸入make,回車(如果它不工作請發郵件通知我 . 這将産生一個二進制檔案,你可以驗證一下。如下: [[email protected] vsftpd]   $ ls -l vsftpd -rwxrwxr-x 1 chris chris 61748 Sep 27 00:26 vsftpd 2)滿足VSFTPD安裝所需的一些條件 VSFTPD預設設定需要一個/"nobody/"使用者,如果這個使用者不存在,那麼添加它。如下: [[email protected] root]# useradd nobody useradd: user nobody exists VSFTPD預設設定需要一個空目錄:/usr/share/empty.增加這個目錄,如果它還不存在的話。如下: [[email protected] root]# mkdir /usr/share/empty/ mkdir: cannot create directory `/usr/share/empty/': File exists 如果容許匿名使用者(anonymous),那麼你将需要一個/"ftp/"使用者和其home目錄(這個home目錄不屬于“ftp”使用者,而且“ftp/"使用者也對其沒有寫權限)在你的系統中存在。 以下指令用來建立一個/"ftp/"使用者,如果它還不存在的話。 [[email protected] root]# mkdir /var/ftp/ [[email protected] root]# useradd -d /var/ftp ftp (即使你的/"ftp/"使用者已經存在,完成以下這兩步也是很有好處的:) [[email protected] root]# chown root.root /var/ftp [[email protected] root]# chmod og-w /var/ftp 3)安裝VSFTPD的配置、執行和幫助檔案。 輸入/"make install/"後會将二進制檔案和幫助檔案拷貝到适當的目錄。 你也可以手工拷貝這些檔案: cp vsftpd /usr/local/sbin/vsftpd cp vsftpd.conf.5 /usr/local/man/man5 cp vsftpd.8 /usr/local/man/man8 /"make install/"不會拷貝預設的配置檔案,是以建議你手工拷貝: cp vsftpd.conf /etc daidong注:根據你系統版本的不同,也可能是 cp vsftpd.conf /etc/vsftpd 4)測試 (無inetd影響) VSFTPD能運作在獨立模式(standalone)或者通過inetd(xinetd)來啟動。 你能通過inetd來運作vsftpd以更好地控制它。但我們在首次運作時不這麼做,以便檢查系統是否現在配置正常。 編輯/etc/vsftpd.conf(daidong注:也可能是/etc/vsftpd/vsftpd.conf),并在最下面加入以下這一行: listen=YES 這将告訴VSFTPD不要從inetd啟動。 OK,現在試着啟動FTP。 以ROOT登入。 确定你沒有運作其他FTP服務(否則VSFTPD不能占用FTP所需的21端口)。 運作那個二進制檔案,如下: [[email protected] root]# /usr/local/sbin/vsftpd & [1] 2104 如果一切正常,那麼你将連上FTP伺服器,如下: [[email protected] chris]   $ ftp localhost Connected to localhost (127.0.0.1). 220 (vsFTPd 1.1.1) Name (localhost:chris): ftp 331 Please specify the password. Password: 230 Login successful. Have fun. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (127,0,0,1,229,133) 150 Here comes the directory listing. d--x--x--x 2 0 0 4096 Jan 14 2002 bin d--x--x--x 2 0 0 4096 Apr 21 20:52 etc drwxr-xr-x 2 0 0 4096 Apr 21 20:52 lib drwxr-sr-x 2 0 50 4096 Jul 26 22:58 pub 226 Directory send OK. ftp> 5)從inetd或者類似方式啟動(官方推薦使用standalone方式) 你也許想通過inetd或者類似方式啟動VSFTPD,因為這能給你更多的感受。例如xinetd就有很多的設定。 (注意:VSFTPD的内在機制屏蔽了xinetd的大多數的有用的設定)。 如果使用标準的/"inetd/",你需要編輯/etc/inetd.conf,在其中加入以下一行: ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/vsftpd (确定你删除或者注釋掉一些已存在的FTP服務配置行。如果你沒有安裝tcp_wrappers,或者不想使用它們,那麼請去掉/usr/sbin/tcpd part). inetd需要指定并重新載入它的配置檔案: kill -SIGHUP `pidof inetd` 如果你想使用/"xinetd/",請參閱我們提供的範例 /EXAMPLE/INTERNET_SITE/README. 而其他範例檔案将告訴你如何調配出更強大的xinetd功能。 6)為本地登入配置PAM檔案(可選) 如果你在一台激活了PAM的裝置上運作VSFTPD,你需要提供一個 /etc/pam.d/ftp 檔案。否則非匿名使用者将無法登入伺服器。 (注:如果你的PAM版本比較老,那麼這個檔案也許是 /etc/pam.conf). 做為一個标準設定,你可以拷貝一個已提供的範例檔案,如下: cp RedHat/vsftpd.pam /etc/pam.d/ftp 7)自定義你的配置檔案 完成以上的配置後,建議你安裝一個配置檔案。預設的配置檔案位置是/etc/vsftpd.conf. 在VSFTPD軟體分發包内有一個範例配置檔案。 你可以拷貝其為/etc/vsftpd.conf以做進一步修改。 cp vsftpd.conf /etc (daidong注:也可能是 cp vsftpd.conf /etc/vsftpd ). 這個預設配置即不容許本地登入也不容許匿名使用者上傳,也許你希望更改這個配置。 其它 =================== 測試平台 (已認證) -流行的,功能完善的平台都能測試通過。在以下平台的較新版本,VSFTPD工作得很好。在其大部分較早的版本下,也運作正常。 - RedHat Linux - RedHat Enterprise Linux - Solaris / GNU tools (Solaris 8 or newer) - SuSE Linux - Debian Linux - OpenBSD - FreeBSD - NetBSD - HP-UX / GNU tools - IRIX / GNU tools - Mac OS X (note; older versions have setgroups() problem. 10.3.4 reported OK) 虛拟使用者1 ============= 這個例子示範了如何為虛拟使用者設定VSFTPD/PAM。 虛拟使用者是一個在系統中并不作為一個登入實體而存在的使用者。使用虛拟使用者比使用真實的使用者更安全,因為這個賬号隻能用于FTP伺服器。 虛拟使用者經常用來提供給不大可信任的使用者通路某些資源,而這些資源通常是其他普通使用者不能通路的。 1)建立虛拟使用者資料庫 我們将使用pam_userdb來認證虛拟使用者。這需要提供一個“db/"格式(一種通用資料庫格式)的使用者名/密碼檔案。 建立一個/"db/"格式的檔案,首先要建立一個标準文本檔案,并把使用者名,密碼以豎直排列方式輸入。如logins.txt: tom foo fired bar 這個例子中,tom使用者的密碼是foo.fired使用者的密碼是bar. 以ROOT登入,建立一個資料庫檔案,如下: db_load -T -t hash -f logins.txt /etc/vsftpd_login.db (這要求berkeley db程式已經安裝) (注:一些系統也許安裝了多個版本的/"db/",是以某些情況下你可能使用/"db3_load/"才是正确的。對于一些 Debian系統就是這樣。 關鍵在于要讓pam_userdb相信它的登入資料庫是哪一個db版本所産生(一般都是db3,盡管你的系統裡可能安裝的是db4).) 這将建立/etc/vsftpd_login.db檔案。顯然,你希望設定這個檔案的權限: chmod 600 /etc/vsftpd_login.db 要了解更多關于維護你的登入資料庫的資訊,請在/"berkeley DB/"察看相關文檔: http://www.sleepycat.com/docs/utility/index.html 2)用你的新資料庫建立一個PAM檔案 請參考範例vsftpd.pam,它包含2行: auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login account required /lib/security/pam_userdb.so db=/etc/vsftpd_login 這是告訴PAM用新的資料庫去驗證使用者。把這個PAM檔案拷貝到PAM目錄,一般是/etc/pam.d cp vsftpd.pam /etc/pam.d/ftp 3)為虛拟使用者設定home目錄 useradd -d /home/ftpsite virtual ls -ld /home/ftpsite (which should give): drwx------ 3 virtual virtual 4096 Jul 30 00:39 /home/ftpsite 我們已經建立了一個名叫/"virtual/"的使用者,home目錄是/"/home/ftpsite/". 我們拷貝一些東西到這個下載下傳目錄: cp /etc/hosts /home/ftpsite chown virtual.virtual /home/ftpsite/hosts 4)建立你的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 這将把虛拟使用者鎖定在我們在以上設定的/home/ftpsite目錄内。 guest_enable=YES guest_username=virtual guest_enable非常重要-它激活了虛拟使用者!而guest_username說明所有的虛拟使用者都對應我們在上面設定的真實使用者:“virtual/". 這同時确定了虛拟使用者在檔案系統中的位置,也就是說,虛拟使用者的home目錄即/"virtual/"使用者的home目錄:/home/ftpsite。 listen=YES listen_port=10021 這讓VSFTPD以獨立模式(standalone)運作,而不是從inetd方式啟動。也就是說,你運作VSFTPD可執行檔案就啟動了FTP服務。 同時也讓VSFTPD啟用非标準端口10021來監聽FTP請求(FTP一般使用21端口)。 pasv_min_port=30000 pasv_max_port=30999 這設定了被動模式的FTP請求端口。當你配置了一個防火牆的時候,這個配置就很好用。 拷貝範例配置檔案到/etc cp vsftpd.conf /etc/ (daidong注:也可能是/etc/vsftpd) 5)啟動VSFTPD 到VSFTPD二進制檔案所在的目錄,輸入: ./vsftpd 如果一切正常,這個指令将生效。否則,你将會看到一些錯誤資訊的回報。 6)測試 啟動另一個會話。(或者ctrl-z,再輸入/"bg/",讓VSFTPD在背景運作)。 這是一個FTP會話的例子: ftp localhost 10021 Connected to localhost (127.0.0.1). 220 ready, dude (vsFTPd 1.1.0: beat me, break me) Name (localhost:chris): tom 331 Please specify the password. Password: 230 Login successful. Have fun. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 /"//" ftp> ls 227 Entering Passive Mode (127,0,0,1,117,135) 150 Here comes the directory listing. 226 Transfer done (but failed to open directory). ftp> size hosts 213 147 ftp> 注釋: 密碼是/"foo/" 出現”failed to open directory“的話,别擔心。這是因為/home/ftpsite目錄不容許被任意浏覽。 (我們可以更改anon_world_readable_only=NO以消除告警,但為了安全,還是保留這個配置)。 我們能通過size指令看到我們已經通路了被我們拷貝到這裡的/"hosts/"檔案。 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=10021 pasv_min_port=30000 pasv_max_port=30999 虛拟使用者2 =============== 這個例子将示範如何擴充“VIRTUAL_USERS”那個範例,進而實作更複雜一點的配置。 讓我們假定我們需要2種不同的虛拟使用者:一種隻能浏覽并下載下傳資源,另一種能上傳檔案并浏覽站内資源。 要激活這個設定,我們将使用VSFTPD的強大的“單個使用者配置”功能(是V1.1.0後出現的新功能)。 在前一個虛拟使用者範例中,我們建立了2個使用者-tom和fred. 我們将實作fred有寫權限以上傳新檔案,同時tom隻能下載下傳檔案。 1)激活單個使用者配置功能。 要激活這個功能,需要增加以下配置行到配置檔案: user_config_dir=/etc/vsftpd_user_conf 并且建立目錄: mkdir /etc/vsftpd_user_conf 2)授予tom讀取所有檔案和目錄的權限 在上一個例子的最後,我們注意到虛拟使用者隻能浏覽所有的完全可讀屬性的目錄和檔案。我們使/home/ftpsite完全可讀,而且被上傳的檔案也 賦予了完全可讀的權限(daidong注:意思是說這樣虛拟使用者就能讀取所有的檔案了)。但實作這個目的的另一個方法是授權tom能下載下傳那些非完全可讀的檔案。 對于tom,他的配置檔案中需要修改一個設定: anon_world_readable_only: 設為/"anon_world_readable_only=NO/" > /etc/vsftpd_user_conf/tom (daidong注:既把預設配置修改了anon_world_readable_only後,複制到/etc/vsftpd_user_conf下,名字為tom) 驗證一下結果-以tom登入,“ls”将傳回一個目錄清單。如果以fred登入将不會如此。 注意:重新開機VSFTPD以啟用配置檔案/etc/vsftpd.conf(進階使用者也可以發送SIGHUP給VSFTPD的監聽程序). 3)授予freg讀取所有檔案/目錄并建立新檔案/目錄的權限,但讓他不能對已存在的檔案/目錄進行操作. echo /"anon_world_readable_only=NO/" > /etc/vsftpd_user_conf/fred echo /"write_enable=YES/" >> /etc/vsftpd_user_conf/fred echo /"anon_upload_enable=YES/" >> /etc/vsftpd_user_conf/fred 驗證一下-以tom登入,将不能上傳,而fred就可以. 試圖删除一個檔案--噢,你們倆都不行! 配置詳解 ============= VSFTPD.CONF.5 ================ 名字 vsftpd.conf :VSFTPD的配置檔案 描述: vsftpd.conf 用來控制VSFTPD的各項功能。預設狀态下,它的位置是/etc/vsftpd.conf。 (譯者注:也許老的LINUX版本下,配置檔案是這個位置,但新的LINUX版本,例如FC2,配置檔案是在/etc/vsftpd目錄下。 但是也很可能和安裝方式有關,RPM包安裝,配置檔案是/etc/vsftpd.conf. 源碼包安裝:/etc/vsftpd/vsftpd.conf.我不确定。 但以後我不再特别指出了,真累!!) 然而,你也可以通過修改配置行來指定到其它目錄。這一點很有用,因為也許你想使用一些進階inetd功能,例如xinetd,在一個多虛拟主機的機器上調用不同的配置檔案。 格式 VSFTPD.conf 的格式非常簡單,每行要麼是一個注釋,要麼是一個指令。注釋行以#開始并被忽略掉。指令行格式如下: 配置項=參數值 很重要的一點是,這個格式裡不存在任何空格。 預設的,每一個配置項在配置檔案裡都占一編輯行,可以被修改。 布爾選項 參數值的布爾選項可以是: YES或者NO allow_anon_ssl 隻有ss1_enable激活了才可以啟用此項。如果設定為YES,匿名使用者将容許使用安全的SSL連接配接伺服器。 預設值:NO anon_mkdir_write_enable 如果設為YES,匿名使用者将容許在指定的環境下建立新目錄。如果此項要生效,那麼配置write_enable必須被激活,并且匿名使用者必須在其父目錄有寫權限。 預設值:NO anon_other_write_enable 如果設定為YES,匿名使用者将被授予較大的寫權限,例如删除和改名。一般不建議這麼做,除非想完全授權。 預設值:NO anon_upload_enable 如果設為YES,匿名使用者就容許在指定的環境下上傳檔案。如果此項要生效,那麼配置write_enable必須激活。并且匿名使用者必須在相關目錄有寫權限。 預設值:NO anon_world_readable_only 啟用的時候,匿名使用者隻容許下載下傳完全可讀的檔案,這也就容許了ftp使用者擁有對檔案的所有權,尤其是在上傳的情況下。 預設值:YES anonymous_enable 控制是否容許匿名使用者登入。如果容許,那麼“ftp”和“anonymous”都将被視為“anonymous/"而容許登入。 預設值:YES ascii_download_enable 啟用時,使用者下載下傳時将以ASCII模式傳送檔案。 預設值:NO ascii_upload_enable 啟用時,使用者上傳時将以ASCII模式傳送檔案。 預設值:NO async_abor_enable 啟用時,一個特殊的FTP指令/"async ABOR”将容許使用。隻有不正常的FTP用戶端要使用這一點。而且,這個功能又難于操作,是以, 預設是把它關閉了。但是,有些用戶端在取消一個傳送的時候會被挂死(daidong注:估計是用戶端無響應了),那你隻有啟用這個功能才能避免這種情況。 預設值:NO background 啟用時,并且VSFTPD是“listen”模式啟動的(daidong注:就是standalone模式),VSFTPD将把監聽程序置于背景。但通路VSFTPD時,控制台将立即被傳回到SHELL。 預設值:NO check_shell 注意:這個選項隻對非PAM結構的VSFTPD才有效。如果關閉,VSFTPD将不檢查/etc/shells以判定本地登入的使用者是否有一個可用的SHELL。 預設值:YES chmod_enable 啟用時,将容許使用SITE CHMOD指令。注意,這隻能用于本地使用者。匿名使用者絕不能使用SITE CHMOD。 預設值:YES chown_uploads 如果啟用,是以匿名使用者上傳的檔案的所有者将變成在chown_username裡指定的使用者。這對管理FTP很有用,也許也對安全有益。 預設值:NO chroot_list_enable 如果激活,你要提供一個使用者清單,表内的使用者将在登入後被放在其home目錄,鎖定在虛根下(daidong注:進入FTP後,PWD一下,可以看到目前目錄是/"//",這就是虛根。是FTP的根目錄,并非FTP伺服器系統的根目錄)。如果chroot_local_user設為YES後,其含義會發生一點變化。 在這種情況下,這個清單内的使用者将不被鎖定在虛根下。 預設情況下,這個清單檔案是/etc/vsftpd.chroot_list, 但你也可以通過修改chroot_list_file來改變預設值。 預設值:NO chroot_local_user 如果設為YES,本地使用者登入後将被(預設地)鎖定在虛根下,并被放在他的home目錄下。 警告: 這個配置項有安全的意味,特别是如果使用者有上傳權限或者可使用SHELL的話。在你确定的前提下,再啟用它。 注意,這種安全暗示并非隻存在于VSFTPD,其實是廣泛用于所有的希望把使用者鎖定在虛根下的FTP軟體。 預設值:NO connect_from_port_20 這用來控制伺服器是否使用20端口号來做資料傳輸。為安全起見,有些客戶堅持啟用。相反,關閉這一項可以讓VSFTPD更加大衆化。 預設值:NO (但在範例配置檔案中,啟用了,即YES) deny_email_enable 如果激活,你要提供一個關于匿名使用者的密碼E-MAIL表(daidong注:我們都知道,匿名使用者是用郵件位址做密碼的)以阻止以這些密碼登入的匿名使用者。 預設情況下,這個清單檔案是/etc/vsftpd.banner_emails,但你也可以通過設定banned_email_file來改變預設值。 預設值:NO dirlist_enable 如果設定為NO,所有的清單指令(daidong注:如ls)都将被傳回“permission denied”提示。 預設值:YES dirmessage_enable 如果啟用,FTP伺服器的使用者在首次進入一個新目錄的時候将顯示一段資訊。預設情況下,會在這個目錄中查找.message檔案,但你也可以 通過更改message_file來改變預設值。 預設值:NO (但在配置範例檔案中啟用了它) download_enable 如果設為NO,下載下傳請求将傳回“permission denied”。 預設值:YES dual_log_enable 如果啟用,兩個LOG檔案會各自産生,預設的是/var/log/xferlog和/var/log/vsftpd.log。前一個是wu-ftpd格式的LOG,能被通用工具分析。 後一個是VSFTPD的專用LOG格式。 預設值: NO force_dot_files 如果激活,即使用戶端沒有使用“a”标記,(FTP裡)以.開始的檔案和目錄都會顯示在目錄資源清單裡。但是把/"./"和/"../"不會顯示。(daidong注:即LINUX下 的目前目錄和上級目錄不會以‘.’或‘..’方式顯示)。 預設值:NO force_local_data_ssl 隻有在ssl_enable激活後才能啟用。如果啟用,所有的非匿名使用者将被強迫使用安全的SSL登入以在資料線路上收發資料。 預設值:YES force_local_logins_ssl 隻有在ssl_enable激活後才能啟用。如果啟用,所有的非匿名使用者将被強迫使用安全的SSL登入以發送密碼。 預設值:YES guest_enable 如果啟用,所有的非匿名使用者登入時将被視為”遊客“,其名字将被映射為guest_username裡所指定的名字。 預設值:NO hide_ids 如果啟用,目錄資源清單裡所有使用者群組的資訊将顯示為/"ftp/". 預設值:NO listen 如果啟用,VSFTPD将以獨立模式(standalone)運作,也就是說可以不依賴于inetd或者類似的東東啟動。直接運作VSFTPD 的可執行檔案一次,然後VSFTPD就自己去監聽和處理連接配接請求了。 預設值:NO listen_ipv6 類似于listen參數的功能,但有一點不同,啟用後VSFTPD會去監聽IPV6套接字而不是IPV4的。這個設定和listen的設定互相排斥。 預設值:NO local_enable 用來控制是否容許本地使用者登入。如果啟用,/etc/passwd裡面的正常使用者的賬号将被用來登入。 預設值:NO log_ftp_protocol 啟用後,如果xferlog_std_format沒有被激活,所有的FTP請求和回報資訊将被紀錄。這常用于調試(debugging)。 預設值:NO ls_recurse_enable 如果啟用,/"ls -R/"将被容許使用。這是為了避免一點點安全風險。因為在一個大的站點内,在目錄頂層使用這個指令将消耗大量資源。 預設值:NO no_anon_password 如果啟用,VSFTPD将不會向匿名使用者詢問密碼。匿名使用者将直接登入。 預設值:NO no_log_lock 啟用時,VSFTPD在寫入LOG檔案時将不會把檔案鎖住。這一項一般不啟用。它對一些工作區作業系統問題,如Solaris / Veritas檔案系統共存時有用。 因為那在試圖鎖定LOG檔案時,有時候看上去象被挂死(無響應)了。(daidong注:這我也不是很了解。是以翻譯未必近乎原意。原文如下:It exists to workaround operating system bugs such as the Solaris / Veritas filesystem combination which has been observed to sometimes exhibit hangs trying to lock log files.) 預設值:NO one_process_model 如果你的LINUX

繼續閱讀