WordPress / 架站教學二:透過 SSH 連線遠端控制 GCP 並架設 FTP 伺服器 (使用 WordPress Bitnami)

WordPress / 架站教學二:透過 SSH 連線遠端控制 GCP 並架設 FTP 伺服器 (使用 WordPress Bitnami)

English Version: WordPress / Tutorial #2: How to setup FTP Server on GCP with WordPress Bitnami

FTP, File Transport Protocol,檔案傳輸協定,是一個常見的檔案傳輸方式。透過 FTP 我們可以直接遠端連線到我們的 server 並且直接上傳、下載或管理遠端伺服器的檔案。

在上一篇我們已經介紹過如何在 GCP 上安裝部署 WordPress,雖然 WordPress 已經有很完整的圖形化介面可以對網站進行設定或修改,但為了做更進階的設定,我們可能必須抽換伺服器上的檔案,甚至修改檔案權限或除錯。此時就必須透過 SSH 連線和 FTP Server 去完成系統控制和檔案管理的任務。

 

透過 SSH 連線遠端控制伺服器

SSH 是一種加密的網路傳輸協定,最常見使用於遠端登入系統,透過指令控制系統。我們先前已經建立好的 WordPress Bitnami Server 是用 Debian Linux 作業系統建立的,所以我們可以輕易的用 SSH 連線用下指令的方式遠端控制我們的 server。

▍ 使用 Google Cloud SDK 登入伺服器

還記得在前一篇提過的 Google Cloud SDK 嗎?我們可以藉由這個 SDK 與遠端的 GCP server 建立 SSH 連線。

在 GCP 上建立的虛擬機器稱為執行個體 (instance),是包裹在一個專案之下。其實所謂虛擬機器就是在遠端的伺服器上建立一個作業系統,他就好像一台虛擬的電腦,我們可以透過 SSH 指令對他遠端控制。

由於我們使用 WordPress Bitnami 使用的作業系統是 Debian Linux,伺服器則是使用 Appache,所以在這裡我們使用的都是 Linux 指令。

🔺 透過 SSH 連上伺服器的步驟很簡單:
Deployment Manager > Deployments >
(instance) > View gcloud command

首先,先開啟 GCP 的專案,接著依照上面的步驟找到剛剛建立的 WordPress 伺服器,在右邊的控制面板我們可以直接找到 gcloud 指令,對伺服器進行遠端控制。 (紅字是你的虛擬機器名稱)

wp-tutorial-2-1-gcp-panel

在 MAC 使用終端機或 Windows 則使用命令提示字元 (cmd),直接將那一串指令複製貼上、並按下 Enter 執行它。像我的 gcloud 指令就是長這樣:

$ gcloud compute --project "gcp-tutorial-251113" ssh --zone "asia-east1-a" "charlesblog-vm"
wp-tutorial-2-2-SSH-command

輸入密碼連上線之後,就進入我們的虛擬機器 (Virtual Machine, VM) 啦~

🔺 存取權限錯誤

ERROR: (gcloud.compute.ssh) Could not fetch resource:
 - Required 'compute.instances.get' permission for 'projects/gcp-tutorial-248114/zones/asia-east1-a/instances/charlesblog-vm'

如果在登入 gcloud 的時候收到上面的錯誤訊息,很可能是必須重新授權 SDK 存取 Google 帳號。

$ gcloud auth login

輸入指令就會彈出瀏覽器視窗,重新授權之後就可以順利登入。

 

使用 vsftp 安裝 FTP 伺服器

我們使用 vsftp 這套 FTP 軟體,安裝方式與設定非常簡單,所有步驟全部都以指令就可以完成。

▍ 安裝 vsftpd 及更新
$ sudo apt update
$ sudo apt install vsftpd

執行上面指令,系統就會自動下載並安裝好 vsftpd。如果要確認是否安裝成功,可以再輸入指令確認 vsftpd 的狀態:

$ sudo systemctl status vsftpd

如果狀態是 active (running) 就表示 FTP server 目前正在運行當中囉!

● vsftpd.service - vsftpd FTP server
   Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-08-22 08:05:36 UTC; 12s ago
 Main PID: 17656 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─17656 /usr/sbin/vsftpd /etc/vsftpd.conf

Aug 22 08:05:36 charlesblog-vm systemd[1]: Starting vsftpd FTP server...
Aug 22 08:05:36 charlesblog-vm systemd[1]: Started vsftpd FTP server.
參數設定

在開始使用之前,我們還是必須對 FTP 做一些參數設定。詳細的參數說明可以參考官方文件

vsftpd 的參數設定檔位在 /etc/vsftpd.conf ,首先先使用 nano 編輯器開啟參數檔:

$ sudo nano /etc/vsftpd.conf

可以看到裡面已經有預設的參數設定,我們必須修改部分的參數:

1. FTP server 存取權限

為了安全性,關閉匿名登入、只允許本地端使用者存取 FTP,並允許檔案上傳。

anonymous_enable=NO
local_enable=YES
write_enable=YES

2. 禁止使用者存取根目錄以外的目錄

在後面的設定我們會指定每個使用者的根目錄,也就是當使用者一登入 FTP server 時會出現的根目錄。為了安全起見,我們當然不希望使用者可以存取任何我們指定目錄以外的地方到處亂逛。所以我們必須關閉這樣的權限,把使用者”鎖”在家目錄底下。

chroot_local_user=YES

當我們開啟 chroot 之後,必須給予使用者存取的權限。主要有兩種方式:

  • 方法一:使用者擁有根目錄底下的寫入權限
allow_writeable_chroot=YES

這是我比較推薦的方式,設定上比較直觀、管理也比較方便。在後面的步驟會對每個使用者設定根目錄的位置,在這邊我們只需要給予使用者寫入的權限,也就是能上傳檔案即可。

  • 方法二:指定預設根目錄
user_sub_token=$USER
local_root=/home/$USER/ftp

另一個方式則是設定預設的使用者根目錄,這方法的好處是可以統一的讓使用者家目錄有一致性的結構。像上面的指令,讓所有的家目錄都在 /home/user/ftp 之下,紅字是使用者名稱。不過這比較不適用這裡,因為我們主要是希望透過 FTP 抽換 WordPress 的檔案,不是單純做一個檔案上傳的空間而已。

3. 連接埠設定

vsftpd 可以使用任何的連接埠 (port),我們將連接埠限制在一定的範圍之內,後續才能設定防火牆的規則。

pasv_min_port=30000
pasv_max_port=31000

我們指定 30000 ~ 31000 之間的 port,這也可以依照你喜歡的數字修改。

4. 使用者登入清單

為了安全性起見,我們要求只有列在清單上的使用者才能存取 FTP server。

userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
userlist_deny=NO

所有列在 /etc/vsftpd.user_list 當中的使用者才能登入 FTP。

5. 修正 PAM 模組名稱

pam_service_name=vsftpd

在我設定過好多次 vsftpd 的經驗當中,有時候會遇到連線失敗的狀況,我發現是 PAM 模組名稱設定的問題。PAM 模組是管理使用者登入權限、限制用戶能力的相關設定檔。

預設的名稱是 ftp,不過實際上我們的 PAM 模組是存在 /etc/pam.d/vsftpd 當中,所以必修做此一修正。

6. 設定加密連線設定檔位置

下一個步驟我們會對 FTP 設定 SSL 加密連線,在這邊我們預先設定好參數,告訴 vsftpd 我們的金鑰與認證檔儲存的位置。

rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES

所有參數設定完成之後,按 Control + X 儲存並離開編輯器。

7. 設定 SSL 加密連線

一般的 FTP 是沒有加密過的連線,所有檔案與資料都在網路上明碼傳輸,這其實非常危險,所以我們必須使用 SSL 協定對連線做加密。一般來說,可以透過可信任的機構申請 SSL 認證。如果你擁有自己的 domain name,也可以使用 Let’s Encrypt 做免費的加密認證。

或者,我們也能自行製作加密認證。

$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

這裡我們使用 openssl 指令自行產生加密認證,上面的指令會產生一個 2048 bits 的金鑰,長達 10 年的效期,且金鑰與認證都存在同一個檔案當中。 (/etc/ssl/private/vsftpd.pem)

8. 重新啟動 FTP server

到此我們已經完成好 vsftpd 的參數設定,只需要重新啟動即可。

$ sudo systemctl restart vsftpd
▍ 安裝 UFW 防火牆

同樣的為了安全性起見,我們在 server 上安裝防火牆控制連接埠的開關是有必要的。這裡我們使用 UFW Firewall,安裝及設定只需要幾個指令即可完成。

1. 安裝 UFW Firewall

$ sudo apt-get install ufw

輸入指令,安裝程序就會自動完成。

2. 開啟必要的連接埠

$ sudo ufw allow 20:21/tcp
$ sudo ufw allow 30000:31000/tcp
$ sudo ufw allow OpenSSH
$ sudo ufw allow http
$ sudo ufw allow https

開啟必要的連接埠 FTP 及 Apache server 才能正確地連線。

3. 重新啟動 UFW 防火牆

$ sudo ufw disable
$ sudo ufw enable

重新啟動防火牆以生效前面的設定。

如果要確認連接埠是否有正確的開啟,可以輸入指令查看防火牆狀態:

$ sudo ufw status

顯示的狀態如下:

Status: active
 

 To                         Action      From
 --                         ------      ----
 20:21/tcp                  ALLOW       Anywhere                  
 30000:31000/tcp            ALLOW       Anywhere                  
 80/tcp                     ALLOW       Anywhere                  
 OpenSSH                    ALLOW       Anywhere                  
 21/tcp                     ALLOW       Anywhere                  
 443/tcp                    ALLOW       Anywhere                  
 20:21/tcp (v6)             ALLOW       Anywhere (v6)             
 30000:31000/tcp (v6)       ALLOW       Anywhere (v6)             
 80/tcp (v6)                ALLOW       Anywhere (v6)             
 OpenSSH (v6)               ALLOW       Anywhere (v6)             
 21/tcp (v6)                ALLOW       Anywhere (v6)             
 443/tcp (v6)               ALLOW       Anywhere (v6)  

 

新增使用者、管理使用者權限、群組及設定根目錄

FTP 的使用者其實就是這個 Linux 系統的使用者,簡單幾個步驟建立:

1. 建立新的使用者

$ sudo adduser wptutorial

輸入指令建立新的使用者名稱及密碼,紅字是使用者名稱可自行設定。

2. 將使用者名稱寫入 vsftpd 的清單

$ echo "wptoturial" | sudo tee -a /etc/vsftpd.user_list

還記得我們前面設定過,只允許在清單上的使用者登入 FTP 嗎?所以記得要把使用者名稱加進去,輸入以上指令即可完成,紅字是使用者名稱可自行設定。

3. 設定使用者群組及根目錄

Linux 的使用者群組及根目錄的相關設定主要儲存在這兩個檔案:
/etc/passwd
/etc/group

由於我們必須指定正確的根目錄給使用者,並且因為我們要對 WordPress 抽換檔案或作設定,必須將使用者設定到正確的群組才行。

🔺 開啟 passwd:

$ sudo nano /etc/passwd

應該會在最後一行看到我們剛剛建立的新使用者,關於 Linux 的使用者帳號管理可以另外參考這一篇:鳥哥的 Linux 私房菜 — 第十三章、Linux 帳號管理與 ACL 權限設定

這裡主要有兩項要修改:

wptutorial:x:1:1:,,,:/opt/bitnami/apps/wordpress:/bin/bash

前面兩個數字 1 分別是有效群組和初始群組,我們都指向 daemon 這個群組,這樣後面 WordPress 才不會出現存取權限的問題。

後面的目錄則是這個使用者的根目錄位置,我們指向 WordPress 的儲存位置。以後用此帳號登入就能直接看到 WordPress 的所有檔案內容。

完成後按 Control + X 儲存並離開編輯器。

🔺 開啟 group:

$ sudo nano /etc/group

這裡我們要將使用者加入 daemon 的群組當中,應該會在第二行將使用者名稱加到最後面:

daemon:x:1:wptutorial

完成後按 Control + X 儲存並離開編輯器。

開啟 FTP port on GCP instance

到此為止已經完成所有 FTP server 和使用者權限的設定了!最後一件事,我們必須開啟 GCP 上的防火牆。

wp-tutorial-2-4-firewall-rules

🔺 GCP 防火牆設定:
VPC Network > Firewall Rules > Create Firewall Rule

主要參數:

Name: vsftpd
Targets: All instances in the network
Source filter: IP ranges
Source IP ranges: 0.0.0.0/0
Protocols and ports: tcp: 20-22, 30000-31000

紅字的名稱可自行設定。

接下來可以進行測試,用任何一個 FTP 軟體登入,選擇 FTP-SSL 連線。Server 輸入 GCP 上給定的 IP address、port 21,並使用上面建立的帳號密碼,登入後會直接進入剛剛設定好的根目錄了~

wp-tutorial-2-3-ftp

到這邊為止已經完全可以開始使用你自己的 WordPress 網站,也可以透過 FTP 管理遠端伺服器當中的檔案。下一篇我們將介紹關於 WordPress 的主要檔案結構,以及修改主題相關的方法簡介。

 

下一篇:WordPress / 架站教學三:更改 MySQL Administrator 密碼、設定外部靜態 IP 位址

 

WordPress 網站架設與搬家教學系列

WordPress 快速架站教學 (濃縮版):
在 Google Cloud (GCP) 台灣主機上免費架設 WordPress Bitnami

WP 架站教學一:使用 Google 台灣主機免費架設自己的網站 (Mac/Win版)
WP 架站教學二:透過 SSH 連線遠端控制 GCP 並設定 FTP 伺服器 (使用 WordPress Bitnami)
WP 架站教學三:更改 MySQL Administrator 密碼、設定外部靜態 IP 位址
WP 架站教學四:設定 Domain Name 及 Apache 參數
WP 架站教學五:設定 SSL 加密連線,讓網站連線更安全 (以Apache為例)
WP 架站教學六:WordPress 檔案及目錄的結構簡介與預設檔案權限
WP 架站教學七:修改網站外觀樣式,如何建立子主題 (child theme)
WP 多重架站一:如何在同一個伺服器架設第二個 WordPress (Multiple WordPress)
WP 多重架站二:設定 Domain Name,指定多個 WordPress 的網址 (使用subdomain)
WP 多重架站三:設定 SSL 加密連線 (以 Apache 為例)
WP 搬家教學:一個按鍵幫網站搬家,使用 All-in-One Migration

WordPress / 網站架設與搬家教學系列簡介及目錄
https://note.charlestw.com/wordpress-tutorial-category/