把網站搬上自架主機或租了一台 VPS 之後,第一個要過的關卡幾乎都是 SSH 連線主機。沒有圖形介面、只剩一個閃爍游標的黑底視窗,很多人卡在「連得上、但每次都要打密碼」「想關掉密碼登入卻把自己鎖在門外」這些地方。
SSH 連線主機的完整流程其實只有四件事:連上去、換成金鑰登入、把指令收乾淨、最後把門鎖好。這篇從零開始走一遍,涵蓋 Windows、Mac 與 Linux 三種環境,金鑰怎麼產、authorized_keys 怎麼設、權限為什麼要改,到停用密碼登入前該留的那一手保命設定,一次講清楚。文章用 WordPress 自架站的維運情境舉例,但指令對任何 Linux 主機都通用。
SSH 連線主機到底在連什麼,又為什麼比密碼安全
SSH 是 Secure Shell 的縮寫,它在你的電腦與遠端主機之間開一條加密通道,讓你像坐在主機前一樣,透過一個文字介面的 shell 下指令、管理整台伺服器。傳統的遠端登入協定會把帳號密碼用明文送出去,SSH 則全程加密,這是它取代舊協定成為標準的核心理由。
連線時你會用到兩個身分驗證方式:密碼登入,或金鑰登入。密碼登入直覺,但有兩個弱點。第一、密碼在網路上雖然加密,卻擋不住對方在你的主機上反覆暴力嘗試;任何一台對外開 22 埠的主機,上線幾小時內就會開始收到全球機器人的試密碼攻擊。第二、密碼夠短就容易被猜中,夠長又難記。
金鑰登入用的是非對稱加密。你會產生一對鑰匙:公鑰(public key)和私鑰(private key)。公鑰放到遠端主機上,等於門上那把鎖;私鑰留在自己電腦裡,是唯一能開這把鎖的鑰匙,而且設計上無法從公鑰反推出私鑰。登入時主機用公鑰出一道只有對應私鑰才解得開的考題,你的電腦答對就放行,全程不傳輸密碼。這就是為什麼金鑰登入既免去每次打密碼的麻煩,又比密碼安全得多。
連線前要先備齊的三樣東西
開始之前先確認手上有三樣東西,缺一樣都連不上。
- 主機位址:通常是一組 IP,例如
203.0.113.10,也可能是已經指向主機的網域名稱。租用 VPS 後,主機商會在後台或開通信中給你。 - 登入帳號:新開的主機多半預設給
root,部分服務商會給ubuntu、admin之類的初始帳號。 - 一個終端機程式:用來輸入
ssh指令的視窗。
終端機在三種系統上的取得方式不同。Mac 直接打開「終端機」(Terminal)即可;Linux 桌面環境用內建的終端機。Windows 過去要另外裝 PuTTY,但現行的 Windows 10、Windows 11 已經內建 OpenSSH 用戶端,直接開「PowerShell」或「命令提示字元」就能用 ssh 指令,跟 Mac、Linux 的寫法完全一致,新手不必再為了連線特別安裝軟體。若你的環境真的沒有內建,再回頭裝 PuTTY 也行,但本文以內建 OpenSSH 為主,三種系統一套指令走到底。
用密碼連上主機的第一步
最快驗證連線是否正常的方式,是先用密碼登入一次。指令格式固定如下:
ssh 帳號@主機位址
舉例來說,要用 root 登入 203.0.113.10 這台主機,就輸入:
ssh root@203.0.113.10
如果主機的 SSH 服務不是跑在預設的 22 埠,而是換到了別的埠號(例如 2222),用 -p 指定:
ssh -p 2222 root@203.0.113.10
第一次連上某台主機時,畫面會跳出一段確認訊息,問你是否信任這台主機的指紋(fingerprint),類似:
The authenticity of host '203.0.113.10' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxx...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
這是 SSH 在問:「我沒見過這台主機,你確定要信任它嗎?」輸入 yes 後,這台主機的公鑰指紋會被寫進你電腦家目錄下的 ~/.ssh/known_hosts 檔案,之後再連同一台就不會再問。
值得知道的是,如果哪天連線時冒出大寫的「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」警告,代表主機的指紋跟 known_hosts 裡記的不一樣了。多數情況是你重灌了系統或主機重建,導致主機金鑰重新產生;這時把 known_hosts 裡那一行舊紀錄刪掉再重連即可。但如果你沒做過任何變更卻跳出這個警告,就要提高警覺,因為它也可能是中間人攻擊的訊號。確認沒問題後再通過密碼驗證,就能進入主機的 shell 開始操作。
產生 SSH 金鑰並完成免密碼登入
能用密碼連上之後,接著把登入方式升級成金鑰。整個過程分成產鑰匙、上傳公鑰、修正權限三步。
第一步、在自己電腦上產生金鑰對
打開本機終端機,輸入 ssh-keygen。建議指定 ed25519 演算法,它比舊的 RSA 更短、更快,安全性也足夠,是目前的推薦選擇:
ssh-keygen -t ed25519
接著程式會問兩個問題。第一個問金鑰要存哪裡,直接按 Enter 用預設路徑就好;第二個問是否設定 passphrase(金鑰的保護密碼)。passphrase 是替私鑰再加一層保險,就算檔案外洩,沒有這組密碼也用不了;想要全自動免密碼可以留空,但若這台電腦不是只有你用,設一組 passphrase 比較保險。
完成後,你的家目錄下會多出 ~/.ssh 資料夾,裡面有兩個檔:id_ed25519 是私鑰,絕對不要外流、不要上傳;id_ed25519.pub 才是要放到主機上的公鑰。
第二步、把公鑰上傳到遠端主機
最省事的做法是用 ssh-copy-id,它會自動在主機的 ~/.ssh/ 下建立並寫入 authorized_keys:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@203.0.113.10
執行時會要你輸入一次主機密碼,這是最後一次手動打密碼。Windows 的 OpenSSH 不一定內建 ssh-copy-id,可以改用手動方式:先登入主機,確認家目錄下有 .ssh 資料夾(沒有就 mkdir ~/.ssh),再把公鑰內容附加進 authorized_keys:
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
authorized_keys 這個檔案的作用,就是登記「哪些公鑰被允許登入這個帳號」。一個檔案可以放多把公鑰,每把佔一行,所以同一台主機要讓多台裝置或多個人登入,把各自的公鑰各加一行進去就行。
第三步、修正 .ssh 的權限
這一步最常被略過,卻是金鑰登入失敗最常見的原因。SSH 出於安全考量,如果 .ssh 資料夾或 authorized_keys 的權限太寬鬆(讓別的使用者也讀得到),它會直接拒絕用這把金鑰登入,而且不一定會明說原因。在主機上執行:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
700 代表這個資料夾只有擁有者能進出,600 代表這個檔案只有擁有者能讀寫。設好之後登出再重連一次,如果不再要求輸入密碼,就代表金鑰登入成功了。
用 ssh config 把冗長的連線指令收成一個別名
換到非預設埠、又指定私鑰之後,完整的連線指令會變得很長,每次都要打 ssh -p 2222 -i ~/.ssh/id_ed25519 myadmin@203.0.113.10,既難記又容易打錯。SSH 內建的設定檔可以把這串東西收成一個短別名。
在本機編輯 ~/.ssh/config 這個檔案(沒有就新建),寫入:
Host mysite
HostName 203.0.113.10
Port 2222
User myadmin
IdentityFile ~/.ssh/id_ed25519
存檔後,往後要連這台主機只需要打:
ssh mysite
SSH 會自動帶入位址、埠號、帳號和指定的私鑰。管理多台主機時這個檔案特別好用,每台給一個 Host 區塊、一個好記的別名,連線時不必再去翻 IP。這也是新手很容易錯過、但老手幾乎都在用的一招。
連上主機後最常用的維運指令
進到主機的 shell 後,操作邏輯跟本機的終端機完全一樣,差別只在你下的指令是在遠端執行。以下整理自架站維運最常用到的幾類指令。
- 查看目錄與檔案:
ls -l列出當前目錄的所有檔案與權限,cd 路徑切換目錄,pwd顯示目前位置。 - 查看登入狀況:
w列出目前有哪些使用者透過 SSH 登入這台主機,排查異常登入時很有用。 - 檢查 SSH 服務狀態:CentOS、RHEL 系列用
systemctl status sshd;Ubuntu、Debian 系列用systemctl status ssh。修改設定後要套用,把status換成restart。 - 離開連線:輸入
exit或logout即可關閉這次 SSH 連線,回到本機。
SSH 不只能進主機下指令,還能直接搬檔案。scp 可以把本機檔案複製到遠端,或反向抓回來,全程走的就是 SSH 的加密通道;要做整個資料夾的同步與備份,則用 rsync,它預設也是透過 SSH 傳輸,只搬有變動的部分,做網站定期備份很合適。
對 WordPress 自架站來說,SSH 是很多維運工作的入口。安裝 WP-CLI 之後,你可以在主機上直接用指令更新外掛、清快取、匯出資料庫,比登入後台一個個點快得多。資料庫的備份與還原、佈景主題檔案的上傳,也都在這條連線上完成。如果站上有開通金流或結帳功能,相關設定一樣是透過後台或設定檔處理,SSH 在這裡的角色只是讓你能安全地連進主機去操作,本身與收款流程無關。
SSH 安全強化的設定順序與一個保命步驟
主機一旦對外開放 SSH,就會持續收到自動化的暴力嘗試,所以連得上之後一定要做安全強化。所有設定都在主機的 /etc/ssh/sshd_config 這個檔案裡調整,改完都要重啟 SSH 服務才會生效。建議按下面的順序做。
第一、新增一個管理帳號並停用 root 直接登入。 root 是攻擊者第一個會猜的帳號,全球機器人整天在試 root 的密碼。先建立一個一般帳號並給它管理權限:
adduser myadmin
usermod -aG sudo myadmin
接著在 sshd_config 把 PermitRootLogin 的值改成 no,之後一律用 myadmin 登入、需要管理權限時再加 sudo。
第二、改掉預設的 22 埠。 把 sshd_config 裡的 Port 改成一個自訂埠號(例如 2222)。換埠不會讓主機真的更安全,但能擋掉絕大多數只掃 22 埠的自動化攻擊,等於先把雜訊降下來。改完別忘了在防火牆放行新埠號。
第三、關閉密碼登入,只留金鑰。 這是最關鍵也最危險的一步。確認金鑰登入已經能成功之後,在 sshd_config 設定:
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
這裡有一個保命步驟務必照做:重啟 SSH 服務之前,先保留一個目前已登入的連線視窗別關,另外開一個新視窗測試金鑰登入。 萬一設定打錯導致新連線進不去,你還能用那個沒關的舊視窗把設定改回來;如果一關掉就全部重連,又剛好設定有誤,你就會被鎖在主機門外。
這一步還有一個容易踩的坑:明明把 PasswordAuthentication 改成 no 也重啟了,卻發現密碼還是能登入。原因通常是 sshd_config 開頭用 Include 引入了 sshd_config.d 目錄下的其他設定檔,而那些檔案裡又把密碼登入開了回來,蓋過你的設定。解法是把那些被引入的設定檔一起檢查、改成 no,再重啟才會真正生效。
第四、裝上 fail2ban 自動封鎖惡意 IP。 fail2ban 會持續監看登入紀錄,一旦發現某個 IP 短時間內反覆登入失敗,就自動把它加進黑名單擋掉。Ubuntu、Debian 上安裝與啟用:
sudo apt-get update
sudo apt-get install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
裝好它會用合理的預設值開始保護 SSH,後續再依需求微調封鎖門檻即可。
走完這四步,這台主機的 SSH 大門就從「誰都能來敲」收緊成「只有持鑰匙的人進得來,敲錯幾次還會被擋」。
連上、換鑰匙、鎖好門,SSH 主機管理的完整節奏
SSH 連線主機看似門檻高,拆開來其實就是一條清楚的路線:先用密碼確認連得上,再用 ssh-keygen 產生 ed25519 金鑰、把公鑰寫進 authorized_keys 並修好權限,換成免密碼的金鑰登入;接著用 ~/.ssh/config 把連線指令收成別名,日常維運就只剩一個短指令;最後依序停用 root、改埠、關閉密碼登入、裝上 fail2ban 把安全收緊。
唯一不能省的是停用密碼登入前那一手:留著舊連線、另開新視窗測試成功再重啟服務。把這條節奏跑順之後,無論是管理 WordPress 自架站,還是日後多接幾台主機,你都能用同一套流程穩穩地連上去、安全地待在裡面。下一步,就挑一台你正在用的主機,從產生金鑰開始實際走一遍。