收紧SSH密码认证文档安全边界
This commit is contained in:
parent
90ad566357
commit
89b56745b0
@ -1,6 +1,6 @@
|
||||
# Scert 项目
|
||||
|
||||
Scert 是一个统一管理 SSL 证书、自动续期并部署到多台服务器的跨平台项目。
|
||||
Scert 是一个统一管理 SSL 证书、自动续期并通过密码 SSH 部署到多台服务器的跨平台项目。
|
||||
|
||||
## 正式交付范围
|
||||
|
||||
@ -26,7 +26,7 @@ Scert 是一个统一管理 SSL 证书、自动续期并部署到多台服务器
|
||||
|
||||
## 开发状态
|
||||
|
||||
当前已完成配置、日志、数据库迁移、域名与服务器管理、管理员认证、DNS API 在线测试、lego DNS-01、证书申请与导入、自动续期、SSH 部署、通知、设置接口和 Web 管理页面;真实 DNS、ACME、远程服务器及平台安装验收仍需在授权环境完成。
|
||||
当前已完成配置、日志、数据库迁移、域名与服务器管理、管理员认证、DNS API 在线测试、lego DNS-01、证书申请与导入、自动续期、密码 SSH 部署、通知、设置接口和 Web 管理页面;SSH 私钥、公钥和密钥登录能力不属于当前产品,真实 DNS、ACME、远程服务器及平台安装验收仍需在授权环境完成。
|
||||
|
||||
详细内容请先阅读:
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# Scert
|
||||
|
||||
Scert 是面向 Windows 和 Linux 的 SSL 证书管理服务。当前代码已覆盖核心证书生命周期、DNS-01、自动续期、SSH 部署、通知、认证和 Web 管理流程。
|
||||
Scert 是面向 Windows 和 Linux 的 SSL 证书管理服务。当前代码已覆盖核心证书生命周期、DNS-01、自动续期、密码 SSH 部署、通知、认证和 Web 管理流程。
|
||||
|
||||
正式交付仅包含 Web 和服务端。CLI 限定为初始化、服务启动、运维诊断、数据库维护、备份恢复、服务安装和卸载入口;历史 `domain`、`server`、`ssh-key`、`renew`、`deploy` 命令已停用,仅返回中文迁移提示,不执行原业务操作。命令边界见 `../doc/命令行运维范围说明.md`。Wails 历史实现不参与正式发布及测试门禁。
|
||||
|
||||
@ -36,7 +36,7 @@ go run ./cmd/scert serve --base-dir C:\ScertData
|
||||
- `POST /api/v1/domains`
|
||||
- `DELETE /api/v1/domains/:id`
|
||||
|
||||
当前 `serve` 已接入配置加载、数据库迁移、认证、DNS 在线测试、ACME 证书申请、自动续期、证书导入、SSH 部署和通知流程。HTTPS 生产切换、真实 DNS/ACME 申请、远程服务器及平台安装仍需授权环境验收。
|
||||
当前 `serve` 已接入配置加载、数据库迁移、认证、DNS 在线测试、ACME 证书申请、自动续期、证书导入、密码 SSH 部署和通知流程。SSH 私钥、公钥和密钥登录能力已禁用;HTTPS 生产切换、真实 DNS/ACME 申请、远程服务器及平台安装仍需授权环境验收。
|
||||
|
||||
### 开发阶段使用 9004 与 9003 端口
|
||||
|
||||
@ -108,7 +108,7 @@ Remove-Item Env:GOARCH
|
||||
|
||||
## 当前生产验收边界
|
||||
|
||||
代码层已实现 ACME/lego 申请、第一批 DNS Provider、CNAME 委派、自动续期、证书导入、SSH/SFTP 部署、Nginx/Caddy/Apache reload、通知和 Web 管理接口。以下项目不能仅凭本地自动化测试宣称生产完成:真实 DNS 权限与公网传播、Let’s Encrypt Production 签发、真实远程服务器部署、Windows Service、Linux systemd 实机安装、Wails 桌面封装、Windows ACL、MySQL 真实实例和最终 HTTPS 到达性验收。
|
||||
代码层已实现 ACME/lego 申请、第一批 DNS Provider、CNAME 委派、自动续期、证书导入、密码 SSH/SFTP 部署、Nginx/Caddy/Apache reload、通知和 Web 管理接口。SSH 私钥、公钥和密钥登录能力已禁用。以下项目不能仅凭本地自动化测试宣称生产完成:真实 DNS 权限与公网传播、Let’s Encrypt Production 签发、真实远程服务器部署、Windows Service、Linux systemd 实机安装、Wails 桌面封装、Windows ACL、MySQL 真实实例和最终 HTTPS 到达性验收。
|
||||
|
||||
## 首轮复审状态
|
||||
|
||||
|
||||
183
doc/SSH密钥配置指南.md
183
doc/SSH密钥配置指南.md
@ -1,178 +1,35 @@
|
||||
# SSH 密钥配置指南
|
||||
# SSH 登录配置说明
|
||||
|
||||
本文用于帮助不熟悉 SSH 的用户完成 Scert 远程服务器部署配置。Scert 只使用 SSH 密钥认证,不保存或使用远程服务器登录密码。本机为每台主机、每次配置生成随机密钥文件名,最终公钥路径为 `/ssl/ssh/<用户名>+scert-<随机标识>`,不保留 `.pub` 后缀。
|
||||
本说明用于明确当前产品的安全边界。Scert 远程服务器连接**仅支持 SSH 密码认证**,不提供、不生成、不读取、不保存、不上传 SSH 私钥或公钥,也不会写入远程 `authorized_keys`。
|
||||
|
||||
## 一、配置流程
|
||||
## 当前配置流程
|
||||
|
||||
SSH 配置分为三步:
|
||||
|
||||
1. 在自己的电脑上生成一对 SSH 密钥。
|
||||
2. 将公钥安装到远程服务器的授权文件中。
|
||||
3. 将本机私钥录入 Scert,Scert 会在保存时加密存储。
|
||||
|
||||
密钥分为两部分:
|
||||
|
||||
- **私钥**:只保存在自己的电脑或 Scert 的加密敏感信息存储中,不能发送给他人,不能提交到 Git。
|
||||
- **公钥**:可以安装到远程服务器,用于验证私钥对应的客户端。
|
||||
|
||||
## 二、Windows 生成密钥
|
||||
|
||||
Windows 10、Windows 11 和较新的 Windows Server 通常已经包含 OpenSSH 客户端。打开 PowerShell,复制并执行:
|
||||
|
||||
```powershell
|
||||
ssh-keygen -t ed25519 -C "scert-deploy" -f "$HOME\.ssh\scert_deploy_ed25519"
|
||||
```
|
||||
|
||||
执行过程中:
|
||||
|
||||
1. 如果提示创建目录,输入 `Y` 或按回车确认。
|
||||
2. 如果提示输入私钥口令,可以设置一个口令;如果希望配置更简单,也可以直接按两次回车留空。
|
||||
3. 私钥默认保存为:`%USERPROFILE%\.ssh\scert_deploy_ed25519`。
|
||||
4. 公钥默认保存为:`%USERPROFILE%\.ssh\scert_deploy_ed25519.pub`。
|
||||
|
||||
查看公钥内容:
|
||||
|
||||
```powershell
|
||||
Get-Content "$HOME\.ssh\scert_deploy_ed25519.pub"
|
||||
```
|
||||
|
||||
复制公钥内容时,要从 `ssh-ed25519` 开始复制到末尾的注释,必须保持为一整行。
|
||||
|
||||
## 三、Linux 或 macOS 生成密钥
|
||||
|
||||
打开终端,复制并执行:
|
||||
|
||||
```bash
|
||||
ssh-keygen -t ed25519 -C "scert-deploy" -f ~/.ssh/scert_deploy_ed25519
|
||||
```
|
||||
|
||||
查看公钥内容:
|
||||
|
||||
```bash
|
||||
cat ~/.ssh/scert_deploy_ed25519.pub
|
||||
```
|
||||
|
||||
默认文件位置:
|
||||
|
||||
- 私钥:`~/.ssh/scert_deploy_ed25519`
|
||||
- 公钥:`~/.ssh/scert_deploy_ed25519.pub`
|
||||
|
||||
建议设置本地私钥权限:
|
||||
|
||||
```bash
|
||||
chmod 700 ~/.ssh
|
||||
chmod 600 ~/.ssh/scert_deploy_ed25519
|
||||
chmod 644 ~/.ssh/scert_deploy_ed25519.pub
|
||||
```
|
||||
|
||||
## 四、把公钥安装到 Linux 服务器
|
||||
|
||||
如果本机安装了 `ssh-copy-id`,可以执行:
|
||||
|
||||
```bash
|
||||
ssh-copy-id -i ~/.ssh/scert_deploy_ed25519.pub 用户名@服务器地址
|
||||
```
|
||||
|
||||
命令会要求输入一次服务器登录密码。密码只用于把公钥安装到服务器,不会提交给 Scert。
|
||||
|
||||
如果没有 `ssh-copy-id`,先查看公钥:
|
||||
|
||||
```bash
|
||||
cat ~/.ssh/scert_deploy_ed25519.pub
|
||||
```
|
||||
|
||||
然后使用服务器控制台或已有登录方式,在远程服务器执行:
|
||||
|
||||
```bash
|
||||
umask 077
|
||||
mkdir -p ~/.ssh
|
||||
cat >> ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
执行后将公钥整行粘贴进去,按回车,再按 `Ctrl+D` 结束输入。最后设置权限:
|
||||
|
||||
```bash
|
||||
chmod 700 ~/.ssh
|
||||
chmod 600 ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
如果远程服务器使用的是其他登录用户,必须把公钥放到该用户自己的 `~/.ssh/authorized_keys`,不能误放到 root 用户目录。
|
||||
|
||||
## 五、把公钥安装到 Windows OpenSSH 服务器
|
||||
|
||||
Windows 服务器需要先确认 OpenSSH Server 已安装并运行。对于普通用户,将公钥追加到该用户的 `.ssh\authorized_keys` 文件;对于管理员账户,Windows OpenSSH 通常使用系统级管理员授权文件,具体位置以服务器 OpenSSH 配置为准。
|
||||
|
||||
建议优先使用服务器管理员提供的 OpenSSH 配置方式,不要直接覆盖已有授权文件。追加公钥时只能新增一行,不能删除其他用户已经配置的公钥。
|
||||
|
||||
## 六、在 Scert 中录入私钥
|
||||
|
||||
在 Scert 的服务器配置页面:
|
||||
|
||||
1. 点击“新建或导入”。
|
||||
2. 选择自己的操作系统标签,查看对应的密钥生成和公钥安装命令。
|
||||
3. 在“私钥名称”中填写容易识别的名称,例如“测试服务器部署密钥”。
|
||||
4. 可以直接把私钥内容粘贴到“私钥内容”,也可以点击文件选择框读取本机私钥文件。
|
||||
5. 如果生成密钥时设置了口令,在“私钥口令”中填写相同口令;未设置口令时留空。
|
||||
6. 确认内容无误后点击“加密保存”。
|
||||
7. 返回服务器配置,选择刚刚保存的 SSH 私钥。
|
||||
|
||||
Scert 页面显示的本机密钥路径遵循以下规则:
|
||||
|
||||
- 私钥:`/ssl/ssh/<用户名>+scert-<随机标识>.key`
|
||||
- 公钥:`/ssl/ssh/<用户名>+scert-<随机标识>`
|
||||
|
||||
生成命令会先由 `ssh-keygen` 临时产生 `.pub` 文件,然后将该文件移动为不带 `.pub` 后缀的公钥目标文件。每台主机、每次新建配置都会生成新的随机标识;远程服务器仍只需要把公钥内容追加到授权文件。
|
||||
|
||||
读取本机私钥文件只会把内容放入当前页面内存,仍需点击“加密保存”才会提交。关闭窗口或刷新页面前,请确认已经完成保存。
|
||||
|
||||
## 七、测试连接前检查
|
||||
|
||||
配置服务器时需要填写:
|
||||
在服务器配置页面填写以下内容:
|
||||
|
||||
- 服务器地址和 SSH 端口,默认端口为 `22`。
|
||||
- SSH 用户名。
|
||||
- 已加密保存的 SSH 私钥。
|
||||
- SSH 登录密码。
|
||||
- SSH 主机 `SHA256` 指纹。
|
||||
- 远程证书、完整证书链和私钥路径。
|
||||
- 远程证书、完整证书链和证书私钥路径。
|
||||
|
||||
首次连接前,请通过可信的服务器控制台或管理员渠道核对主机指纹。不要为了绕过连接失败而随意删除指纹校验。
|
||||
保存服务器配置后,Scert 只使用受保护的密码凭据建立 SSH 连接,并校验服务器主机指纹。密码不会在页面回显、日志中输出或作为命令参数写入。
|
||||
|
||||
测试环境当前包括:
|
||||
## 明确禁止的操作
|
||||
|
||||
- `192.168.2.3`
|
||||
- `192.168.2.4`
|
||||
- 不要在 Scert 中录入 SSH 私钥或公钥。
|
||||
- 不要在 Scert 中生成 SSH 密钥对。
|
||||
- 不要使用 `ssh-keygen`、`ssh-copy-id` 或其他方式为 Scert 部署登录密钥。
|
||||
- 不要由 Scert 创建或修改远程 `authorized_keys`。
|
||||
- 不要为了绕过密码认证失败而开启 `PubkeyAuthentication`。
|
||||
|
||||
上述地址仅用于授权测试,不应直接写入生产配置。生产环境应由用户自行填写实际服务器地址,并重新核对主机指纹和远程路径。
|
||||
页面中出现的“证书私钥路径”仅用于目标 Web 服务器的 TLS 证书部署,与 SSH 登录认证完全不同,不能用于 SSH 登录。
|
||||
|
||||
## 八、常见问题
|
||||
## 连接失败处理
|
||||
|
||||
### 1. 提示权限不足
|
||||
如果连接失败,请核对服务器地址、端口、用户名、密码、主机指纹和远程账号权限。不要删除主机指纹校验,也不要切换为密钥认证。需要调整服务器 SSH 策略时,应通过服务器控制台或可信的系统维护流程完成,并保持密码认证要求。
|
||||
|
||||
检查远程用户是否有权读取或替换证书目录,以及是否有权执行 Nginx、Caddy 或 Apache 的重载命令。不要直接给服务账号授予不必要的全盘权限。
|
||||
## 安全要求
|
||||
|
||||
### 2. 提示私钥格式错误
|
||||
|
||||
请确认录入的是私钥文件,而不是 `.pub` 公钥文件。私钥内容通常以 `BEGIN` 开头;公钥通常以 `ssh-ed25519`、`ssh-rsa` 或类似标识开头。
|
||||
|
||||
### 3. 设置了私钥口令但连接失败
|
||||
|
||||
检查 Scert 中填写的私钥口令是否与生成密钥时设置的口令完全一致。配置页面允许明文显示口令,便于确认输入;保存后由后端加密存储,接口不返回明文。
|
||||
|
||||
### 4. 不知道怎么操作
|
||||
|
||||
最简单的方式是:
|
||||
|
||||
1. 在 Scert 弹窗中复制密钥生成命令。
|
||||
2. 在自己的电脑上执行命令。
|
||||
3. 将公钥安装命令中的服务器地址和用户名替换为实际值并执行。
|
||||
4. 回到 Scert,选择刚生成的私钥文件。
|
||||
5. 点击“加密保存”,再配置服务器。
|
||||
|
||||
## 九、安全注意事项
|
||||
|
||||
- 不要把私钥发送给任何人。
|
||||
- 不要把私钥、公钥安装密码或 DNS 密钥提交到 Git。
|
||||
- 不要把私钥粘贴到远程服务器;远程服务器只需要公钥。
|
||||
- 不要覆盖远程服务器已有的 `authorized_keys` 文件。
|
||||
- 服务器地址、端口、用户和主机指纹应按环境分别配置。
|
||||
- 测试机的配置不能直接复制到生产环境。
|
||||
- 服务器密码只通过受保护的凭据存储保存,不提交到 Git、脚本、日志或工单。
|
||||
- 生产服务器应关闭 SSH 公钥认证,使用密码唯一认证策略。
|
||||
- Scert 管理服务和数据库不直接暴露公网,远程管理入口应通过 Nginx 的 `80/443` 反代访问。
|
||||
@ -38,7 +38,7 @@
|
||||
|
||||
1. 保留用于启动服务、查看状态、诊断、备份恢复及平台服务管理的现有运维流程。
|
||||
2. 停止依赖旧业务命令的定时任务和自动化调用,避免非零退出被误当成成功。
|
||||
3. 在 Web 中管理域名、DNS 账户、服务器和 SSH 凭据,发起手动申请、续期、导入及部署。
|
||||
3. 在 Web 中管理域名、DNS 账户和服务器密码凭据,发起手动申请、续期、导入及部署;不提供 SSH 私钥、公钥或密钥登录配置。
|
||||
4. 自动续期继续由服务端执行,不需要额外配置 `scert renew` 定时任务。
|
||||
|
||||
这次变更只收敛 CLI 入口,不代表 Web 的统一任务中心、项目隔离、完整审计或生产门禁已全部完成;这些仍按对应整改项执行。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user