AZWALUWU/p04-ssh-hardening
GitHub: AZWALUWU/p04-ssh-hardening
该项目提供基于堡垒主机模式的企业级 SSH 加固方案,通过密钥认证、防火墙策略、入侵防御和加密隧道实现零信任网络边界。
Stars: 0 | Forks: 0

# SSH 加固与堡垒主机模式(项目 0.4)
本仓库包含完整的文档、配置矩阵以及自动化脚本,用于通过**堡垒主机模式**构建安全的企业级边界防御网络。
该实现缓解了凭证猜测威胁,隔离了敏感的私有工作负载,并采用现代密码学实践建立了统一的访问控制。
## 🏗️ 架构与网络拓扑
本项目实现了经典的边界网络分段模式:
* **本地客户端**:作为管理员工作站,承载主要的非对称加密身份密钥。
* **堡垒主机**:唯一面向公众的互联网网关。它经过了高度加固和监控,并充当安全入口点。
* **私有服务器**:模拟隔离的后端网络区域。它配置在 Host-Only 适配器上,**没有直接的互联网访问权限**,只能通过堡垒主机路由的加密反向隧道访问。
```
+------------------------+ Internet +------------------------------+
| Local Client Machine | ---------------------------------------------> | GCP Bastion Host |
| (Windows PowerShell) | <--------------------------------------------- | (Public IP: 34.70.245.255) |
+------------------------+ SSH Remote Tunnel +------------------------------+
| |
| Host-Only Subnet | Reverse Port Mapping
v v
+------------------------+ |
| VirtualBox VM | <-------------------------------------------------------------+
| (IP: 192.168.56.101) | localhost:2222 -> Port 22
+------------------------+
```
## 🔒 加固与实施步骤
### 阶段 1:加密身份设置
安全身份验证始于使用高熵非对称加密密钥取代传统的基于密码的身份验证。
1. 在本地 Windows 客户端机器上**生成 Ed25519 密钥对**:
```
ssh-keygen -t ed25519 -b 4096 -C "tugas-bastion-key" -f ~/.ssh/id_ed25519
```
2. **密钥对分发**:
* `id_ed25519.pub`(公钥)将被追加到 GCP 堡垒主机和 VirtualBox 私有服务器的 `/etc/ssh/authorized_keys` 中。
* `id_ed25519`(私钥)严格保留在客户端机器上。
### 阶段 2:边界网关 SSH 加固
更新 GCP 堡垒主机上 SSH Daemon (`sshd`) 的默认配置,以最小化其攻击面。
1. **备份原始 daemon 配置文件**:
```
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
```
2. 修改 `/etc/ssh/sshd_config` 中的参数以严格执行零信任:
```
# 强制使用非对称密钥对并完全禁用密码
PasswordAuthentication no
PubkeyAuthentication yes
# 阻止 root exploit vectors
PermitRootLogin no
# 通过显式地将授权的 administrative users 加入白名单来限制暴露
AllowUsers tugas-bastion-host
# 在多次 authentication 失败后主动断开 TCP 连接
MaxAuthTries 3
```
3. **验证配置语法**并重新加载服务 daemon:
```
sudo sshd -t
sudo systemctl restart ssh
```
### 阶段 3:边界防火墙 (UFW) 与主动入侵防御
通过集成本地系统防火墙和解析日志的主动防御工具,引入了分层安全框架。
1. **限制系统防火墙配置**:
```
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
echo "y" | sudo ufw enable
```
2. **部署自动暴力破解封禁**:
创建自定义的 jail 配置文件:
```
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
```
配置特定的 `[sshd]` 部分,以主动跟踪登录日志 (`/var/log/auth.log`) 并临时封禁可疑的源 IP:
```
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
findtime = 10m
bantime = 1h
```
3. **激活并验证运行状态**:
```
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
```
### 阶段 4:构建加密代理跳板隧道
由于后端私有服务器位于离线的本地 Host-Only 接口之后,我们使用 SSH 远程端口转发建立安全的反向代理隧道。
1. 在 Windows (`C:\Users\aza\.ssh\config`) 中**配置本地客户端路由文件**:
```
Host bastion
HostName 34.70.245.255
User tugas-bastion-host
IdentityFile ~/.ssh/id_ed25519
RemoteForward 2222 192.168.56.101:22
```
2. 从本地 Windows 终端**开启安全隧道连接**:
```
ssh bastion
```
*(保持此终端会话运行以维持安全桥接连接。)*
3. 从堡垒主机终端**安全地访问私有服务器**:
```
ssh aza@localhost -p 2222
```
## 🚀 自动化部署脚本
为了使该架构具有可扩展性并且易于在新服务器上重复实施,整个边界加固协议被编译成一个单独的 Bash 脚本:`hardening-script.sh`。
```
#!/bin/bash
# ====================================================================
# PROJECT 0.5: AUTOMATED SSH HARDENING, UFW & FAIL2BAN PROVISIONER
# ====================================================================
# 强制使用 administrative privileges 执行脚本
if [ "$EUID" -ne 0 ]; then
echo "[-] Critical Error: This runtime instance requires root or escalated privileges."
exit 1
fi
echo "[+] Step 1/4: Syncing Package Indexes and Installing System Dependencies..."
apt update && apt upgrade -y
apt install fail2ban ufw -y
echo "[+] Step 2/4: Applying Asymmetric SSH Daemon Hardening Protocols..."
SSH_CONF="/etc/ssh/sshd_config"
BACKUP_SSH="/etc/ssh/sshd_config.bak_$(date +%F_%T)"
cp "$SSH_CONF" "$BACKUP_SSH"
echo "[*] System configuration backup preserved at: $BACKUP_SSH"
# 通过 Stream Editors (sed) 安全地修改目标参数
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' "$SSH_CONF"
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' "$SSH_CONF"
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/g' "$SSH_CONF"
sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' "$SSH_CONF"
# 如果完全缺失,则干净地追加安全边界
if ! grep -q "MaxAuthTries" "$SSH_CONF"; then
echo "MaxAuthTries 3" >> "$SSH_CONF"
fi
# 在提交 service reload 之前对配置语法进行 dry-run 验证
sshd -t
if [ $? -eq 0 ]; then
systemctl restart ssh
echo "[+] System SSH engine parameters hardened and reloaded successfully."
else
echo "[-] Configuration syntax errors detected. Initiating immediate recovery roll-back..."
cp "$BACKUP_SSH" "$SSH_CONF"
systemctl restart ssh
fi
echo "[+] Step 3/4: Enforcing Inbound Firewall Policies (UFW)..."
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
echo "y" | ufw enable
ufw status verbose
echo "[+] Step 4/4: Constructing Active IDS Log-Scanning Architecture (Fail2Ban)..."
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 通过 end-of-text redirection 安全地注入独立的 sshd 配置块
cat <> /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
maxretry = 3
findtime = 10m
bantime = 1h
EOT
systemctl restart fail2ban
systemctl enable fail2ban
echo "===================================================================="
echo "[SUCCESS] PERIMETER HARDENING PROCEDURES COMPLETED SECURELY!"
echo "===================================================================="
```
## 📊 验证矩阵
使用此清单确认所有安全控制措施均正常运行:
| 验证指标 | 目标验证参数 | 预期行为 / 证明 | 状态 |
| --- | --- | --- | --- |
| **密码验证锁定** | `ssh -o PubkeyAuthentication=no tugas-bastion-host@34.70.245.255` | 立即返回 `Permission denied (publickey)`。 | ✅ 通过 |
| **Root 访问拒绝** | `ssh root@34.70.245.255` | 被身份验证提供程序明确拒绝。 | ✅ 通过 |
| **防火墙隔离** | `sudo ufw status verbose` | 返回 `Default: deny (incoming)` 且仅允许 Port 22。 | ✅ 通过 |
| **主动入侵检测** | `sudo fail2ban-client status sshd` | 主动解析 `/var/log/auth.log` 文件路径。 | ✅ 通过 |
| **安全代理访问** | `ssh aza@localhost -p 2222` | 成功从云端连接到隔离的后端。 | ✅ 通过 |
标签:GCP, SSH加固, 内存分配, 堡垒机, 子域名枚举, 应用安全, 系统安全, 网络架构, 运维