建立多主機多帳號的操作白名單

以下是你要的 「主機 × 可登入帳號 白名單對應版」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」 等級了,還可以再加:

  1. auditd 記錄連線行為
  2. 限制某些主機只能在特定時段連
  3. 依 optim 本地帳號 → 映射遠端帳號(禁止手填)
  4. 禁止 root,只能透過 sudo 登入遠端
  5. 連線前二次確認(防誤連 production)

如果你要其中任何一項,我可以直接給你「可上線版本」。


信心指數:97%