以下文章介紹Liunx 環境下vsftpd的三種實現方法
一、前言
Vsftp(Very Secure FTP)是一種在Unix/Linux中非常安全且快速穩定的FTP服務器,目前已經被許多大型站點所采用,如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。Vsftpd的實現有三種方式
1、匿名用戶形式:在默認安裝的情況下,系統只提供匿名用戶訪問
2、本地用戶形式:以/etc/passwd中的用戶名為認證方式
3、虛擬用戶形式:支持將用戶名和口令保存在數據庫文件或數據庫服務器中。相對于FTP的本地用戶形式來說,虛擬用戶只是FTP服務器的專有用戶,虛擬用戶只能訪問FTP服務器所提供的資源,這大大增強系統本身的安全性。相對于匿名用戶而言,虛擬用戶需要用戶名和密碼才能獲取FTP服務器中的文件,增加了對用戶和下載的可管理性。對于需要提供下載服務,但又不希望所有人都可以匿名下載;既需要對下載用戶進行管理,又考慮到主機安全和管理方便的FTP站點來說,虛擬用戶是一種極好的解決方案。
二、獲取最新版的Vsftp程序
代碼:
# 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 /* VSF_BUILDDEFS_H */
將以上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 }'`
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),測試一下,是可以被下載下來的,好了,匿名服務器就說到這里了。
本地用戶形式實現
# 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 /* VSF_BUILDDEFS_H */
將以上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,他的登陸目錄就是自己的主目錄
再測試一個系統用戶,那我們先建立一個用戶名叫sss的
# useradd sss
# passwd sss
Changing password for user sss.
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): sss
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/sss"
ftp> quit
221 Goodbye.
我們看到sss用戶可以登陸到ftp,他的登陸目錄也是自己的主目錄。哈哈,又完成了!
高級配置
細心的朋友可能已經看出來如果我們不支持PAM認證方式,那么本地用戶就可以登陸,而默認編譯的vsftpd支持PAM認證方式,所以是不支持本地用戶登陸的。恩,從這點說,這也是vsftp安全的一個表現----禁止本地用戶登陸。
我們登陸后進行測試,傳一個文件上去,得,失敗了,那下載個文件下來吧,恩,這是成功的(見圖2),而且我們發現我們可以進入到系統根目錄(見圖3),這樣很危險。
那么改配置文件吧,為了測試方便,我們先建立一個名為kill-loc的腳本,也是為了殺掉FTP程序的
#!/bin/bash
a=`/bin/ps -A | grep vsftpd-loc | awk '{print }'`
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
#endif /* VSF_BUILDDEFS_H */
將以上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 ftpd@localhost 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
(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的認證方式,很簡單吧??
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來說,安全系數更高一點。
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,回車(如果它不工作請發郵件通知我 .
這將產生一個二進制文件,你可以驗證一下。如下:
[chris@localhost vsftpd]$ ls -l vsftpd
-rwxrwxr-x 1 chris chris 61748 Sep 27 00:26 vsftpd
2)滿足VSFTPD安裝所需的一些條件
VSFTPD默認設置需要一個"nobody"用戶,如果這個用戶不存在,那么添加它。如下:
[root@localhost root]# useradd nobody
useradd: user nobody exists
VSFTPD默認設置需要一個空目錄:/usr/share/empty.增加這個目錄,如果它還不存在的話。如下:
[root@localhost root]# mkdir /usr/share/empty/
mkdir: cannot create directory `/usr/share/empty': File exists
如果容許匿名用戶(anonymous),那么你將需要一個"ftp"用戶和其home目錄(這個home目錄不屬于“ftp”用戶,而且“ftp"用戶也對其沒有寫權限)在你的系統中存在。
以下命令用來創建一個"ftp"用戶,如果它還不存在的話。
[root@localhost root]# mkdir /var/ftp/
[root@localhost root]# useradd -d /var/ftp ftp
(即使你的"ftp"用戶已經存在,完成以下這兩步也是很有好處的:)
[root@localhost root]# chown root.root /var/ftp
[root@localhost 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端口)。
運行那個二進制文件,如下:
[root@localhost root]# /usr/local/sbin/vsftpd &
[1] 2104
如果一切正常,那么你將連上FTP服務器,如下:
[chris@localhost 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
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只能下載文件。
---------------------------------------------------------------------------------------------------------------------------------
說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
http://m.tkk7.com/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------
posted on 2007-12-06 17:25
宋針還 閱讀(915)
評論(0) 編輯 收藏 所屬分類:
操作系統