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 服務的話,可依如下方式設定即可。- 輸入指令 /stand/sysinstall 進入管理畫面
- 選擇 Configure
- 選擇 Networking
- 選擇 Anon FTP 後
- 設定匿名 (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 指令。