SSH笔记
安装SSH
需要关注ufw防火墙、fail2ban
更新系统
1 | sudo apt update -y && sudo apt upgrade -y |
安装SSH服务
安装OpenSSH服务器,允许远程访问:
1 | sudo apt install openssh-server |
确认SSH服务运行
1 | sudo systemctl status ssh |
1 | sudo systemctl status sshd |
SSH密钥创建 ssh-keygen
如下密钥生成方案中;~/.ssh/:存储密钥的路径,可以设置不同的路径 id_rsa:是生成的密钥文件名,可以设置不同的密钥文件名
如果密钥不需要设置密码。那么一直回车就可以;如果需要设置密码 密钥设置密码
RSA 4096位密钥(推荐兼容性方案)
1 | ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "your_email@example.com" |
Ed25519密钥(推荐安全方案)
1 | ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "your_email@example.com" |
ECDSA 521位密钥(平衡方案)
1 | ssh-keygen -t ecdsa -b 521 -f ~/.ssh/id_ecdsa -C "your_email@example.com" |
带密码保护的密钥(示例)
1 | ssh-keygen -t ed25519 -f ~/.ssh/secure_key -N "your_strong_password" |
-t:指定密钥类型(rsa/ed25519/ecdsa)-b:定义密钥长度(RSA/ECDSA需指定)-f:自定义密钥文件路径-C:添加注释(通常为邮箱)-N:设置密钥密码(空表示无密码)
SSH 密钥验证登录等
SSH 基础短参数(直接跟在 ssh 后,无需 -o)
| 参数 | 支持填写值 | 作用说明 | rsync / 脚本场景备注 |
|---|---|---|---|
-i |
本地私钥绝对路径,如 /root/.ssh/backup.key |
指定本次连接使用的私钥文件 | 跨机器同步必备,免密登录核心 |
-p |
数字端口(默认 22),如 2222、36000 | 指定远端 SSH 服务端口 | 服务器修改 ssh 端口后必须加 |
-l |
用户名(root/admin/backup) | 指定登录远端服务器的用户 | 简写等价 user@ip |
-4 |
无值,仅开关 | 仅使用 IPv4 建立连接 | 服务器双栈、只想走 IPv4 时使用 |
-6 |
无值,仅开关 | 仅使用 IPv6 建立连接 | 纯 IPv6 机房专用 |
-T |
无值,仅开关 | 不分配交互式 TTY 终端 | rsync、定时任务推荐,避免多余输出 |
-N |
无值,仅开关 | 仅建立隧道,不执行远端命令 | 端口转发场景,同步不用 |
-A |
无值,仅开关 | 转发本地 ssh-agent 私钥(跳板免密) | 跳板机多层同步时开启 |
-F |
ssh 配置文件路径 | 加载自定义 ssh config 配置 | 批量多主机统一配置时简化命令 |
-q |
无值,仅开关 | 静默 ssh 连接,关闭 ssh 自身输出 | 定时 cron 减少日志垃圾 |
-v |
无值,可叠加 -vv/-vvv |
输出 SSH 完整握手、密钥、认证调试日志 -v:简易日志 -vv:中等详情 -vvv:底层全量报文(排错最强) |
密钥报错、端口不通、算法不匹配必加;定时脚本不建议长期开启,日志量大 |
-T |
无值,仅开关 | 不分配交互式 TTY 终端 | rsync 固定使用;手动登录加此参数无法输入命令 |
-F |
ssh 配置文件路径 | 加载自定义 ssh config | 批量多主机简化命令 |
-o 配置项参数(-o 配置名=值,rsync 脚本高频)
| 参数名称 | 可选合法取值 | 作用说明 | 生产 / 定时场景使用建议 |
|---|---|---|---|
| StrictHostKeyChecking | ask(默认)no``accept-new``yes |
控制远端主机公钥校验策略1. ask:弹窗询问(脚本阻塞)2. no:自动写入 known_hosts,主机密钥变更不拦截(低安全)3. accept-new:首次自动保存,密钥变更直接拒绝(平衡安全 & 自动化)4. yes:未知主机直接拒绝,必须手动录入 | cron 定时、rsync 脚本优先 accept-new;临时测试可用 no;公网高危环境用 yes |
| UserKnownHostsFile | 文件绝对路径 / /dev/null |
指定主机公钥存储文件;设为 /dev/null 不保存不校验 | 一次性临时同步、多任务隔离场景使用 |
| ExitOnForwardFailure | yes / no |
端口转发失败直接断开 ssh 连接 | 同步带隧道转发时设 yes,快速报错 |
| ConnectTimeout | 数字(单位秒) | ssh 连接超时时间,超时直接失败 | 跨机房网络不稳定推荐设 10/15 秒,防止卡死 |
| ServerAliveInterval | 数字(单位秒) | 客户端定时发保活包,防止连接被防火墙断开 | 长同步大文件设 30/60 秒 |
| ServerAliveCountMax | 数字 | 保活包无响应最大重试次数,超限断开 | 搭配 ServerAliveInterval,推荐 2-3 |
| PreferredAuthentications | publickey,password / publickey |
限定 ssh 认证方式优先级 | 仅密钥免密同步:publickey,屏蔽密码弹窗 |
| PasswordAuthentication | yes / no |
是否允许密码登录 | 脚本统一设 no,杜绝密码交互阻塞 |
| GSSAPIAuthentication | yes / no |
域控 GSSAPI 认证开关 | 普通服务器固定 no,加速 ssh 握手 |
| CheckHostIP | yes / no |
反向解析 IP 校验主机指纹 | 脚本设 no,减少 DNS 卡顿导致连接慢 |
| Compression | yes / no |
ssh 传输层开启压缩 | 跨机房带宽不足开启,本地内网关闭 |
| ControlMaster | yes / no |
长连接复用主控通道 | 批量多文件同步加速,复用 ssh 连接 |
| ControlPath | 套接字文件路径 | 长连接复用 socket 存储路径 | 搭配 ControlMaster 实现多任务共享连接 |
| ControlPersist | 数字 (秒) /yes/no | 主控连接后台保活时长 | 批量同步设 300,空闲 5 分钟自动关闭 |
登录服务器
1 | ssh -i ~/.ssh/rsync_key -p 2222 test@10.0.0.2 |
测试登录服务器
1 | ssh -i ~/.ssh/rsync_key -p 2222 -T test@10.0.0.2 |
sshd_config服务器参数含义
核心安全参数完整对照表
| 参数 | 可选值 | 含义 | 运维 / 安全备注 |
|---|---|---|---|
ChallengeResponseAuthentication |
yes / no | 挑战应答认证(密码登录底层依赖项);关闭后无法密码登录,也会阻断 SSH Agent 免密跳转 | 安全建议:no;开启会允许密码交互式验证,爆破风险高;关闭后仅密钥登录可用 |
AllowAgentForwarding |
yes / no | 是否允许 SSH Agent 转发(跳板机免密跳转核心开关) | 内网信任跳板机:yes;公网暴露服务器:no,防止劫持私钥 |
AllowTcpForwarding |
yes / no | 是否允许 TCP 端口转发(本地端口映射、隧道代理) | 不需要隧道功能:no;关闭可防止内网端口被外部代理访问 |
PermitRootLogin |
yes / no / prohibit-password / without-password | 是否允许 root 账号登录1. yes:允许密码 / 密钥登录 root2. no:彻底禁止 root 登录3. prohibit-password:仅密钥登录 root,禁止密码 | 生产安全推荐:prohibit-password 或 no;禁止 root 直接公网登录 |
PasswordAuthentication |
yes / no | 是否支持账号密码登录 SSH | 安全最优:no;关闭后只能密钥登录,杜绝暴力破解 |
PubkeyAuthentication |
yes / no | 是否允许 SSH 公私钥密钥登录 | 必须 yes;关闭后无法密钥登录,只能依赖密码 |
AllowUsers |
用户名列表(空格分隔) | 白名单:仅列表内用户可 SSH 登录,不在列表直接拒绝 | 示例:AllowUsers root admin ubuntu;不填该参数 = 允许所有用户;公网服务器强烈配置 |
AllowGroups |
用户组名列表 | 白名单:仅指定用户组内成员可登录 | 配合 AllowUsers 使用,批量管控登录权限 |
DenyUsers |
用户名列表 | 黑名单:列表内用户禁止 SSH 登录 | 优先级高于 AllowUsers,拦截高危账号 |
DenyGroups |
用户组名列表 | 黑名单:指定用户组全部禁止登录 | 常用于禁用 nobody、guest 等低权限组 |
PermitEmptyPasswords |
yes / no | 是否允许空密码账号登录 SSH | 强制 no;空密码存在极高入侵风险 |
MaxAuthTries |
数字(如 3、5) | 单 IP 单次 SSH 连接最大认证失败次数,超限断开连接 | 推荐 3~5;减少暴力破解尝试机会 |
MaxSessions |
数字 | 单个 SSH 连接最多开启多少个会话窗口 | 推荐 10;防止单连接占用大量资源 |
LoginGraceTime |
时长(0/60/120,单位秒) | 连接成功后,多久内必须完成登录认证,超时断开 | 推荐 60;0 = 不限制,容易被挂连接消耗资源 |
X11Forwarding |
yes / no | 是否允许 X11 图形界面转发 | 无图形运维需求:no;关闭减少攻击面 |
PermitTunnel |
yes / no / point-to-point | 是否允许 SSH 虚拟网卡隧道 | 绝大多数服务器不需要,统一设 no |
GatewayPorts |
yes / no | 端口转发是否监听 0.0.0.0(允许外部访问转发端口) | 高危参数,推荐 no;开启后隧道端口对公网开放 |
ListenAddress |
IP 地址 / 0.0.0.0 / :: | SSH 服务监听的本机 IP,限制仅指定网卡提供 SSH | 示例:ListenAddress 192.168.1.10;仅内网 IP 开放 ssh |
Port |
数字(默认 22) | SSH 服务监听端口 | 公网机器建议修改非 22 端口,减少扫描爆破 |
LogLevel |
QUIET / FATAL / ERROR / INFO / VERBOSE | SSH 登录日志详细程度 | 安全审计推荐 VERBOSE,记录完整登录、认证失败信息 |
UseDNS |
yes / no | 登录时反向解析客户端 IP 为域名 | 推荐 no;DNS 解析卡顿会导致 SSH 连接缓慢 |
IgnoreRhosts |
yes / no | 是否忽略.rhosts 信任登录文件 | 必须 yes;rhosts 机制极不安全,易被劫持 |
HostbasedAuthentication |
yes / no | 基于主机信任免密登录 | 必须 no;内网环境也存在横向渗透风险 |
ClientAliveInterval |
秒数 | 服务端定时向客户端发送保活包,超时无响应断开 | 推荐 300;防止闲置连接占用会话 |
ClientAliveCountMax |
数字 | 保活包无响应最大重试次数 | 搭配 ClientAliveInterval,超时自动踢掉线连接 |
Banner |
文件路径 | SSH 连接后、登录前展示提示公告 | 示例:Banner /etc/ssh/banner.txt,用于安全告警 |
StrictModes |
yes / no | 校验用户家目录、.ssh 文件夹、密钥文件权限 | 必须 yes;权限过宽会直接拒绝密钥登录,防止私钥篡改 |
AuthorizedKeysFile |
.ssh/authorized_keys | 指定用户公钥存储路径 | 默认即可,一般无需修改 |
Compression |
yes / no / delayed | 是否开启传输压缩 | 带宽不足 yes;高负载服务器 delayed(登录后再压缩) |
IgnoreUserKnownHosts |
yes / no | 是否忽略用户 known_hosts 主机信任记录 | 推荐 no,用于校验目标主机防中间人劫持 |
KerberosAuthentication |
yes / no | Kerberos 单点登录认证开关 | 无 Kerberos 环境统一 no |
GSSAPIAuthentication |
yes / no | GSSAPI 企业域认证开关 | 普通服务器 no,仅域控环境开启 |
PermitTTY |
yes / no | 是否允许分配终端 TTY(交互式 shell) - yes:正常 ssh 登录能输入命令 - no:仅允许无终端执行单条命令,无法交互式登录 |
适用于 API / 中转专用账号,禁止交互式操作;设为 no 后用户 ssh 登录会直接断开,只能ssh user@ip command执行单次指令 |
X11Forwarding |
yes / no | 是否开启 X11 图形界面转发 | 服务器无图形需求一律设 no,缩小攻击面 |
Match LocalPort |
端口数字 | 条件匹配块开头,匹配指定 SSH 监听端口,下方配置仅对该端口生效 | Match 是条件分组语法,可按端口、用户、地址差异化限制 SSH 权限,示例见下方 |
服务器sshd_config配置
指纹信息
获取服务器指纹
1 | ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub |
删除本地存储的指纹信息
切换需要删除指纹信息的用户
1 | # 切换到执行rsync的用户 syncdata |
1 | # 删除目标IP旧指纹 |
本地重新获取指纹
1 | 弹窗出现新指纹,和第二步服务器本地获取的指纹一字不差再输入 yes。 |
弹窗出现新指纹,和第二步服务器本地获取的指纹一字不差再输入 yes。指纹对比可以去服务器做如下操作比较,有输出就是比较正确
1 | ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub | grep 指纹信息 |
核对无误写入 known_hosts。
SSH目录下文件含义
该文件是在用户目录下,XXXXXX是用户名
1 | C:\Users\XXXXXX\.ssh |
config
- 当有多个设备配置了不同公钥与私钥后,就需要通过配置文件配置,才能去区分。
- 配置文件的格式可以在边上搜索框中搜索
同一台电脑上多个github或gitee账户查看编写格式
id_rsa
- 这是生成的本地私钥文件
id_rsa.pud
- 这是公钥文件,给服务器使用的
authorized_keys
- 该文件是服务器将客户端的公钥信息,保存在这个文件中(用于客户端免密登录时候使用)
known_hosts
- 当客户端接收到服务器的公钥之后,服务器信息就记录在了该文件中,代表着客户端相信该服务器公钥信息了,便于下次连接,不再需要一个确认过程。存储着指纹信息
known_hosts.old