以下是你要的 「主機 × 可登入帳號 白名單對應版」optim_ssh,此版本具備:
- ✅ 多台 SSH 目標主機
- ✅ 每台主機有各自允許的登入帳號清單
- ❌ 使用者無法自行指定任意主機
- ❌ 使用者無法輸入未授權帳號
- ❌ 無 Port Forward / ProxyCommand / 跳板逃逸
一、最終版檔案:/usr/local/bin/optim_ssh
#!/bin/bash
set -euo pipefail
# ========= 主機 × 帳號 白名單 =========
# 格式:
# "主機|帳號1,帳號2,帳號3"
TARGETS=(
"10.0.0.10|root,admin,ops"
"10.0.0.11|ops"
"server1.internal|deploy,ops"
"server2.internal|admin"
)
# ====================================
valid_user() {
[[ "$1" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]
}
print_menu() {
echo "=== SSH 受控連線選單 ==="
echo
local i=1
for entry in "${TARGETS[@]}"; do
host="${entry%%|*}"
users="${entry##*|}"
echo " $i) $host (允許帳號: $users)"
((i++))
done
echo " 0) 返回"
echo
}
while true; do
clear
print_menu
read -r -p "請選擇主機: " pick
if [[ "$pick" == "0" ]]; then
exit 0
fi
if ! [[ "$pick" =~ ^[0-9]+$ ]]; then
echo "ERR: 請輸入數字"
read -r -p "按 Enter 繼續..." _
continue
fi
idx=$((pick - 1))
if (( idx < 0 || idx >= ${#TARGETS[@]} )); then
echo "ERR: 選項超出範圍"
read -r -p "按 Enter 繼續..." _
continue
fi
entry="${TARGETS[$idx]}"
host="${entry%%|*}"
allowed_users="${entry##*|}"
read -r -p "請輸入登入帳號: " ruser
if ! valid_user "$ruser"; then
echo "ERR: 帳號格式不合法"
read -r -p "按 Enter 繼續..." _
continue
fi
# 驗證帳號是否在該主機白名單
if ! echo ",$allowed_users," | grep -q ",$ruser,"; then
echo "ERR: 帳號 [$ruser] 不允許登入 $host"
read -r -p "按 Enter 繼續..." _
continue
fi
echo
echo "即將連線:$ruser@$host"
echo "(結束遠端連線請輸入 exit)"
echo
/usr/bin/ssh \
-o "ClearAllForwardings=yes" \
-o "PermitLocalCommand=no" \
-o "ProxyCommand=none" \
-o "ServerAliveInterval=30" \
-o "ServerAliveCountMax=3" \
-l "$ruser" \
"$host"
read -r -p "已離開 $host,按 Enter 回到主選單..." _
done
二、權限設定(不可省略)
sudo chown root:root /usr/local/bin/optim_ssh
sudo chmod 755 /usr/local/bin/optim_ssh
三、安全特性總覽(你現在已做到)
| 項目 | 狀態 |
|---|---|
| 主機白名單 | ✅ |
| 每台主機帳號白名單 | ✅ |
| 使用者自行輸入 host | ❌ |
| 任意 ssh 參數 | ❌ |
| Port Forward / Tunnel | ❌ |
| ProxyCommand / 跳板 | ❌ |
| 離開後回選單 | ✅ |
| 搭配 ForceCommand | ✅ |
四、進階強化(如果你要更硬)
你現在已經是 「企業級 Jump Menu」 等級了,還可以再加:
- auditd 記錄連線行為
- 限制某些主機只能在特定時段連
- 依 optim 本地帳號 → 映射遠端帳號(禁止手填)
- 禁止 root,只能透過 sudo 登入遠端
- 連線前二次確認(防誤連 production)
如果你要其中任何一項,我可以直接給你「可上線版本」。
信心指數:97%