1、前言
本篇將在 SELinux 安全機制及 IPTables 防火牆開啟的環境下實作,限制匿名者 FTP 登入後僅可下載檔案無法上傳並且被限制在 /home/user/guest 資料夾內 (chroot 機制),而一般使用者帳號則可以在自已的家目錄下新增刪除檔案及資料夾,關於 vsftp 檔案傳輸伺服器內容及更詳細設定參數可以參考官方文件 RedHat - Deployment Guide Chapter 17.2 FTP 。文章目錄
1、前言2、實作環境
3、安裝 vsftp 網頁伺服器套件
4、設定 IPTables 防火牆規則
5、修改 vsftp 設定檔
6、修改 SELinux 設定值
7、啟動 vsftp 服務
2、實作環境
- OS: CentOS 6.0 (32 bit)
- vsftp 套件資訊: vsftpd-2.2.2-6.el6_0.1.i686
- vsftp 設定檔: /etc/vsftpd/vsftpd.conf
- IPTables 防火牆: TCP 協定 Port 21
- SELinux 權限: public_content_t、user_home_dir_t、ftp_home_dir=1
- vsftp 根目錄預設路徑: /var/ftp
- vsftp 根目錄變更後路徑: /home/user
3、安裝 vsftp 網頁伺服器套件
請使用 yum 指令搭配 vsftp 套件名稱 vsftpd 即可進行套件安裝。# yum -y install vsftpd //安裝 vsftp 套件
# rpm -qa vsftpd //查詢 vsftp 套件版本
vsftpd-2.2.2-6.el6_0.1.i686
# rpm -qc vsftpd |grep vsftpd.conf //查詢 vsftp 設定檔路徑
/etc/vsftpd/vsftpd.conf
4、設定 IPTables 防火牆規則
vsftp 網頁伺服器屆時服務啟動時會 Listen TCP 協定 Port 21,因此我們必須修改 IPTables 防火牆規則以便等一下進行測試,請修改 IPTables 防火牆規則設定檔「/etc/sysconfig/iptables」加上允許 TCP Port 21 的規則,除此之外還必須修改 IPTables防火牆模組設定檔「/etc/sysconfig/iptables-config」加上「ip_conntrack_ftp」項目,否則屆時 FTP Client 將會發生連線逾時的錯誤,修改防火牆規則後請使用指令「service iptables restart」來重新啟動防火牆服務,以便防火牆規則套用生效,並且使用「service iptables status」指令來確定目前防火牆規則是否有允許 TCP Port 21。# vi /etc/sysconfig/iptables //修改防火牆規則
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
# vi /etc/sysconfig/iptables-config
IPTABLES_MODULES="" //預設值,未載入任何模組
IPTABLES_MODULES="ip_conntrack_ftp" //修改後
# service iptables restart //重新啟動防火牆服務
...略...
iptables: Loading additional modules: ip_conntrack_ftp [ OK ] //載入成功
# service iptables status | grep 21 //查看防火牆規則是否套用生效
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:21
# chkconfig vsftpd on //開機自動啟動 vsftp 服務
5、修改 vsftp 設定檔
修改 vsftp 設定檔「/etc/vsftpd/vsftpd.conf」,新增 「local_root=/home/user」內容,其意義為 /home/user 資料夾為所有登入 FTP 伺服器的使用者預設根路徑,匿名者登入家目錄由預設的 「/var/ftp」 改為 「/home/user/guest」 只能下載無法上傳,下列為修改內容:# vi /etc/vsftpd/vsftpd.conf //修改 vsftp 設定檔
local_root=/home/user //加上此行
# vipw
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin //預設值(匿名者 FTP 家目錄)
ftp:x:14:50:FTP User:/home/user/guest:/sbin/nologin //修改後
由於先前便規劃使用者帳號都存放於 /home/user 下,所以僅建立匿名者 FTP 資料夾及設定權限即可。
# mkdir /home/user/guest
# ls -l /home/user/
drwxr-xr-x. 2 root root 4096 Oct 31 17:20 guest
drwx------. 21 weithenn weithenn 4096 Oct 24 12:44 weithenn
6、修改 SELinux 設定值
修改 SELinux 安全機制的設定值,因為將 FTP 使用者根目錄由 「/var/ftp」 修改至 「/home/user」,因此新的 /home/user 資料夾其 SELinux 安全機制的權限勢必與原來的 /var/ftp 資料夾不同,若不進行修改的話屆時啟動 vsftp 服務時便可能會因為 SELinux 權限問題造成無法啟動 vsftp 服務的狀況。# ls -dZ /var/ftp /home/user
drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 /home/user
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /var/ftp
接著透過 「semanage fcontext -a -t」 指令配合 SELinux 權限 「public_content_t」,指定「/home/user」資料夾設定此權限為「SELinux預設權限」,而使用者個人資料夾則設定為 「user_home_dir_t」,之後使用「restorecon -Rv」指令把 /home/user 相關資料夾還原至剛才設定的 SELinux 預設權限,若執行 semanage 指令發現系統中沒有此一指令請安裝 policycoreutils-python 套件即可 (yum -y install policycoreutils-python)。
# semanage fcontext -a -t public_content_t "/home/user(/.*)?" //設定 SELinux 預設權限
# semanage fcontext -a -t user_home_dir_t "/home/user/weithenn(/.*)?"
# restorecon -Rv /home/user //還原 SELinux 權限
# ls -dZ /var/ftp /home/user /home/user/{guest,weithenn} //查看資料夾 SELinux 權限
drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 /home/user
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /home/user/guest
drwx------. weithenn weithenn system_u:object_r:user_home_dir_t:s0 /home/user/weithenn
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /var/ftp
最後則是要將相關的 SELinux 安全機制的布林值打開,將「ftp_home_dir」設定為 1 也就是 Enable 功能,如此一來使用者才可讀寫自已的家目錄。
# setsebool -P ftp_home_dir=1 //開啟 SELinux 安全機制的布林值
# getsebool -a |grep ftp_home_dir //查詢是否設定成功
ftp_home_dir --> on
7、啟動 vsftp 服務
完成修改 SELinux 安全機制權限設定後,我們可以放心啟動 vsftp 服務,請使用指令「service vsftpd start」來啟動 vsftp 服務,並且於服務啟動後使用「netstat」指令來查看系統是否開啟了 TCP Port 21,以及使用「ps」指令來查看 vsftp 執行序(vsftpd)是否運作。# service vsftpd start //啟動 vsftp 服務
Starting vsftpd for vsftpd: [ OK ]
# netstat -tunpl | grep :21 //查看是否開啟 Port 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1637/vsftpd
# ps aux |grep vsftpd //查看 vsftpd 執行序
root 1637 0.0 0.0 6572 576 ? Ss 17:32 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
# echo 'test' > /home/user/guest/test.txt //建立匿名者可下載的測試檔案
啟動 vsftp 服務成功後,便可開啟 FTP Client (例如 FileZilla Client) 進行測試,以便驗證 vsftp 服務是否真的運作,如下操作中匿名者可順利下載其家目錄「/home/user/guest」內的檔案,而使用者 weithenn 可以在自已的家目錄「/home/user/weithenn」上傳下載檔案。