我們有個 企業 IT 委外 (協助客戶提升企業 IT 管理品質與安全性的服務) 的客戶問我說要如何設定 vsftpd ( Linux 下非常普及的 FTP 伺服器 ) 才能讓他們官網在更新檔案的時候比較安全,因為該客戶的網站編輯人員經常透過 FTP 更新資料,且公司裡所有需要更新網站的人都能透過 FTP 登入官網,每個人都能建立檔案、刪除檔案、更新檔案…等等,由於每個人都擁有 FTP 最大權限,他覺得很不安全,問我應該怎樣設定比較好。因此今天整理出我設定 vsftpd 的筆記,在此我分享安全設定 vsftpd 與多人共用 FTP 的設定技巧!
[ 注意事項 ]
- 以下設定步驟牽涉到許多 Linux 系統管理的基本觀念與指令,例如 umask, chroot, shell, useradd, usermod, chmod, setuid, setgid, …,我不會深入解釋每個設定所代表的意思,如果有任何疑問歡迎留言討論。
- 以下會用到一些變數,請依據實際的情況進行修改使用,切勿直接 Copy / Paste 執行!
§ PART I: 安全的 vsftpd 設定 ( 關閉匿名登入、允許本機使用者登入、將登入者預設 chroot )
修改兩個 vsftpd.conf 的預設設定 ( 設定檔位於 /etc/vsftpd/vsftpd.conf 或 /etc/vsftpd.conf )
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=002
chroot_local_user=YES
註 1:設定 local_umask=002 主要是為了讓透過 FTP 上傳的檔案的預設群組權限為「可寫入」
註 2:設定 chroot_local_user=YES 之後,新版的 vsftpd 會限制根目錄不能開啟「寫入權限」
新增允許 FTP 登入的 shell 版本 ( 將 /usr/sbin/nologin 或 /sbin/nologin 加入到 /etc/shells )
echo /usr/sbin/nologin >> /etc/shells
重新啟動 vsftpd 服務
/etc/init.d/vsftpd restart
§ PART II: 網站最高權限使用者 & 網站目錄權限設定
新增一個 網站使用者 ( mysite ) 與其 家目錄 ( /home/mysite )
useradd -d /home/mysite -s /usr/sbin/nologin -m mysite
查看一下該使用者的家目錄檔案 ( 包括隱藏檔 )
root@www:~# ls -laF /home/mysite/
total 20
drwxr-xr-x 2 mysite mysite 4096 Aug 14 00:39 ./
drwxr-xr-x 4 root root 4096 Aug 14 00:39 ../
-rw-r--r-- 1 mysite mysite 220 Apr 3 23:58 .bash_logout
-rw-r--r-- 1 mysite mysite 3486 Apr 3 23:58 .bashrc
-rw-r--r-- 1 mysite mysite 675 Apr 3 23:58 .profile
刪除用不到的隱藏檔
rm -f /home/mysite/.[a-z]*
清空後目錄應該長這樣:
root@www:~# ls -laF /home/mysite/
total 8
drwxr-xr-x 2 mysite mysite 4096 Aug 14 00:39 ./
drwxr-xr-x 4 root root 4096 Aug 14 00:39 ../
變更家目錄的權限,設定成唯讀 (必要步驟)
由於新版 vsftpd 的限制,只要是透過 chroot 限制的帳號,登入 FTP 時會要求根目錄不能有任何「寫入權限」,否則會出現 500 OOPS: vsftpd: refusing to run with writable root inside chroot() 的錯誤訊息! (我覺得這個限制還挺麻煩的,應該要有選項能關閉這個限制才對,可惜目前 v3.0 都還沒有)
建立第一層子目錄
因為 chroot 後的根目錄必須為唯讀,所以真正可透過 FTP 管理的目錄必須為 chroot 後的子目錄才行!
mkdir /home/mysite/public_html
賦予該目錄的群組寫入權限 ( 設定群組可寫入 & 設定群組 ID 旗標 )
當目錄被設定群組 ID 旗標 (setgid) 之後,該目錄新增的檔案與目錄都會設定的跟目錄一樣權限!
chown mysite.mysite /home/mysite/public_html
chmod g+ws /home/mysite/public_html
設定完後目錄應該長這樣:
root@www:~# ls -laF /home/mysite/
total 12
dr-xr-xr-x 3 mysite mysite 4096 Aug 14 01:58 ./
drwxr-xr-x 4 root root 4096 Aug 14 01:58 ../
drwxrwsr-x 2 mysite mysite 4096 Aug 14 01:58 public_html/
如果該目錄已經有檔案的情況下,可以透過以下指令重設目錄與檔案權限
chown mysite.mysite -R /home/mysite
chmod a-w /home/mysite
chmod g+rw -R /home/mysite/*
find /home/mysite/* -type d -exec chmod g+ws {} \;
§ PART III: 新增其他共用 FTP 的使用者 ( 需開放特定網站目錄給特定使用者 )
假設我要開放 /home/mysite 目錄下的權限給 user1 使用者,可透過以下指令設定:
useradd -d /home/mysite -s /usr/sbin/nologin user1
重設 user1 帳戶的密碼
將 user1 帳戶加入到 mysite 群組 ( 加入到 mysite 群組後就有權限可以上傳、刪除目錄中的檔案了 )
usermod -a -G mysite user1
若要將 user1 從 mysite 群組中移除 ( 也就是將預設群組設定為原帳戶預設的群組名稱 )
若要修改 user1 的預設家目錄
usermod -d /home/mysite user1
其他備註事項
- 如果要不同目錄給不同使用者權限,可以將特定目錄設定成不同的 gid (群組),再將 FTP 使用者加入到特定 gid (群組) 之中,即可做到限制其「讀取」或「寫入」等不同的權限。
- 以上安全設定的觀念必須融會貫通,才能真正做到安全的權限控管。
- 如果你常用 FileZilla 連接 vsftpd 的話,每當修改完 vsftpd 的設定與權限後,請務必將 FileZilla 完整關閉並重新啟動後再進行測試,否則你很有可能會遇到設定的權限沒有立即生效的詭異狀況! ( 因為 FileZilla 在手動斷線或重連後其實還會留下一條連線在背景,你必須將 FileZilla 應用程式整個關閉才能真正讓 FileZilla 與 vsftpd 之間的連線完整切斷! )
相關連結