Vsftpd配置詳解之配置文件詳解
配置文件詳解:vsftpd配置文件只有一個,就是/etc/vsftpd/vsftpd.conf,上一小節我們就已經加入了兩行參數了。在修改了配置文件之后,需要重新啟動服務才能生效。下面我們就來詳細解釋其中的參數。
1. 匿名及本地用戶共同參數
- write_enable=yes/no //是否允許全局可寫
- download_enable=yes/no //是否允許所有用戶可以下載
- dirlist_enable=yes/no //是否允許所有用戶可以瀏覽(列出文件列表)
我們將write_enable=no、download_enable=yes兩行加入配置文件,再測試:
- # ftp 127.0.0.1
- ……
- ftp> ls
- 227 Entering Passive Mode (127,0,0,1,230,192)
- 150 Here comes the directory listing.
- -rw-r--r-- 1 0 0 4 May 13 11:43 ioo_file
- 226 Directory send OK.
- ftp> get ioo_file
- local: ioo_file remote: ioo_file
- 227 Entering Passive Mode (127,0,0,1,160,26)
- 150 Opening BINARY mode data connection for ioo_file (4 bytes).
- 226 File send OK.
- 4 bytes received in 0.062 seconds (0.063 Kbytes/s)
- ftp> put scsrun.log
- local: scsrun.log remote: scsrun.log
- 227 Entering Passive Mode (127,0,0,1,176,84)
- 550 Permission denied.
如上所示,我們看到了ftp上的文件,可以下載文件,但不可以上傳文件。如果把dirlist_enable=no 也加上,便無法看到ftp上的文件(無法列出文件列表),但是如果你知道具體的文件名及路徑,仍然可以下載文件的。實驗結果就不貼上來了。
再看下一組:
ftpd_banner=歡迎語字符串
banner_file=文件
dirmessage_enable=yes/no
message_file=文件
參數ftpd_banner設置的歡迎語字符串將在登錄時看到,如果想做出多行歡迎語,就要把內容單獨存為banner_file參數指定的文件,應用中這兩個參數二選一即可。dirmessage_enable和message_file參數是進入某個目錄后顯示的歡迎信息,用法與前兩個參數一樣。
2. 本地用戶管理
2.1 本地用戶常規配置參數
- local_root=/path //本地用戶登陸服務器后直接進入的目錄
- local_umask=八進制數 //本地用戶上傳檔案權限的 umask值
- local_max_rate=數字 //本地用戶傳輸速率單位為 bps
- chmod_enable=yes/no // 是否允許本地用戶改變ftp 服務器上檔案的權限
我們知道使用本地用戶登錄ftp后進入的是用戶的主目錄,locla_root這個參數允許我們登錄服務器后直接進入其它的目錄。此功能結合Apache 的userdir模塊來實現網站內容更新上傳是非常方便的。Linux系統中的任何文件都是有權限值的,上傳的文件也不例外,這個默認的權限值就由 local_umask參數指定。其計算方法為:
默認建立文件的權限+local_umask =0666
默認建立目錄的權限+local_umask =0777
由此我們可以看出,上傳的文件無論如何都不可能有執行權限的。這也是vsftp安全性的體現啊!
local_max_rate參數限定了數據傳輸速率,包括上傳和下載。chmod_enable參數限制用戶是否可以改變檔案權限(使用chmod, site命令)。
我們可能想讓為每個用戶進行單獨的配置,或者想配置個別用戶的權限。這樣就得為每個本地用戶配置一個文件。這些配置文件必須是在同一個目錄下,所以我們可以設置本地用戶單獨配置文件所在的目錄:
user_config_dir=/path //用戶單獨配置文件所在目錄
我們在配置文件中加入以下幾行:
- local_umask=077
- local_max_rate=20000
- user_config_dir=/etc/vsftpd/vsftpd_user_dir
給予用戶上傳權限:
- write_enable=yes
新建一個普通用戶ioo,再新建一個目錄/etc/vsftpd/vsftpd_user_dir,其下建一個文件ioo,里面加入下面幾行:
- local_root=/var/www/html
- local_umask=022
- local_max_rate=50000
把/var/www/html的所有者改為ioo:
- chown ioo:ioo /var/www/html
測試之后我們發現,使用ioo用戶登錄后就直接進入var/www/html了,上傳的文件(夾)權限為644(755),傳輸速率為50k,自定義的設置覆蓋了主配置文件中的設置。
2.2 本地用戶登錄限制參數
在我們的服務器上本來就有很多的本地用戶,這些本地用戶應該都是可以登陸 ftp 服務器的。但是 ftp 服務是以明文傳輸的,如果允許管理員登陸的話,這種機制顯然不好。又或者我們想讓一些本地用戶可以登陸,或者一些不能登陸我們的 ftp 服務器,這樣我們可以怎么設置呢?
Vsftpd 提供了 userlist 功能。它使用一個文件來保存一些用戶名,然后根據配置來決定是文件中的用戶可以登錄還是文件中沒有列出的用戶可以登陸 ftp 服務器,這樣就對本地用戶的登陸起到了限制作用。其配置參數有如下幾個:
- userlist_enable=yes/no //是否啟用 userlist 功能模塊
- userlist_deny=yes/no //是否拒絕 userlist 文件中用戶登陸 ftp 服務
- userlist_file=/path/to/file //指定的 userlist 文件名
當第1個參數值為yes時,第2、3行才起作用。我們將配置文件加上如下3行:
- userlist_enable=yes
- userlist_deny=yes
- userlist_file=/etc/vsftpd/vsftpd.userlist
然后再新建一個文件/etc/vsftpd/vsftpd.userlist,在里面加入用戶名,每個用戶名一行,比如我這里加入用戶root,再登錄服務時出現以下信息:
- # ftp 127.0.0.1
- Connected to 127.0.0.1.
- ……
- Name (127.0.0.1:root): root
- 530 Permission denied.
- Login failed.
root用戶已經不能登錄了,在輸入密碼之前就被拒絕,但其它用戶還可以登錄的。如果把userlist_deny的值改為no,則只有文件中的用戶才可以登錄服務器。
2.3 本地用戶的根目錄參數
大家再來看下面這一段:
- # ftp 127.0.0.1
- ……
- Name (127.0.0.1:root): ioo
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> pwd
- 257 "/home/ioo"
- ftp> cd /
- 250 Directory successfully changed.
- ftp> ls
- 227 Entering Passive Mode (127,0,0,1,163,193)
- 150 Here comes the directory listing.
- drwxr-xr-x 2 0 0 4096 May 12 21:22 bin
- drwxr-xr-x 3 0 0 4096 Apr 30 19:57 boot
- drwxr-xr-x 12 0 0 3840 May 13 10:29 dev
- ……
是不是感到吃驚了!我們用本地用戶登錄ftp服務器,卻可以看到整個服務器的目錄和文件,甚至還可以把/etc/passwd文件下載下來,這是非常不安全的,我們應該禁止這個功能,限制用戶只能在自己的目錄里瀏覽,這就要用到chroot功能。看下面三個參數:
- chroot_list_enable=yes/no //是否啟用 chroot_list 文件
- chroot_local_user=yes/no //是否限制本地用戶的根目錄為自己的主目錄
- chroot_list_file=/path/to/file //設置 chrootlist 文件名
我們新建一個用戶woo,再新建一個文件/etc/vsftpd/vsftpd.chroot_list,其中加入woo。然后在配置文件中添加以下幾行:
- chroot_list_enable=yes
- chroot_local_user=yes
- chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
登錄服務器測試:
- # ftp 127.0.0.1
- ……
- Name (127.0.0.1:root): woo
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> pwd
- 257 "/home/woo"
- Name (127.0.0.1:root): ioo
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> pwd
- 257 "/"
#p#
我們看到,在文件中的用戶woo根目錄仍然是系統根目錄,但文件外的用戶根目錄已經變成了“/”,就是說列在文件外的用戶已經不能在自己主目錄范圍外瀏覽了。
更改chroot_list_enable和chroot_local_user的值,得到以下幾種組合:
參數
取值
取值
取值
取值
chroot_list_enable
yes
yes
no
no
chroot_local_user
yes
no
yes
no
意義
文件中列出的用戶根目錄為系統根目錄,其它用戶根目錄為自己主目錄。
文件中列出的用戶根目錄為自己主目錄,其它用戶根目錄為系統根目錄。
全部用戶根目錄都是自己主目錄。
全部用戶根目錄都是系統根目錄。
3. 匿名用戶參數
我們可以認為,本地用戶進入自己主目錄本身就應有比較大的權限,所以我們看到本地用戶受限的語句不多。但是匿名用戶通常涉及到一個公開、公共的互聯網環境,所以限制匿名用戶的權限語句就比較多,限制也比較細致。看看這一組參數:
- anon_upload_enable=yes/no //是否允許匿名用戶上傳
- anon_mkdir_write_enable=yes/no //是否允許匿名用戶建立文件夾
- anon_other_write_enable=yes/no //是否允許匿名用戶可以使用除了建立文件夾和上傳文件以外其他的ftp寫操作命令。例如:delete、rename 等等
- anon_world_readable_only=yes/no //匿名用戶是否允許下載所有用戶都可以訪問的文件
我們先把配置文件清理一下,現在配置文件只有下面幾行:
- listen=yes
- anonymous_enable=yes
- write_enable=yes
- download_enable=yes
- dirlist_enable=yes
- anon_upload_enable=yes
- anon_mkdir_write_enable=yes
- anon_other_write_enable=yes
我們希望匿名用戶有上傳文件的權限,但這里還只是在ftp服務里給了寫權限,還必須在文件權限考慮實現。于是我們給/var/ftp加上寫權限:
- chmod a+w /var/ftp
然后登錄服務器:
- # ftp 127.0.0.1
- ……
- Name (127.0.0.1:root): ftp
- 331 Please specify the password.
- Password:
- 500 OOPS: vsftpd: refusing to run with writable anonymous root
- Login failed.
- 421 Service not available, remote server has closed connection
結果我們連服務器都登陸不了了!這是因為vsftpd出于在安全方面的考慮,不允許匿名用戶對根目錄有寫權限。為此,我們只有去掉/var/ftp的寫權限,再在其中新建一個目錄,給予其寫權限,讓匿名用戶上傳文件到這個目錄中。
- # chmod 755 /var/ftp
- # mkdir /var/ftp/upload
- # chmod 777 /var/ftp/upload
現在我們可以匿名在upload里上傳文件、建立文件夾、還可以刪除改名等,但是卻無法將上傳的文件下載回來。如果你上傳的文件是在一個新建的文件夾里,那么上傳的文件不但下載不下來,而且連看都看不到:
- ftp> mkdir asm
- 257 "/upload/asm" created
- ftp> cd asm
- 250 Directory successfully changed.
- ftp> put file1
- local: file1 remote: file1
- 227 Entering Passive Mode (127,0,0,1,135,56)
- 150 Ok to send data.
- 226 File receive OK.
- 5 bytes sent in 0.063 seconds (0.077 Kbytes/s)
- ftp> get file1
- local: file1 remote: file1
- 227 Entering Passive Mode (127,0,0,1,20,101)
- 550 Failed to open file.
- ftp> ls
- 227 Entering Passive Mode (127,0,0,1,133,186)
- 150 Here comes the directory listing.
- 226 Transfer done (but failed to open directory).
- ftp>
這就要研究anon_world_readable_only這個參數了,它的默認值是yes。如果其值為yes,則匿名用戶只可以下載所有用戶都可訪問的文件。比如:
- # ll
- total 40
- -rw----r-- 1 ftp ftp 34935 05-13 17:38 install.log
- -rw------- 1 ftp ftp 209 05-13 18:16 scsrun.log
這里install.log文件權限其它位上有r權限,那么這個文件就可以被下載;scsrun.log文件其它位上沒有任何權限,所以這個文件就不能被匿名用戶下載。
因此解決方法有兩個,一是把參數anon_world_readable_only的值改為no;二是把上傳文件默認權限的其它位上加上執行權限,這就用到下面這個參數:
anon_umask=八進制數
這個參數值的計算方法與本地用戶local_umask參數一樣,不在贅述。
在以上的實驗中,大家可能已經注意到匿名用戶上傳的檔案所有者為ftp,這們也可能用下面兩個參數來改變檔案所有者:
- chown_uploads=yes/no //是否開啟修改默認匿名上傳檔案所有者的功能
- chown_username=本地用戶名 //匿名上傳檔案的所有者名
匿名用戶使用任何密碼都是可以登陸服務器的,那么我們可以免了匿名用戶登陸必須輸入密碼的步驟,只要我們在配置文件中加入:
- no_anon_password=yes
匿名用戶的參數還有很多,我們就不一一介紹了
到此,我們已經可以達建出的ftp服務器已經可以滿足很多場合的需要了,如果有要求更加苛刻的場合,那就還需要進一步設置。
【編輯推薦】