Linux Ubuntu安裝SFTP,部屬靜態網頁至Nginx

SFTP對於網頁開發來說是個重要的工具,可以透過SFTP把要發佈的程式上傳到Web Server,部屬靜態網頁至Nginx。並透過ChrootDirectory來限制能瀏覽的目錄,限制SFTP看到系統上的其他檔案

 

由於SFTP是架構在SSH上來做傳輸,所以我們必須要在ubuntu上先安裝ssh。並修改sshd_config,將Subsystem sftp由/usr/lib/openssh/sftp-server改成internal-sftp
sudo apt install ssh
sudo nano /etc/ssh/sshd_config
# override default of no subsystems
#Subsystem      sftp    /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

 

重新啟動sshd
sudo service sshd restart

 

建立sftp使用者
sudo adduser sftp_user2

 

建立Linux群組
$ sudo groupadd sftp_group

 

將sftp使用者帳號加入至剛剛建立的群組中
sudo usermod -a -G sftp_group sftp_user2

 

以Nginx來說,Nginx預設目錄會為/var/www/html/,這層是文檔根目錄,ChrootDirectory則為上一層的/var/www/

但如果有多個網站的話,底下可能會依照不同的domain或是專案又區分不同的資料夾(ex:/var/www/html/Site_1/, /var/www/html/Site_2/…)分成不同的文檔根目錄。這時候我們的文檔根目錄就會為/var/www/html/Site_1/,ChrootDirectory則為上一層的/var/www/html/。

知道了什麼是ChrootDirectory後,接著我們要修改sshd_config,將ChrootDirectory對應到我們剛剛建立的群組,以便後續的權限設定。
sudo nano /etc/ssh/sshd_config

下面設定意思如下:
ChrootDirectory /var/www/html:登入後需透過 chroot 限制存取目錄
ForceCommand internal-sftp:不允許使用者登入 Shell 進行操作 ( 讓使用者只能使用 SFTP 傳輸檔案 )
X11Forwarding no:不允取使用者建立 X11 Forwarding
AllowTcpForwarding no:不允取使用者建立 SSH 通道 (SSH Tunnel 或稱 TCP Forwarding)

Match Group sftp_group
ChrootDirectory /var/www/html
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
PasswordAuthentication yes

 

測試一下設定檔是否有錯誤,以免採用錯誤的設定造成 sshd 伺服器無法啟動,把自己擋在伺服器之外,並重啟ssh服務
sudo sshd -t
sudo service sshd restart

 

在設定權限前,有一些Linux權限的基本知識要先了解一下,不然會有看沒有懂。

Linux權限的表示方法為[drwxr-xr-x]共10的字元。
d:directory
r:可讀(4)
w:可寫(2)
x:可執行(1)

第1個字元表示權限範圍為一個目錄。
第2~4個字元,代表的是擁有人的權限,rwx代表可讀可寫可執行(4+2+1=7)
第5~7個字元,代表的是同群組的權限,r-x代表可讀不可寫可執行(4+0+1=5)
第2~4個字元,代表的是所有人的權限,r-x代表可讀不可寫可執行(4+0+1=5)

目錄權限可以用[drwxr-xr-x]來表示,也可以用數字[755]來表示。

有了上述的基本認知後。首先,讓我們檢查 /var/ 的權限和所有權——默認情況下它們應該是 755 和(擁有人是) root。

sudo ls -ld /var/

輸出:

drwxr-xr-x 14 root root 4096 Aug 10 02:18 /var/

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

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

 

接著設定ChrootDirectory的權限(/var/www/html/),也設定為755 + root
sudo chmod 755 /var/www/html/
sudo chown root:root /var/www/html/

檢查此目錄的權限:

sudo ls -ld /var/www/html/

輸出:

drwxr-xr-x 3 root root 4096 Aug 10 02:18 /var/www/

 

我們在ChrootDirectory下新增一個Site1資料夾,當作我們的文檔根目錄,也就是存放網站發布後的檔案的資料夾。

接著設定文檔根目錄的權限,權限設定為775 。

新增Site1目錄

sudo mkdir /var/www/html/Site1

確認目錄結構

sudo tree /var/www/

設定文檔根目錄的權限

sudo chmod 775 /var/www/html/Site1/

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

sudo chown -R root:sftp_group /var/www/html/Site1*

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

sudo find /var/www/html/Site1/ -type d -exec chmod 775 {} \;

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

sudo find /var/www/html/Site1/ -type f -exec chmod 775 {} \;

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

sudo find /var/www/html/Site1/ -type d -exec chmod g+s {} \;

 

上述繁雜的設定都完成後,我們就可以透過Filezilla來上傳Angular建置出的檔案到Server試試看。結果是確實有上傳成功了,網頁也確實可以正常打開。

 

如果確認上面的步驟都沒有做錯,但網頁一直顯示404的話。確認一下/etc/nginx/sites-available/default的server區塊內容是不是有少設定東西

sudo nano /etc/nginx/sites-available/default
server {
    listen 80;
    server_name "";
    index index.html index.htm;
    root /var/www/html;
    
    
...省略...
}

 

 

Ref:
[教學][Ubuntu 架站] 如何配置 SFTP 以允許用戶上傳到網頁伺服器的文檔根目錄(Document Root)
透過 OpenSSH 使用 SFTP 登入時將帳戶設為 chroot 的方法 (Linux)
Linux 建立 SFTP 專用帳號,並設定 Chroot 環境教學
linux系統644、755、777權限詳解
檔案權限