CentOS安裝配置vsftp虛擬用戶登錄
在使用Linux時,難免要進行各種文件的遠程傳輸,比如:網(wǎng)站的代碼,共享資源等,而這其中用的最多的傳輸方法大概就是FTP了。Linux下可用FTP服務(wù)端是非常多的,vsftp, proftp, uw-ftp等,其中vsftp流行度比較廣,沖著這個,本人在自己的CentOS上也就選擇了vsftp,而且,vsftp支持PAM(pluggable authentication modules)下虛擬用戶設(shè)置,這正是Mitchell Chu比較喜歡的一種方式,接下來就請vsftp君上場。
Vsftp使用的用戶中,支持三種用戶模式,分別是:實體用戶,匿名用戶和虛擬用戶(guest
, 亦稱訪客身份)。實體用戶(Real User)是指用戶本身存在于系統(tǒng)中的用戶,他們存在于/etc/passwd和/etc/shadow文件中。匿名用戶(Anonymous)是指客戶 端無需提供任何用戶身份,ftp為訪問者提供一個名為anonymous的特殊用戶以供其使用。虛擬用戶(Virtual User)個人理解是一種介于實體用戶和匿名用戶之間的用戶。原因是:虛擬用戶雖然在系統(tǒng)的實體用戶文件中不存在,但是會在系統(tǒng)的其他地方進行記錄(本文是Berkeley DB),以供vsftp用來對ftp訪問者進行必要的鑒權(quán),而鑒權(quán)完畢之后,該用戶操作文件之時,將是使用vsftp的運行用戶ftp進行的。由于實體用戶需要的是系統(tǒng)真實帳戶,開放這種權(quán)限無疑會增加系統(tǒng)的風險,而虛擬用戶使用的是和實體用戶不同的用戶驗證體系,并且,在系統(tǒng)中并不實際存在虛擬用戶到實體用戶的映射關(guān)系,因此降低了FTP給系統(tǒng)帶來的風險性,在實際生產(chǎn)環(huán)境中,虛擬用戶可以更加靈活的進行獨立管理,比如:虛擬主機需要給用戶提供FTP帳 戶。有這么些好處之后,讓我們看看是如何配置吧!
預(yù)備式
Berkeley DB
數(shù)據(jù)庫:用來存儲虛擬用戶的登錄信息。
pam_userdb.so
:用來驗證虛擬用戶。
db4_utils
:用來轉(zhuǎn)換虛擬用戶到DB數(shù)據(jù)的工具。
安裝需要的包
CentOS中好像是默認自帶vsftp的,因此,無需安裝,如果你不確認,可以用which
看下:
- which vsftpd
- # 如果安裝好了的話,應(yīng)該是有類似下面的輸出:
- # /usr/sbin/vsftpd
- # 如果沒安裝,則類似下面的輸出
- # /usr/bin/which: no xd in (/home/limituser...
沒有安裝的話,請安裝:
- yum install vsftpd
- # 或者: yum -y install vsftpd
當然,清空下yum
的緩存亦可:
- pushd /etc/yum.repos.d/
- rm -rf *
- wget http://docs.linuxtone.org/soft/lemp/CentOS-Base.repo
- yum clean all
- yum -y install vsftpd ## 這句還是重點.
為了簡單,我們可以一次性安裝所有需要的包:
- yum install db4-utils db4 vsftpd
- ## Mitchell Chu提醒:有的就不用再安裝了,請自行增減
創(chuàng)建虛擬用戶
虛擬用戶我們使用Berkeley DB數(shù)據(jù)庫來存儲。***步是創(chuàng)建純文本來添加用戶和密碼,用戶名和密碼各占一行。比如我們要創(chuàng)建:useasp
的用戶名,密碼是blog.useasp.net
,并且創(chuàng)建一個admin
密碼是adminpasswd
的用戶,那么,純文本將類似如下:
- pushd /etc/vsftpd
- cat >vusers.txt
- useasp
- blog.useasp.net
- admin
- adminpasswd
創(chuàng)建好vusers.txt
后,我們需要的第二步是將純文本轉(zhuǎn)換為db文件,這時候需要使用到db_load
了:
- db_load -T -t hash -f vusers.txt vsftpd-virtual-users.db
為了安全起見,記得設(shè)置僅root
可讀寫(當前是root
):
- chmod 600 vsftpd-virtual-users.db
再清理掉原來的純文本文件:
- rm vusers.txt
此時,我們已經(jīng)將需要登錄FTP的用戶已經(jīng)準備好了,接下來就需要去配置vsftpd,讓vsftpd能夠正確的識別并支持已經(jīng)設(shè)置好虛擬用戶了。
VSFTPD虛擬用戶的配置
找到vsftpd.conf
配置文件,添加或修改下面這些配置選項:
- # 禁止匿名登錄
- anonymous_enable=NO
- anon_upload_enable=YES
- anon_other_write_enable=YES
- # 啟用本地用戶
- local_enable=YES
- # 虛擬用戶使用本地用戶權(quán)限
- virtual_use_local_privs=YES
- # 可寫
- write_enable=YES
- # PAM配置
- pam_service_name=vsftpd
- # 啟用虛擬用戶
- guest_enable=YES
- # 用戶后綴: 配合下面local_root使用,將會用登錄的用戶名替換掉$USER
- user_sub_token=$USER
- # 根目錄
- local_root=/var/ftp/$USER
- # 啟用chroot,登錄后會被定位到指定根目錄
- chroot_local_user=YES
- # 將所有的用戶和組顯示為ftp
- hide_ids=YES
vsftpd的配置文件是在/etc/vsftpd/vsftpd.conf
,原有配置項可以保留默認值,如果需要日志,vsftpd有兩個日志可供使用,一個是標準xferlog格式的,一個是vsftpd格式的,可讀性后者更好,當然,你也可以兩個日志都啟用,要啟用可以設(shè)置:xferlog_enable
, xferlog_std_format
, xferlog_file
, vsftpd_log_file
等參數(shù)以獲得需要的日志效果。
#p#
虛擬用戶的PAM配置
要針對虛擬用戶啟用PAM,我們還需要對PAM盡心配置,在上面的vsftpd配置文件中,我們使用pam_service_name
來配置了PAM將使用的配置文件,這個文件安裝后是默認存在的,如果你覺得有必要保留原來的配置,可以先行備份一份,而后配置文件內(nèi)容改為如下:
- #%PAM-1.0
- auth required pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users
- account required pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users
- #session required pam_loginuid.so
要啟用session
可以將上面的#注釋掉,如果是在32位系統(tǒng)下,網(wǎng)上有一個配置方法是下面這種:
- #%PAM-1.0
- auth sufficient pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users
- account sufficient pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users
由于本人對Linux下的PAM并不是很了解,并不太了解required
和sufficient
的區(qū)別,這里不好做過多的論斷,有了解的可以指點一下,謝謝!
PAM配置里面,是指明賬戶保存的所在位置,我們配置文件里面的路徑即是前面使用db_load
創(chuàng)建的Berkeley DB的文件路徑。
創(chuàng)建FTP目錄
前面vsftpd已經(jīng)配置了ftp的目錄,我們需要先行創(chuàng)建FTP根目錄,和用戶需要的目錄,因為一旦這些用戶登錄,將會被vsftpd重新定位到指定的home目錄下的,vsftpd中我們配置的是/var/ftp
,因此我們需要確認此目錄是否存在,不存在我們就需要創(chuàng)建,而后,在此目錄下創(chuàng)建虛擬用戶的根目錄,目錄名稱就是用戶名稱。
- mkdir -p /var/ftp/{useasp,admin}
- chown -R ftp:ftp /var/ftp
為了保證能夠順利讀取到文件,我們將根目錄下的所有文件都變成ftp這個用戶所有——ftp賬戶系統(tǒng)已經(jīng)默認設(shè)置好了,vsftpd就是使用這個賬戶來操作的。
重啟FTP服務(wù),測試FTP
按上面的流程配置完后,我們就可以重新啟動vsftpd服務(wù),讓新的配置生效——如果你沒有辦法使用此命令,請參看后面的省卻麻煩一節(jié),將vsftpd設(shè)置成為開機啟動服務(wù):
- service vsftpd restart
重啟之后,理論上來說,應(yīng)該就能使用FTP客戶端訪問FTP服務(wù)器了,如果需要測試,你也可以直接在本機訪問測試下:
- ftp 127.0.0.1
此時應(yīng)該能夠得到正常返回,類似如下:
- Connected to 127.0.0.1 (127.0.0.1).
- 220-Welcome to Mitchell Personal Web Server(MPWS)
- 220-Please use user name and password to login...
- 220-if you have any question, please contact MitchellChu<******@useasp.net>
- 220
- Name (127.0.0.1:root):useasp
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp>
而在系統(tǒng)的日志中應(yīng)該也能看到登錄信息(以下是多個日志文件,和有的如果沒有配置vsftpd的日志文件將無法看到):
- # tail -f /var/log/secure
- Sep 4 23:36:11 CentOS vsftpd[8721]: pam_userdb(vsftpd:auth): user 'useasp' granted access
- # tail -f /var/log/vsftpd.log
- Fri Sep 4 23:36:15 2015 [pid 8721] [useasp] FTP response: Client "127.0.0.1", "150 Here comes the directory listing."
到此,我們就已經(jīng)配置了一個可以正常訪問的FTP服務(wù)器了。
開啟防火墻,開放給別人用吧
上面測試正常后,如果你開啟了iptables
,那么,記得添加規(guī)則,讓你的21,20端口,以后被動模式時使用的端口范圍開放出來吧:
- iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
- iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
- iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 65300:65360 -j ACCEPT
- service iptables save
上面的是我的iptables
的配置,開放了21和20端口,20端口是ftp-data
用的,用來傳輸數(shù)據(jù)。
省卻麻煩
為了不用每次重啟之后都爬上機器上開啟FTP,我們可以將vsftpd設(shè)置為開機啟動——如果系統(tǒng)已經(jīng)有了這個服務(wù),忽略:
- chkconfig --levels 345 vsftpd on
- service vsftpd start
至此,就差不多得到一個比較***的FTP Server了。
后記:
上面是配置vsftpd使用虛擬用戶的基本流程,但在配置中,我們總是能發(fā)現(xiàn)這樣或者那樣的問題,因此就需要我們不斷的去DEBUG整個流程,由于Linux中有SELinux的存在,很多問題的根源還是在于SELinux的設(shè)置,如果你需要簡單快捷,那么使用下面這個命令即可解決大部分問題——網(wǎng)上很多朋友也正是這樣解決的:
- setenforce 0
- # or
- setenforce Permissive
當然,如果你和Mitchell Chu一樣,也是個不愿意如此簡單了事的人兒,那么,咱們繼續(xù)踏上征程……在按上面的方法配置好整個FTP服務(wù)器之后,本人也或多或少碰到如下的這些問題,現(xiàn)在匯集起來,方便后來者(若有時間,會展開來講,暫且記錄下):
1.不能定位到各自用戶的目錄,這個問題的存在,我們可以嘗試設(shè)置SELinux中的ftp_home_dir
來解決:
- setsebool -P ftp_home_dir on
2.不能列出FTP目錄內(nèi)容,這個問題也是SELinux引起的,可能的原因是vsftpd對于目錄并沒有權(quán)限,檢查下自己的權(quán)限是否正確,vsftpd使用的是ftp用戶訪問,看看自己是否設(shè)置錯權(quán)限了?
3.還是不能列出目錄文件,再看看目標文件夾的類型對不對,一般需要的是public_content_r_t,如果你不確認,可以使用下面的命令查看:
- ls -alZ
你將看到類似如下的輸出:
- drwxr-xr-x. root root system_u:object_r:public_content_t:s0 .
- drwxr-xr-x. root root system_u:object_r:var_t:s0 ..
- drwxr-xr-x. root root system_u:object_r:var_t:s0 useasp
- drwxr-xr-x. root root system_u:object_r:var_t:s0 admin
可以看到,默認的是var_t
,我們需要設(shè)置一下,這里需要用到工具semanage
,如果沒有,需要安裝policycoreutils-python
:
- yum -y install policycoreutils-python
因為我使用了自行編譯的Python版本,導(dǎo)致semanage
不能正常運行,報錯:
- Traceback (most recent call last):
- File "/usr/sbin/semanage", line 23, in <module>
- import policycoreutils.default_encoding_utf8
- ImportError: No module named policycoreutils.default_encoding_utf8
修正后,直接使用semanage
來設(shè)置:
- restorecon -R -v /var/ftp/{useasp,admin}
4.不能上傳文件,不能創(chuàng)建文件夾,還是SELinux的問題啊,設(shè)置:
- setsebool -P allow_ftpd_anon_write on
5.還不能上傳文件?試試:
- semanage fcontext -a -t public_content_rw_t "/var/ftp(/.*)?"
- restorecon -R -v /var/ftp/{useasp,admin}
這個和上面的設(shè)置差不多,只是權(quán)限更大,請謹慎操作!