引子

已经用了很多年的 Debian,持续不断地 root 裸奔。从只会改 SSH 端口,到使用密钥登录,今天开始我要切换到非 root 用户来使用了。于是写了一个初始化脚本,帮助自己快速完成 VPS 的安全加固。

功能

这个脚本帮助自己一键完成:

  • 创建普通用户 - 自动加入 sudo 组,免密执行管理员命令
  • 生成 SSH 密钥对 - Ed25519 算法,安全且现代
  • 加固 SSH 配置 - 禁用 root 登录、禁用密码登录、修改默认端口
  • 配置防火墙 - UFW 仅开放 SSH 端口
  • 安装 fail2ban - 自动封禁暴力破解尝试
  • 自动获取 IP - 无需手动输入,智能识别服务器地址

用法

一键执行

1
curl -fsSL http://cdn.imhcg.cn/linux/shell/init.sh | bash -s -- --user 普通用户名

先下载再执行

1
2
curl -fsSL http://cdn.imhcg.cn/linux/shell/init.sh -o init.sh
bash init.sh --user 普通用户名

使用流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 以 root 登录新服务器
ssh root@your-server-ip

# 执行脚本
curl -fsSL http://cdn.imhcg.cn/linux/shell/init.sh | bash -s -- --user 普通用户名

# 按提示操作:
# 1. 输入主机名(默认当前主机名)
# 2. 确认服务器 IP(自动检测)
# 3. 用户已存在时确认是否轮换密钥

# 脚本执行完成后,会输出:
# - 私钥保存命令(macOS/Linux/Windows)
# - SSH 配置一键命令
# - 手动配置指南

本地配置

脚本执行完成后,复制对应系统的一键命令在本地执行:

macOS / Linux

1
2
3
4
5
6
7
8
9
# 一键保存私钥并配置 SSH
echo 'LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZ...' | base64 -d > ~/.ssh/my-vps && chmod 600 ~/.ssh/my-vps && cat >> ~/.ssh/config << 'EOF'
Host my-vps
HostName 192.168.1.100
Port 10010
User 普通用户名
IdentityFile ~/.ssh/my-vps
IdentitiesOnly yes
EOF

Windows PowerShell

1
2
3
4
5
6
7
8
[System.IO.File]::WriteAllBytes("$env:USERPROFILE/.ssh/my-vps", [System.Convert]::FromBase64String("LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZ...")); Add-Content -Path $env:USERPROFILE/.ssh/config -Value @'
Host my-vps
HostName 192.168.1.100
Port 10010
User 普通用户名
IdentityFile ~/.ssh/my-vps
IdentitiesOnly yes
'@

连接服务器

配置完成后,直接使用:

1
ssh my-vps

无需记住 IP、端口、用户名,一切都已经配置好了。

安全设计

为什么这样设计?

设计 理由
禁用 root 登录 减少攻击目标
禁用密码登录 防止暴力破解
仅密钥登录 强度远高于密码
修改默认端口 减少扫描骚扰
sudo 免密 方便管理,但前提是已获得私钥
删除服务器私钥 私钥只存在于本地,服务器不留痕

与直接使用 root 的区别

  • 身份隔离 - 日常操作普通权限,需要时才 sudo
  • 审计日志 - sudo 操作有记录,便于追踪
  • 误操作缓冲 - 需要显式 sudo,避免手滑
  • 攻击链更长 - 获取私钥 → 登录 → sudo,多一道防线

技术细节

依赖处理

脚本会自动检测并安装缺失的依赖:

  • iproute2 - 获取服务器 IP
  • sudo - 权限管理
  • openssl - 生成随机密码
  • ufw - 防火墙
  • fail2ban - 防暴力破解

密钥轮换

如果用户已存在,脚本支持密钥轮换:

1
2
3
bash init.sh --user 普通用户名
# 提示:用户 普通用户名 已存在,轮换密钥
# 继续? [y/N]: y

旧密钥自动备份,新密钥立即生效。

兼容性

  • 目标系统: Debian 12(主要),兼容 11/13
  • 其他系统: 会提示确认,可能不兼容

源码

1
2
3
4
5
#!/bin/bash
# VPS 安全加固脚本 - Debian 12
# 用法: bash init.sh --user <username>

# ... 完整源码略,见 http://cdn.imhcg.cn/linux/shell/init.sh

完整源码托管在:http://cdn.imhcg.cn/linux/shell/init.sh

最后

这个脚本帮我从 root 裸奔进化到安全的密钥登录 + 普通用户管理。Debian 用了这么多年,终于开始重视安全了 😅