前言
SSH檔案傳輸協定(英語:SSH File Transfer Protocol,也稱Secret File Transfer Protocol,中文:安全檔案傳送協定,英文:Secure FTP或字母縮寫:SFTP)是一數據流連線,提供檔案存取、傳輸和管理功能的網路傳輸協定。由網際網路工程任務組(IETF)設計,透過SSH 2.0 的擴充提供安全檔案傳輸能力,但也能夠被其他協定使用。即使IETF在網路草案資料階段時,這個協定是在SSH-2檔案中描述,它能夠使用在許多不同的應用程式,例如安全檔案傳輸在傳輸層安全(TLS)和傳輸資訊管理於虛擬私人網路應用程式。這個協定是假設執行在安全信道,例如SSH,伺服器已經認證客戶端,並且客戶端使用者可利用協定。
參考資料:維基百科
介紹
本教學假設你有遵循之前的教學:在 Ubuntu 22.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域)或 在 Ubuntu 20.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域)。所以你的文檔根目錄應該會位於 /var/www/example.com/public_html,其中 example.com 為自己設定的網域,在教學中我會使用網域 test1.ui-code.com。
本教學已在 Ubuntu 22.04、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 22.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域)或 在 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 22.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域)或 在 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,並確保你可以在文檔根目錄中創建、編輯和刪除文件和文件夾
相關文章
- [教學][Ubuntu 架站] 如何在 Google Cloud Platform 架設 Ubuntu 伺服器
- [教學][Ubuntu 架站] 在 Ubuntu 20.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域)
- [教學][Ubuntu 架站] 在 Ubuntu 20.04 伺服器上安裝 PHP
- [教學][Ubuntu 架站] 在 Ubuntu 20.04 上安裝 MySQL Server
- [教學][Ubuntu 架站] 在 Ubuntu 20.04 上安裝 phpMyAdmin
- [教學][Ubuntu 架站] 為 Ubuntu 20.04 上的 Apache 配置 Let’s Encrypt SSL 憑證
- [教學][Ubuntu 架站] 如何配置 SFTP 以允許用戶上傳到網頁伺服器的文檔根目錄
- [教學][Ubuntu 架站] 如何在 Google Cloud Platform 架設 Ubuntu 22.04 伺服器
- [教學][Ubuntu 架站] 在 Ubuntu 22.04 安裝 Apache 網頁伺服器,並架設多個網站(多網域)
- [教學][Ubuntu 架站] 在 Ubuntu 22.04 上安裝 MySQL Server
- [教學][Ubuntu 架站] 在 Ubuntu 22.04 伺服器上安裝 PHP
- [教學][Ubuntu 架站] 在 Ubuntu 22.04 上安裝 phpMyAdmin
- [教學][Ubuntu 架站] 為 Ubuntu 22.04 上的 Apache 配置 Let’s Encrypt SSL 憑證
- [教學][Ubuntu 架站] 如何配置 SFTP 以允許用戶上傳到網頁伺服器的文檔根目錄(Document Root)