The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何安全地設定 vsftpd 提供多人同時使用 FTP 更新網站資料

我們有個 企業 IT 委外 (協助客戶提升企業 IT 管理品質與安全性的服務) 的客戶問我說要如何設定 vsftpd ( Linux 下非常普及的 FTP 伺服器 ) 才能讓他們官網在更新檔案的時候比較安全,因為該客戶的網站編輯人員經常透過 FTP 更新資料,且公司裡所有需要更新網站的人都能透過 FTP 登入官網,每個人都能建立檔案、刪除檔案、更新檔案…等等,由於每個人都擁有 FTP 最大權限,他覺得很不安全,問我應該怎樣設定比較好。因此今天整理出我設定 vsftpd 的筆記,在此我分享安全設定 vsftpd 與多人共用 FTP 的設定技巧!

 

[ 注意事項 ]

  1. 以下設定步驟牽涉到許多 Linux 系統管理的基本觀念與指令,例如 umask, chroot, shell, useradd, usermod, chmod, setuid, setgid,  …,我不會深入解釋每個設定所代表的意思,如果有任何疑問歡迎留言討論。
  2. 以下會用到一��變數,請依據實際的情況進行修改使用,切勿直接 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 都還沒有)

chmod a-w /home/mysite/

建立第一層子目錄

因為 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 帳戶的密碼

passwd user1

user1 帳戶加入到 mysite 群組 ( 加入到 mysite 群組後就有權限可以上傳、刪除目錄中的檔案了 )

usermod -a -G mysite user1

若要將 user1 從 mysite 群組中移除 ( 也就是將預設群組設定為原帳戶預設的群組名稱 )

usermod -G user1 user1

若要修改 user1 的預設家目錄

usermod -d /home/mysite user1

 

其他備註事項

  • 如果要不同目錄不同使用者權限,可以將特定目錄設定成不同的 gid (群組),再將 FTP 使用者加入到特定 gid (群組) 之中,即可做到限制其「讀取」或「寫入」等不同的權限。
  • 以上安全設定的觀念必須融會貫通,才能真正做到安全的權限控管。
  • 如果你常用 FileZilla 連接 vsftpd 的話,每當修改完 vsftpd 的設定與權限後,請務必將 FileZilla 完整關閉並重新啟動後再進行測試,否則你很有可能會遇到設定的權限沒有立即生效的詭異狀況! ( 因為 FileZilla 在手動斷線或重連後其實還會留下一條連線在背景,你必須將 FileZilla 應用程式整個關閉才能真正讓 FileZillavsftpd 之間的連線完整切斷! )

 

相關連結