︿
Top

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」上傳下載檔案。


文章標籤: