# VS Code Remote SSH 設定指南 - VMware Ubuntu VM (支援多人同時連線)
## 概述
本指南將幫您在 VMware Ubuntu Linux VM 上建立一個安全的 VS Code Remote SSH 環境,支援多人同時連線使用,包含 Amazon Q CLI 安裝和受限制的用戶權限設定。
## 前置需求
- VMware 環境
- Ubuntu 22.04 LTS Server 版本 (建議使用 Server 版以節省資源)
- 高規格主機硬體 (詳見 VM 規格需求)
- 本機已安裝 VS Code 和 Remote-SSH 擴展
## 架構示意圖
```mermaid
graph TB
subgraph "本機環境"
U1["用戶01<br/>VS Code + Remote SSH"]
U2["用戶02<br/>VS Code + Remote SSH"]
U3["用戶03<br/>VS Code + Remote SSH"]
U4["用戶04<br/>VS Code + Remote SSH"]
U5["用戶05<br/>VS Code + Remote SSH"]
UD["... 用戶20<br/>VS Code + Remote SSH"]
end
subgraph "VMware Ubuntu Server"
subgraph "系統服務"
SSHD["SSH Daemon<br/>MaxSessions: 50"]
FB["Fail2Ban 安全防護"]
UFW["UFW 防火牆"]
end
subgraph "用戶環境"
USER1["/home/user01<br/>受限制環境<br/>VS Code Server<br/>Amazon Q CLI"]
USER2["/home/user02<br/>受限制環境<br/>VS Code Server<br/>Amazon Q CLI"]
USER3["/home/user03<br/>受限制環境<br/>VS Code Server<br/>Amazon Q CLI"]
USERN["/home/user20<br/>受限制環境<br/>VS Code Server<br/>Amazon Q CLI"]
end
subgraph "系統資源"
CPU["16-20 核心 CPU"]
RAM["64-80GB RAM"]
DISK["500GB SSD"]
end
subgraph "安全限制"
ACL["ACL 權限控制"]
RESTRICT["目錄存取限制<br/>/etc /root /var"]
ISOLATE["用戶隔離<br/>只能存取自己家目錄"]
end
end
subgraph "外部服務"
QAPI["Amazon Q API<br/>AI 助手服務"]
ADO["ADO 程式碼倉庫"]
VSCODE_CDN["VS Code CDN<br/>擴展和更新"]
end
U1 --> SSHD
U2 --> SSHD
U3 --> SSHD
U4 --> SSHD
U5 --> SSHD
UD --> SSHD
SSHD --> USER1
SSHD --> USER2
SSHD --> USER3
SSHD --> USERN
USER1 -.-> QAPI
USER2 -.-> QAPI
USER3 -.-> QAPI
USERN -.-> QAPI
USER1 -.-> ADO
USER2 -.-> ADO
USER3 -.-> ADO
USERN -.-> ADO
SSHD -.-> VSCODE_CDN
```
## 工作流程說明
```mermaid
sequenceDiagram
participant User as 👤 用戶本機<br/>VS Code
participant SSH as 🔐 SSH 連接
participant Server as 🖥️ Ubuntu Server
participant VSCode as 📁 VS Code Server
participant Q as ⚡ Amazon Q CLI
participant API as ☁️ Amazon Q API
Note over User,API: 用戶連接和工作流程
User->>SSH: 1. SSH 金鑰認證
SSH->>Server: 2. 建立安全連接
Server->>VSCode: 3. 啟動 VS Code Server<br/>(預安裝,快速啟動)
VSCode-->>User: 4. 建立 VS Code 通信通道
Note over User,VSCode: VS Code Remote 環境已就緒
User->>VSCode: 5. 開啟終端機
VSCode->>Q: 6. 執行 q chat 命令
Q->>API: 7. 發送查詢到 Amazon Q
API-->>Q: 8. 返回 AI 回應
Q-->>VSCode: 9. 顯示回應結果
VSCode-->>User: 10. 用戶看到 AI 回應
Note over User,API: 持續的開發和 AI 協助循環
```
## 步驟 1: 建立 Ubuntu VM
### 1.1 VM 規格需求 (20 人同時使用)
#### 推薦規格
```bash
# 生產環境規格 (20 人同時使用)
- CPU: 16-20 核心 (每人約 1 核心)
- RAM: 64-80GB (每人約 3-4GB)
- 磁碟: 500GB SSD (每人約 25GB)
- 網路: 橋接模式 (更好的網路效能)
- 交換空間: 16GB
```
#### 最低規格
```bash
# 最低可接受規格 (可能影響效能)
- CPU: 12 核心
- RAM: 48GB
- 磁碟: 300GB
- 網路: NAT 模式
- 交換空間: 8GB
```
#### 資源計算說明
```bash
# 每個用戶預估資源使用量
- VS Code Server: 200-400MB RAM
- Node.js 進程: 100-200MB RAM
- Amazon Q CLI: 50-100MB RAM
- Shell 和系統進程: 50-100MB RAM
- 磁碟空間: 20-25GB (包含 VS Code extensions)
- CPU: 輕度使用 0.5-1 核心,重度使用 1-2 核心
```
### 1.2 安裝 Ubuntu Server
1. 下載 Ubuntu 22.04 LTS Server ISO
2. 在 VMware 中建立新 VM,分配上述規格
3. 完成 Ubuntu Server 安裝,建立管理員用戶
4. 選擇安裝 OpenSSH Server
### 1.3 系統效能調優
```bash
# 設定交換空間 (如果安裝時未設定)
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 調整系統參數以支援更多並發連線
sudo tee -a /etc/sysctl.conf << 'EOF'
# 支援更多並發連線
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
fs.file-max = 65536
# 記憶體管理優化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
EOF
sudo sysctl -p
```
### 1.4 取得 VM IP 位址
```bash
# 在 VM 中執行
ip addr show
# 記錄 IP 位址,例如:192.168.1.100
```
## 步驟 2: 系統基礎設定
### 2.1 更新系統
```bash
sudo apt update && sudo apt upgrade -y
```
### 2.2 安裝必要套件
```bash
sudo apt install -y openssh-server curl wget git nodejs npm acl htop iotop \
build-essential python3-pip unzip tar gzip fail2ban ufw
```
### 2.3 設定 SSH 服務以支援多用戶
```bash
# 編輯 SSH 設定
sudo tee -a /etc/ssh/sshd_config << 'EOF'
# 多用戶連線優化
MaxAuthTries 6
MaxSessions 50
MaxStartups 30:30:100
ClientAliveInterval 300
ClientAliveCountMax 2
# 安全設定
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
EOF
sudo systemctl restart ssh
```
### 2.4 設定防火牆
```bash
sudo ufw allow ssh
sudo ufw --force enable
```
### 2.5 設定 Fail2Ban (防止暴力破解)
```bash
sudo tee /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
EOF
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
```
## 步驟 3: 批量建立受限制用戶
### 3.1 建立用戶管理腳本
```bash
# 建立用戶管理腳本
sudo tee /usr/local/bin/create-vscode-user.sh << 'EOF'
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <username>"
exit 1
fi
USERNAME=$1
# 建立用戶
sudo useradd -m -s /bin/bash $USERNAME
echo "User $USERNAME created"
# 建立 SSH 目錄
sudo mkdir -p /home/$USERNAME/.ssh
sudo chmod 700 /home/$USERNAME/.ssh
sudo chown $USERNAME:$USERNAME /home/$USERNAME/.ssh
# 建立受限制的 Shell 環境
sudo tee /home/$USERNAME/.bashrc > /dev/null << 'BASHRC_EOF'
# 基本環境設定
export HOME=/home/USERNAME_PLACEHOLDER
export USER=USERNAME_PLACEHOLDER
export LOGNAME=USERNAME_PLACEHOLDER
export PATH="/home/USERNAME_PLACEHOLDER/.local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
# 確保在家目錄
cd /home/USERNAME_PLACEHOLDER 2>/dev/null || true
# 智能的目錄存取控制(只在互動式 shell 中啟用)
if [[ $- == *i* ]]; then
restricted_cd() {
local target_dir="$1"
if [[ -z "$target_dir" ]]; then
target_dir="$HOME"
fi
# 解析絕對路徑
if [[ "$target_dir" = /* ]]; then
# 絕對路徑 - 檢查是否在家目錄內
if [[ "$target_dir" != "$HOME"* ]]; then
echo "Access denied: You can only access your home directory"
return 1
fi
else
# 相對路徑 - 檢查結果是否會離開家目錄
local full_path=$(realpath "$PWD/$target_dir" 2>/dev/null)
if [[ $? -ne 0 ]] || [[ "$full_path" != "$HOME"* ]]; then
echo "Access denied: You can only access your home directory"
return 1
fi
fi
builtin cd "$target_dir"
}
# 只在互動式 shell 中覆蓋 cd 命令
alias cd='restricted_cd'
# 歡迎訊息
echo "Welcome to your restricted environment!"
echo "You are limited to your home directory: $HOME"
echo "Current users online: $(who | wc -l)"
fi
# 其他有用的別名
alias ls='ls --color=auto'
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
BASHRC_EOF
# 替換用戶名佔位符
sudo sed -i "s/USERNAME_PLACEHOLDER/$USERNAME/g" /home/$USERNAME/.bashrc
sudo chown $USERNAME:$USERNAME /home/$USERNAME/.bashrc
echo "User $USERNAME setup completed"
EOF
sudo chmod +x /usr/local/bin/create-vscode-user.sh
```
### 3.2 批量建立用戶 (範例:user01-user20)
```bash
# 建立 20 個用戶
for i in $(seq -w 1 20); do
/usr/local/bin/create-vscode-user.sh user$i
done
# 或建立自定義用戶名
# /usr/local/bin/create-vscode-user.sh jameschan
# /usr/local/bin/create-vscode-user.sh alice
# /usr/local/bin/create-vscode-user.sh bob
```
### 3.3 批量設定 SSH 金鑰認證
```bash
# 在本機生成主要金鑰對
ssh-keygen -t rsa -b 4096 -f ~/.ssh/vm-users-key
# 為每個用戶設定公鑰 (在 VM 上執行)
PUBLIC_KEY="ssh-rsa AAAAB3NzaC1yc2EAAAA... your-public-key-here"
for i in $(seq -w 1 20); do
echo "$PUBLIC_KEY" | sudo tee /home/user$i/.ssh/authorized_keys
sudo chown user$i:user$i /home/user$i/.ssh/authorized_keys
sudo chmod 600 /home/user$i/.ssh/authorized_keys
done
```
## 步驟 4: 實施多用戶安全限制
### 4.1 建立安全限制腳本
```bash
# 建立安全限制腳本
sudo tee /usr/local/bin/apply-security-restrictions.sh << 'EOF'
#!/bin/bash
echo "Applying security restrictions for all VS Code users..."
# 建立受限用戶群組
sudo groupadd vscode-users 2>/dev/null || true
# 將所有 user* 用戶加入群組
for user in $(ls /home | grep "^user[0-9]"); do
sudo usermod -a -G vscode-users $user
done
# 限制存取敏感目錄
RESTRICTED_DIRS=(
"/root"
"/var/log"
"/boot"
"/home" # 限制存取其他用戶的家目錄
)
for dir in "${RESTRICTED_DIRS[@]}"; do
if [ -d "$dir" ]; then
sudo setfacl -m g:vscode-users:--- "$dir"
fi
done
# 限制存取敏感文件
SENSITIVE_FILES=(
"/etc/passwd"
"/etc/shadow"
"/etc/group"
"/etc/sudoers"
"/etc/ssh/sshd_config"
)
for file in "${SENSITIVE_FILES[@]}"; do
if [ -f "$file" ]; then
sudo setfacl -m g:vscode-users:--- "$file"
fi
done
# 允許存取必要的系統工具
REQUIRED_TOOLS=(
"/usr/bin/node"
"/usr/bin/npm"
"/usr/bin/curl"
"/usr/bin/wget"
"/usr/bin/tar"
"/usr/bin/gzip"
"/usr/bin/unzip"
"/usr/bin/ps"
"/usr/bin/kill"
"/usr/bin/find"
"/usr/bin/grep"
"/usr/bin/sed"
"/usr/bin/awk"
"/usr/bin/who"
"/usr/bin/w"
"/usr/bin/uptime"
"/usr/bin/free"
"/usr/bin/df"
)
for tool in "${REQUIRED_TOOLS[@]}"; do
if [ -f "$tool" ]; then
sudo setfacl -m g:vscode-users:rx "$tool"
fi
done
# 允許存取必要的系統目錄
SYSTEM_DIRS=(
"/usr"
"/usr/bin"
"/usr/lib"
"/usr/lib64"
"/lib"
"/lib64"
"/bin"
"/tmp"
)
for dir in "${SYSTEM_DIRS[@]}"; do
if [ -d "$dir" ]; then
sudo setfacl -m g:vscode-users:rx "$dir"
fi
done
# 允許存取 SSL 配置(VS Code Server 需要)
sudo setfacl -m g:vscode-users:rx /etc
sudo setfacl -m g:vscode-users:rx /etc/ssl
sudo setfacl -m g:vscode-users:r /etc/ssl/openssl.cnf
# 允許存取設備文件
sudo setfacl -m g:vscode-users:rx /dev
sudo setfacl -m g:vscode-users:rw /dev/null
sudo setfacl -m g:vscode-users:rw /dev/zero
sudo setfacl -m g:vscode-users:r /dev/urandom
# 確保用戶只能存取自己的家目錄
for user in $(ls /home | grep "^user[0-9]"); do
sudo setfacl -m u:$user:rwx /home/$user
sudo setfacl -R -m u:$user:rwx /home/$user/
# 禁止存取其他用戶的家目錄
for other_user in $(ls /home | grep "^user[0-9]"); do
if [ "$user" != "$other_user" ]; then
sudo setfacl -m u:$user:--- /home/$other_user
fi
done
done
echo "Security restrictions applied successfully"
EOF
sudo chmod +x /usr/local/bin/apply-security-restrictions.sh
```
### 4.2 執行安全限制
```bash
/usr/local/bin/apply-security-restrictions.sh
```
### 4.3 禁用 sudo 權限
```bash
sudo tee /etc/sudoers.d/restrict_vscode_users > /dev/null << 'EOF'
# 明確禁止 vscode-users 群組使用 sudo
%vscode-users ALL=(ALL) !ALL
EOF
```
### 4.4 設定資源限制
```bash
# 設定每個用戶的資源限制
sudo tee -a /etc/security/limits.conf << 'EOF'
# VS Code 用戶資源限制
@vscode-users soft nproc 100
@vscode-users hard nproc 150
@vscode-users soft nofile 4096
@vscode-users hard nofile 8192
@vscode-users soft fsize 10485760
@vscode-users hard fsize 20971520
@vscode-users soft cpu 30
@vscode-users hard cpu 60
EOF
```
## 步驟 5: 批量安裝 Amazon Q CLI
### 5.1 建立 Amazon Q CLI 下載腳本
```bash
# 建立批量下載腳本
sudo tee /usr/local/bin/download-q-cli-batch.sh << 'EOF'
#!/bin/bash
echo "Downloading Amazon Q CLI for all VS Code users..."
# 下載 Amazon Q CLI 到共享位置
cd /tmp
curl --proto '=https' --tlsv1.2 -sSf 'https://desktop-release.codewhisperer.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip' -o 'q.zip'
if [ ! -f q.zip ]; then
echo "Failed to download Amazon Q CLI"
exit 1
fi
unzip q.zip
# 為每個用戶複製安裝文件
for user in $(ls /home | grep "^user[0-9]"); do
echo "Preparing Q CLI installation files for user: $user"
# 複製安裝文件到用戶目錄
sudo -u $user cp -r /tmp/q /home/$user/
echo "Installation files copied to /home/$user/q/"
done
# 清理共享的臨時文件
rm -rf /tmp/q.zip /tmp/q/
echo "Amazon Q CLI installation files prepared for all users"
echo "Each user needs to manually run: ./q/install.sh in their home directory"
EOF
sudo chmod +x /usr/local/bin/download-q-cli-batch.sh
```
### 5.2 執行批量下載
```bash
/usr/local/bin/download-q-cli-batch.sh
```
### 5.3 用戶手動安裝說明
每個用戶需要個別登入並手動執行安裝程序,因為 Amazon Q CLI 需要進行個人化的認證設定。
#### 用戶安裝步驟
1. **SSH 登入到各自的用戶帳號**
```bash
# 每個用戶使用自己的帳號登入
ssh -i ~/.ssh/vm-users-key user01@192.168.1.100
```
2. **執行安裝程式**
```bash
# 在用戶家目錄執行
cd ~
./q/install.sh
```
3. **互動式安裝流程**
安裝程式會啟動互動式設定流程:
**步驟 1:Shell 配置選擇**
```bash
? Do you want q to modify your shell config (you will have to manually do this otherwise)? ›
❯ Yes
No
```
**建議選擇 `Yes`**,讓安裝程式自動修改 shell 配置檔案。
**步驟 2:登入方式選擇**
```bash
? Select login method ›
Use for Free with Builder ID
❯ Use with Pro license
```
選擇適合的登入方式:
- **Use for Free with Builder ID**: 免費版本,使用 AWS Builder ID
- **Use with Pro license**: 專業版本,使用企業 SSO 或 AWS 帳戶
**步驟 3:輸入 Start URL(如選擇 Pro license)**
```bash
? Enter Start URL › https://your-org.awsapps.com/start
```
輸入您組織的 AWS SSO Start URL。
**步驟 4:選擇 AWS 區域**
```bash
? Enter Region › us-east-1
```
選擇適當的 AWS 區域:
- `us-east-1` (美國東部 - 維吉尼亞北部)
- `eu-central-1` (歐洲 - 法蘭克福)
**步驟 5:瀏覽器認證**
```bash
Confirm the following code in the browser
Code: LSRC-XPGB
Open this URL: https://your-org.awsapps.com/start/#/device?user_code=LSRC-XPGB
▰▰▰▰▰▰▱ Logging in...
```
**重要步驟**:
- 複製顯示的 URL 到本地電腦的瀏覽器
- 在瀏覽器中輸入顯示的驗證碼
- 完成 AWS SSO 登入流程
- 等待認證完成
**步驟 6:安裝完成**
```bash
Device authorized
Logged in successfully
```
4. **重新載入環境變數**
```bash
# 重新載入 shell 配置
source ~/.bashrc
```
5. **驗證安裝**
```bash
# 測試 Amazon Q CLI
q --version
q chat
```
### 5.4 批量驗證腳本
```bash
# 建立驗證腳本
sudo tee /usr/local/bin/verify-q-cli-batch.sh << 'EOF'
#!/bin/bash
echo "Verifying Amazon Q CLI installation for all users..."
for user in $(ls /home | grep "^user[0-9]"); do
echo "Checking Q CLI for $user:"
# 檢查安裝文件是否存在
if [ -f "/home/$user/.local/bin/q" ]; then
echo " ✓ Q CLI binary found"
# 檢查版本(需要用戶已完成認證)
sudo -u $user /home/$user/.local/bin/q --version 2>/dev/null && echo " ✓ Q CLI working" || echo " ⚠ Q CLI needs authentication"
else
echo " ✗ Q CLI not installed - user needs to run ./q/install.sh"
fi
echo
done
EOF
sudo chmod +x /usr/local/bin/verify-q-cli-batch.sh
```
### 5.5 管理員檢查安裝狀態
```bash
# 檢查所有用戶的安裝狀態
/usr/local/bin/verify-q-cli-batch.sh
```
### 5.6 重要注意事項
1. **個人化認證**:每個用戶必須個別完成認證流程,無法批量處理
2. **網路需求**:安裝過程需要存取外網進行認證
3. **瀏覽器需求**:用戶需要在本地電腦上使用瀏覽器完成 SSO 認證
4. **一次性設定**:每個用戶只需要執行一次安裝和認證流程
5. **清理安裝文件**:認證完成後,可以刪除 `~/q/` 目錄以節省空間
```bash
# 用戶完成安裝後可以清理安裝文件
rm -rf ~/q/
```
## VS Code Server 預安裝說明
### 為什麼需要預安裝 VS Code Server?
VS Code Remote SSH 的標準工作流程是自動下載並安裝 VS Code Server,但在 20 人同時使用的環境中會帶來問題:
- **網路擁塞**:20 人同時下載 ~65MB,總計 1.3GB 流量
- **連接失敗**:首次連接需要 2-10 分鐘,成功率僅 70-80%
- **用戶體驗差**:長時間等待和可能的連接中斷
**預安裝的優勢**:
- 連接時間從 2-10 分鐘縮短到 5-15 秒
- 成功率提升到 95%+
- 支援離線環境,減少外網依賴
- 統一版本管理,符合企業需求
因此,對於多用戶環境,我們採用預安裝方式以確保最佳的用戶體驗和系統穩定性。
---
## 步驟 6: 批量預安裝 VS Code Server
### 6.1 建立 VS Code Server 批量安裝腳本
```bash
# 建立批量安裝腳本
sudo tee /usr/local/bin/install-vscode-server-batch.sh << 'EOF'
#!/bin/bash
echo "Installing VS Code Server for all users..."
# 獲取最新版本
VSCODE_VERSION=$(curl -s https://api.github.com/repos/microsoft/vscode/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
if [ -z "$VSCODE_VERSION" ]; then
VSCODE_VERSION="1.102.3"
echo "Using default version: $VSCODE_VERSION"
else
echo "Latest version: $VSCODE_VERSION"
fi
# 下載 VS Code Server 到共享位置
cd /tmp
echo "Downloading VS Code Server..."
wget -O vscode-server.tar.gz "https://update.code.visualstudio.com/$VSCODE_VERSION/server-linux-x64/stable"
if [ ! -f vscode-server.tar.gz ]; then
echo "Failed to download VS Code Server"
exit 1
fi
echo "VS Code Server downloaded successfully"
# 為每個用戶安裝
for user in $(ls /home | grep "^user[0-9]"); do
echo "Installing VS Code Server for user: $user"
# 建立用戶的 VS Code Server 目錄
sudo -u $user mkdir -p /home/$user/.vscode-server/bin/$VSCODE_VERSION
# 解壓縮到用戶目錄
sudo tar -xzf vscode-server.tar.gz -C /home/$user/.vscode-server/bin/$VSCODE_VERSION --strip-components=1
sudo chown -R $user:$user /home/$user/.vscode-server/bin/$VSCODE_VERSION
# 建立版本標記
echo $VSCODE_VERSION | sudo -u $user tee /home/$user/.vscode-server/bin/$VSCODE_VERSION/.version > /dev/null
echo "VS Code Server installed for $user"
done
# 清理
rm -f vscode-server.tar.gz
echo "VS Code Server installation completed for all users"
EOF
sudo chmod +x /usr/local/bin/install-vscode-server-batch.sh
```
### 6.2 執行批量安裝
```bash
/usr/local/bin/install-vscode-server-batch.sh
```
### 6.3 修復所有用戶的 VS Code Server 權限
```bash
# 建立權限修復腳本
sudo tee /usr/local/bin/fix-vscode-permissions.sh << 'EOF'
#!/bin/bash
echo "Fixing VS Code Server permissions for all users..."
for user in $(ls /home | grep "^user[0-9]"); do
echo "Fixing permissions for user: $user"
sudo chown -R $user:$user /home/$user/.vscode-server/
sudo chmod -R u+rwX /home/$user/.vscode-server/
sudo find /home/$user/.vscode-server/ -name 'code-server' -exec chmod +x {} \;
sudo find /home/$user/.vscode-server/ -name 'node' -exec chmod +x {} \;
done
echo "Permissions fixed for all users"
EOF
sudo chmod +x /usr/local/bin/fix-vscode-permissions.sh
/usr/local/bin/fix-vscode-permissions.sh
```
### 6.4 建立 VS Code Server 更新腳本
```bash
# 建立定期更新腳本
sudo tee /usr/local/bin/update-vscode-server.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/vscode-server-update.log"
echo "$(date): Starting VS Code Server update" | tee -a $LOG_FILE
# 獲取最新版本
LATEST_VERSION=$(curl -s https://api.github.com/repos/microsoft/vscode/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
if [ -z "$LATEST_VERSION" ]; then
echo "$(date): Failed to get latest version" | tee -a $LOG_FILE
exit 1
fi
echo "$(date): Latest version: $LATEST_VERSION" | tee -a $LOG_FILE
# 檢查是否需要更新
NEED_UPDATE=false
for user in $(ls /home | grep "^user[0-9]"); do
CURRENT_VERSION=$(ls /home/$user/.vscode-server/bin/ 2>/dev/null | head -1)
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then
NEED_UPDATE=true
break
fi
done
if [ "$NEED_UPDATE" = false ]; then
echo "$(date): All users already have the latest version" | tee -a $LOG_FILE
exit 0
fi
# 下載最新版本
cd /tmp
echo "$(date): Downloading VS Code Server $LATEST_VERSION" | tee -a $LOG_FILE
wget -O vscode-server-latest.tar.gz "https://update.code.visualstudio.com/$LATEST_VERSION/server-linux-x64/stable"
if [ ! -f vscode-server-latest.tar.gz ]; then
echo "$(date): Failed to download VS Code Server" | tee -a $LOG_FILE
exit 1
fi
# 為每個用戶更新
for user in $(ls /home | grep "^user[0-9]"); do
echo "$(date): Updating VS Code Server for $user" | tee -a $LOG_FILE
# 備份舊版本(保留最近一個版本)
OLD_VERSIONS=$(ls /home/$user/.vscode-server/bin/ 2>/dev/null | grep -v "$LATEST_VERSION" | head -n -1)
for old_ver in $OLD_VERSIONS; do
rm -rf /home/$user/.vscode-server/bin/$old_ver
done
# 安裝新版本
sudo -u $user mkdir -p /home/$user/.vscode-server/bin/$LATEST_VERSION
sudo tar -xzf vscode-server-latest.tar.gz -C /home/$user/.vscode-server/bin/$LATEST_VERSION --strip-components=1
sudo chown -R $user:$user /home/$user/.vscode-server/bin/$LATEST_VERSION
# 建立版本標記
echo $LATEST_VERSION | sudo -u $user tee /home/$user/.vscode-server/bin/$LATEST_VERSION/.version > /dev/null
# 修復權限
sudo chmod -R u+rwX /home/$user/.vscode-server/bin/$LATEST_VERSION
sudo find /home/$user/.vscode-server/bin/$LATEST_VERSION -name 'code-server' -exec chmod +x {} \;
sudo find /home/$user/.vscode-server/bin/$LATEST_VERSION -name 'node' -exec chmod +x {} \;
done
# 清理
rm -f vscode-server-latest.tar.gz
echo "$(date): VS Code Server update completed" | tee -a $LOG_FILE
EOF
sudo chmod +x /usr/local/bin/update-vscode-server.sh
### 6.5 驗證安裝和測試更新
```bash
# 測試幾個用戶的 VS Code Server
for user in user01 user02 user03; do
echo "Testing VS Code Server for $user:"
VSCODE_DIR=$(sudo -u $user ls /home/$user/.vscode-server/bin/ | head -1)
sudo -u $user /home/$user/.vscode-server/bin/$VSCODE_DIR/bin/code-server --version
done
# 測試更新腳本
echo "Testing VS Code Server update script:"
/usr/local/bin/update-vscode-server.sh
# 檢查更新日誌
tail -10 /var/log/vscode-server-update.log
```
### 6.6 VS Code Server 版本管理最佳實踐
```bash
# 建立版本檢查腳本
sudo tee /usr/local/bin/check-vscode-versions.sh << 'EOF'
#!/bin/bash
echo "=== VS Code Server 版本檢查 ==="
echo "檢查時間: $(date)"
echo
# 獲取最新可用版本
LATEST_VERSION=$(curl -s https://api.github.com/repos/microsoft/vscode/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
echo "最新版本: $LATEST_VERSION"
echo
# 檢查每個用戶的版本
echo "用戶版本檢查:"
for user in $(ls /home | grep "^user[0-9]" | head -5); do
INSTALLED_VERSIONS=$(ls /home/$user/.vscode-server/bin/ 2>/dev/null | tr '\n' ' ')
echo " $user: $INSTALLED_VERSIONS"
done
echo
echo "版本統計:"
ls /home/user*/.vscode-server/bin/ 2>/dev/null | sort | uniq -c | sort -nr
echo
echo "磁碟使用量:"
du -sh /home/user*/.vscode-server/ 2>/dev/null | head -5
EOF
sudo chmod +x /usr/local/bin/check-vscode-versions.sh
```
## 步驟 7: 設定 VS Code Remote SSH (本地電腦設定)
> **注意**:以下步驟需要在**用戶的本地電腦**上執行,不是在 Ubuntu VM 上。
### 7.1 本機 SSH 設定 (支援多用戶)
在**本機**的 `~/.ssh/config` 文件中添加:
```
# Ubuntu VM 多用戶設定
Host ubuntu-vm-user01
HostName 192.168.1.100
User user01
IdentityFile ~/.ssh/vm-users-key
StrictHostKeyChecking no
ServerAliveInterval 60
ServerAliveCountMax 3
Host ubuntu-vm-user02
HostName 192.168.1.100
User user02
IdentityFile ~/.ssh/vm-users-key
StrictHostKeyChecking no
ServerAliveInterval 60
ServerAliveCountMax 3
# 可以繼續添加更多用戶...
# 或使用通配符設定
Host ubuntu-vm-user*
HostName 192.168.1.100
IdentityFile ~/.ssh/vm-users-key
StrictHostKeyChecking no
ServerAliveInterval 60
ServerAliveCountMax 3
```
### 7.2 建立連接測試腳本 (本地電腦)
```bash
# 在本機建立測試腳本
cat > ~/test-vm-connections.sh << 'EOF'
#!/bin/bash
VM_IP="192.168.1.100"
KEY_FILE="~/.ssh/vm-users-key"
echo "Testing connections to Ubuntu VM users..."
for i in $(seq -w 1 20); do
user="user$i"
echo -n "Testing $user: "
if ssh -i $KEY_FILE -o ConnectTimeout=5 -o BatchMode=yes $user@$VM_IP "echo 'OK'" 2>/dev/null; then
echo "✓ Connected"
else
echo "✗ Failed"
fi
done
EOF
chmod +x ~/test-vm-connections.sh
```
### 7.3 VS Code 多用戶連接設定 (本地電腦)
1. 在**本地電腦**開啟 VS Code
2. 按 `Cmd+Shift+P` (macOS) 或 `Ctrl+Shift+P` (Windows/Linux)
3. 輸入 "Remote-SSH: Connect to Host"
4. 選擇對應的用戶主機 (例如 "ubuntu-vm-user01")
### 7.4 VS Code Explorer 限制設定 (Ubuntu VM 上的全域設定)
> **注意**:以下步驟需要在 **Ubuntu VM** 上執行,為所有用戶建立統一的 VS Code 設定。
每個用戶連接後,VS Code 會自動建立個人設定。如需統一設定,可在 VM 上建立全域設定:
```bash
# 建立全域 VS Code 設定腳本
sudo tee /usr/local/bin/setup-vscode-settings.sh << 'EOF'
#!/bin/bash
SETTINGS_JSON='{
"files.exclude": {
"/etc/**": true,
"/root/**": true,
"/var/**": true,
"/usr/**": true,
"/opt/**": true,
"/boot/**": true,
"/sys/**": true,
"/proc/**": true,
"/dev/**": true,
"/run/**": true,
"/tmp/**": true,
"/srv/**": true,
"/mnt/**": true,
"/media/**": true,
"/lib/**": true,
"/bin/**": true,
"/sbin/**": true
},
"search.exclude": {
"/etc/**": true,
"/root/**": true,
"/var/**": true,
"/usr/**": true,
"/opt/**": true,
"/boot/**": true,
"/sys/**": true,
"/proc/**": true,
"/dev/**": true,
"/run/**": true,
"/tmp/**": true,
"/srv/**": true,
"/mnt/**": true,
"/media/**": true,
"/lib/**": true,
"/bin/**": true,
"/sbin/**": true
},
"terminal.integrated.cwd": "~",
"terminal.integrated.defaultProfile.linux": "bash"
}'
for user in $(ls /home | grep "^user[0-9]"); do
echo "Setting up VS Code settings for $user"
sudo -u $user mkdir -p /home/$user/.vscode-server/data/User
echo "$SETTINGS_JSON" | sudo -u $user tee /home/$user/.vscode-server/data/User/settings.json > /dev/null
done
echo "VS Code settings applied to all users"
EOF
sudo chmod +x /usr/local/bin/setup-vscode-settings.sh
/usr/local/bin/setup-vscode-settings.sh
```
## 步驟 8: 測試和驗證
### 8.1 系統資源監控
```bash
# 建立系統監控腳本
sudo tee /usr/local/bin/monitor-system.sh << 'EOF'
#!/bin/bash
echo "=== 系統資源監控 ==="
echo "時間: $(date)"
echo
echo "=== CPU 使用率 ==="
top -bn1 | grep "Cpu(s)" | awk '{print $2 $3 $4 $5 $6 $7 $8}'
echo
echo "=== 記憶體使用情況 ==="
free -h
echo
echo "=== 磁碟使用情況 ==="
df -h /
echo
echo "=== 當前登入用戶 ==="
who | wc -l
who
echo
echo "=== 活躍的 VS Code Server 進程 ==="
ps aux | grep code-server | grep -v grep | wc -l
echo
echo "=== 網路連接統計 ==="
ss -tuln | grep :22
echo
echo "=== 系統負載 ==="
uptime
echo
echo "=== 前 10 個消耗記憶體的進程 ==="
ps aux --sort=-%mem | head -11
EOF
sudo chmod +x /usr/local/bin/monitor-system.sh
```
### 8.2 測試多用戶連接
```bash
# 測試 SSH 連接
for i in $(seq -w 1 5); do
echo "Testing user$i SSH connection:"
ssh -i ~/.ssh/vm-users-key -o ConnectTimeout=5 user$i@192.168.1.100 "whoami && pwd && q --version" || echo "Connection failed"
echo "---"
done
```
### 8.3 測試安全限制
```bash
# 在 VM 上測試安全限制
sudo tee /usr/local/bin/test-security.sh << 'EOF'
#!/bin/bash
echo "=== 安全限制測試 ==="
for user in user01 user02 user03; do
echo "Testing security for $user:"
echo -n " Access to /etc/passwd: "
sudo -u $user cat /etc/passwd 2>&1 | head -1 | grep -q "Permission denied" && echo "✓ BLOCKED" || echo "✗ ALLOWED"
echo -n " Access to /root: "
sudo -u $user ls /root 2>&1 | head -1 | grep -q "Permission denied" && echo "✓ BLOCKED" || echo "✗ ALLOWED"
echo -n " Access to other user's home: "
sudo -u $user ls /home/user02 2>&1 | head -1 | grep -q "Permission denied" && echo "✓ BLOCKED" || echo "✗ ALLOWED"
echo -n " Can access own home: "
sudo -u $user ls /home/$user > /dev/null 2>&1 && echo "✓ ALLOWED" || echo "✗ BLOCKED"
echo
done
EOF
sudo chmod +x /usr/local/bin/test-security.sh
/usr/local/bin/test-security.sh
```
### 8.4 效能基準測試
```bash
# 建立效能測試腳本
sudo tee /usr/local/bin/performance-test.sh << 'EOF'
#!/bin/bash
echo "=== 效能基準測試 ==="
echo "1. 測試同時啟動多個 VS Code Server..."
start_time=$(date +%s)
# 模擬 5 個用戶同時啟動 VS Code Server
for i in $(seq 1 5); do
user="user$(printf "%02d" $i)"
echo "Starting VS Code Server for $user..."
sudo -u $user bash -c "
VSCODE_DIR=\$(ls /home/$user/.vscode-server/bin/ | head -1)
timeout 10s /home/$user/.vscode-server/bin/\$VSCODE_DIR/bin/code-server --version > /dev/null 2>&1
" &
done
wait
end_time=$(date +%s)
echo "所有 VS Code Server 啟動完成,耗時: $((end_time - start_time)) 秒"
echo
echo "2. 記憶體使用情況:"
free -h
echo
echo "3. CPU 負載:"
uptime
echo
echo "4. 磁碟 I/O 測試:"
dd if=/dev/zero of=/tmp/test_file bs=1M count=100 2>&1 | grep copied
rm -f /tmp/test_file
EOF
sudo chmod +x /usr/local/bin/performance-test.sh
```
## 步驟 9: 系統維護和監控
### 9.1 建立自動化維護腳本
```bash
# 建立每日維護腳本
sudo tee /usr/local/bin/daily-maintenance.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/vscode-maintenance.log"
echo "$(date): Starting daily maintenance" >> $LOG_FILE
# 清理臨時文件
find /tmp -type f -atime +1 -delete 2>/dev/null
echo "$(date): Cleaned temporary files" >> $LOG_FILE
# 清理用戶的 VS Code 日誌
for user in $(ls /home | grep "^user[0-9]"); do
find /home/$user/.vscode-server -name "*.log" -mtime +7 -delete 2>/dev/null
done
echo "$(date): Cleaned VS Code logs" >> $LOG_FILE
# 檢查 VS Code Server 版本一致性
LATEST_VERSION=$(curl -s https://api.github.com/repos/microsoft/vscode/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
OUTDATED_USERS=0
for user in $(ls /home | grep "^user[0-9]"); do
CURRENT_VERSION=$(ls /home/$user/.vscode-server/bin/ 2>/dev/null | head -1)
if [ "$CURRENT_VERSION" != "$LATEST_VERSION" ]; then
OUTDATED_USERS=$((OUTDATED_USERS + 1))
fi
done
if [ $OUTDATED_USERS -gt 0 ]; then
echo "$(date): WARNING - $OUTDATED_USERS users have outdated VS Code Server (latest: $LATEST_VERSION)" >> $LOG_FILE
fi
# 檢查磁碟使用量
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
echo "$(date): WARNING - Disk usage is ${DISK_USAGE}%" >> $LOG_FILE
fi
# 檢查記憶體使用量
MEM_USAGE=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100.0)}')
if [ $MEM_USAGE -gt 90 ]; then
echo "$(date): WARNING - Memory usage is ${MEM_USAGE}%" >> $LOG_FILE
fi
# 檢查活躍的 VS Code Server 進程數
VSCODE_PROCESSES=$(ps aux | grep code-server | grep -v grep | wc -l)
echo "$(date): Active VS Code Server processes: $VSCODE_PROCESSES" >> $LOG_FILE
echo "$(date): Daily maintenance completed" >> $LOG_FILE
EOF
sudo chmod +x /usr/local/bin/daily-maintenance.sh
# 設定 cron job
echo "0 2 * * * /usr/local/bin/daily-maintenance.sh" | sudo crontab -
echo "0 3 1 * * /usr/local/bin/update-vscode-server.sh" | sudo crontab -
```
### 9.2 建立用戶管理工具
```bash
# 建立用戶管理腳本
sudo tee /usr/local/bin/manage-vscode-users.sh << 'EOF'
#!/bin/bash
case "$1" in
"add")
if [ -z "$2" ]; then
echo "Usage: $0 add <username>"
exit 1
fi
/usr/local/bin/create-vscode-user.sh "$2"
/usr/local/bin/apply-security-restrictions.sh
echo "User $2 added successfully"
;;
"remove")
if [ -z "$2" ]; then
echo "Usage: $0 remove <username>"
exit 1
fi
sudo userdel -r "$2"
echo "User $2 removed successfully"
;;
"list")
echo "VS Code users:"
ls /home | grep "^user[0-9]" | sort
;;
"status")
echo "=== VS Code 環境狀態 ==="
/usr/local/bin/monitor-system.sh
;;
*)
echo "Usage: $0 {add|remove|list|status} [username]"
exit 1
;;
esac
EOF
sudo chmod +x /usr/local/bin/manage-vscode-users.sh
```
## 故障排除
### 常見問題
1. **多用戶 SSH 連接失敗**
- 檢查 VM IP 位址和網路連接
- 確認 SSH 服務運行:`sudo systemctl status ssh`
- 檢查 SSH 設定:`sudo sshd -T | grep -i max`
- 檢查防火牆設定:`sudo ufw status`
- 查看 SSH 日誌:`sudo tail -f /var/log/auth.log`
2. **系統效能問題**
- 監控系統資源:`/usr/local/bin/monitor-system.sh`
- 檢查記憶體使用:`free -h`
- 檢查 CPU 負載:`top`
- 檢查磁碟空間:`df -h`
- 檢查交換空間:`swapon -s`
3. **VS Code Server 啟動緩慢**
- 檢查是否已預安裝:`ls ~/.vscode-server/bin/`
- 檢查網路連接:`curl -I https://update.code.visualstudio.com`
- 重新安裝:`/usr/local/bin/install-vscode-server-batch.sh`
- 修復權限:`/usr/local/bin/fix-vscode-permissions.sh`
4. **用戶權限問題**
- 重新套用安全限制:`/usr/local/bin/apply-security-restrictions.sh`
- 檢查 ACL 設定:`getfacl /home/user01`
- 測試安全限制:`/usr/local/bin/test-security.sh`
5. **資源不足問題**
- 增加 VM 記憶體和 CPU
- 清理臨時文件:`/usr/local/bin/daily-maintenance.sh`
- 限制同時連線數量
- 監控資源使用:`htop`
### 效能調優建議
1. **記憶體優化**
```bash
# 調整 swappiness
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
# 清理記憶體快取
sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
```
2. **磁碟 I/O 優化**
```bash
# 使用 SSD 並啟用 TRIM
sudo fstrim -av
# 調整 I/O 排程器
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler
```
3. **網路優化**
```bash
# 調整 TCP 參數
sudo tee -a /etc/sysctl.conf << 'EOF'
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
EOF
```
## 使用 Amazon Q CLI 自動化部署
### 多用戶環境自動化 Prompt 範本
您可以使用以下 prompt 來請求 Amazon Q CLI 協助自動化部署:
```
請幫我建立一個自動化腳本來部署支援 20 人同時使用的 VS Code Remote SSH 環境到 Ubuntu VM,需求如下:
1. 目標環境:Ubuntu 22.04 LTS Server VM
2. VM 規格:16-20 核心 CPU,64-80GB RAM,500GB SSD
3. 批量建立受限制用戶:user01-user20
4. 系統優化:
- 支援高並發 SSH 連線 (MaxSessions 50)
- 記憶體和 CPU 調優
- 網路參數優化
- 設定 Fail2Ban 防護
5. 安全限制:
- 使用 ACL 和群組權限管理
- 限制用戶只能存取自己的家目錄
- 禁止存取敏感系統文件
- 設定資源使用限制
6. 批量安裝軟體:
- Amazon Q CLI (所有用戶)
- VS Code Server 預安裝 (所有用戶)
- 必要的開發工具
7. 監控和維護:
- 系統資源監控腳本
- 自動化維護任務
- 用戶管理工具
- 效能測試工具
請提供完整的 bash 腳本,包含:
- 錯誤處理和回滾機制
- 進度顯示和日誌記錄
- 冪等性設計(可重複執行)
- 效能基準測試
- 安全驗證測試
額外需求:
- 支援自定義用戶數量和命名規則
- 提供資源使用量預估
- 包含災難恢復計劃
- 支援批量用戶管理操作
```
### 進階多用戶管理 Prompt
```
基於上述的多用戶 VS Code Remote SSH 環境,請幫我建立一個企業級的管理系統:
1. 用戶生命週期管理:
- 批量用戶建立/刪除/暫停
- 用戶權限動態調整
- 用戶活動監控和審計
- 自動清理非活躍用戶
2. 資源管理和調度:
- 動態資源分配
- 負載平衡和限流
- 自動擴展機制
- 資源使用報告
3. 安全和合規:
- 多層安全防護
- 存取日誌和審計
- 合規性檢查
- 安全事件響應
4. 監控和告警:
- 實時系統監控
- 效能指標收集
- 自動告警機制
- 容量規劃建議
5. 自動化運維:
- CI/CD 整合
- 配置管理 (Ansible/Terraform)
- 備份和恢復自動化
- 版本更新管理
6. 用戶體驗優化:
- 連接品質監控
- 效能調優建議
- 故障自動診斷
- 用戶支援工具
請提供完整的實作方案,包含:
- 架構設計文件
- 所有必要的腳本和配置
- 部署和維護手冊
- 監控儀表板設計
- 災難恢復程序
```
### 客製化大規模部署 Prompt
```
我需要為我的組織部署一個大規模的 VS Code Remote SSH 環境:
環境需求:
- 用戶數量:[50-100 人]
- VM 規格:[指定具體需求]
- 網路環境:[內網/混合雲/多地點]
- 安全要求:[企業安全政策]
- 合規需求:[GDPR/SOX/其他]
- 整合需求:[LDAP/AD/SSO]
技術需求:
- 高可用性設計
- 負載均衡和故障轉移
- 資料備份和災難恢復
- 監控和日誌管理
- 自動化部署和更新
請幫我:
1. 設計可擴展的架構方案
2. 建立完整的部署自動化
3. 提供運維管理工具
4. 建立監控和告警系統
5. 制定安全和合規策略
6. 提供成本優化建議
7. 建立用戶培訓材料
請考慮:
- 多租戶隔離
- 效能和可擴展性
- 安全和合規
- 運維複雜度
- 總體擁有成本 (TCO)
```
### 故障排除自動化 Prompt
```
請幫我建立一個智能的故障排除系統,用於多用戶 VS Code Remote SSH 環境:
1. 自動診斷系統:
- 連接問題診斷
- 效能問題分析
- 權限問題檢測
- 資源不足預警
2. 自動修復機制:
- 常見問題自動修復
- 服務自動重啟
- 權限自動修復
- 資源自動清理
3. 監控和告警:
- 實時健康檢查
- 異常行為檢測
- 預測性維護
- 智能告警過濾
4. 用戶支援工具:
- 自助診斷工具
- 問題報告系統
- 解決方案知識庫
- 用戶指導系統
5. 運維工具:
- 批量操作工具
- 配置驗證工具
- 效能調優建議
- 容量規劃工具
請提供:
- 完整的診斷腳本
- 自動修復程序
- 監控配置
- 告警規則
- 用戶支援工具
- 運維手冊
```
---
**重要提醒:**
### 資源規劃建議
- **20 人同時使用**:建議 VM 規格為 16-20 核心 CPU,64-80GB RAM,500GB SSD
- **網路頻寬**:建議至少 100Mbps 上行頻寬
- **監控**:定期使用 `/usr/local/bin/monitor-system.sh` 監控系統狀態
- **維護**:每日執行 `/usr/local/bin/daily-maintenance.sh` 進行系統維護
### 擴展性考量
- 如需支援更多用戶,可考慮使用多台 VM 進行負載分散
- 建議建立用戶使用量監控,以便及時調整資源配置
- 定期備份用戶資料和系統配置
### 安全注意事項
- 定期更新系統和軟體套件
- 監控用戶活動和系統日誌
- 定期檢查和更新安全設定
- 遵循組織的安全政策和合規要求
---
## 附錄 A: SSH 帳號密碼認證修改指南
### 概述
本附錄說明如何將現有的 SSH 金鑰認證方式改為帳號密碼認證方式,以便在 VS Code Remote SSH 中使用。
### 需要修改的章節
#### A.1 步驟 2.3 - SSH 服務設定修改
**原始設定**:
```bash
# 編輯 SSH 設定
sudo tee -a /etc/ssh/sshd_config << 'EOF'
# 多用戶連線優化
MaxAuthTries 6
MaxSessions 50
MaxStartups 30:30:100
ClientAliveInterval 300
ClientAliveCountMax 2
# 安全設定
PermitRootLogin no
PasswordAuthentication no # ← 需要修改
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
EOF
```
**修改為密碼認證**:
```bash
# 編輯 SSH 設定
sudo tee -a /etc/ssh/sshd_config << 'EOF'
# 多用戶連線優化
MaxAuthTries 6
MaxSessions 50
MaxStartups 30:30:100
ClientAliveInterval 300
ClientAliveCountMax 2
# 安全設定
PermitRootLogin no
PasswordAuthentication yes # ← 啟用密碼認證
PubkeyAuthentication yes # ← 可以同時保留金鑰認證
AuthorizedKeysFile .ssh/authorized_keys
# 密碼認證額外安全設定
MaxAuthTries 3 # 限制密碼嘗試次數
LoginGraceTime 60 # 登入超時時間
EOF
sudo systemctl restart ssh
```
#### A.2 步驟 3.2 - 用戶建立和密碼設定
**原始腳本修改**:
在 `create-vscode-user.sh` 腳本中添加密碼設定:
```bash
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage: $0 <username> <password>"
exit 1
fi
USERNAME=$1
PASSWORD=$2
# 建立用戶並設定密碼
sudo useradd -m -s /bin/bash $USERNAME
echo "$USERNAME:$PASSWORD" | sudo chpasswd
echo "User $USERNAME created with password"
# 建立 SSH 目錄(保留原有設定)
sudo mkdir -p /home/$USERNAME/.ssh
sudo chmod 700 /home/$USERNAME/.ssh
sudo chown $USERNAME:$USERNAME /home/$USERNAME/.ssh
# 其餘設定保持不變...
```
**批量建立用戶範例**:
```bash
# 建立 20 個用戶並設定密碼
for i in $(seq -w 1 20); do
# 可以使用統一密碼或個別密碼
PASSWORD="User${i}@2024" # 或使用更安全的密碼生成
/usr/local/bin/create-vscode-user.sh user$i $PASSWORD
echo "user$i password: $PASSWORD" >> /tmp/user_passwords.txt
done
# 安全地分發密碼給用戶
sudo chmod 600 /tmp/user_passwords.txt
```
#### A.3 步驟 3.3 - 移除 SSH 金鑰設定
**原始章節**:
```bash
### 3.3 批量設定 SSH 金鑰認證
# 在本機生成主要金鑰對
ssh-keygen -t rsa -b 4096 -f ~/.ssh/vm-users-key
# 為每個用戶設定公鑰 (在 VM 上執行)
PUBLIC_KEY="ssh-rsa AAAAB3NzaC1yc2EAAAA... your-public-key-here"
for i in $(seq -w 1 20); do
echo "$PUBLIC_KEY" | sudo tee /home/user$i/.ssh/authorized_keys
sudo chown user$i:user$i /home/user$i/.ssh/authorized_keys
sudo chmod 600 /home/user$i/.ssh/authorized_keys
done
```
**修改為**:
```bash
### 3.3 用戶密碼管理
# 建立密碼管理腳本
sudo tee /usr/local/bin/manage-user-passwords.sh << 'EOF'
#!/bin/bash
case "$1" in
"generate")
# 為所有用戶生成隨機密碼
for user in $(ls /home | grep "^user[0-9]"); do
PASSWORD=$(openssl rand -base64 12)
echo "$user:$PASSWORD" | sudo chpasswd
echo "$user:$PASSWORD" >> /tmp/new_passwords.txt
done
echo "Passwords generated and saved to /tmp/new_passwords.txt"
;;
"change")
if [ -z "$2" ] || [ -z "$3" ]; then
echo "Usage: $0 change <username> <new_password>"
exit 1
fi
echo "$2:$3" | sudo chpasswd
echo "Password changed for user $2"
;;
*)
echo "Usage: $0 {generate|change} [username] [password]"
exit 1
;;
esac
EOF
sudo chmod +x /usr/local/bin/manage-user-passwords.sh
```
#### A.4 步驟 7.1 - 本機 SSH 設定修改
**原始設定**:
```bash
# Ubuntu VM 多用戶設定
Host ubuntu-vm-user01
HostName 192.168.1.100
User user01
IdentityFile ~/.ssh/vm-users-key # ← 移除此行
StrictHostKeyChecking no
ServerAliveInterval 60
ServerAliveCountMax 3
```
**修改為密碼認證**:
```bash
# Ubuntu VM 多用戶設定 (密碼認證)
Host ubuntu-vm-user01
HostName 192.168.1.100
User user01
PreferredAuthentications password
StrictHostKeyChecking no
ServerAliveInterval 60
ServerAliveCountMax 3
Host ubuntu-vm-user02
HostName 192.168.1.100
User user02
PreferredAuthentications password
StrictHostKeyChecking no
ServerAliveInterval 60
ServerAliveCountMax 3
# 通配符設定
Host ubuntu-vm-user*
HostName 192.168.1.100
PreferredAuthentications password
StrictHostKeyChecking no
ServerAliveInterval 60
ServerAliveCountMax 3
```
### A.5 VS Code Remote SSH 密碼認證設定
#### A.5.1 VS Code 設定檔修改
在 VS Code 的設定中,需要確保支援密碼認證:
**方法 1:VS Code 設定檔**
```json
{
"remote.SSH.showLoginTerminal": true,
"remote.SSH.useLocalServer": false,
"remote.SSH.remotePlatform": {
"ubuntu-vm-user01": "linux",
"ubuntu-vm-user02": "linux"
}
}
```
**方法 2:命令面板設定**
1. 在 VS Code 中按 `Cmd+Shift+P` (macOS) 或 `Ctrl+Shift+P` (Windows/Linux)
2. 輸入 "Remote-SSH: Connect to Host"
3. 選擇主機後,VS Code 會提示輸入密碼
4. 輸入對應用戶的密碼
#### A.5.2 連接流程
使用密碼認證時的連接流程:
1. **選擇主機**:在 VS Code 中選擇 "ubuntu-vm-user01"
2. **輸入密碼**:VS Code 會彈出密碼輸入框
3. **建立連接**:輸入正確密碼後建立 SSH 連接
4. **啟動 VS Code Server**:自動啟動遠端 VS Code Server
### A.6 安全考量和最佳實踐
#### A.6.1 密碼安全策略
```bash
# 設定密碼複雜度要求
sudo tee -a /etc/security/pwquality.conf << 'EOF'
# 密碼最小長度
minlen = 12
# 至少包含一個數字
dcredit = -1
# 至少包含一個大寫字母
ucredit = -1
# 至少包含一個小寫字母
lcredit = -1
# 至少包含一個特殊字符
ocredit = -1
EOF
```
#### A.6.2 強化 Fail2Ban 設定
```bash
# 針對密碼認證加強 Fail2Ban 設定
sudo tee /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 降低重試次數
bantime = 1800 # 增加封鎖時間
findtime = 300 # 檢測時間窗口
EOF
sudo systemctl restart fail2ban
```
#### A.6.3 定期密碼更新
```bash
# 建立定期密碼更新腳本
sudo tee /usr/local/bin/rotate-passwords.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/password-rotation.log"
echo "$(date): Starting password rotation" >> $LOG_FILE
# 為所有用戶生成新密碼
for user in $(ls /home | grep "^user[0-9]"); do
NEW_PASSWORD=$(openssl rand -base64 16)
echo "$user:$NEW_PASSWORD" | sudo chpasswd
echo "$user:$NEW_PASSWORD" >> /tmp/rotated_passwords_$(date +%Y%m%d).txt
echo "$(date): Password rotated for $user" >> $LOG_FILE
done
# 設定文件權限
chmod 600 /tmp/rotated_passwords_*.txt
echo "$(date): Password rotation completed" >> $LOG_FILE
EOF
sudo chmod +x /usr/local/bin/rotate-passwords.sh
# 設定每月自動輪換(可選)
echo "0 2 1 * * /usr/local/bin/rotate-passwords.sh" | sudo crontab -
```
### A.7 優缺點比較
#### 密碼認證的優點
- **設定簡單**:不需要管理 SSH 金鑰
- **用戶友善**:用戶只需記住密碼
- **快速部署**:批量建立用戶更容易
- **靈活管理**:可以隨時更改密碼
#### 密碼認證的缺點
- **安全性較低**:容易受到暴力破解攻擊
- **密碼管理**:需要安全地分發和管理密碼
- **網路風險**:密碼可能在網路傳輸中被截獲
- **合規問題**:某些企業政策可能不允許密碼認證
#### 建議的混合方案
```bash
# 同時啟用金鑰和密碼認證
PasswordAuthentication yes
PubkeyAuthentication yes
# 優先使用金鑰認證
AuthenticationMethods publickey,password
```
這樣用戶可以選擇使用金鑰或密碼,提供更大的靈活性。
### A.8 總結
將 SSH 金鑰認證改為密碼認證主要涉及:
1. **SSH 服務器設定**:啟用 `PasswordAuthentication`
2. **用戶管理**:為用戶設定密碼而非 SSH 金鑰
3. **本機 SSH 設定**:移除 `IdentityFile`,添加 `PreferredAuthentications password`
4. **VS Code 設定**:確保支援密碼輸入
5. **安全加固**:強化密碼政策和 Fail2Ban 設定
雖然密碼認證在管理上更簡單,但建議在生產環境中仍使用 SSH 金鑰認證以確保更高的安全性。