[教學][Ubuntu 架站] 如何配置 SFTP 以允許用戶上傳到網頁伺服器的文檔根目錄(Document Root)

前言

SSH檔案傳輸協定(英語:SSH File Transfer Protocol,也稱Secret File Transfer Protocol,中文:安全檔案傳送協定,英文:Secure FTP或字母縮寫:SFTP)是一數據流連線,提供檔案存取、傳輸和管理功能的網路傳輸協定。由網際網路工程任務組(IETF)設計,透過SSH 2.0 的擴充提供安全檔案傳輸能力,但也能夠被其他協定使用。即使IETF在網路草案資料階段時,這個協定是在SSH-2檔案中描述,它能夠使用在許多不同的應用程式,例如安全檔案傳輸在傳輸層安全(TLS)和傳輸資訊管理於虛擬私人網路應用程式。這個協定是假設執行在安全信道,例如SSH,伺服器已經認證客戶端,並且客戶端使用者可利用協定。

參考資料:維基百科


介紹

本教學假設你有遵循之前的教學:在 Ubuntu 20.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域)。所以你的文檔根目錄應該會位於 /var/www/example.com/public_html,其中 example.com 為自己設定的網域,在教學中我會使用網域 test1.ui-code.com。

本教學已在 Ubuntu 20.04、18.04 和 16.04 上進行了測試,但它也應該適用於其他基於 Debian 的發行版。

本篇教學方法刪除對整個文檔根目錄的 www-data 寫入訪問權限。考慮 PHP 腳本或 WordPress 插件被駭客入侵的狀況,攻擊者可以獲得對整個文檔根目錄的寫訪問權限。為了緩解這種情況,我們只需要授權 www-data(以及 WordPress)對僅需要它正常運行的目錄的寫訪問權限。


1. 安裝 SSH

SFTP 建立在 SSH 傳輸層之上,默認情況下應該安裝在大多數 Linux 服務器發行版上。如果沒有,你可以安裝:

$ sudo apt install ssh

2. 設置 SSH

sshd_config 中將子系統更改為 internal-sftp

$ sudo nano /etc/ssh/sshd_config

滾動到文件底部,在 Subsystem sftp 之前添加 # 註釋掉該行,然後在其下方添加 Subsystem sftp internal-sftp。

#Subsystem sftp /usr/lib/openssh/sftp-server 
Subsystem sftp internal-sftp

重新啟動 sshd 服務以使更改生效。

$ sudo service sshd restart

3. 建立 SFTP 用戶

不建議你使用 root 帳戶或任何具有 sudo 權限的帳戶將文件上傳到網站伺服器的文檔根目錄。因此,你應該創建一個新用戶,該用戶僅具有對文檔根目錄的 SFTP 訪問權限。

在此教學中,我們將 SFTP 用戶稱為 webdev _test1_ui-code_com。

$ sudo adduser webdev_test1_ui-code_com

4. 建立新的 Linux 用戶群組

我們將創建一個具有對文檔根目錄訪問權限的 Linux 用戶群組,然後將我們的 SFTP 用戶添加到該群組。

如果你使用 Apache 或 Nginx 在一台服務器上託管多個網站,你應該命名這些群組,使它們與你的域名相對應。例如,sftp_example1_com 和 sftp_example2_org。

本教學所使用的網域為 test1.ui-code.com,因此我們將群組名命為 sftp_test1_ui-code_com,將此群組限制為默認文檔根目錄 /var/www/test1.ui-code.com/public_html。

新增新的群組:

$ sudo groupadd sftp_test1_ui-code_com

5. 將 SFTP 用戶添加到群組

將你的 SFTP 用戶 webdev(或你命名的任何名稱)添加到 sftp_test1_ui-code_com 組。

$ sudo usermod -a -G sftp_test1_ui-code_com webdev_test1_ui-code_com

6. 在 SSH 設定檔中新增 Match Group 指令

通過使用 Match Group 指令,你可以更方便地管理多個用戶和文檔根目錄。

首先打開 sshd_config

$ sudo nano /etc/ssh/sshd_config

向下滾動到 SSH 配置文件的底部並添加新的 Match Group 指令。

如果你依照之前的教學:在 Ubuntu 20.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域) 。您的文檔根目錄可能位於 /var/www/mydomain.com/public_html,在這種情況下,你的 ChrootDirectory 將是 /var/www/mydomain.com/, 其中 mydomain.com 為自己設定的網域,在教學中我會使用網域 test1.ui-code.com。

Match Group sftp_test1_ui-code_com 
        ChrootDirectory /var/www/test1.ui-code.com/
        ForceCommand internal-sftp 
        X11Forwarding no 
        AllowTcpForwarding no 
        PasswordAuthentication yes

保存並退出(按 CTRL + X,按 Y,然後按 ENTER)。

在重新啟動之前測試 SSH 配置。

$ sudo sshd -t

如果沒有錯誤,請重新啟動 sshd 服務以使更改生效。

$ sudo service sshd restart

7. 設定目錄權限

SFTP 對 chroot 目錄權限非常嚴格,如果設置不正確,你將無法登錄,因此請仔細按照這些說明進行操作。

chroot 通常是文檔根目錄之上的目錄。例如,默認情況下 /var/www/ 是 chroot,/var/www/html 是文檔根目錄。另一個範例,如果你的文檔根目錄是更深的一個目錄,例如 /var/www/domain.com/public_html,那麼您的 chroot 是 /var/www/domain.com。

  • chroot 目錄及其所有父目錄不得具有群組或全域寫入功能,否則 SFTP 登錄將失敗並出現錯誤。
  • chroot 目錄及其所有父目錄必須由 root 擁有,否則 SFTP 登錄將失敗並出現致命錯誤。
  • 如果你的 chroot 目錄不是 /var/www 而是 /var/www/domain.com,那麼你需要將這些權限和 root 所有權也應用於該文件夾及其所有父文件夾!

首先,讓我們檢查 /var/ 的權限和所有權——默認情況下它們應該是 755 和 root。

$ sudo ls -ld /var/

輸出:

drwxr-xr-x 14 root root 4096 Sep  7 11:33 /var/

如果 /var/ 的權限和所有權不是 755 和 root,則需要重新設置權限和所有權。

$ sudo chmod 755 /var/
$ sudo chown root:root /var/

如果你依照之前的教學:在 Ubuntu 20.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域) 。您的文檔根目錄可能位於 /var/www/mydomain.com/public_html,在這種情況下,你的 ChrootDirectory 將是 /var/www/mydomain.com/, 其中 mydomain.com 為自己設定的網域,在教學中我會使用網域 test1.ui-code.com。

$ sudo chmod 755 /var/www/test1.ui-code.com/

確保您的 chroot 目錄歸 root 所有。

$ sudo chown root:root /var/www/test1.ui-code.com/

要檢查此目錄的權限:

$ sudo ls -ld /var/www/test1.ui-code.com/

輸出:

drwxr-xr-x 3 root root 4096 Sep  8 06:07 /var/www/test1.ui-code.com/

確保文檔根設置為 775,這將允許組寫入此目錄。

$ sudo chmod 775 /var/www/test1.ui-code.com/public_html

確保你的文檔根目錄和所有內容都歸根目錄和 sftp_test1_ui-code_com 群組所有

$ sudo chown -R root:sftp_test1_ui-code_com /var/www/test1.ui-code.com/public_html*

將文檔根目錄中的所有目錄更改為 775。這將允許 sftp_test1_ui-code_com 組讀取、寫入和執行文件夾。

$ sudo find /var/www/test1.ui-code.com/public_html/ -type d -exec chmod 775 {} \;

將文檔根目錄中的所有文件更改為 664,這將允許 sftp_test1_ui-code_com 組讀取、寫入和執行文件。

$ sudo find /var/www/test1.ui-code.com/public_html/ -type f -exec chmod 664 {} \;

確保 SFTP 用戶創建的任何新文件或文件夾都繼承了文檔根目錄的群組,在本例中為 sftp_test1_ui-code_com 組。

$ sudo find /var/www/test1.ui-code.com/public_html -type d -exec chmod g+s {} \;

現在使用你可使用 FTP 客戶端登錄 SFTP,並確保你可以在文檔根目錄中創建、編輯和刪除文件和文件夾


相關文章

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。