[Bastion] 從 SSH Key 到 IAM:AWS SSM Shell 與 Port Forwarding

Introduction

Bastion Host(堡壘主機,常被稱為跳板機)是部署在網路邊界(如公有子網或 DMZ)、經過加固的專用伺服器,作為從外部進入內部私有網路(Private Subnet)的單一受控入口。

核心功能與特點

  • 單一入口:沒有公開 IP 的內部資源(如資料庫、應用程式伺服器)無法從外部直接連線,需先經過 Bastion Host,再透過 SSH、RDP 或 Port Forwarding(SSH Tunnel)存取。
  • 縮小攻擊面:只開放必要服務(如 SSH),並透過最小化套件、關閉密碼登入、定期更新等方式加固。由於它直接暴露在外,本身也是高價值的攻擊目標。
  • 集中管理與稽核:所有遠端存取集中在單一節點,方便記錄與追蹤;但需額外設定(如個人帳號、session 錄製)才能達到完整稽核。

常見運作方式

  • 公有與私有子網隔離:Bastion Host 放在公有子網並具備公開 IP(如 AWS Elastic IP);內部伺服器放在私有子網。
  • 存取控制:防火牆規則或 Security Group 只允許特定信任來源(如公司辦公室或 VPN 的 IP)連入 Bastion Host。

雲端廠商提供的替代方案

各大雲端供應商提供不需開放 Inbound SSH Port、改以雲端身分(IAM)控管的連線方式:


傳統 SSH Bastion

架構:本機 → Bastion(Public Subnet,開 22 port)→ Private 資源

前置設定(~/.ssh/config):

Host bastion
HostName bastion.example.com
User ec2-user
IdentityFile ~/.ssh/bastion.pem

1. Shell:連到內部主機(ProxyJump)

OpenSSH 7.3 起內建 ProxyJump(-J),讓 SSH 連線穿過 Bastion 到達內部主機。

方式 A:不用 config(單次使用)

$ ssh -J ec2-user@bastion.example.com ec2-user@10.0.1.50

-J 後面需寫完整 user@host。金鑰建議先 ssh-add ~/.ssh/key.pem 加進 agent,避免兩段連線的 key 指定問題。

方式 B:寫進 ~/.ssh/config(建議,常用時)

Host bastion
HostName bastion.example.com
User ec2-user
IdentityFile ~/.ssh/bastion.pem

Host private-app
HostName 10.0.1.50
User ec2-user
IdentityFile ~/.ssh/private.pem
ProxyJump bastion

之後直接連線即可,SSH 會自動經由 Bastion 跳到目標主機:

$ ssh private-app
  • scp、rsync 同樣適用,例如 scp file.txt private-app:~/
  • 兩台主機使用不同 key 時,用 config 管理最乾淨
  • 目標主機需要跑 sshd,且要能 SSH 登入
  • 這是 TCP 層轉發,終端到終端的驗證仍在本機與目標主機之間完成,私鑰不需放在 Bastion,也不需 ForwardAgent
  • 舊寫法 ProxyCommand ssh -W %h:%p bastion 已被 ProxyJump 取代

2. Port Forwarding:連到內部服務(-L)

用於存取沒有 sshd 的服務(RDS、Redis 等),或任何 TCP port。

ssh -L 13306:mydb.xxxx.rds.amazonaws.com:3306 bastion -N
參數 說明
-L 本機port:目標host:目標port 本機 13306 轉發到「從 Bastion 看出去」的目標
bastion SSH 登入的中繼點
-N 不開 shell,只維持隧道
-f(選配) 隧道轉入背景執行

連線方式:本機 DBeaver / MySQL client 連 localhost:13306。

兩者比較

ProxyJump (-J) Port Forwarding (-L)
目的 SSH 登入內部主機 轉發任意 TCP 服務 port
目標需要 sshd 需要 不需要
典型用途 ssh、scp、rsync DBeaver 連 RDS
可否同時使用 可以,-J 負責到達中繼點,-L 負責轉發
# 組合:中繼點本身也在內網時
ssh -J bastion -L 13306:mydb.xxxx.rds.amazonaws.com:3306 ec2-user@10.0.1.50 -N

痛點(銜接 SSM)

  • 需開放 22 port,並管理 Security Group / IP allowlist
  • SSH key 的發放、輪替、離職回收
  • Bastion 需要 public IP 並持續維護、patch
  • 轉發模式下 Bastion 只看得到加密流量,稽核不易

後續 SSM 章節可以一對一對照:ssh -J ↔ AWS-StartSSHSession/Shell session,ssh -L ↔ AWS-StartPortForwardingSession(ToRemoteHost)。

Leave a Reply

Your email address will not be published. Required fields are marked *