利用內建的 Ftpd 來提供 FTP 服務

1、前言

當 FreeBSD 裝好後,內建就已經有 ftpd ,但您若覺得內建的 ftpd 功能太陽春,可使用其它 ftpd 來取代,像 pure-ftpd 就是個功能強大又安全的 ftp 軟體,本文為介紹內建的 ftpd。






文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.由 inetd 來啟動 ftpd
          步驟2.設定 Chroot 功能
          步驟3.提供匿名登入 FTP 服務
          步驟4.設定開機時自動執行 inetd 服務
          步驟5.安全性設定
          步驟6.啟動 inetd 服務
4、補充1:只想讓帳號能 FTP 連線而無法 SSH 登入?
5、補充2:如何改變 FTP 預設上傳目錄及檔案權限?
6、參考





2、實作環境

  • FreeBSD 5.x
  • FreeBSD 6.x
  • 內建 ftpd 





3、安裝及設定

步驟 1. 由 inetd 來啟動 ftpd

由於 FreeBSD 中內建的 ftpd 服務是透過 inetd 這隻服務來啟動,因此我們修改 inetd 設定檔啟動 ftpd。以下為參數說明:
  • -l:syslogd 將會記錄每次的連線 (若加上二個 -l 參數則連使用的動作都記錄下來)。
  • -S:記錄所有匿名使用者 (anonymous) 下載動作,並記錄到 /var/log/ftpd 內。

修改 inetd 設定檔內容,把註解拿掉,並加上 -l -l -S參數。
vi /etc/inetd.conf      //修改 inetd.conf 內容如下
 ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -S  //拿掉註解並加上參數




步驟 2. 設定 Chroot 功能

何謂 Chroot? 即 FTP Client 登入後只能在該使用者帳戶內自已的家目錄下活動稱之,要達成此方法我們可透過設定 ftpchroot 或 login.conf 設定檔來達成。
  • /etc/ftpchroot: 針對 特定 個人或群組
  • /etc/login.conf: 針對 所有 使用者帳戶

步驟 2-1. /etc/ftpchroot (針對特定個人或群組套用 chroot)

修改 /etc/ftpchroot 針對特定個人或群組套用 chroot。
vi /etc/ftpchroot   //修改(新增)此檔內容如下
 weithenn     //限制 user account weithenn 只能在家目錄活動
 @ftpuser     //限制 ftpuser 群組只能在家目錄活動


步驟 2-2. /etc/login.conf (針對所有使用者帳戶套用 chroot)

修改 /etc/login.conf 針對所有使用者帳戶套用 chroot。
vi /etc/login.conf    //修改 login.conf 加入 :ftp-chroot:\
 default:\
              :ftp-chroot:\    //加入此行後存檔離開
              :passwd_format=md5:\
              :copyright=/etc/COPYRIGHT:\
              :welcome=/etc/motd:\
#cap_mkdb /etc/login.conf      //重新載入設定檔 (更新至 login.conf.db 資料庫)


步驟 2-3. chroot 套用後仍可存取共享目錄

但問題來了,如果想要讓使用者只能在自己的家目錄活動 (chroot),但又要能進入公開的共享目錄要如何達成呢? 使用 ln -s 是無法通過 chroot 的限制,此時請使用 mount_nullfs 來達成此一目的,即可達成限制使用者於 chroot 中又可取得共享檔案。
  • 使用者帳戶: weithenn (套用 chroot)
  • 共享目錄: /home/share
  • 掛載共享目錄: /home/weithenn/share

如下指令為將 /home/share 的共享目錄利用 mount_nullfs 指令掛到 /home/weithenn/share 下。
mount_nullfs /home/share /home/weithenn/share
不過當你機器重新開機後此 mount 便消失了,若想要重開機仍自動 mount_nullfs 請新增如下 shell script 至 /usr/local/etc/rc.d 內。
vi /usr/local/etc/rc.d/ftpshare.sh         //建立 script,如下內容
 #!/bin/sh
 mount_nullfs /home/share /home/weithenn/share
chmod 755 /usr/local/etc/rc.d/ftpshare.sh  //給予執行權限




步驟 3. 提供匿名登入 FTP 服務

若您想提供匿名 (Anonymous) 使用者也可存取 FTP 服務的話,可依如下方式設定即可。
  1. 輸入指令 /stand/sysinstall 進入管理畫面
  2. 選擇 Configure
  3. 選擇 Networking 
  4. 選擇 Anon FTP 後
  5. 設定匿名 (Anonymous) 使用者帳戶及目錄後即可開始使用,/var/log/xferlog 可查看 ftp 連結相關資訊



步驟 4. 設定開機時自動執行 inetd 服務

修改 rc.conf 設定檔,以便下次機器重新開機時能自動啟動 inetd 服務。
vi /etc/rc.conf      //修改 rc.conf 設定檔
 inetd_enable="YES"   //加入此行




步驟 5. 安全性設定

當您的 FTP 只是要提供給特定幾人時,可利用 tcp_wrappers 功能來限制只有特定 IP Address 才能連線的功能。
vi /etc/hosts.allow      //修改 hosts.allow 內容如下
 ftpd : 61.60.59.58/255.255.255.255: allow  //允許 61.60.59.58 才能登入 FTP
 ftpd : ALL : deny                          //拒絕其他 FTP 連線請求




步驟 6. 啟動 inetd 服務

相關完成後我們鍵入以下指令來啟動 inetd 服務 (重新載入 inetd.conf 設定檔內容)。
/etc/rc.d/inetd start               //啟動 inetd 服務
kill -HUP `cat /var/run/inetd.pid`  //重新啟動 inetd 服務 

檢查執行序 (process) 是否已有 inetd 服務
ps aux |grep inetd                  //查看 inetd 服務是否啟動
測試 FTP 功能
telnet localhost 21                 //測試 ftp 服務是否啟動
 Trying 127.0.0.1...                 //啟動成功
 Connected to localhost.
 Escape character is '^'.
 220 dmz.weithenn.org FTP server (Version 6.00LS) ready.
 quit                                //輸入 quit 離開
 221 Goodbye.
 Connection closed by foreign host.






4、補充1: 只想讓帳號能 FTP 連線而無法 SSH 登入?

若只想讓該使用者帳號只能 FTP 連線至 FreeBSD 而無法 SSH (putty) 登入至 FreeBSD 該如何達成?
vi /etc/shells     //修改 shells
 /bin/sh            //預設值
 /bin/csh           //預設值
 /bin/tcsh          //預設值
 /usr/sbin/nologin  //加入此行

使用指令 vipw 修改使用者的 Shell 環境,將預設 /bin/tcsh 修改為 /usr/sbin/nologin 則該使用者帳戶便只可 FTP 連線登入而無法使用 putty 進行 SSH 登入至 FreeBSD。
vipw
 weithenn:$1$5XtAqwy7$A.TnRLjkQ2yqrMj32XszC/:1001:1001::0:0:User &:/home/user/weithenn:/bin/tcsh               //預設值
 weithenn:$1$5XtAqwy7$A.TnRLjkQ2yqrMj32XszC/:1001:1001::0:0:User &:/home/user/weithenn:/usr/sbin/nologin    //修改後






5、補充2: 如何改變 FTP 預設上傳目錄及檔案權限?

為何需要更改呢?因為 ftpd 預設上傳目錄及檔案的權限為 umask 022。
umask:022   //等於對檔案權限為 644 對目錄權限為 755
這樣當有許多帳號想要同時上傳到同一個目錄時,則會產生困擾因為 umask 為 022 ,所以上傳的檔案為 644 這樣當另一個人想上傳時便發生檔案無法寫入的問題,如何才能讓預設上傳的權限改為 664 呢?
vi /etc/login.conf
 :umask=022:    //預設值
 :umask=002:    //更改後對檔案權限為 664 對目錄權限為 775
cap_mkdb /etc/login.conf  //重新載入設定檔 (更新至 login.conf.db 資料庫中)

經過上述更改後 ftpd 上傳預設就變為 644 關於 umask 對應請參考 網路農夫 -- UNIX C Shell -- 3-8-1 umask 指令





6、參考