xhj018 xhj019

写在最前面:

论坛注册用户已经超过 6 万了,每天都有不少新面孔加入 NodeSeek。很多刚接触 VPS、独服、小鸡的朋友,第一步经常会卡在一些服务器的基础操作上:

  • SSH 密钥怎么生成?
  • GitHub 公钥怎么托管?
  • 新机器为什么禁用密码登录?
  • 新机器怎么禁用密码登录?
  • SSH 端口为什么要改?
  • GitHub OAuth 怎么配置?
  • 面板怎么部署到域名和 HTTPS?

其实这些操作本身不算复杂,很多命令复制粘贴就能搞定。但对第一次接触的新手来说,还是很容易出岔子,尤其是 SSH 配置这块,一旦配错就可能把自己锁在服务器外面。

所以我做了一个小项目:OU-SSH
image
它不打算做成一个厚重的运维平台,定位更偏向“服务器基础安全初始化教程 + 小工具面板”。希望新来的朋友能通过它快速搞懂、并完成服务器初始化里最基础、也最容易踩坑的那部分。
如果你是老 MJJ,也欢迎 fork 二创,改成自己顺手的工具箱,或者加入你需要的功能。

新手常见疑问

Q:为什么建议改掉默认的 22 端口?

A:SSH 默认端口是:22
这就意味着互联网上的扫描器、爆破工具、弱密码机器人,在你机器一开机就会第一时间来扫这个端口。
只要服务器公网开着 22 端口,日志里基本天天能看到各种陌生 IP 在试图登录:
root、admin、test、ubuntu、oracle
甚至会没完没了地尝试各种常见弱密码。
把 SSH 端口从 22 改成其他端口,比如 OU-SSH 默认推荐的:5522
但这不代表改了端口就“绝对安全”了。改端口本质上不算核心安全机制,只是能降低被无脑扫描和自动化爆破工具盯上的概率。
简单说:

  • 22 端口是最默认的靶子
  • 换个非默认端口能挡掉一大堆低级扫描和爆破日志
  • 真正的安全性还是得靠密钥登录、禁用密码登录、防火墙和系统更新
    所以改 SSH 端口不是拿来替代安全配置的,只是基础加固的一环。
Q:为什么建议禁用 root 的密码登录?

A:很多新手刚拿到服务器,服务商会直接给一个 root 密码,于是就直接:
ssh root@服务器IP
这样是挺方便,但安全隐患也比较明显。
密码登录本身就存在几个先天问题:

  1. 密码可能太弱
    比如生日、手机号、常见单词、默认密码,或者重复用过的旧密码。
  2. 密码可能泄露
    同一个密码在好几个地方用过,只要其中一个平台泄露,服务器也可能被拖库撞中。
  3. 密码可以被暴力尝试
    只要 SSH 还允许密码登录,攻击者就能没完没了地试各种用户名密码组合。
  4. root 是最高权限用户
    root 密码一旦被猜中,对方拿到手的就是整台服务器的最高权限。
    所以从安全角度讲,直接开放 root 密码登录不算是个好习惯。
    更推荐的做法是:

使用 SSH 密钥登录
禁用密码登录
必要时再限制 root 登录

Q:为什么说 SSH 密钥登录更安全?

A:SSH 密钥登录靠的是一对密钥:
私钥:保存在你自己的电脑上 公钥:放在服务器或 GitHub 上
登录的时候不用输密码,而是靠私钥做加密认证。
它的好处在于:

  • 私钥的长度和强度都比普通密码高得多
  • 没法靠猜密码暴力破解
  • 公钥可以随便公开,私钥不用上传到服务器
  • 不同设备可以生成各自不同的密钥
  • 某台设备丢了,单独移除对应的公钥就行

OU-SSH 到底是什么?

OU-SSH 是一个轻量的服务器节点管理面板,目前主要能干这几件事:

  1. 本地账号登录
  2. GitHub OAuth 登录 / 绑定
  3. Ed25519 SSH 密钥生成
  4. 密钥打包为 .zip 下载
  5. GitHub 用户名绑定
  6. 自动生成新机初始化脚本
  7. 修改目标机器 SSH 端口,默认 5522
  8. 禁用密码登录,启用公钥登录
  9. 禁用键盘交互密码登录
  10. 兼容 sshd_config.d /cloud-init 这类云服务器常见配置覆盖问题
  11. Docker Compose 一键部署
  12. 可选域名 HTTPS,Caddy 自动申请和续签证书
    项目定位很简单:

给新手 MJJ 一个尽量少踩坑的 SSH 初始化工具。


OU-SSH 默认使用的是 Ed25519 密钥,这是目前比较推荐的 SSH 密钥算法之一,速度快、安全性也很好。
需要注意的是:
私钥一定要自己保存好,不要上传到服务器,不要发给别人,不要提交到 GitHub。

一键安装

直接在服务器上执行:

bash <(curl -sL https://raw.githubusercontent.com/cshaizhihao/OU-SSH/main/install.sh)

安装脚本是中文交互式的,会问你有没有已经解析到本机的域名。
没有域名的话,可以直接用:

http://服务器IP:8080

要是有域名并且已经解析到这台服务器,可以在安装过程中直接启用 HTTPS,Caddy 会自动签发并续期证书。
默认的账号密码是:

账号:admin
密码:admin

首次登录会强制进入安全设置,建议第一时间改掉默认账号密码。

一键卸载与升级

安装完成后,脚本会自动生成一个面板指令 ou,输入这个指令就能一键升级、一键卸载。
后面会陆续加上:开荒指令(TCP 调优、时间校准、CF DDNS)、一键优化这些功能。

新手手把手上手流程

0. Cloudflare DNS 解析

先买一个自己喜欢的域名,在 CF 里给这个应用加一条 DNS 记录
image
关闭小黄云
image
PS:这一步不是必须的,但建议顺手配一下,反正后面迟早会用到。

1. 在服务器中安装

SSH 登录之后,在服务器上直接执行:

bash <(curl -sL https://raw.githubusercontent.com/cshaizhihao/OU-SSH/main/install.sh)

脚本会自动进行系统依赖安装、docker 安装以及本应用的安装
image
在这里,如果你已经添加过 DNS 解析,请输入 Y,没有则输入 N
image
输入刚才在 CF 里解析好的域名。
再输入一个证书邮箱,脚本就会自动完成安装并启动服务。
最后会生成类似下面的信息:
image

2. 登录面板

安装完成后打开面板地址,用默认账号登录:

admin / admin

首次登录会强制要求改账号密码。
image

3. 生成 SSH 密钥

image

image

进入「密钥生成器」,点一下生成。
面板会在后端生成 Ed25519 密钥对,打包成 .zip 给你下载。
压缩包里一般会有:

id_ed25519
id_ed25519.pub

image

私钥自己收好,不要传到服务器、GitHub 或任何别的地方。

4. 把公钥添加到 GitHub

.pub 公钥的内容加到 GitHub 的 SSH Keys 里。
去 GitHub 设置页面,或者直接点图里的链接跳转过去:
https://github.com/settings/keys
image
image
保存一下就行。

5. 输入 GitHub 用户名

在面板里填上你的 GitHub 用户名,比如:

cshaizhihao

面板会自动生成这样一个地址:

https://github.com/cshaizhihao.keys

之后新开的机器就能直接拉取你的 GitHub 公钥了。

image

6. 复制新机初始化脚本

进入「新机初始化指令」,可以设置 SSH 端口,默认用的是:

5522

把脚本复制到新服务器上,用 root 权限执行。
脚本会自动完成这些事:

  • 创建 ~/.ssh
  • 从 GitHub 拉取你的公钥
  • 写入 authorized_keys
  • 修改 SSH 端口
  • 禁用密码登录
  • 禁用键盘交互密码登录
  • 启用公钥登录
  • 兼容 sshd_config.d
  • 兼容 cloud-init 覆盖 SSH 配置的情况
  • 重启 SSH 服务

新手推荐的 SSH 安全配置组合

对大部分新手 MJJ 来说,基础配置先做到这几步就够了:

1. 修改 SSH 默认 22 端口
2. 使用 SSH 密钥登录
3. 禁用密码登录
4. 禁用键盘交互密码登录
5. 保持一个旧 SSH 窗口,确认新配置可登录后再关闭

OU-SSH 生成的新机初始化脚本,就是围着这几个目标做的。
它不是要把服务器变得“绝对安全”,而是帮新手先绕开最常见的那几个坑:

默认 22 端口暴露
root 密码被爆破
密码登录没有禁用干净
cloud-init 覆盖 sshd 配置
改完 SSH 后把自己锁外面

把这几个坑填上,服务器的基础安全性就会比刚到手时好不少。

重要提示

跑新机初始化脚本之前,一定要保持当前 SSH 窗口别关。
因为一旦禁用了密码登录,要是公钥没配置成功,你就可能把自己关在服务器外面进不去了。
推荐这样操作:

  1. 保持旧 SSH 窗口不关闭
  2. 执行初始化脚本
  3. 新开一个 SSH 窗口
  4. 使用新端口和密钥测试登录
  5. 确认能登录后,再关闭旧窗口
    测试命令类似:
ssh -p 5522 root@你的服务器IP

如果你想确认密码登录是否真的禁用了,可以测试:

ssh -p 5522 -o PubkeyAuthentication=no -o PreferredAuthentications=password root@你的服务器IP

正常情况下这时候应该已经没法用密码登录了。

Q:为什么有些机器明明禁用了密码,还是能用密码登录?

A:这个坑我自己测试时也踩过。
很多云服务器读取的配置并不只是:

/etc/ssh/sshd_config

它还会读:

/etc/ssh/sshd_config.d/*.conf

比如 cloud-init 可能会写一个配置文件进去,里面依然保留着:

PasswordAuthentication yes

另外,有些系统就算设置了:

PasswordAuthentication no

但只要 KbdInteractiveAuthentication 还开着,照样能通过键盘交互的方式输密码登录。
所以新版脚本会把这几种情况一起处理掉,写进优先级更高的配置里。


关于 GitHub OAuth

面板也支持用 GitHub OAuth 登录和绑定账号。
不过这不是必须配置的,新手先用本地账号就够了。
要是想配置 GitHub OAuth,登录后进「安全设定」,面板里会给出 OAuth App 的创建入口和 Callback URL。


这个项目适合谁用?

比较推荐:

  • 刚开始玩 VPS 的新手
  • 不熟悉 SSH 密钥登录的朋友
  • 想把 GitHub 公钥作为统一入口的人
  • 想快速初始化新服务器的人
  • 想做二创工具箱的老 MJJ
    不太适合:
  • 想要完整堡垒机的人
  • 想要多用户权限系统的人
  • 想要重型 CMDB / 运维平台的人
    OU-SSH 目前定位就是一个简单、轻量、偏教学和初始化 的小面板。

开源仓库

GitHub 地址:
https://github.com/cshaizhihao/OU-SSH
欢迎点个 Star,也欢迎 fork 之后自己二次创作。
如果你是新手,希望这个项目能让你少踩点 SSH 初始化的坑。
如果你是老 MJJ,也欢迎提 issue、发 PR,或者直接改成自己顺手的版本。