DsureD/ssh-safekit
GitHub: DsureD/ssh-safekit
Stars: 0 | Forks: 0
# ssh-safekit
[](LICENSE)
Linux 服务器 SSH 安全一键加固脚本。交互式菜单操作,广泛兼容主流 Linux 发行版。
## 功能
- **SSH 配置管理** — Root 登录策略、密码认证开关、端口修改(自定义/随机高位端口)、认证限制、空闲超时、root 密码管理
- **SSH 密钥管理** — 服务器端生成密钥对(ed25519/RSA 4096)、导入已有公钥
- **Fail2ban** — 一键安装、配置 SSH 防暴力破解规则、解封 IP
- **防火墙** — 自适应 ufw(Debian 系)/ firewalld(RHEL 系)/ iptables(Alpine/Arch 等),IPv4+IPv6 双栈
- **一键推荐加固** — 7 步引导式加固流程,每步可跳过
- **安全状态总览** — 一键查看 SSH、防火墙、Fail2ban、监听端口等状态
- **配置还原** — 从自动备份中恢复 SSH 配置
- **CLI 参数** — 支持 `--status`、`--quick` 等非交互模式
- **广泛兼容** — 基于能力检测,自动适配不同发行版的包管理器、防火墙和 init 系统
## 新特性 (v1.2.0)
- ✨ **基于能力检测的系统识别** — 不再依赖硬编码的发行版列表,自动识别包管理器和工具
- ✨ **Alpine Linux 完整支持** — 支持 apk 包管理器、OpenRC init 系统和 iptables 防火墙
- ✨ **Arch Linux 支持** — 支持 pacman 包管理器
- ✨ **openSUSE 支持** — 支持 zypper 包管理器
- ✨ **多 init 系统支持** — 兼容 systemd、OpenRC 和 SysVinit
- ✨ **iptables 防火墙支持** — 适用于轻量级系统和容器环境
- ✨ **智能用户选择** — 在纯 root 环境下自动查找普通用户或使用 root
- 🔧 **统一服务管理** — 抽象层自动适配不同 init 系统的服务管理命令
## 菜单结构
ssh-safekit 主菜单
├── 1) SSH 配置管理
│ ├── 1) Root 登录设置 (yes / prohibit-password / no)
│ ├── 2) 密码认证开关 (启用 / 禁用,带公钥检查)
│ ├── 3) 修改 SSH 端口 (自定义 / 随机高位 / 恢复22)
│ ├── 4) 认证限制 (MaxAuthTries / LoginGraceTime)
│ ├── 5) 空闲超时 (ClientAliveInterval / ClientAliveCountMax)
│ ├── 6) 修改 root 密码 (passwd)
│ ├── 7) 锁定 root 密码 (passwd -l)
│ └── 0) 返回主菜单
├── 2) SSH 密钥管理
│ ├── 1) 生成新密钥对 (ed25519 / RSA 4096)
│ ├── 2) 导入已有公钥 (粘贴)
│ ├── 3) 查看当前 authorized_keys
│ └── 0) 返回主菜单
├── 3) Fail2ban 管理
│ ├── 1) 安装 Fail2ban
│ ├── 2) 配置 SSH 防护规则 (bantime / findtime / maxretry)
│ ├── 3) 查看状态
│ ├── 4) 解封 IP
│ └── 0) 返回主菜单
├── 4) 防火墙管理 (自适应 ufw / firewalld)
│ ├── 1) 放行端口 (TCP / UDP / TCP+UDP)
│ ├── 2) 关闭端口
│ ├── 3) 设置默认策略 (拒绝入站 / 允许所有)
│ ├── 4) 启用防火墙
│ ├── 5) 禁用防火墙
│ ├── 6) 查看状态
│ └── 0) 返回主菜单
├── 5) 一键推荐加固
│ ├── 步骤 1. 检测系统环境
│ ├── 步骤 2. SSH 端口设置 (保持 / 自定义 / 随机)
│ ├── 步骤 3. SSH 密钥配置 (生成 / 粘贴公钥)
│ ├── 步骤 4. 防火墙配置
│ ├── 步骤 5. 安装 Fail2ban
│ ├── 步骤 6. 禁用密码登录
│ └── 步骤 7. 限制 root 登录 + 锁定 root 密码
├── 6) 查看当前安全状态
│ ├── 系统信息
│ ├── SSH 配置 (含空闲超时)
│ ├── Root 密码状态
│ ├── 防火墙规则
│ ├── Fail2ban 状态
│ ├── 当前 SSH 会话
│ └── 监听端口
├── 7) 从备份还原 SSH 配置
└── 0) 退出
## 安全保护
- 禁用密码登录前强制检查 `authorized_keys` 是否有有效公钥,防止锁死
- 修改 SSH 端口前自动在防火墙放行新端口
- RHEL 系自动处理 SELinux 端口策略(`semanage port`),避免改端口后 sshd 启动失败
- 启用防火墙前强制放行当前 SSH 端口
- 所有 SSH 配置变更前 `sshd -t` 校验,失败自动回滚
- 仅使用 `systemctl reload`,不中断现有会话
- 每次修改前自动备份到带时间戳的文件,自动保留最近 20 份
- 自动适配 OpenSSH 版本,新版使用 `KbdInteractiveAuthentication`,旧版使用 `ChallengeResponseAuthentication`
- 日志文件超过 10MB 时自动轮转
## 快速开始
### GitHub下载并运行(推荐)
使用 `curl`:
curl -fsSL https://raw.githubusercontent.com/DsureD/ssh-safekit/main/ssh-safekit.sh -o ssh-safekit.sh && chmod +x ssh-safekit.sh && ./ssh-safekit.sh
使用 `wget`:
wget -qO ssh-safekit.sh https://raw.githubusercontent.com/DsureD/ssh-safekit/main/ssh-safekit.sh && chmod +x ssh-safekit.sh && ./ssh-safekit.sh
### 一键脚本(直接运行)
bash <(curl -fsSL https://raw.githubusercontent.com/DsureD/ssh-safekit/main/ssh-safekit.sh)
### 手动安装
git clone https://github.com/DsureD/ssh-safekit.git
cd ssh-safekit
chmod +x ssh-safekit.sh
sudo ./ssh-safekit.sh
## 自定义日志路径
默认日志写入 `/var/log/ssh-safekit.log`,可通过环境变量覆盖:
sudo SSH_SAFEKIT_LOG=/var/log/my-ssh-audit.log ./ssh-safekit.sh
## CLI 参数
除交互式菜单外,还支持以下命令行参数:
sudo ./ssh-safekit.sh --help # 显示帮助
sudo ./ssh-safekit.sh --version # 显示版本号
sudo ./ssh-safekit.sh --status # 非交互式查看安全状态
sudo ./ssh-safekit.sh --quick # 直接进入一键加固流程
## 系统要求
**支持的发行版:**
脚本采用**基于能力检测**的设计,自动识别包管理器、防火墙工具和 init 系统,理论上支持所有主流 Linux 发行版:
| 发行版系列 | 包管理器 | 防火墙 | Init 系统 | 测试状态 |
|-----------|---------|--------|----------|---------|
| **Debian/Ubuntu** | apt | ufw | systemd | ✅ 完全支持 |
| Debian 10+ | apt | ufw | systemd | ✅ 完全支持 |
| Ubuntu 18.04+ | apt | ufw | systemd | ✅ 完全支持 |
| Linux Mint | apt | ufw | systemd | ✅ 完全支持 |
| **RHEL/CentOS** | dnf/yum | firewalld | systemd | ✅ 完全支持 |
| CentOS 7+ | yum | firewalld | systemd | ✅ 完全支持 |
| Rocky Linux 8+ | dnf | firewalld | systemd | ✅ 完全支持 |
| AlmaLinux 8+ | dnf | firewalld | systemd | ✅ 完全支持 |
| Fedora 33+ | dnf | firewalld | systemd | ✅ 完全支持 |
| **云厂商定制版** | dnf/yum | firewalld | systemd | ✅ 完全支持 |
| Alibaba Cloud Linux 2+ | yum | firewalld | systemd | ✅ 完全支持 |
| Amazon Linux 2+ | yum | firewalld | systemd | ✅ 完全支持 |
| TencentOS Server 2+ | yum | firewalld | systemd | ✅ 完全支持 |
| openEuler 20.03+ | dnf | firewalld | systemd | ✅ 完全支持 |
| 龙蜥 OpenAnolis 8+ | dnf | firewalld | systemd | ✅ 完全支持 |
| **国产操作系统** | dnf/yum | firewalld | systemd | ✅ 完全支持 |
| 银河麒麟 Kylin V10 | yum | firewalld | systemd | ✅ 完全支持 |
| 统信 UOS 20+ | apt | ufw | systemd | ✅ 完全支持 |
| **Alpine Linux** | apk | iptables | openrc | ✅ 完全支持 |
| Alpine 3.x | apk | iptables | openrc | ✅ 完全支持 |
| **Arch Linux** | pacman | iptables | systemd | ✅ 理论支持 |
| Arch Linux | pacman | iptables | systemd | ⚠️ 未充分测试 |
| Manjaro | pacman | iptables | systemd | ⚠️ 未充分测试 |
| **openSUSE** | zypper | firewalld | systemd | ✅ 理论支持 |
| openSUSE Leap | zypper | firewalld | systemd | ⚠️ 未充分测试 |
| openSUSE Tumbleweed | zypper | firewalld | systemd | ⚠️ 未充分测试 |
**最低要求:**
- root 权限或 sudo
- bash 4.0+
- OpenSSH Server
**可选组件:**
- systemd / openrc / sysvinit(服务管理)
- ufw / firewalld / iptables(防火墙)
- fail2ban(防暴力破解)
## 使用建议
1. 首次运行建议先选菜单 `6) 查看当前安全状态`,了解服务器现状
2. 使用 `5) 一键推荐加固` 可快速完成全套加固
3. **操作全程不要关闭当前 SSH 会话**,新开一个终端验证连接成功后再退出
4. 如果改了端口,记得用新端口连接:`ssh -p <新端口> user@server`
5. **云服务器用户注意**:修改 SSH 端口后,除了本机防火墙,还需要在云厂商控制台的**安全组**中放行新端口(TCP),否则仍然无法连接
## 许可证
MIT