需求:
要在公司內(nèi)網(wǎng)搭建一個 ftp 服務(wù),基本滿足以下場景即可:
- 研發(fā)同學(xué)可以使用自己的賬號上傳/下載文件到各自的 home 目錄
- 大家都可以將某些文件放在某個公共目錄,所有人都可以免密碼通過 ftp 協(xié)議在瀏覽器查看這些公共目錄及其中的文件.
第二個需求主要是為了方便美工妹妹: 美工可以登錄自己的ftp賬號上傳原型圖,切圖等文件,然后將 ftp 協(xié)議的 url 發(fā)給研發(fā)同學(xué)們. 研發(fā)同學(xué)可以在瀏覽器打開這個 url,或者使用 ftp 軟件查看,但不能修改其中的內(nèi)容.
另1: 美工妹妹用了 Marketch 這個東西做原型,可以把原型做成網(wǎng)頁,可以直接在原型圖上下載切圖,配合瀏覽器使用,還是很方便的.
另2: 公司內(nèi)網(wǎng)服務(wù)器安裝了 CentOs 6.5
搭建:
大家各自訪問各自的 home 目錄容易實(shí)現(xiàn),網(wǎng)上很多配置vsftp的文章,這里不再贅述.
公共目錄的建立也容易,就是修改 /etc/vsftpd/vsftpd.conf
設(shè)置匿名用戶訪問有只讀權(quán)限即可.
所有實(shí)名用戶都可以往公共目錄仍東西,是受網(wǎng)上某篇大牛的文章啟發(fā),在每個人的 home 目錄下,建立一個 ftp_public 目錄,并用 mount --bind
命令將公共目錄綁定到大家的這個目錄下.
mount --bind /ftp_public /home/user/ftp_public
這樣就可以實(shí)現(xiàn)第二個需求了.再利用 linux 權(quán)限管理,就可以實(shí)現(xiàn)公共目錄中的各種文件權(quán)限設(shè)置了.
因?yàn)檫@個策略隨時會有調(diào)整,因此并沒有把掛載信息寫進(jìn) fstab 里面去.寫了個腳本,每次開機(jī)的時候執(zhí)行下就可以了:
#!/bin/bash
# AUTHOR : liuxu
# DATE : 2016-11-23
# mount public ftp directory for each developer
FTP_DIR=/ftp_public
FTP_DIR_NAME=ftp_public
if [ $UID -ne 0 ]; then
echo "only root can run this script"
else
# 這里執(zhí)行了一個外部腳本,將用戶賬號列表導(dǎo)入進(jìn)來.
# 這樣做是為了將腳本與人員配置分開.
source developer_list
for u in ${DEVELOPERS[@]}; do
if [ -d /home/$u ]; then
echo "setup public ftp dir for $u"
d=/home/$u/$FTP_DIR_NAME;
if [ ! -d $d ]; then
mkdir $d
# 因?yàn)槭怯?root 等賬戶運(yùn)行該腳本,因此需要把目錄權(quán)限改成各個賬號的
# 開發(fā)賬號都在一個叫 techops 的組里,因此把屬主也改了,便于后續(xù)管理
chown "$u:techops" $d
fi
mount --bind $FTP_DIR $d
else
echo "setup public ftp dir for $u, home dir not found"
fi
done
fi
# 下面這兩句后面會有介紹的,都與 selinux 的權(quán)限有關(guān)
setsebool allow_ftpd_full_access on
chcon -R -t public_content_t /ftp_public
人員配置信息被放在了另外的文件,目的是將配置和羅輯分開. 配置文件如下:
#!/bin/bash
# AUTHOR : liuxu
# DATE : 2016-11-23
DEVELOPERS=(\
JonSnow\
RobStark\
SansaStark\
AryaStark\
BrandonStark\
RickonStark\
JaimeLannister\
TyrionLannister\
CeiseLannister\
)
當(dāng)然我可以這么做是因?yàn)橛脩舨欢?所以沒有開啟 vsftpd 虛擬用戶功能.
如果開啟的虛擬用戶,還要建立公共目錄,就沒再繼續(xù)研究了.
但是:
豈能盡如人意...似乎沒有啥東西能一帆風(fēng)順的搞下來.(好吧,其實(shí)是好搞的大家記不住).
主要是各種權(quán)限問題.一開始看 vsftpd 配置文件沒錯,沒有頭緒.后來查到,奇怪的權(quán)限問題,多半是 SeLinux 的設(shè)置問題導(dǎo)致的.
網(wǎng)上有說直接關(guān)掉 SeLinux 的,一了百了.其實(shí)在我的使用場景上也是可以這么做的.因?yàn)楣拘?人少,又是內(nèi)網(wǎng),關(guān)了完全沒問題.
但作為一個文(zhuang)藝(bi)程序員,怎么能干這么不優(yōu)雅的事情呢.還是要動手解決.
權(quán)限問題:
遇到了很多權(quán)限問題,當(dāng)時沒有記錄下來,大體有
- "550 Permission Deny" 問題
- 瀏覽器不能列出公共目錄問題
- 文件瀏覽器 (both windows and ubuntu) 不能瀏覽ftp目錄問題
因?yàn)橛龅絾栴}時沒有記錄,沒法分條寫下解決方案.但其實(shí)套路就是:
- 查看 /etc/vsftpd/vsftpd.conf 相關(guān)配置是否正確
- 打開默認(rèn)關(guān)閉的 SeLinux 相關(guān)選項(xiàng)
- 用戶登錄問題可能需要修改 PAM: /etc/pam.d/vsftpd . 因?yàn)闆]遇到類似問題,因此沒深入了解.
vsftpd 的配置方法網(wǎng)上鋪天蓋地,不贅述.
ftp 與 SeLinux 相關(guān)的內(nèi)容,個人覺得網(wǎng)上各位的敘述太雜亂了.不過這也沒辦法,大家遇到的問題各自不一樣,各自的環(huán)境也不一樣.
但其實(shí),沒必要那么麻煩遇到每個 SeLinux 相關(guān)問題都去網(wǎng)上找的.自己看看相關(guān)配置,很快就可以搞定的.
首先查看與 ftp 相關(guān)的選項(xiàng):
$ getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> on
ftpd_connect_db --> off
ftpd_use_fusefs --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_use_cifs --> off
tftp_use_nfs --> off
然后... 自己挨個查查每個選項(xiàng)的意思吧,然后試試,看看把哪個選項(xiàng)打開能解決自己的問題.
其實(shí)看著這些字段名,再稍微搜索下,各種權(quán)限問題就都可以很快解決的.
$ setsebool ftpd_use_passive_mode on
$ setsebool allow_ftpd_full_access on
配置防火墻端口問題:
主動模式下配置 iptables 開啟 20 及 21 端口即可:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT</pre>
被動模式下需要開一個端口號段:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7500:7600 -j ACCEPT</pre>
這段打算用到時再研究, 內(nèi)網(wǎng)安全不重要, 先保證能用就成.
公共目錄配置 SeLinux 權(quán)限問題:
然后就是遇到了一個怎么搜索都沒搜到解決辦法的問題:
某次服務(wù)器重啟后,無論實(shí)名還是匿名訪問公共目錄,目錄下的目錄可以顯示,但目錄下的文件都顯示不出來了.訪問其他目錄都正常.
各種地方都搜了,都沒有搜到有人碰到類似問題. 后來自己嘗試調(diào)了下上文列出的 SeLinux 參數(shù),實(shí)名用戶倒是可以正常訪問公共目錄了. 但匿名用戶依然有問題.
再后來,因?yàn)椴榱硪粋€問題,去了 redhat 官網(wǎng),順便搜了下這個問題. 這才解決掉.
其實(shí)就是執(zhí)行下面這句:
chcon -R -t public_content_t /ftp_public</pre>
chcon
用于修改某對象的安全上下文. 上面那句就是說,設(shè)置要把某目錄對匿名用戶 (nobody) 開放. 這還是 SeLinux 的相關(guān)設(shè)置.
但為什么 ftp 公共目錄在重啟服務(wù)器前是可以正常訪問的,我就不知道了. 有空還得詳細(xì)的研究下 SeLinux .
總結(jié):
上面遇到的全部問題,在 redhat 官網(wǎng)的這份文檔中都已經(jīng)給予解答了,只是我們總是想找快餐式答案,忽略了這些根基性的優(yōu)質(zhì)文檔.
建議各位想要在 CentOS 上搭建 vsftp, 之前又沒有經(jīng)驗(yàn)的同學(xué),先把這篇文檔讀通,多數(shù)問題就都知道怎么辦了. 文檔地址如下:
vsftpd deploy guide