ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SSH入门四步:下载、登录、设密码、改密码全解析

SSH入门四步:下载、登录、设密码、改密码全解析 1. 项目概述SSH不是“远程桌面”而是你和服务器之间的加密信使很多人第一次听说SSH是在公司IT发来的一封邮件里写着“请用SSH登录测试服务器”或者在GitHub文档里看到“通过SSH克隆仓库”。但真正打开终端敲下ssh userhost时却卡在了“Permission denied”——不是密码错了是压根没设过密码不是连不上是本地SSH客户端根本没装不是配置复杂是连“SSH到底是什么”都没搞清。我带过十几期Linux运维新人培训90%的人最初都把SSH当成类似TeamViewer那样的图形化远程控制工具结果在命令行里反复试错浪费两三天时间。其实SSHSecure Shell本质是一个加密通信协议它不传输画面只传输指令和响应它不依赖图形界面哪怕服务器连显示器都没接只要网络通、服务开着就能执行任何命令。你用VS Code点一下“Remote-SSH”连接成功背后是它自动调用本地OpenSSH客户端生成密钥对、协商加密算法、校验主机指纹、转发端口——这一整套流程全靠SSH协议支撑。标题里提到的“下载、登录、设置密码、修改密码”恰恰是四个最常卡住新手的实操断点下载什么不是下载“SSH软件”而是下载支持SSH协议的客户端Windows用户尤其容易混淆Notepad官网下载和SSH工具下载登录失败80%源于/etc/ssh/sshd_config里PermitRootLogin被禁用或PasswordAuthentication设为no设置密码不是给SSH本身设而是给Linux系统用户设比如sudo passwd ubuntu修改密码更不是改SSH配置文件而是用passwd命令重置用户凭证。这篇文章不讲RFC标准不堆砌加密算法名词只聚焦你明天上班就要用的四件事在哪下、怎么连、密码怎么设、密码怎么改。无论你是刚配好树莓派的小白还是需要批量管理20台CentOS服务器的运维所有操作步骤我都按真实终端截图还原参数值全部标注来源依据连chmod 600 ~/.ssh/id_rsa这种权限报错的底层原因都给你拆开讲透。2. 核心细节解析与实操要点从协议原理到终端报错的逐层穿透2.1 SSH协议的本质为什么必须加密明文传输有多危险先破除一个根本误解SSH不是“远程登录软件”它是网络层之上的安全外壳协议Secure Shell Protocol运行在TCP 22端口核心使命是解决Telnet、FTP这类传统协议的致命缺陷——所有数据包括用户名、密码、命令、返回结果都以明文形式在网络中裸奔。我曾用Wireshark抓包演示过当某同事用Telnet登录一台老交换机时他输入的admin和123456密码在局域网内任何一台电脑上都能被实时捕获。而SSH通过三阶段加密彻底杜绝此事第一阶段是密钥交换Key Exchange客户端和服务端用Diffie-Hellman算法协商出一个临时会话密钥这个过程即使被截获也无法反推密钥第二阶段是服务器身份认证服务端出示自己的公钥存储在/etc/ssh/ssh_host_rsa_key.pub客户端首次连接时会将此公钥存入~/.ssh/known_hosts下次连接若公钥变更可能遭遇中间人攻击就会警告WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!第三阶段是用户认证支持密码、密钥、Kerberos等多种方式其中密钥认证因无需传输密码安全性远超密码登录。所以当你看到“SSH工具”时要明白它只是实现了该协议的客户端程序就像Chrome是HTTP协议的客户端一样。Windows自带的OpenSSH客户端Win10 1809内置和macOS的Terminal本质都是SSH协议的实现者而Bitvise、MobaXterm、WindTerm这些第三方工具不过是加了图形化界面、会话保存、SFTP文件拖拽等便利功能的增强版。2.2 “下载SSH”到底下什么Windows/macOS/Linux的原生能力差异搜索“SSH下载”时百度首页推荐的往往是“Notepad官网下载”“CCSwitch下载”这类完全无关的链接这是典型的关键词误导。真正的答案是绝大多数现代操作系统已内置SSH客户端无需额外下载。但不同系统预装程度差异极大必须分清楚macOS10.15 Catalina起终端Terminal直接支持ssh命令且预装OpenSSH 8.1p1以上版本足够应对99%场景。你只需打开“访达→应用程序→实用工具→终端”输入ssh -V即可验证。Windows 101809版本后及Windows 11微软已将OpenSSH客户端作为可选功能集成。打开“设置→应用→可选功能→添加功能”搜索“OpenSSH 客户端”并安装即可。安装后在PowerShell或CMD中执行ssh -V显示OpenSSH_for_Windows_8.6p1...即成功。注意不要去第三方网站下载所谓“SSH for Windows”那些多为捆绑广告的盗版包。Linux发行版Ubuntu/CentOS/Debian等几乎全部默认预装OpenSSH客户端。Ubuntu 22.04中openssh-client包随系统安装执行which ssh返回/usr/bin/ssh即确认存在。那么什么时候真需要“下载”只有两种情况一是使用老旧系统如Windows 7或macOS 10.13此时需手动安装二是需要高级功能如SFTP图形界面、会话批量管理。针对前者我强烈推荐Windows 7用户下载官方PuTTYhttps://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html轻量单个exe文件、无安装、免杀毒误报。注意避开国内镜像站提供的“绿色版”它们常被植入挖矿脚本。macOS 10.13用户用Homebrew安装brew install openssh比手动编译省心百倍。提示所有第三方“SSH工具”如WindTerm、Tabby本质都是基于libssh或OpenSSH库开发的GUI封装。如果你只需要基础登录原生命令行更稳定如果需频繁传文件选支持SFTP协议的工具如FileZilla配合SSH密钥。2.3 登录失败的四大元凶从网络层到应用层的排查链当你执行ssh user192.168.1.100却收到Connection refused或Connection timed out别急着重装系统按以下顺序逐层排查这是我写在运维手册第一页的黄金法则网络层连通性先用ping 192.168.1.100确认IP可达。若ping不通检查物理网线、WiFi连接、防火墙是否拦截ICMP。注意某些云服务器如阿里云默认关闭ICMP此时ping不通不等于SSH不通需跳至下一步。端口监听状态在目标服务器上执行sudo ss -tlnp | grep :22CentOS/RHEL或sudo netstat -tlnp | grep :22Ubuntu/Debian。正常应显示LISTEN状态及sshd进程。若无输出说明SSH服务根本没启动CentOS用sudo systemctl start sshdUbuntu用sudo systemctl start ssh。服务端配置锁死即使端口开着/etc/ssh/sshd_config中的关键参数仍可能拒绝连接。重点检查三行Port 22确认端口号未被改成其他值如2222若改过则登录时需指定ssh -p 2222 userhostListenAddress 0.0.0.0确保监听所有网卡而非仅127.0.0.1本地回环PermitRootLogin yes若为no则root用户无法直连需用普通用户登录后再sudo su -客户端密钥权限错误Windows用户常见报错Bad owner or permissions on C:\Users\ThinkPad\.ssh\config。这是因为OpenSSH严格要求私钥文件权限为600仅所有者可读写。在PowerShell中执行icacls $env:USERPROFILE\.ssh\id_rsa /reset /T重置权限再用chmod 600 $env:USERPROFILE\.ssh\id_rsa需启用WSL或Git Bash。注意ssh -v userhost加-v参数会输出详细调试日志从TCP握手到密钥交换每一步都可见。我处理过一个案例日志显示debug1: kex: algorithm: diffie-hellman-group-exchange-sha256但服务器SSH版本过低OpenSSH 5.3不支持该算法最终降级到diffie-hellman-group1-sha1解决。这就是-v参数的价值——它不告诉你答案但指明问题在哪一层。3. 实操过程与核心环节实现从零开始完成一次完整SSH生命周期3.1 服务端环境准备以Ubuntu 22.04为例的最小化配置假设你有一台全新安装的Ubuntu 22.04服务器物理机或云主机目标是让本地Windows电脑能用密码登录。以下是我在客户现场实测的10分钟配置流程所有命令均经生产环境验证第一步更新系统并安装SSH服务Ubuntu 22.04默认已安装openssh-server但需确认并更新sudo apt update sudo apt upgrade -y # 更新系统 sudo systemctl status ssh # 检查服务状态应显示active (running)若状态为inactive执行sudo systemctl enable --now ssh启用并开机自启。第二步创建专用登录用户禁止root直连直接用root登录是重大安全隐患。创建新用户并赋予sudo权限sudo adduser devops # 按提示输入密码此处设为Pssw0rd2023 sudo usermod -aG sudo devops # 将devops加入sudo组实操心得密码强度必须符合Ubuntu默认策略至少8位含大小写字母数字。若提示BAD PASSWORD: The password is too simple说明密码太弱需按规则重设。这是PAM模块的强制校验非SSH配置问题。第三步配置SSH服务端编辑主配置文件sudo nano /etc/ssh/sshd_config找到并修改以下参数# 禁用root登录安全基线要求 PermitRootLogin no # 允许密码认证新手友好后续可升级为密钥 PasswordAuthentication yes # 指定监听端口如需改端口取消注释并修改 # Port 22 # 限制登录用户可选提升安全性 AllowUsers devops保存后重启服务sudo systemctl restart ssh。此时服务端配置完成。第四步配置防火墙放行22端口Ubuntu默认使用UFW防火墙sudo ufw status verbose # 查看当前状态 sudo ufw allow OpenSSH # 允许SSH等同于allow 22 sudo ufw enable # 启用防火墙验证sudo ufw status应显示22/tcp ALLOW IN Anywhere。3.2 客户端连接实操Windows PowerShell下的完整登录链现在切换到你的Windows电脑已启用OpenSSH客户端打开PowerShell执行以下步骤第一步生成密钥对为后续升级做准备虽然当前用密码登录但生成密钥是必做动作ssh-keygen -t ed25519 -C your_emailexample.com # 按三次回车密钥将保存在C:\Users\YourName\.ssh\id_ed25519ed25519是目前最安全的密钥类型比RSA 2048位更强生成速度快私钥体积小。第二步首次连接并接受主机指纹执行登录命令ssh devops192.168.1.100首次连接会弹出警告The authenticity of host 192.168.1.100 (192.168.1.100) cant be established. ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])?输入yes系统会将服务器公钥存入C:\Users\YourName\.ssh\known_hosts。这步不可跳过否则每次连接都会警告。第三步输入密码完成登录终端提示devops192.168.1.100s password:输入之前设置的Pssw0rd2023。成功后即进入服务器shell提示符变为devopsubuntu:~$。实操心得若输入密码后光标不动可能是Caps Lock开启或密码含特殊字符导致粘贴异常。建议手动输入避免复制粘贴。另外密码输入时不会显示星号这是SSH的安全设计防止旁观者通过字符数推测密码长度。3.3 设置与修改密码系统用户密码 vs SSH服务密码的本质区别这是标题中最易混淆的点。必须明确SSH本身没有密码它只验证Linux系统用户的密码。因此“设置密码”和“修改密码”操作对象都是/etc/shadow文件中的用户记录。设置新用户密码首次在服务器上用root或sudo权限执行sudo passwd devops # 输入新密码两次不显示密码会被加密后存入/etc/shadow算法由/etc/login.defs中的ENCRYPT_METHOD决定Ubuntu 22.04默认为SHA512。修改现有用户密码普通用户可自行修改passwd # 输入当前密码再输入新密码两次管理员可强制修改他人密码无需知道原密码sudo passwd devops # 直接输入新密码两次关键参数解析/etc/login.defs中的PASS_MAX_DAYS 90密码最长有效期90天到期后用户登录时会被强制修改。PASS_MIN_LEN 8密码最小长度8位低于此值passwd命令会拒绝。FAILLOG_ENAB yes启用登录失败日志记录在/var/log/faillog可用faillog -u devops查看该用户失败次数。注意MySQL/MariaDB的root密码与SSH密码完全无关标题中提到的“给mariadb root设置密码”是数据库层面操作执行mysql -u root -p后在SQL中运行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY NewPass123;。混淆这两者是新人踩坑重灾区。4. 常见问题与排查技巧实录来自200次现场排障的终极清单4.1 密码登录被拒的七种真实场景及解决方案在为客户部署SSH时我整理了一份高频问题速查表覆盖95%的登录失败案例。每个问题都附带ssh -v日志特征和一击必杀命令问题现象ssh -v关键日志根本原因解决方案Permission denied (publickey)debug1: Next authentication method: publickey服务端PasswordAuthentication no且客户端无有效密钥sudo nano /etc/ssh/sshd_config→ 设PasswordAuthentication yes→sudo systemctl restart sshConnection refusedconnect to host 192.168.1.100 port 22: Connection refusedSSH服务未运行或端口被占用sudo systemctl status ssh→ 若inactive则sudo systemctl start ssh若端口冲突sudo ss -tlnp | grep :22查进程Connection timed outssh: connect to host 192.168.1.100 port 22: Connection timed out防火墙拦截或网络不通sudo ufw status→ 若active则sudo ufw allow 22云服务器需检查安全组规则Host key verification failedWarning: Remote host identification has changed!服务器重装系统导致SSH主机密钥变更删除本地~/.ssh/known_hosts中对应行ssh-keygen -R 192.168.1.100Bad owner or permissionsBad owner or permissions on /c/Users/ThinkPad/.ssh/configWindows下.ssh目录权限过宽PowerShell中执行icacls $env:USERPROFILE\.ssh /t /grant:r $env:USERNAME:(OI)(CI)FNo supported authentication methods availabledebug1: No more authentication methods to try.服务端禁用所有认证方式检查sshd_config中PubkeyAuthentication和PasswordAuthentication是否均为yesKeyboard-interactive authentication faileddebug1: Next authentication method: keyboard-interactivePAM模块配置错误或密码策略触发查看/var/log/auth.log常见于pam_faillock.so锁定账户用sudo faillock --user devops --reset解锁实操心得/var/log/auth.log是SSH排障的黄金日志。当遇到诡异问题时先在服务器上执行sudo tail -f /var/log/auth.log然后在客户端发起一次登录实时观察日志输出。例如若日志出现pam_faillock(sshd:auth): User devops not found说明用户不存在若出现pam_unix(sshd:auth): check pass; user unknown则是用户名拼写错误。日志比任何猜测都可靠。4.2 密钥认证进阶从密码登录平滑过渡到密钥登录密码登录虽简单但存在暴力破解风险。我建议所有生产环境在密码登录验证成功后立即升级为密钥认证。以下是零失误迁移步骤第一步将公钥上传至服务器在Windows PowerShell中执行# 将本地公钥内容复制到剪贴板 Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard # 登录服务器后创建authorized_keys文件 mkdir -p ~/.ssh echo 粘贴的公钥内容 ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys第二步服务端强制密钥认证编辑/etc/ssh/sshd_configPasswordAuthentication no # 关闭密码认证 PubkeyAuthentication yes # 确保密钥认证开启重启服务sudo systemctl restart ssh。第三步客户端验证密钥登录退出当前会话在PowerShell中执行ssh -i $env:USERPROFILE\.ssh\id_ed25519 devops192.168.1.100若成功登录说明密钥生效。此时可删除~/.ssh/authorized_keys中旧的公钥或保留作为备用。注意-i参数指定私钥路径是显式写法更优雅的方式是配置~/.ssh/configHost myserver HostName 192.168.1.100 User devops IdentityFile ~/.ssh/id_ed25519之后只需ssh myserver即可无需记忆IP和参数。4.3 批量管理与自动化用SSH实现100台服务器的密码统一修改当服务器数量超过5台手动改密码效率极低。我用sshpass工具实现批量操作注意sshpass需在客户端安装非服务端第一步安装sshpassUbuntu客户端sudo apt install sshpass第二步准备服务器列表和密码文件创建servers.txt192.168.1.101 192.168.1.102 192.168.1.103创建newpass.txt单行新密码NewPssw0rd2023!第三步执行批量修改#!/bin/bash NEWPASS$(cat newpass.txt) for ip in $(cat servers.txt); do echo 修改 $ip sshpass -p 旧密码 ssh -o StrictHostKeyCheckingno devops$ip echo $NEWPASS | sudo passwd devops --stdin 2/dev/null if [ $? -eq 0 ]; then echo ✓ $ip 修改成功 else echo ✗ $ip 修改失败 fi done实操心得--stdin参数是CentOS/RHEL特有Ubuntu需用sudo passwd devops EOF\n$NEWPASS\n$NEWPASS\nEOF。批量操作前务必在单台服务器上测试脚本避免误操作。另外StrictHostKeyCheckingno跳过主机密钥验证仅限内网可信环境使用生产环境应提前分发known_hosts。5. 安全加固与生产环境最佳实践让SSH从“能用”到“牢不可破”5.1 密码策略强化超越passwd命令的深度控制仅用passwd命令设密码远远不够。真正的安全需要多层防御第一层PAM模块强制复杂度编辑/etc/pam.d/common-passwordUbuntu或/etc/pam.d/system-authCentOS添加password [success1 defaultignore] pam_unix.so obscure sha512 password requisite pam_pwquality.so retry3 minlen12 difok3 maxrepeat3minlen12密码至少12位difok3新密码需与旧密码至少3个字符不同maxrepeat3禁止连续4个相同字符如aaaa第二层登录失败锁定在/etc/pam.d/sshd中添加auth [defaultdie] pam_faillock.so authfail deny5 unlock_time900 auth [defaultdie] pam_faillock.so authsucc deny5 unlock_time900deny55次失败后锁定账户unlock_time90015分钟后自动解锁第三层会话超时自动登出在/etc/ssh/sshd_config中添加ClientAliveInterval 300 # 服务器每5分钟发心跳 ClientAliveCountMax 2 # 连续2次无响应则断开这样闲置10分钟的会话将自动终止防止无人值守终端被利用。5.2 端口与协议优化从22端口到量子安全的演进路径将SSH端口从22改为其他端口如2222是常见做法但实际效果有限——自动化扫描器会遍历所有端口。更有效的方案是方案A端口敲门Port Knocking安装knockd服务配置/etc/knockd.conf[options] UseSyslog [openSSH] sequence 7000,8000,9000 seq_timeout 5 command /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags syn [closeSSH] sequence 9000,8000,7000 seq_timeout 5 command /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT客户端需按顺序发送三次SYN包knock 192.168.1.100 7000 8000 9000防火墙才放行22端口。这相当于给SSH加了一把动态密码锁。方案B证书认证Certificate Authority适用于大型企业。生成CA密钥ssh-keygen -t rsa -b 4096 -f ca_key为每个用户签发证书ssh-keygen -s ca_key -I user_devops -n devops -V 52w id_ed25519.pub服务端sshd_config中启用TrustedUserCAKeys /etc/ssh/ca_key.pub。用户证书过期后自动失效无需手动回收。最后分享一个血泪教训某客户将SSH端口改为65535最高端口以为更安全。结果监控系统因端口范围限制无法检测服务器被黑后两周才发现。安全不是藏起来而是层层设防实时监控。我现在的标准配置是密钥认证端口敲门Fail2ban自动封IP/var/log/auth.log实时告警——四道防线缺一不可。
返回列表