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

我們有個 **企業 IT 委外** (協助客戶提升企業 IT 管理品質與安全性的服務) 的客戶問我說要如何設定 [vsftpd](http://vsftpd.beasts.org/) ( 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()](https://web.archive.org/web/20191215192928/https://www.centos.bz/2011/12/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 旗標](http://en.wikipedia.org/wiki/Setuid)** )

當目錄被設定群組 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](http://filezilla-project.org/) 連接 vsftpd 的話，每當修改完 vsftpd 的設定與權限後，請務必將 [FileZilla](http://filezilla-project.org/) 完整關閉並重新啟動後再進行測試，否則你很有可能會遇到設定的權限沒有立即生效的詭異狀況！ ( 因為 [FileZilla](http://filezilla-project.org/) 在手動斷線或重連後其實還會留下一條連線在背景，你必須將 [FileZilla](http://filezilla-project.org/) 應用程式整個關閉才能真正讓 [FileZilla](http://filezilla-project.org/) 與 [vsftpd](https://security.appspot.com/vsftpd.html) 之間的連線完整切斷！ )

**相關連結**

-   [vsftpd - Secure, fast FTP server for UNIX-like systems](https://security.appspot.com/vsftpd.html)
-   [setuid - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Setuid)
-   [Ubuntu Server Guide](https://help.ubuntu.com/12.04/serverguide/index.html) » [File Servers](https://help.ubuntu.com/12.04/serverguide/file-servers.html) » [FTP Server](https://help.ubuntu.com/12.04/serverguide/ftp-server.html)
-   [500 OOPS: vsftpd: refusing to run with writable root inside chroot()](https://web.archive.org/web/20191215192928/https://www.centos.bz/2011/12/500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/)
-   [VSFTPD.CONF](http://vsftpd.beasts.org/vsftpd_conf.html)
-   [vsftpd.conf](https://manpages.ubuntu.com/manpages/jammy/en/man5/vsftpd.conf.5.html) ( ubuntu manuals )
-   [Howto: Linux Add User To Group](http://www.cyberciti.biz/faq/howto-linux-add-user-to-group/)
-   [Remove Linux User From a Secondary Group ( Supplementary Groups )](http://www.cyberciti.biz/faq/howto-linux-remove-user-from-group/)
-   vsftpd-3.0.0/secutil.c
