如何将Ubuntu SSH密钥登录,彻底告别密码登录的繁琐?

摘要:在Linux服务器管理中,SSH(Secure Shell)是最常用的远程连接工具。然而,传统的密码登录方式存在诸多安全隐患:弱密码易被暴力破解、密码泄露风险高、难以管理多个服务器等。相比之下,SSH密钥登录通过非对称加密技术,提供了更高级
在Linux服务器管理中,SSH(Secure Shell)是最常用的远程连接工具。然而,传统的密码登录方式存在诸多安全隐患:弱密码易被暴力破解、密码泄露风险高、难以管理多个服务器等。相比之下,SSH密钥登录通过非对称加密技术,提供了更高级别的安全保障。 本文将详细介绍如何在Ubuntu服务器上配置SSH密钥登录,并完全禁用密码认证。无论你是个人开发者还是系统管理员,这套方案都能显著提升服务器的安全性。 环境准备 服务器环境 操作系统:Ubuntu 22.04.5 LTS SSH服务:OpenSSH Server 用户权限:具有sudo权限的用户 客户端环境 操作系统:Windows 10/11 连接工具:FinalShell(也可使用其他SSH客户端) 第一部分:服务器端SSH服务安装与基础配置 1.1 更新系统并安装SSH服务 首先,通过控制台或VNC登录到Ubuntu服务器。如果服务器尚未安装SSH服务,执行以下命令: # 更新软件包列表 sudo apt update # 安装OpenSSH服务器 sudo apt install openssh-server -y 1.2 启动并启用SSH服务 安装完成后,启动SSH服务并设置为开机自启: # 启动SSH服务 sudo systemctl start ssh # 设置开机自启 sudo systemctl enable ssh # 检查服务状态 sudo systemctl status ssh 正常情况下,你应该看到"active (running)"状态。 1.3 配置防火墙(如有需要) 如果服务器启用了防火墙,需要允许SSH连接: # 允许SSH端口(默认22) sudo ufw allow ssh # 启用防火墙 sudo ufw enable # 检查防火墙状态 sudo ufw status 第二部分:SSH密钥生成与配置 2.1 生成Ed25519密钥对 Ed25519是目前最推荐的SSH密钥算法,它比传统的RSA算法更安全、更快速: # 生成Ed25519密钥对 ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "$(whoami)@$(hostname)-$(date +%Y-%m-%d)" 系统会提示: 输入保存位置:直接回车使用默认路径 输入私钥密码:建议设置强密码(至少8位,包含大小写字母、数字和特殊符号) 再次确认密码:输入相同的密码 2.2 设置正确的文件权限 正确的文件权限是SSH密钥安全的关键: # 设置.ssh目录权限 chmod 700 ~/.ssh # 设置私钥权限(只有所有者可读写) chmod 600 ~/.ssh/id_ed25519 # 设置公钥权限(所有者可读写,其他人可读) chmod 644 ~/.ssh/id_ed25519.pub # 查看权限设置 ls -la ~/.ssh/ 输出应类似: drwx------ 2 user user 4096 Dec 18 18:30 . drwxr-xr-x 18 user user 4096 Dec 18 18:20 .. -rw------- 1 user user 509 Dec 18 18:30 id_ed25519 -rw-r--r-- 1 user user 128 Dec 18 18:30 id_ed25519.pub 2.3 配置公钥认证 创建授权文件并将公钥添加到其中: # 创建authorized_keys文件(如果不存在) touch ~/.ssh/authorized_keys # 设置授权文件权限 chmod 600 ~/.ssh/authorized_keys # 将公钥添加到授权文件 cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys # 验证公钥已添加 cat ~/.ssh/authorized_keys 2.4 测试本地密钥认证 在服务器本地测试密钥认证是否正常工作: ssh -i ~/.ssh/id_ed25519 localhost 第一次连接会提示确认主机指纹,输入"yes"继续。如果设置了私钥密码,会提示输入。成功登录后,执行exit退出。 第三部分:配置SSH服务器安全策略 3.1 备份原始配置 在修改SSH配置前,务必备份原始文件: # 创建带时间戳的备份 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d) 3.2 编辑SSH配置文件 使用nano编辑器修改SSH配置: sudo nano /etc/ssh/sshd_config 找到并修改以下配置项: # 启用公钥认证 PubkeyAuthentication yes # 禁用密码认证(关键安全设置) PasswordAuthentication no # 禁用键盘交互认证 KbdInteractiveAuthentication no # 禁止空密码 PermitEmptyPasswords no # 限制root登录方式(建议设置) PermitRootLogin prohibit-password # 其他安全增强设置 MaxAuthTries 3 # 最大认证尝试次数 LoginGraceTime 30 # 登录宽限时间(秒) ClientAliveInterval 300 # 客户端活动检测间隔 ClientAliveCountMax 2 # 客户端活动检测最大次数 3.3 应用配置更改 # 测试配置文件语法 sudo sshd -t # 如果没有错误,重启SSH服务 sudo systemctl restart ssh # 确认服务正常运行 sudo systemctl status ssh 3.4 验证配置生效 # 确认密码认证已禁用 sudo grep -E "PasswordAuthentication|PubkeyAuthentication" /etc/ssh/sshd_config # 确认其他相关配置 sudo grep -E "PermitRootLogin|KbdInteractiveAuthentication" /etc/ssh/sshd_config 期望输出: PasswordAuthentication no PubkeyAuthentication yes PermitRootLogin prohibit-password KbdInteractiveAuthentication no 第四部分:Windows客户端配置(FinalShell) 4.1 获取服务器连接信息 在服务器上执行以下命令,获取连接所需信息: # 获取服务器IP地址 hostname -I # 查看当前用户名 whoami 记下IP地址(如192.168.1.100)和用户名。 4.2 将私钥下载到Windows 在服务器上显示私钥内容: cat ~/.ssh/id_ed25519 复制输出的所有内容(包括-----BEGIN OPENSSH PRIVATE KEY-----和-----END OPENSSH PRIVATE KEY-----)。 在Windows电脑上: 创建新的文本文件 粘贴复制的私钥内容 将文件保存为ubuntu_server.key 注意保存位置,建议放在安全目录 4.3 FinalShell安装与配置 安装FinalShell 访问Finalshell官网下载Windows版本 运行安装程序,按向导完成安装 导入SSH密钥 打开FinalShell 点击菜单栏 工具 → 导入密钥 选择刚才保存的ubuntu_server.key文件 设置密钥信息: 密钥名称:Ubuntu服务器密钥 密码:输入生成密钥时设置的私钥密码 点击"确定"完成导入 创建SSH连接 在FinalShell主界面,点击 文件夹图标 或 文件 → 新建 选择 SSH连接(Linux) 填写连接信息: 名称:Ubuntu服务器(密钥登录) 主机:服务器IP地址 端口:22 用户名:服务器用户名 认证方式:公钥认证 私钥:选择"Ubuntu服务器密钥" 点击"确定"保存 4.4 首次连接测试 双击新建的连接 首次连接会提示安全警告,选择"接受并保存" 如果设置了私钥密码,FinalShell会提示输入 成功连接后,会显示服务器终端界面 在连接成功的终端中,可以执行一些验证命令: # 验证连接信息 whoami hostname # 测试命令执行 echo "SSH密钥连接成功!" # 查看系统信息 uname -a 第五部分:安全验证与测试 5.1 验证密码登录已被禁用 在另一台电脑或Windows的命令提示符中,尝试使用密码登录: ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no 用户名@服务器IP 应该看到错误信息:Permission denied (publickey). 5.2 验证密钥登录正常工作 使用FinalShell或命令行进行密钥登录测试: # 在Windows PowerShell或CMD中(如果安装了OpenSSH客户端) ssh -i "C:\path\to\ubuntu_server.key" 用户名@服务器IP 5.3 查看SSH登录日志 在服务器上监控SSH登录活动: # 查看最近SSH登录记录 sudo journalctl -u ssh --since "today" | grep -E "(Accepted|Failed)" # 实时监控登录尝试 sudo tail -f /var/log/auth.log | grep ssh