Ubuntu 安装和配置 OpenSSH:密钥登录与防锁死步骤

2026-10-9 / 0 评论 / 2 阅读

Ubuntu 安装和配置 OpenSSH:密钥登录与防锁死步骤 原创示意图

SSH(Secure Shell)用于加密远程管理服务器,也支持 SCP、SFTP 等文件传输。Ubuntu 上的客户端包是 openssh-client,接收连接的服务器端是 openssh-server,后台进程名为 sshd。配置 SSH 最大的风险不是“不会改”,而是改错后把唯一远程入口关掉。

一、安装并确认服务

sudo apt update
sudo apt install openssh-server
systemctl status ssh --no-pager
ss -lntp | grep ':22'

active (running) 表示服务正在运行,ss 用于确认监听地址和端口。客户端连接格式是:

ssh 用户名@服务器IP

第一次连接显示主机密钥指纹(Host key fingerprint)。在可信控制台核对后输入 yes,不要对完全陌生的指纹无条件接受。如果已连接过的服务器突然提示指纹变化,可能是系统重装,也可能存在中间人风险,应先查明原因。

二、生成并安装 SSH 密钥

密钥要在客户端电脑生成,不是在服务器替别人生成:

ssh-keygen -t ed25519 -a 64 -C 'my-laptop'

保存位置可接受默认值,建议为私钥设置口令(Passphrase)。生成后,私钥通常是 ~/.ssh/id_ed25519,绝不能发给别人;以 .pub 结尾的是公钥,可以安装到服务器。

Linux、macOS 或带 OpenSSH 的 Windows 可执行:

ssh-copy-id 用户名@服务器IP

若没有 ssh-copy-id,可把公钥内容追加到服务器用户的 ~/.ssh/authorized_keys。权限应为:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

先开一个新终端测试无密码登录,确认公钥确实生效;原来的密码会话暂时不要退出。

三、用配置片段修改 sshd

Ubuntu 支持在 /etc/ssh/sshd_config.d/ 放置配置片段(Configuration snippet),比直接反复修改主文件更容易维护。创建例如 /etc/ssh/sshd_config.d/99-local.conf:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

不要在密钥尚未验证前关闭密码认证。修改后先检查语法和实际生效值:

sudo sshd -t
sudo sshd -T | grep -E 'permitrootlogin|pubkeyauthentication|passwordauthentication'

sshd -t 没有输出通常表示语法通过。然后重新加载(Reload)而不是粗暴停止服务:

sudo systemctl reload ssh

保持旧连接,使用新窗口再次登录;只有新连接成功后才能退出旧会话。如果失败,可在旧会话修正配置并再次检查。

四、限制用户和更换端口

可用 AllowUsers alice bob 只允许指定用户,但写错用户名会直接锁死其他账号。也可以通过 AllowGroups sshusers 按组控制。规则上线前确认至少有一个可用管理员账号属于允许范围。

改 SSH 端口只能减少日志里的自动扫描,不等于真正安全。若确实改成例如 2222,需要同时修改 sshd 配置和防火墙:

sudo ufw allow 2222/tcp
ssh -p 2222 用户名@服务器IP

先放行新端口并验证,再删除旧端口规则。公网路由器还有端口映射时,要区分外部端口(External port)和服务器实际监听端口(Internal port)。

五、文件传输和常用客户端配置

上传单个文件:

scp local.txt 用户名@服务器IP:/tmp/

下载文件则交换源和目标。目录可使用 scp -r,大量或可恢复传输更适合 rsync。交互式 SFTP 使用 sftp 用户名@服务器IP,常用命令有 put、get、ls 和 exit。

客户端可在 ~/.ssh/config 保存别名:

Host homeserver
    HostName 192.168.2.251
    User alice
    Port 22
    IdentityFile ~/.ssh/id_ed25519

以后执行 ssh homeserver 即可。客户端配置文件建议权限设为 600。

六、连不上时按层排查

先从服务器控制台执行:

sudo sshd -t
systemctl status ssh --no-pager
journalctl -u ssh -n 50 --no-pager
ss -lntp | grep ssh
sudo ufw status numbered

局域网不通还要检查 IP、子网、虚拟交换机和 VLAN;公网不通再检查运营商限制、路由器端口映射和云安全组。Connection refused 通常表示目标可达但端口没有服务;超时(Timeout)多与路由或防火墙有关;Permission denied 则进入认证、用户名或密钥权限排查。

七、私钥保管与 ssh-agent

私钥相当于门钥匙,不应上传到公共网盘、聊天群、Git 仓库或服务器网页目录。客户端私钥权限通常应为 600;如果私钥已经泄露,单纯修改文件名没有用,必须从所有服务器的 authorized_keys 中删除对应公钥并重新生成密钥对。

带口令的私钥可以交给 SSH 代理(SSH agent)临时解锁:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l

离开电脑前锁屏,公用电脑不要长期保存私钥。代理转发(Agent forwarding)会让远端主机间接使用本机密钥,只在完全信任的跳板机上使用,不要把 ForwardAgent yes 设为全局默认。

八、识别认证日志中的异常

journalctl -u ssh --since '1 hour ago'
sudo grep -E 'Failed password|Accepted' /var/log/auth.log | tail -n 50

不同 Ubuntu 版本日志位置可能不同。大量失败尝试在公网服务器上很常见,重点是确认是否存在陌生的成功登录(Accepted)、异常用户名或非预期来源。可配合密钥认证、关闭 root 登录、限制允许用户、VPN 和登录限速降低风险。

频繁扫描不代表攻击者已经登录,也不要因为日志难看就随意改端口后忽略身份验证。真正重要的是唯一密钥、及时撤销、最小权限和更新。更换配置后记录时间,方便把日志变化与自己的操作对应起来。

九、建立紧急恢复路径

云主机准备厂商控制台,ESXi/Hyper-V 虚拟机保留虚拟控制台,实体服务器最好有显示器键盘或带外管理。恢复路径要在故障前测试。只有 SSH 一条入口时,不要同时修改端口、防火墙、认证方式和网络地址;每次只改一项并验证,出错时才知道该回退哪一步。

本文为中文学习整理。资料来源:Ubuntu Server 官方文档:OpenSSH server。

评论一下?

OωO
取消