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 ForwardingAllowTcpForwarding 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權限詳解
。檔案權限