以下文章介紹Liunx 環(huán)境下vsftpd的三種實(shí)現(xiàn)方法
一、前言
Vsftp(Very Secure FTP)是一種在Unix/Linux中非常安全且快速穩(wěn)定的FTP服務(wù)器,目前已經(jīng)被許多大型站點(diǎn)所采用,如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。Vsftpd的實(shí)現(xiàn)有三種方式
1、匿名用戶形式:在默認(rèn)安裝的情況下,系統(tǒng)只提供匿名用戶訪問
2、本地用戶形式:以/etc/passwd中的用戶名為認(rèn)證方式
3、虛擬用戶形式:支持將用戶名和口令保存在數(shù)據(jù)庫文件或數(shù)據(jù)庫服務(wù)器中。相對(duì)于FTP的本地用戶形式來說,虛擬用戶只是FTP服務(wù)器的專有用戶,虛擬用戶只能訪問FTP服務(wù)器所提供的資源,這大大增強(qiáng)系統(tǒng)本身的安全性。相對(duì)于匿名用戶而言,虛擬用戶需要用戶名和密碼才能獲取FTP服務(wù)器中的文件,增加了對(duì)用戶和下載的可管理性。對(duì)于需要提供下載服務(wù),但又不希望所有人都可以匿名下載;既需要對(duì)下載用戶進(jìn)行管理,又考慮到主機(jī)安全和管理方便的FTP站點(diǎn)來說,虛擬用戶是一種極好的解決方案。
二、獲取最新版的Vsftp程序
代碼:
# cd /home/xuchen
# tar xzvf vsftpd-2.0.3.tar.gz //解壓縮程序
# cd vsftpd-2.0.3
三、三種方式的實(shí)現(xiàn)
1、匿名用戶形式實(shí)現(xiàn)
# vi builddefs.h \編輯builddefs.h 文件,文件內(nèi)容如下:
#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認(rèn)證方式,支持SSL
# make //直接在vsftpd-2.0.3里用make編譯
# ls -l vsftpd
-rwxr-xr-x 1 root root 86088 Jun 6 12:29 vsftpd //可執(zhí)行程序已被編譯成功
創(chuàng)建必要的帳號(hào),目錄:
# useradd nobody //可能你的系統(tǒng)已經(jīng)存在此帳號(hào),那就不用建立
# mkdir /usr/share/empty //可能你的系統(tǒng)已經(jīng)存在此目錄,那就不用建立
# mkdir /var/ftp //可能你的系統(tǒng)已經(jīng)存在此目錄,那就不用建立
# useradd -d /var/ftp ftp //可能你的系統(tǒng)已經(jīng)存在此帳號(hào),那就不用建立
# chown root:root /var/ftp
# chmod og-w /var/ftp
請(qǐng)記住,如果你不想讓用戶在本地登陸,那么你需要把他的登陸SHELL設(shè)置成/sbin/nologin,比如以上的nobody和ftp我就設(shè)置成/sbin/nologin
安裝vsftp配置文件,可執(zhí)行程序,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
這樣就安裝完成了,那么我們開始進(jìn)行簡(jiǎn)單的配置
# vi /etc/vsftpd-ano.conf ,將如下三行加入文件
listen=YES
listen_port=21
tcp_wrappers=YES
anon_root=/var/ftp //設(shè)置匿名用戶本地目錄,和ftp用戶目錄必須相同
listen=YES的意思是使用standalone啟動(dòng)vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式)
# /usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf & //以后臺(tái)方式啟動(dòng)vsftpd
注意:每行的值都不要有空格,否則啟動(dòng)時(shí)會(huì)出現(xiàn)錯(cuò)誤,舉個(gè)例子,假如我在listen=YES后多了個(gè)空格,那我啟動(dòng)時(shí)就出現(xiàn)如下錯(cuò)誤:
500 OOPS: bad bool value in config file for: listen
測(cè)試搭建好的匿名用戶方式
# 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,已經(jīng)完成了,very nice.
高級(jí)配置
細(xì)心的朋友可能已經(jīng)看出來我們只在默認(rèn)配置文件增加了四行,就實(shí)現(xiàn)了FTP連接(也證明了vsftpd的易用性),那么讓我們傳個(gè)文件吧,呀!!傳輸失敗了(見圖1)
為什么呢?因?yàn)?vsftpd 是為了安全需要,/var/ftp目錄不能把所有的權(quán)限打開,所以我們這時(shí)要建一個(gè)目錄pub,當(dāng)然也還是需要繼續(xù)修改配置文件的。
# mkdir /var/ftp/pub
# chmod -R 777 /var/ftp/pub
為了測(cè)試方便,我們先建立一個(gè)名為kill-ano的腳本,是為了殺掉FTP程序的
#!/bin/bash
a=`/bin/ps -A | grep vsftpd-ano | awk '{print }'`
kill -9 $a
那么現(xiàn)在大家看看我的匿名服務(wù)器配置文件吧
anonymous_enable=YES //允許匿名訪問,這是匿名服務(wù)器必須的
write_enable=YES //全局配置可寫
no_anon_password=YES //匿名用戶login時(shí)不詢問口令
anon_umask=077 //匿名用戶上傳的文件權(quán)限是-rw----
anon_upload_enable=YES //允許匿名用戶上傳文件
anon_mkdir_write_enable=YES //允許匿名用戶建立目錄
anon_other_write_enable=YES //允許匿名用戶具有建立目錄,上傳之外的權(quán)限,如重命名,刪除
dirmessage_enable=YES //當(dāng)使用者轉(zhuǎn)換目錄,則會(huì)顯示該目錄下的.message信息
xferlog_enable=YES //記錄使用者所有上傳下載信息
xferlog_file=/var/log/vsftpd.log //將上傳下載信息記錄到/var/log/vsftpd.log中
xferlog_std_format=YES //日志使用標(biāo)準(zhǔn)xferlog格式
idle_session_timeout=600 //客戶端超過600S沒有動(dòng)作就自動(dòng)被服務(wù)器踢出
data_connection_timeout=120 //數(shù)據(jù)傳輸時(shí)超過120S沒有動(dòng)作被服務(wù)器踢出
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 //不檢測(cè)SHELL
現(xiàn)在再測(cè)試,先kill掉再啟動(dòng)FTP程序
# ./kill-ano
# /usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf &
上傳一個(gè)文件測(cè)試一下,怎么樣?OK了吧,下載剛上傳的那個(gè)文件,恩?不行,提示
550 Failed to open file.
傳輸已失敗!
傳輸隊(duì)列已完成
1 個(gè)文件傳輸失敗
沒有關(guān)系,你記得咱們?cè)O(shè)置了anon_umask=077了嗎?所以你下載不了,如果你到服務(wù)器上touch 一個(gè)文件(644),測(cè)試一下,是可以被下載下來的,好了,匿名服務(wù)器就說到這里了。
本地用戶形式實(shí)現(xiàn)
# cd /home/xuchen/vsftpd-2.0.3 //進(jìn)入vsftpd-2.0.3的源代碼目錄
# make clean //清除編譯環(huán)境
# vi builddefs.h \繼續(xù)編輯builddefs.h 文件,文件內(nèi)容如下:
#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認(rèn)證方式,支持SSL,記住啊,如果支持了PAM認(rèn)證方式,你本地用戶是不能登陸的。
# make //直接在vsftpd-2.0.3里用make編譯
# ls -l vsftpd
-rwxr-xr-x 1 root root 84712 Jun 6 18:56 vsftpd //可執(zhí)行程序已被編譯成功
創(chuàng)建必要的帳號(hào),目錄:
# useradd nobody //可能你的系統(tǒng)已經(jīng)存在此帳號(hào),那就不用建立
# mkdir /usr/share/empty //可能你的系統(tǒng)已經(jīng)存在此目錄,那就不用建立
# mkdir /var/ftp //可能你的系統(tǒng)已經(jīng)存在此目錄,那就不用建立
# useradd -d /var/ftp ftp //可能你的系統(tǒng)已經(jīng)存在此帳號(hào),那就不用建立
# chown root:root /var/ftp
# chmod og-w /var/ftp
請(qǐng)記住,如果你不想讓用戶在本地登陸,那么你需要把他的登陸SHELL設(shè)置成/sbin/nologin,比如以上的nobody和ftp我就設(shè)置成/sbin/nologin
安裝vsftp配置文件,可執(zhí)行程序,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
這樣就安裝完成了,那么我們開始進(jìn)行簡(jiǎn)單的配置
# vi /etc/vsftpd-loc.conf ,將如下三行加入文件
listen=YES
listen_port=21
tcp_wrappers=YES //支持tcp_wrappers,限制訪問(/etc/hosts.allow,/etc/hosts.deny)
listen=YES的意思是使用standalone啟動(dòng)vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式),注意事項(xiàng)請(qǐng)參看匿名用戶的配置。
anonymous_enable=NO
local_enable=YES //這兩項(xiàng)配置說不允許匿名用戶登陸,允許本地用戶登陸
# /usr/local/sbin/vsftpd-loc /etc/vsftpd-loc.conf & //以后臺(tái)方式啟動(dòng)vsftpd
測(cè)試搭建好的匿名用戶方式,先測(cè)試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,他的登陸目錄就是自己的主目錄
再測(cè)試一個(gè)系統(tǒng)用戶,那我們先建立一個(gè)用戶名叫sss的
# useradd sss
# passwd sss
Changing password for user sss.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
建立好了,讓我們開始測(cè)試吧!!
# 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,他的登陸目錄也是自己的主目錄。哈哈,又完成了!
高級(jí)配置
細(xì)心的朋友可能已經(jīng)看出來如果我們不支持PAM認(rèn)證方式,那么本地用戶就可以登陸,而默認(rèn)編譯的vsftpd支持PAM認(rèn)證方式,所以是不支持本地用戶登陸的。恩,從這點(diǎn)說,這也是vsftp安全的一個(gè)表現(xiàn)----禁止本地用戶登陸。
我們登陸后進(jìn)行測(cè)試,傳一個(gè)文件上去,得,失敗了,那下載個(gè)文件下來吧,恩,這是成功的(見圖2),而且我們發(fā)現(xiàn)我們可以進(jìn)入到系統(tǒng)根目錄(見圖3),這樣很危險(xiǎn)。
那么改配置文件吧,為了測(cè)試方便,我們先建立一個(gè)名為kill-loc的腳本,也是為了殺掉FTP程序的
#!/bin/bash
a=`/bin/ps -A | grep vsftpd-loc | awk '{print }'`
kill -9 $a
現(xiàn)在提供我的本地用戶驗(yàn)證服務(wù)器配置文件吧(在匿名里寫過的注釋我就不在這里寫了)
listen=YES
listen_port=21
tcp_wrappers=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022 //本地用戶文件上傳后的權(quán)限是-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 //你可以指定所有本地用戶登陸后的目錄,如果不設(shè)置此項(xiàng),用戶都會(huì)登陸于自己的主目錄,就跟咱們前面測(cè)試的結(jié)果是一樣的
local_max_rate=500000 //本地用戶的下載速度為500KBytes/s
idle_session_timeout=600
data_connection_timeout=120
nopriv_user= nobody //設(shè)定服務(wù)執(zhí)行者為nobody,vsftpd推薦使用一個(gè)權(quán)限很低的用戶,最好是沒有家目錄(/dev/null),沒有登陸shell(/sbin/nologin),系統(tǒng)會(huì)更安全
ftpd_banner=Welcome to d-1701.com FTP service.
check_shell=NO
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.denyuser
以上三條設(shè)定不允許登陸的用戶,用戶列表存放在/etc/vsftpd.denyuser中,一行一個(gè)帳號(hào)如果我把xuchen這個(gè)用戶加到vsftpd.denyuser里,那么登陸時(shí)會(huì)出現(xiàn)如下錯(cuò)誤:
# 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.
呵呵,有意思吧,自己測(cè)試吧,本地用戶登陸方式就介紹到這里吧!
3、虛擬用戶形式實(shí)現(xiàn)(db及mysql形式)
# cd /home/xuchen/vsftpd-2.0.3 //進(jìn)入vsftpd-2.0.3的源代碼目錄
# make clean //清除編譯環(huán)境
# vi builddefs.h \繼續(xù)編輯builddefs.h 文件,文件內(nèi)容如下:
#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認(rèn)證方式,支持SSL,和匿名用戶形式是一樣的。
# make //直接在vsftpd-2.0.3里用make編譯
# ls -l vsftpd
-rwxr-xr-x 1 root root 86088 Jun 6 22:26 vsftpd //可執(zhí)行程序已被編譯成功
創(chuàng)建必要的帳號(hào),目錄:
# useradd nobody //可能你的系統(tǒng)已經(jīng)存在此帳號(hào),那就不用建立
# mkdir /usr/share/empty //可能你的系統(tǒng)已經(jīng)存在此目錄,那就不用建立
# mkdir /var/ftp //可能你的系統(tǒng)已經(jīng)存在此目錄,那就不用建立
# useradd -d /var/ftp ftp //可能你的系統(tǒng)已經(jīng)存在此帳號(hào),那就不用建立
# chown root:root /var/ftp
# chmod og-w /var/ftp
請(qǐng)記住,如果你不想讓用戶在本地登陸,那么你需要把他的登陸SHELL設(shè)置成/sbin/nologin,比如以上的nobody和ftp我就設(shè)置成/sbin/nologin
安裝vsftp配置文件,可執(zhí)行程序,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
這樣就安裝完成了,那么我們開始進(jìn)行簡(jiǎn)單的配置
對(duì)于用DB庫存儲(chǔ)用戶名及密碼的方式來說:
(1)查看系統(tǒng)是否有相應(yīng)軟件包
# 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)建立一個(gè)logins.txt的文件,單行為用戶名,雙行為密碼,例如
# vi /home/logins.txt
xuchen
12345
(3)建立數(shù)據(jù)庫文件并設(shè)置文件屬性
# db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db
# chmod 600 /etc/vsftpd_login.db
(4)建立認(rèn)證文件
# 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)建立一個(gè)虛擬用戶
useradd -d /home/vsftpd -s /sbin/nologin vsftpd
ls -ld /home/vsftpd
drwx------ 3 vsftpd vsftpd 1024 Jun 6 22:55 /home/vsftpd/
(6)編寫配置文件(注意事項(xiàng)請(qǐng)參看匿名用戶的配置,這里不再贅述)
# vi /etc/vsftpd-pam.conf
listen=YES
listen_port=21
tcp_wrappers=YES //支持tcp_wrappers,限制訪問(/etc/hosts.allow,/etc/hosts.deny)
listen=YES的意思是使用standalone啟動(dòng)vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推薦使用standalone方式)
anonymous_enable=NO
local_enable=YES //PAM方式此處必須為YES,如果不是將出現(xiàn)如下錯(cuò)誤:
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 //虛擬用戶和本地用戶權(quán)限相同
pasv_enable=YES //建立資料聯(lián)機(jī)采用被動(dòng)方式
pasv_min_port=30000 //建立資料聯(lián)機(jī)所可以使用port 范圍的上界,0表示任意。默認(rèn)值為0。
pasv_max_port=30999 //建立資料聯(lián)機(jī)所可以使用port 范圍的下界,0表示任意。默認(rèn)值為0。
(7)啟動(dòng)程序
# /usr/local/sbin/vsftpd-pam /etc/vsftpd-pam.conf &
(8)測(cè)試連通及功能
# vi /home/vsftpd/test //建立一個(gè)文件,內(nèi)容如下
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服務(wù)器,看不到文件列表,但可以下載已知文件名的文件,不能上傳文件,非常安全吧!!
如果我們需要用戶看到文件,怎么辦?也好辦,在配置文件中加入如下語句:
anon_world_readable_only=NO //匿名登入者不能下載可閱讀的檔案,默認(rèn)值為YES
如果需要讓用戶上傳文件和下載文件分開,建議如下這么做
# vi /home/logins.txt
xuchen
12345
upload
45678
//首先建立虛擬用戶upload,密碼為45678
# db_load -T -t hash -f /home/logins.txt /etc/vsftpd_login.db //更新數(shù)據(jù)文件
# 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 文件內(nèi)容如下
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里下載文件,很簡(jiǎn)單得實(shí)現(xiàn)了分用戶上傳和下載
對(duì)于用Mysql庫存儲(chǔ)用戶名及密碼的方式來說:
就是把用戶名和密碼放在mysql庫里,實(shí)現(xiàn)起來也相當(dāng)簡(jiǎn)單
(1)建立一個(gè)庫并設(shè)置相應(yīng)權(quán)限
# 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; 刷新權(quán)限設(shè)置
mysql>quit
(2)下載libpam-mysql進(jìn)行安裝編譯
下載地址如下:
http://nchc.dl.sourceforge.net/s ... am_mysql-0.5.tar.gz
假設(shè)我們把它放在了/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認(rèn)證信息
# vi /etc/pam.d/ftp ,內(nèi)容如下
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()函數(shù)(對(duì)應(yīng)SQL數(shù)據(jù)里的encrypt(),encrypt()隨機(jī)產(chǎn)生salt)
crypt=2: 使用MYSQL中的password()函數(shù)加密
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 & //以后臺(tái)方式啟動(dòng)
(7)測(cè)試連通
# 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.
看,成功了!!這樣就實(shí)現(xiàn)了mysql的認(rèn)證方式,很簡(jiǎn)單吧??
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庫來驗(yàn)證沒有多大區(qū)別,其實(shí)就是一個(gè)東西,一個(gè)用mysql來驗(yàn)證,一個(gè)用db庫,我個(gè)人比較傾向于用db庫來驗(yàn)證,在這個(gè)環(huán)境下,相對(duì)于Mysql來說,安全系數(shù)更高一點(diǎn)。
4、為FTP增加磁盤配額,從而避免惡意用戶用垃圾數(shù)據(jù)塞滿你的硬盤
我首先要說的是這個(gè)功能是系統(tǒng)自帶的,而不是vsftp 的功能之一,千萬別搞混了。好了,我們先假設(shè)我們的系統(tǒng)用戶ftpd的主目錄是/home/ftpd,它是建立在/home分區(qū)中,那么如果我們要對(duì)ftpd用戶進(jìn)行磁盤限額,那我們需要修改/etc/fstab中根分區(qū)的記錄,將/home分區(qū)的第4個(gè)字段改成defaults,usrquota,如下:
LABEL=/home /home ext3 defaults,usrquota 1 2
# reboot //重新啟動(dòng)系統(tǒng)使設(shè)置生效
也可以用
# mount -o remount /dev/sda6 ///dev/sda6的掛接點(diǎn)就是/home,這樣可以不用啟動(dòng)系統(tǒng)。
這里我還要說明一下,如果我們對(duì)一個(gè)組進(jìn)行磁配額,那我們需要增加參數(shù)grpquota,例如
LABEL=/home /home ext3 defaults,grpquota 1 2
也可以
LABEL=/home /home ext3 defaults,usrquota,grpquota 1 2
你想怎么限制都可以,自己組合參數(shù)吧。
# quotacheck -avu
說明:a-自動(dòng)開啟掛載文件系統(tǒng)的配額,v-顯示信息,u-啟用用戶配額or g-啟用組配額
# edquota ftpd //為用戶ftpd設(shè)置磁盤配額
OR
# edquota -g grp //為組grp設(shè)置磁盤配額
系統(tǒng)會(huì)自動(dòng)打開配額文件,如下:
Disk quotas for user ftpd (uid 502):
Filesystem blocks soft hard inodes soft hard
/dev/sda6 424 0 0 13 0 0
第一列是啟用了配額的文件系統(tǒng)的名稱。第二列顯示了用戶當(dāng)前使用的塊數(shù),單位為KB。隨后的兩列用來設(shè)置用戶在該文件系統(tǒng)上的軟硬塊限度。inodes 列顯示了用戶當(dāng)前使用的i節(jié)點(diǎn)數(shù)量。最后兩列用來設(shè)置用戶在該文件系統(tǒng)上的軟硬i節(jié)點(diǎn)限度.硬限是用戶或組群可以使用的磁盤空間的絕對(duì)最大值。達(dá)到了該限度后,磁盤空間就不能再被用戶或組群使用了。軟限定義可被使用的最大磁盤空間量。和硬限不同的是,軟限可以在一段時(shí)期內(nèi)被超過。這段時(shí)期被稱為過渡期(grace period),默認(rèn)七天的超越。過渡期可以用秒鐘、分鐘、小時(shí)、天數(shù)、周數(shù)、或月數(shù)表示。如果以上值中的任何一個(gè)被設(shè)置為 0,那個(gè)限度就不會(huì)被設(shè)置。我設(shè)置了硬塊限度為1KB,是為了測(cè)試方便。
# quotaon -avu //打開磁盤配額監(jiān)控進(jìn)程,u是用戶g是組,這里我沒設(shè)置g參數(shù)
要校驗(yàn)用戶的配額是否被設(shè)置,我們可以使用以下命令:
# 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)來設(shè)置過渡期(grace period) //當(dāng)然只針對(duì)軟限制而言
和另一個(gè) edquota 命令相似,這個(gè)命令也會(huì)在文本編輯器中打開當(dāng)前的文件系統(tǒng)配額:
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
按你的需要修改后存盤退出
用以下命令顯示磁盤配額使用狀態(tài)
# repquota -a 或 repquota /dev/sda6(用戶配額)
# repquota -g -a 或 repquota -a /dev/sda6 (組的配額)
如果一切按照你的意思實(shí)施了,那么我們就進(jìn)行測(cè)試了!如下圖4
我們傳了一個(gè)>1k的文件,沒有成功,這樣我們就成功的為用戶ftpd增添了磁盤配額,要是哪一天你不想加磁盤配額了,怎么辦?參看如下命令:
取消某個(gè)文件系統(tǒng)的配額限制
#quotaoff -vug /dev/sda6 //刪除home分區(qū)的磁盤限額
#刪除/etc/fstab中設(shè)置配額的部分
修改軟配額的最大超越時(shí)間
注意:
/,/boot/,/proc,/mnt/cdrom等不要使用配額,沒用。而且磁盤配額不適合FAT和FAT32系統(tǒng)。
以后當(dāng)新設(shè)置了某個(gè)用戶的配額,可以使用如下命令,馬上生效。
# quotacheck -auvgm --是不嘗試重新掛載文件系統(tǒng)
備注:
1、vsftpd配置參數(shù)詳細(xì)整理
#接受匿名用戶
anonymous_enable=YES
#匿名用戶login時(shí)不詢問口令
no_anon_password=YES
#匿名用戶主目錄
anon_root=(none)
#接受本地用戶
local_enable=YES
#本地用戶主目錄
local_root=(none)
#如果匿名用戶需要密碼,那么使用banned_email_file里面的電子郵件地址的用戶不能登錄
deny_email_enable=YES
#僅在沒有pam驗(yàn)證版本時(shí)有用,是否檢查用戶有一個(gè)有效的shell來登錄
check_shell=YES
#若啟用此選項(xiàng),userlist_deny選項(xiàng)才被啟動(dòng)
userlist_enable=YES
#若為YES,則userlist_file中的用戶將不能登錄,為NO則只有userlist_file的用戶可以登錄
userlist_deny=NO
#如果和chroot_local_user一起開啟,那么用戶鎖定的目錄來自/etc/passwd每個(gè)用戶指定的目錄(這個(gè)不是很清楚,很哪位熟悉的指點(diǎn)一下)
passwd_chroot_enable=NO
#定義匿名登入的使用者名稱。默認(rèn)值為ftp。
ftp_username=FTP
#################用戶權(quán)限控制###############
#可以上傳(全局控制).
write_enable=YES
#本地用戶上傳文件的umask
local_umask=022
#上傳文件的權(quán)限配合umask使用
#file_open_mode=0666
#匿名用戶可以上傳
anon_upload_enable=NO
#匿名用戶可以建目錄
anon_mkdir_write_enable=NO
匿名用戶其它的寫權(quán)利(更改權(quán)限?)
anon_other_write_enable=NO
如果設(shè)為YES,匿名登入者會(huì)被允許下載可閱讀的檔案。默認(rèn)值為YES。
anon_world_readable_only=YES
#如果開啟,那么所有非匿名登陸的用戶名都會(huì)被切換成guest_username指定的用戶名
#guest_enable=NO
所有匿名上傳的文件的所屬用戶將會(huì)被更改成chown_username
chown_uploads=YES
匿名上傳文件所屬用戶名
chown_username=lightwiter
#如果啟動(dòng)這項(xiàng)功能,則所有列在chroot_list_file之中的使用者不能更改根目錄
chroot_list_enable=YES
#允許使用"async ABOR"命令,一般不用,容易出問題
async_abor_enable=YES
管控是否可用ASCII 模式上傳。默認(rèn)值為NO。
ascii_upload_enable=YES
#管控是否可用ASCII 模式下載。默認(rèn)值為NO。
ascii_download_enable=YES
#這個(gè)選項(xiàng)必須指定一個(gè)空的數(shù)據(jù)夾且任何登入者都不能有寫入的權(quán)限,當(dāng)vsftpd 不需要file system 的權(quán)限時(shí),就會(huì)將使用者限制在此數(shù)據(jù)夾中。默認(rèn)值為/usr/share/empty
secure_chroot_dir=/usr/share/empty
###################超時(shí)設(shè)置##################
#空閑連接超時(shí)
idle_session_timeout=600
#數(shù)據(jù)傳輸超時(shí)
data_connection_timeout=120
#PAVS請(qǐng)求超時(shí)
ACCEPT_TIMEOUT=60
#PROT模式連接超時(shí)
connect_timeout=60
################服務(wù)器功能選項(xiàng)###############
#開啟日記功能
xferlog_enable=YES
#使用標(biāo)準(zhǔn)格式
xferlog_std_format=YES
#當(dāng)xferlog_std_format關(guān)閉且本選項(xiàng)開啟時(shí),記錄所有ftp請(qǐng)求和回復(fù),當(dāng)調(diào)試比較有用.
#log_ftp_protocol=NO
#允許使用pasv模式
pasv_enable=YES
#關(guān)閉安全檢查,小心呀.
#pasv_promiscuous+NO
#允許使用port模式
#port_enable=YES
#關(guān)閉安全檢查
#prot_promiscuous
#開啟tcp_wrappers支持
tcp_wrappers=YES
#定義PAM 所使用的名稱,預(yù)設(shè)為vsftpd。
pam_service_name=vsftpd
#當(dāng)服務(wù)器運(yùn)行于最底層時(shí)使用的用戶名
nopriv_user=nobody
#使vsftpd在pasv命令回復(fù)時(shí)跳轉(zhuǎn)到指定的IP地址.(服務(wù)器聯(lián)接跳轉(zhuǎn)?)
pasv_address=(none)
#################服務(wù)器性能選項(xiàng)##############
#是否能使用ls -R命令以防止浪費(fèi)大量的服務(wù)器資源
#ls_recurse_enable=YES
#是否使用單進(jìn)程模式
#one_process_model
#綁定到listen_port指定的端口,既然都綁定了也就是每時(shí)都開著的,就是那個(gè)什么standalone模式
listen=YES
#當(dāng)使用者登入后使用ls -al 之類的指令查詢?cè)摍n案的管理權(quán)時(shí),預(yù)設(shè)會(huì)出現(xiàn)擁有者的UID,而不是該檔案擁有者的名稱。若是希望出現(xiàn)擁有者的名稱,則將此功能開啟。
text_userdb_names=NO
#顯示目錄清單時(shí)是用本地時(shí)間還是GMT時(shí)間,可以通過mdtm命令來達(dá)到一樣的效果
use_localtime=NO
#測(cè)試平臺(tái)優(yōu)化
#use_sendfile=YES
################信息類設(shè)置################
#login時(shí)顯示歡迎信息.如果設(shè)置了banner_file則此設(shè)置無效
ftpd_banner=歡迎來到湖南三辰Fake-Ta FTP 網(wǎng)站.
#允許為目錄配置顯示信息,顯示每個(gè)目錄下面的message_file文件的內(nèi)容
dirmessage_enable=YES
#顯示會(huì)話狀態(tài)信息,關(guān)!
#setproctitle_enable=YES
############## 文件定義 ##################
#定義不能更改用戶主目錄的文件
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
#定義限制/允許用戶登錄的文件
userlist_file=/etc/vsftpd/vsftpd.user_list
#定義登錄信息文件的位置
banner_file=/etc/vsftpd/banner
#禁止使用的匿名用戶登陸時(shí)作為密碼的電子郵件地址
banned_email_file=/etc/vsftpd.banned_emails
#日志文件位置
xferlog_file=/var/log/vsftpd.log
#目錄信息文件
message_file=.message
############## 目錄定義 #################
#定義用戶配置文件的目錄
user_config_dir=/etc/vsftpd/userconf
#定義本地用戶登陸的根目錄,注意定義根目錄可以是相對(duì)路徑也可以是絕對(duì)路徑.相對(duì)路徑是針對(duì)用戶家目錄來說的.
local_root=webdisk #此項(xiàng)設(shè)置每個(gè)用戶登陸后其根目錄為/home/username/webdisk
#匿名用戶登陸后的根目錄
anon_root=/var/ftp
#############用戶連接選項(xiàng)#################
#可接受的最大client數(shù)目
max_clients=100
#每個(gè)ip的最大client數(shù)目
max_per_ip=5
#使用標(biāo)準(zhǔn)的20端口來連接ftp
connect_from_port_20=YES
#綁定到某個(gè)IP,其它IP不能訪問
listen_address=192.168.0.2
#綁定到某個(gè)端口
#listen_port=2121
#數(shù)據(jù)傳輸端口
#ftp_data_port=2020
#pasv連接模式時(shí)可以使用port 范圍的上界,0 表示任意。默認(rèn)值為0。
pasv_max_port=0
#pasv連接模式時(shí)可以使用port 范圍的下界,0 表示任意。默認(rèn)值為0。
pasv_min_port=0
##############數(shù)據(jù)傳輸選項(xiàng)#################
#匿名用戶的傳輸比率(b/s)
anon_max_rate=51200
#本地用戶的傳輸比率(b/s)
local_max_rate=5120000
########################################
別外,如果要對(duì)每個(gè)用戶進(jìn)行單獨(dú)的控制,只需要在user_config_dir中建立username文件,內(nèi)容為數(shù)據(jù)傳輸和用戶權(quán)利里面設(shè)置個(gè)人的合適的選項(xiàng),用戶自定義文件同樣適合用pam支持的虛擬用戶
附: FTP 數(shù)字代碼的意義
110 重新啟動(dòng)標(biāo)記應(yīng)答。
120 服務(wù)在多久時(shí)間內(nèi)ready。
125 數(shù)據(jù)鏈路埠開啟,準(zhǔn)備傳送。
150 文件狀態(tài)正常,開啟數(shù)據(jù)連接端口。
200 命令執(zhí)行成功。
202 命令執(zhí)行失敗。
211 系統(tǒng)狀態(tài)或是系統(tǒng)求助響應(yīng)。
212 目錄的狀態(tài)。
213 文件的狀態(tài)。
214 求助的訊息。
215 名稱系統(tǒng)類型。
220 新的聯(lián)機(jī)服務(wù)ready。
221 服務(wù)的控制連接埠關(guān)閉,可以注銷。
225 數(shù)據(jù)連結(jié)開啟,但無傳輸動(dòng)作。
226 關(guān)閉數(shù)據(jù)連接端口,請(qǐng)求的文件操作成功。
227 進(jìn)入passive mode。
230 使用者登入。
250 請(qǐng)求的文件操作完成。
257 顯示目前的路徑名稱。
331 用戶名稱正確,需要密碼。
332 登入時(shí)需要賬號(hào)信息。
350 請(qǐng)求的操作需要進(jìn)一部的命令。
421 無法提供服務(wù),關(guān)閉控制連結(jié)。
425 無法開啟數(shù)據(jù)鏈路。
426 關(guān)閉聯(lián)機(jī),終止傳輸。
450 請(qǐng)求的操作未執(zhí)行。
451 命令終止:有本地的錯(cuò)誤。
452 未執(zhí)行命令:磁盤空間不足。
500 格式錯(cuò)誤,無法識(shí)別命令。
501 參數(shù)語法錯(cuò)誤。
502 命令執(zhí)行失敗。
503 命令順序錯(cuò)誤。
504 命令所接的參數(shù)不正確。
530 未登入。
532 儲(chǔ)存文件需要賬戶登入。
550 未執(zhí)行請(qǐng)求的操作。
551 請(qǐng)求的命令終止,類型未知。
552 請(qǐng)求的文件終止,儲(chǔ)存位溢出。
553 未執(zhí)行請(qǐng)求的的命令,名稱不正確。
2、VSFTPD官方資料翻譯版(不完整版)---摘自中國Linux公社
翻譯了部分VSFTPD的官方資料。
有些知道是什么意思,但難于翻譯。有些涉及專業(yè)的知識(shí),我自己也不懂,只好按字面翻譯。有些我自己看不懂,只好盡量翻譯。
如果看了其中一部分覺得糊涂,請(qǐng)參閱官方文擋。
安裝篇
===============
這個(gè)文件詳細(xì)介紹了如何從VSFTPD的.tar.gz分發(fā)包開始,建立和安裝并運(yùn)行VSFTPD。
1)建立VSFTPD
先進(jìn)入解壓.tar.gz文件后產(chǎn)生的目錄內(nèi)。如下:
cd vsftpd-2.0.1
編輯"builddefs.h"以操作compile-time設(shè)定。(tcp_wrappers build,等)
輸入make,回車(如果它不工作請(qǐng)發(fā)郵件通知我 .
這將產(chǎn)生一個(gè)二進(jìn)制文件,你可以驗(yàn)證一下。如下:
[chris@localhost vsftpd]$ ls -l vsftpd
-rwxrwxr-x 1 chris chris 61748 Sep 27 00:26 vsftpd
2)滿足VSFTPD安裝所需的一些條件
VSFTPD默認(rèn)設(shè)置需要一個(gè)"nobody"用戶,如果這個(gè)用戶不存在,那么添加它。如下:
[root@localhost root]# useradd nobody
useradd: user nobody exists
VSFTPD默認(rèn)設(shè)置需要一個(gè)空目錄:/usr/share/empty.增加這個(gè)目錄,如果它還不存在的話。如下:
[root@localhost root]# mkdir /usr/share/empty/
mkdir: cannot create directory `/usr/share/empty': File exists
如果容許匿名用戶(anonymous),那么你將需要一個(gè)"ftp"用戶和其home目錄(這個(gè)home目錄不屬于“ftp”用戶,而且“ftp"用戶也對(duì)其沒有寫權(quán)限)在你的系統(tǒng)中存在。
以下命令用來創(chuàng)建一個(gè)"ftp"用戶,如果它還不存在的話。
[root@localhost root]# mkdir /var/ftp/
[root@localhost root]# useradd -d /var/ftp ftp
(即使你的"ftp"用戶已經(jīng)存在,完成以下這兩步也是很有好處的:)
[root@localhost root]# chown root.root /var/ftp
[root@localhost root]# chmod og-w /var/ftp
3)安裝VSFTPD的配置、執(zhí)行和幫助文件。
輸入"make install"后會(huì)將二進(jìn)制文件和幫助文件拷貝到適當(dāng)?shù)哪夸洝?
你也可以手工拷貝這些文件:
cp vsftpd /usr/local/sbin/vsftpd
cp vsftpd.conf.5 /usr/local/man/man5
cp vsftpd.8 /usr/local/man/man8
"make install"不會(huì)拷貝默認(rèn)的配置文件,所以建議你手工拷貝:
cp vsftpd.conf /etc
daidong注:根據(jù)你系統(tǒng)版本的不同,也可能是 cp vsftpd.conf /etc/vsftpd
4)測(cè)試 (無inetd影響)
VSFTPD能運(yùn)行在獨(dú)立模式(standalone)或者通過inetd(xinetd)來啟動(dòng)。
你能通過inetd來運(yùn)行vsftpd以更好地控制它。但我們?cè)谑状芜\(yùn)行時(shí)不這么做,以便檢查系統(tǒng)是否現(xiàn)在配置正常。
編輯/etc/vsftpd.conf(daidong注:也可能是/etc/vsftpd/vsftpd.conf),并在最下面加入以下這一行:
listen=YES
這將告訴VSFTPD不要從inetd啟動(dòng)。
OK,現(xiàn)在試著啟動(dòng)FTP。
以ROOT登錄。
確定你沒有運(yùn)行其他FTP服務(wù)(否則VSFTPD不能占用FTP所需的21端口)。
運(yùn)行那個(gè)二進(jìn)制文件,如下:
[root@localhost root]# /usr/local/sbin/vsftpd &
[1] 2104
如果一切正常,那么你將連上FTP服務(wù)器,如下:
[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或者類似方式啟動(dòng)(官方推薦使用standalone方式)
你也許想通過inetd或者類似方式啟動(dòng)VSFTPD,因?yàn)檫@能給你更多的感受。例如xinetd就有很多的設(shè)置。
(注意:VSFTPD的內(nèi)在機(jī)制屏蔽了xinetd的大多數(shù)的有用的設(shè)置)。
如果使用標(biāo)準(zhǔn)的"inetd",你需要編輯/etc/inetd.conf,在其中加入以下一行:
ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/vsftpd
(確定你刪除或者注釋掉一些已存在的FTP服務(wù)配置行。如果你沒有安裝tcp_wrappers,或者不想使用它們,那么請(qǐng)去掉/usr/sbin/tcpd part).
inetd需要指定并重新載入它的配置文件:
kill -SIGHUP `pidof inetd`
如果你想使用"xinetd",請(qǐng)參閱我們提供的范例 /EXAMPLE/INTERNET_SITE/README. 而其他范例文件將告訴你如何調(diào)配出更強(qiáng)大的xinetd功能。
6)為本地登錄配置PAM文件(可選)
如果你在一臺(tái)激活了PAM的設(shè)備上運(yùn)行VSFTPD,你需要提供一個(gè) /etc/pam.d/ftp 文件。否則非匿名用戶將無法登錄服務(wù)器。
(注:如果你的PAM版本比較老,那么這個(gè)文件也許是 /etc/pam.conf).
做為一個(gè)標(biāo)準(zhǔn)設(shè)置,你可以拷貝一個(gè)已提供的范例文件,如下:
cp RedHat/vsftpd.pam /etc/pam.d/ftp
7)自定義你的配置文件
完成以上的配置后,建議你安裝一個(gè)配置文件。默認(rèn)的配置文件位置是/etc/vsftpd.conf. 在VSFTPD軟件分發(fā)包內(nèi)有一個(gè)范例配置文件。
你可以拷貝其為/etc/vsftpd.conf以做進(jìn)一步修改。
cp vsftpd.conf /etc
(daidong注:也可能是 cp vsftpd.conf /etc/vsftpd ).
這個(gè)默認(rèn)配置即不容許本地登錄也不容許匿名用戶上傳,也許你希望更改這個(gè)配置。
其它
===================
測(cè)試平臺(tái) (已通過)
-流行的,功能完善的平臺(tái)都能測(cè)試通過。在以下平臺(tái)的較新版本,VSFTPD工作得很好。在其大部分較早的版本下,也運(yùn)行正常。
- 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
=============
這個(gè)例子示范了如何為虛擬用戶設(shè)置VSFTPD/PAM。
虛擬用戶是一個(gè)在系統(tǒng)中并不作為一個(gè)登錄實(shí)體而存在的用戶。使用虛擬用戶比使用真實(shí)的用戶更安全,因?yàn)檫@個(gè)賬號(hào)只能用于FTP服務(wù)器。
虛擬用戶經(jīng)常用來提供給不大可信任的用戶訪問某些資源,而這些資源通常是其他普通用戶不能訪問的。
1)創(chuàng)建虛擬用戶數(shù)據(jù)庫
我們將使用pam_userdb來認(rèn)證虛擬用戶。這需要提供一個(gè)“db"格式(一種通用數(shù)據(jù)庫格式)的用戶名/密碼文件。
創(chuàng)建一個(gè)"db"格式的文件,首先要?jiǎng)?chuàng)建一個(gè)標(biāo)準(zhǔn)文本文件,并把用戶名,密碼以豎直排列方式輸入。如logins.txt:
tom
foo
fired
bar
這個(gè)例子中,tom用戶的密碼是foo.fired用戶的密碼是bar.
以ROOT登錄,創(chuàng)建一個(gè)數(shù)據(jù)庫文件,如下:
db_load -T -t hash -f logins.txt /etc/vsftpd_login.db
(這要求berkeley db程序已經(jīng)安裝)
(注:一些系統(tǒng)也許安裝了多個(gè)版本的"db",所以某些情況下你可能使用"db3_load"才是正確的。對(duì)于一些 Debian系統(tǒng)就是這樣。
關(guān)鍵在于要讓pam_userdb相信它的登錄數(shù)據(jù)庫是哪一個(gè)db版本所產(chǎn)生(一般都是db3,盡管你的系統(tǒng)里可能安裝的是db4).)
這將創(chuàng)建/etc/vsftpd_login.db文件。顯然,你希望設(shè)定這個(gè)文件的權(quán)限:
chmod 600 /etc/vsftpd_login.db
2)用你的新數(shù)據(jù)庫創(chuàng)建一個(gè)PAM文件
請(qǐng)參考范例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用新的數(shù)據(jù)庫去驗(yàn)證用戶。把這個(gè)PAM文件拷貝到PAM目錄,一般是/etc/pam.d
cp vsftpd.pam /etc/pam.d/ftp
3)為虛擬用戶設(shè)置home目錄
useradd -d /home/ftpsite virtual
ls -ld /home/ftpsite
(which should give):
drwx------ 3 virtual virtual 4096 Jul 30 00:39 /home/ftpsite
我們已經(jīng)創(chuàng)建了一個(gè)名叫"virtual"的用戶,home目錄是"/home/ftpsite".
我們拷貝一些東西到這個(gè)下載目錄:
cp /etc/hosts /home/ftpsite
chown virtual.virtual /home/ftpsite/hosts
4)創(chuàng)建你的vsftpd.conf配置文件
請(qǐng)參考這個(gè)目錄下的例子。讓我們一行行地看一看這些配置:
anonymous_enable=NO
local_enable=YES
安全起見,屏蔽了匿名用戶,只啟用了非匿名用戶(即虛擬用戶使用的賬號(hào))
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
為了安全請(qǐng)確認(rèn)這幾個(gè)配置,這將關(guān)閉寫的權(quán)限。
chroot_local_user=YES
這將把虛擬用戶鎖定在我們?cè)谝陨显O(shè)置的/home/ftpsite目錄內(nèi)。
guest_enable=YES
guest_username=virtual
guest_enable非常重要-它激活了虛擬用戶!而guest_username說明所有的虛擬用戶都對(duì)應(yīng)我們?cè)谏厦嬖O(shè)置的真實(shí)用戶:“virtual".
這同時(shí)確定了虛擬用戶在文件系統(tǒng)中的位置,也就是說,虛擬用戶的home目錄即"virtual"用戶的home目錄:/home/ftpsite。
listen=YES
listen_port=10021
這讓VSFTPD以獨(dú)立模式(standalone)運(yùn)行,而不是從inetd方式啟動(dòng)。也就是說,你運(yùn)行VSFTPD可執(zhí)行文件就啟動(dòng)了FTP服務(wù)。
同時(shí)也讓VSFTPD啟用非標(biāo)準(zhǔn)端口10021來監(jiān)聽FTP請(qǐng)求(FTP一般使用21端口)。
pasv_min_port=30000
pasv_max_port=30999
這設(shè)定了被動(dòng)模式的FTP請(qǐng)求端口。當(dāng)你配置了一個(gè)防火墻的時(shí)候,這個(gè)配置就很好用。
拷貝范例配置文件到/etc
cp vsftpd.conf /etc/
(daidong注:也可能是/etc/vsftpd)
5)啟動(dòng)VSFTPD
到VSFTPD二進(jìn)制文件所在的目錄,輸入:
./vsftpd
如果一切正常,這個(gè)命令將生效。否則,你將會(huì)看到一些錯(cuò)誤信息的反饋。
6)測(cè)試
啟動(dòng)另一個(gè)會(huì)話。(或者ctrl-z,再輸入"bg",讓VSFTPD在后臺(tái)運(yùn)行)。
這是一個(gè)FTP會(huì)話的例子:
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"
出現(xiàn)”failed to open directory“的話,別擔(dān)心。這是因?yàn)?home/ftpsite目錄不容許被任意瀏覽。
(我們可以更改anon_world_readable_only=NO以消除告警,但為了安全,還是保留這個(gè)配置)。
我們能通過size命令看到我們已經(jīng)訪問了被我們拷貝到這里的"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
===============
這個(gè)例子將演示如何擴(kuò)展“VIRTUAL_USERS”那個(gè)范例,從而實(shí)現(xiàn)更復(fù)雜一點(diǎn)的配置。
讓我們假定我們需要2種不同的虛擬用戶:一種只能瀏覽并下載資源,另一種能上傳文件并瀏覽站內(nèi)資源。
要激活這個(gè)設(shè)置,我們將使用VSFTPD的強(qiáng)大的“單個(gè)用戶配置”功能(是V1.1.0后出現(xiàn)的新功能)。
在前一個(gè)虛擬用戶范例中,我們創(chuàng)建了2個(gè)用戶-tom和fred.
我們將實(shí)現(xiàn)fred有寫權(quán)限以上傳新文件,同時(shí)tom只能下載文件。
---------------------------------------------------------------------------------------------------------------------------------
說人之短,乃護(hù)己之短。夸己之長(zhǎng),乃忌人之長(zhǎng)。皆由存心不厚,識(shí)量太狹耳。能去此弊,可以進(jìn)德,可以遠(yuǎn)怨。
http://www.aygfsteel.com/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------