在本篇 Gophish 教學 中,我們將說明如何在 GCP 上的 Ubuntu VM 環境,為已安裝的 Gophish 建立 systemd 服務單元,以實現開機自動啟動,以及即使終端機關閉後 Gophish 仍持續運作。這將大幅提升 Gophish 平台運行的穩定性和便利性,讓您專注於模擬 網路釣魚 攻擊情境與訓練,而無需擔心服務中斷。透過本文步驟,您可以將之前完成的 Gophish 部署(gophish搭建)環境進一步強化,熟悉 systemd 的服務管理方式,並確保 Gophish 在每次重啟或斷線後都能自動啟動、持續提供網路釣魚手法模擬服務。
systemd 是什麼?為何使用 systemd 管理 Gophish?
systemd 是現代 Linux 發行版(包含 Ubuntu)預設採用的系統與服務管理器。它在系統啟動時以 PID 1 運行,接管系統進程的啟動與維護,能平行啟動服務並處理相依性,以提高開機速度和運行效能。相比傳統的 SysV init,systemd 提供了更多功能(例如自動重啟、狀態監控、集中日誌記錄),使管理服務更加方便。
對於 Gophish 這類長期執行的伺服器程式,我們使用 systemd 管理有以下好處:
- 開機自動啟動: 可以將 Gophish 設定為隨系統啟動自動執行,而不需每次手動啟動。
- 脫離終端運行: Gophish 將由 systemd 在背景執行,不受終端機或 SSH 登出的影響,避免了直接在 shell 中啟動程式時,一旦關閉終端 Gophish 就隨之關閉的問題。
- 統一管理控制: 透過
systemctl
指令可方便地啟動、停止、重啟 Gophish 服務,並查看服務狀態。這比使用nohup
或screen/tmux
等方式更直觀可靠。 - 日誌與穩定性: systemd 會集中管理服務日誌輸出,同時我們也能設定自動重啟策略,確保 Gophish 崩潰後自動重新啟動,進一步提升運行穩定性。
簡而言之,systemd 提供了一種標準化的方法來管理 Gophish 這類常駐服務,使 網路釣魚 模擬平台在後台穩定運行,達成自動化與高可用性。
建立 Gophish 的 systemd 服務單元
首先,我們需要新增一個 systemd 服務單元檔案來描述 Gophish 服務的啟動方式。服務單元檔一般放置在 /etc/systemd/system/
目錄下,以 .service
為副檔名。以下是建立 Gophish 服務單元的詳細步驟:
1. 建立服務檔案: 使用喜歡的文字編輯器建立一個新的 systemd 單元檔,例如:
$ sudo vi /etc/systemd/system/gophish.service
(請使用 sudo
取得權限,以便在 /etc/systemd/system
下創建檔案。)
2. 編寫服務內容: 在打開的編輯器中,輸入以下設定內容,並根據實際安裝路徑修改 WorkingDirectory
和 ExecStart
的路徑:
[Unit]
Description=Gophish 開源網路釣魚框架服務
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/gophish/
ExecStart=/opt/gophish/gophish
[Install]
WantedBy=multi-user.target
以上是一個基本的 Gophish 服務單元檔範例。
[Unit]
區段描述服務名稱和依賴,After=network.target
表示在網路初始化後再啟動 Gophish(因 Gophish 需佔用網路埠)。
[Service]
區段定義服務啟動類型與執行細節:WorkingDirectory
請填入 Gophish 可執行檔所在的目錄,ExecStart
指向 Gophish 的可執行檔路徑(確保檔案有執行權限)。預設情況下,此服務將以 root 身份執行(稍後我們會討論安全性優化,可設定其它使用者)。
[Install]
區段的 WantedBy=multi-user.target
表示服務將在系統進入多使用者模式時啟動,相當於一般系統運行等級下啟動。
(注意: 若您的 Gophish 安裝在不同路徑,例如 /home/ubuntu/gophish
,請相應調整路徑。)
3. 儲存檔案並退出: 輸入完上述內容後,儲存 gophish.service
檔案並退出編輯器。檔案建立完成後,可以透過 cat /etc/systemd/system/gophish.service
檢查內容是否正確無誤。
啟用與啟動 Gophish 服務
建立好 service 檔案後,我們需要通知 systemd 加載新的服務設定,並將 Gophish 服務啟動與設定為開機自動啟動。執行以下步驟:
1. 重新載入 systemd 設定: 執行 daemon-reload
讓 systemd 載入新的單元檔:
$ sudo systemctl daemon-reload
這步驟非常重要,每當新增或修改了 /etc/systemd/system/
下的服務檔,都必須重新載入,否則 systemd 不會察覺新的服務定義。
2. 立即啟動 Gophish 服務: 載入後,啟動服務:
$ sudo systemctl start gophish
此指令會立刻在背景啟動 Gophish。若啟動成功,Gophish 將在背景執行,此時終端中沒有輸出(因為輸出被 systemd 接管)。
3. 檢查服務狀態: 執行狀態命令查看 Gophish 運行情況:
$ sudo systemctl status gophish
您應該可以看到 Gophish 服務當前的加載狀態和是否正在執行。例如,狀態應顯示 Active: active (running)
並列出 Gophish 日誌的最近幾行資訊。
成功啟動 Gophish systemd 服務後的 systemctl status gophish
輸出截圖。從圖中可以看到服務已加載 (loaded) 並啟用 (enabled),狀態為 active (running),表示 Gophish 正在執行中;同時列出的日誌訊息顯示 Gophish 的 phishing 伺服器已在 http://0.0.0.0:80 啟動、管理介面在 https://127.0.0.1:3333 啟動,代表服務運行正常。

4. 設定開機自動啟動: 若確認服務正常執行,接著設定讓 Gophish 於開機自動啟動:
$ sudo systemctl enable gophish
執行後 systemd 會建立對應的開機啟動連結,使 Gophish 服務在每次系統引導時自動啟動。成功執行此命令後,終端會提示已建立連結到 /etc/systemd/system/multi-user.target.wants/gophish.service
等。同時保留 enabled
狀態供日後查詢。
完成以上步驟後,Gophish 已經由 systemd 管理並開機自啟。您可以嘗試重啟 VM 或登出 SSH 後重新連線,驗證 Gophish 是否持續運行(使用 systemctl status gophish
檢查)。正確設定的話,系統重啟後 Gophish 會自動啟動提供服務。
常用指令與日常操作建議
將 Gophish 服務交由 systemd 管理後,日常管理操作變得相當簡單且一致。以下是幾個常用的指令與建議:
- 查看服務狀態: 隨時可使用
sudo systemctl status gophish
來檢視服務當前狀態和最後幾條日誌輸出。這對排查問題非常有用,例如確認服務是否正在執行、最近有無錯誤訊息等。 - 停止服務: 若需要暫停 Gophish,執行
sudo systemctl stop gophish
即可停止該服務。停止後,Gophish 將從背景關閉(可透過 status 確認已變為 inactive)。 - 重新啟動服務: 如修改了 Gophish 的設定檔(例如
config.json
)或更新了 Gophish 版本,可使用sudo systemctl restart gophish
將服務重新啟動,使更改生效。restart
指令會先停止再啟動服務,相當於手動重啟 Gophish 程序。 - 開機啟動狀態管理: 使用
enable
與disable
可以分別開啟或關閉開機自動啟動。例如:sudo systemctl disable gophish
可取消開機啟動(不影響當前運行,但下次開機不會自動啟動),而sudo systemctl enable gophish
則重新設定為開機自啟。 - 檢視服務日誌: 由於我們未在 config.json 啟用文件日誌,預設 Gophish 的輸出都被 systemd 接管至 journald 日誌中。您可以使用以下指令查看日誌內容:
sudo journalctl -u gophish -f
這將持續追蹤(-f
) Gophish 服務的日誌輸出,包括啟動訊息、發送郵件或錯誤警告等。若不加-f
則會顯示目前已有的全部日誌記錄。透過查看 systemd 日誌,可監控 Gophish 運行情形並追蹤歷史事件。如需將日誌長期保存到檔案,可考慮修改 Gophish 的config.json
在"logging"
中指定檔名和等級,或使用上文將介紹的反向代理伺服器如 Nginx 協助記錄請求日誌等。 - 更新 Gophish 版本: 當需要更新 Gophish 時,建議步驟為:先執行
sudo systemctl stop gophish
停止服務,備份並替換新的 Gophish 執行檔和相關檔案,然後執行sudo systemctl start gophish
啟動服務。確定服務正常運行後,也可用sudo systemctl enable gophish
確保更新後依然保持開機啟動設定。
透過上述指令,您可以方便地控制 Gophish 服務的啟停與狀態查詢。在 systemd 的管理下,所有服務操作都有一致的介面,降低了人工疏忽的風險。例如,不再需要擔心忘記以 &
背景執行或 nohup
導致的 session 終止問題,systemd 已經全面接管了 Gophish 的生命周期管理。
安全性建議:使用者權限、反向代理與 IP 限制
將 Gophish 設定為 systemd 服務後,還需要考量一些安全性上的最佳實踐,以保護您的釣魚測試平台不受未經授權的存取或潛在攻擊:
1. 以非 root 帳戶執行 Gophish:
默認情況下,上述服務檔未指定 User
,systemd 將以 root 身份啟動 Gophish。由於 Gophish 可能需要監聽 80 埠 (低於1024的埠需 root 權限),許多使用者會直接以 root 執行。但從安全角度,最好為 Gophish 建立一個獨立的系統帳戶,僅賦予其運行 Gophish 所需的最低權限。例如,建立一個名為 gophish 的用戶帳號:
$ sudo useradd -r -d /opt/gophish -s /bin/false gophish
上述命令將建立一個無登入殼層 (/bin/false
)、家目錄為 /opt/gophish 的系統帳戶供 Gophish 使用。接著,修改先前的服務檔,在 [Service]
區塊加入:
User=gophish
並將 Gophish 安裝目錄及相關檔案的擁有者修改為該用戶:
$ sudo chown -R gophish:gophish /opt/gophish/
如果您需要非 root 用戶監聽 80 埠,還須賦予 Gophish 執行檔開啟低階埠的能力:
sudo setcap cap_net_bind_service=+ep /opt/gophish/gophish
此設定允許 gophish 用戶啟動的進程綁定 1024 以下埠口(如 80)。完成以上修改後,重新執行 daemon-reload
並 restart
服務,使設定生效。這樣一來,即使 Gophish 程式遭到入侵,攻擊者獲得的也只是受限權限的帳戶,減少對整個系統的危害。
2. 使用反向代理(Reverse Proxy):
考慮將 Gophish 置於 Nginx 或 Apache 等反向代理伺服器之後,增強整體安全性與靈活性。反向代理可以處理 SSL/TLS 加密(提供 HTTPS 支援和管理憑證)、轉發不同網域或 URL 路徑到 Gophish,以及實施存取控制。例如,您可以僅允許內部網段透過反向代理存取 Gophish 的管理介面,甚至在代理層加設基本驗證或 Google reCAPTCHA 驗證以阻擋惡意請求。有安全專家建議在 Gophish 前方使用反向代理並搭配完善的導流規則,以保護 Gophish 實例免於被偵測或直接攻擊。反向代理也能協助改善 Gophish 服務效能,像是提供靜態檔案快取、壓縮等功能。設定反向代理後,您可以將 Gophish 的釣魚網站改在內部高埠運行(如 8080),由 Nginx 監聽 80/443 對外服務,這樣 Gophish 便無需 root 權限也能透過標準埠提供服務。
3. 限制管理介面存取 IP:
Gophish 預設的管理介面 listen_url 綁定在 127.0.0.1:3333
(本機唯一路徑)以提高安全性。若您為了方便遠端管理將其改為 0.0.0.0:3333
開放至所有介面,務必採取額外的限制措施。例如,利用防火牆(UFW、iptables)或雲端平台的安全群組,只允許特定的 IP 或網段連線到 Gophish 管理介面的埠(預設 3333)。這可防止未經授權的人嘗試暴力破解 Gophish 的登入。若使用反向代理,您也可在代理設定中限制允許的 IP 清單,或將管理介面隱藏在 VPN/內網下。總之,確保只有授權人員才能存取 Gophish 後台。至於 Gophish 釣魚網站本身(即 listen_url 0.0.0.0:80,用於受測者點擊釣魚連結的頁面),通常需要對外開放給目標受眾訪問,但您仍可以配合情境在非測試時段關閉或限制其存取,避免被搜尋引擎索引或被未參與測試者發現。
以上建議能有效提升 Gophish 部署的安全性和穩定性。簡言之:最小權限執行、前端代理隔離,以及網路存取控制 是三大核心措施。透過以獨立用戶跑 Gophish、在前端設置 Nginx 等反向代理、並妥善設定防火牆規則,您可以大幅降低 Gophish 運行風險。同時,別忘了定期更新 Gophish 至最新版本,以獲得最新的安全修補和功能改進。
小結
透過本篇教學,我們完成了在 GCP Ubuntu VM 上將 Gophish 設定為 systemd 服務的步驟。這樣的配置確保了 Gophish 開機自動啟動、後台持續運行,即使終端機關閉或意外斷線,釣魚測試服務依然不會中斷。相較於手動在終端執行 Gophish,此方法大大提升了穩定性與便利性:系統管理員可以放心地重啟伺服器或登出會話,而不必擔心 網路釣魚 平台停止;同時也簡化了日常的管理操作,透過統一的 systemctl
指令即可掌控服務狀態。
更重要的是,結合安全性最佳實踐(如使用 least privilege 帳戶、反向代理隔離以及 IP 存取控制),我們打造出一個更健全安全的 Gophish 部署環境。在這樣的環境中,您可以專注於設計各種網路釣魚手法來教育測試使用者,無須擔心基礎架構的不穩定因素。最後,別忘了定期檢查 Gophish 服務的狀態與日誌,以及時發現問題並維護良好的服務品質。
透過將 Gophish 與 systemd 結合,您的企業釣魚模擬平台將具備自動化、高可用的特性。這不僅提高了管理效率,也確保在關鍵的社交工程演練中,您的模擬攻擊能順利進行、不中斷地收集到所需的統計與成效。希望本次 gophish教學 的內容對您有所幫助,讓您的 Gophish 部署更上一層樓!
FAQ 常見問答
Q1: 設定 systemd 後,如果重啟 VM,Gophish 服務會自動啟動嗎?
A1: 會的,只要您已經執行過 sudo systemctl enable gophish
來啟用開機自動啟動,那麼每次系統開機時 systemd 都會自動啟動 Gophish 服務。您可在重啟後使用 systemctl status gophish
確認服務是否active (running)。若沒有自動啟動,請檢查服務檔是否正確、以及是否有執行 enable
設定。
Q2: 關閉終端機或 SSH 會話後,Gophish 會停止運行嗎?
A2: 不會。將 Gophish 納入 systemd 管理後,它在背景以服務方式執行,與使用者終端會話無關。因此即使您關閉了 SSH 連線或終端窗口,Gophish 仍會繼續運行。在未來需要停止服務時,再用 systemctl stop gophish
手動停止即可,而不需要一直開著連線視窗。
Q3: 我該如何查看 Gophish 的日誌?systemd 會記錄服務日誌嗎?
A3: 是的,systemd 會將 Gophish 的標準輸出與錯誤輸出收集到日誌中。您可以使用 sudo journalctl -u gophish
來查看 Gophish 服務的歷史日誌,或加上 -f
參數持續追蹤最新輸出。如前所述,由於默認 config.json 中 "logging"
部分沒有設定文件,Gophish 將日誌輸出導向至標準輸出,這些訊息都能透過 journalctl
獲取。此外,您也可以在 Gophish 的設定檔內指定 "logging"
的 "filename"
來啟用文件日誌記錄,或者在反向代理(如 Nginx)中配置存取日誌,以輔助紀錄釣魚活動的相關請求。
Q4: 部署成 systemd 服務後,是否可以自動重新啟動故障的 Gophish?
A4: 可以。您可以在服務單元的 [Service]
區段中加入,例如 Restart=on-failure
和 RestartSec=5
,讓 systemd 在偵測到 Gophish 進程非正常退出時5秒後自動嘗試重啟服務。這對於長期運行的伺服器非常有用,可確保 Gophish 因意外崩潰後能自動恢復運行,減少人工介入。不過若問題頻繁發生,建議仍要檢視日誌找出根本原因。
Q5: Gophish 服務可以暫時禁用開機自啟而不卸載嗎?
A5: 可以。只需執行 sudo systemctl disable gophish
,即可取消 Gophish 的開機自動啟動設定。服務檔和手動啟動不受影響,未來想重新隨機啟動只需再次 enable
即可。這對於臨時停用 Gophish 而未來可能再用到的情境很便利。
希望以上常見問題解答能解決您在部署過程中的疑惑。如果有其他問題,建議參考下列官方文件與教學資源以獲取更多資訊。
參考資料
Gophish 官方文件:docs.getgophish.commedium.com
Ubuntu Manpage – systemd 系統與服務管理器簡介:manpages.ubuntu.com
Rickard Carlsson: 〈How to run Gophish as a systemd service〉tzusec.comtzusec.com
sevenlayers.com 部落格:〈GoPhish : Phishing and More…〉sevenlayers.comsevenlayers.com