SSH 是什么?为什么重要?
想象一下,你需要安全地远程控制一台位于机房或云端的服务器,就像坐在它面前操作一样,SSH(Secure Shell)就是实现这个目标的核心技术,它通过加密通道,让你安全地登录远程服务器、执行命令、传输文件,相较于古老的 Telnet(明文传输,极不安全),SSH 是系统管理员、开发者和运维工程师的必备工具,其安全性、可靠性和广泛支持使其成为远程管理的黄金标准。
客户端配置:连接服务器的钥匙
-
生成 SSH 密钥对(最佳实践,更安全)
- 为什么用密钥? 比密码更安全(抗暴力破解),支持免密登录(方便自动化)。
- 操作步骤 (Windows 10/11, Linux, macOS):
- 打开终端 (Windows: PowerShell 或 CMD; macOS/Linux: Terminal)。
- 输入命令:
ssh-keygen -t ed25519 -C "your_email@example.com"
(推荐使用更安全高效的 ed25519 算法) 或ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
(兼容性更好的 RSA)。 - 按提示回车,选择保存密钥文件的位置(默认
~/.ssh/id_ed25519
或~/.ssh/id_rsa
即可)。 - 设置一个强壮的密钥密码 (Passphrase)(强烈建议!即使私钥被盗,也多一层保护),输入两次。
- 结果: 在
~/.ssh/
目录下生成两个文件:id_ed25519
或id_rsa
:私钥 (Private Key) – 必须严格保密! 如同家门钥匙,绝不外泄。id_ed25519.pub
或id_rsa.pub
:公钥 (Public Key) – 需要上传到服务器。
-
将公钥上传到服务器 (Linux/Unix 服务器)
- 使用
ssh-copy-id
(最简单)- 确保你知道服务器的用户名 (
your_username
) 和 IP 地址/域名 (server_ip_or_hostname
)。 - 在客户端终端输入:
ssh-copy-id -i ~/.ssh/id_ed25519.pub your_username@server_ip_or_hostname
(替换为你的公钥路径和服务器信息)。 - 首次连接会提示确认服务器指纹,输入
yes
。 - 输入服务器用户的登录密码。
- 成功后,公钥会自动添加到服务器用户家目录下的
~/.ssh/authorized_keys
文件中。
- 确保你知道服务器的用户名 (
- 手动复制 (通用)
- 在客户端终端输入:
cat ~/.ssh/id_ed25519.pub
(或你的公钥文件路径)。 - 完整复制输出的公钥内容(以
ssh-ed25519 AAAAC3...
或ssh-rsa AAAAB3...
开头,包含你的邮箱注释)。 - 使用密码登录服务器:
ssh your_username@server_ip_or_hostname
。 - 确保服务器上存在
~/.ssh
目录:mkdir -p ~/.ssh
。 - 编辑(或创建)授权文件:
nano ~/.ssh/authorized_keys
。 - 将复制的公钥内容粘贴到文件末尾,确保没有多余空格或换行。
- 保存文件 (
Ctrl+O
, 回车,Ctrl+X
退出 nano)。 - 设置严格的权限(至关重要!):
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
- 在客户端终端输入:
- 使用
-
使用 SSH 客户端连接
- 基本命令:
ssh your_username@server_ip_or_hostname
- 指定端口 (如果服务器修改了默认端口):
ssh -p 2222 your_username@server_ip_or_hostname
(将2222
替换为你的端口) - 指定私钥 (如果使用非默认名称或路径的私钥):
ssh -i ~/.ssh/my_custom_key your_username@server_ip_or_hostname
- 首次连接: 会提示你确认服务器的 ECDSA 或 RSA 密钥指纹,仔细核对(如果服务器是知名的云服务商,可查找其公布的指纹进行比对),确认无误后输入
yes
,该信息会保存在客户端的~/.ssh/known_hosts
文件中,后续连接不再提示(除非服务器密钥变更)。
- 基本命令:
服务器端配置 (Linux/Unix):加固安全防线
服务器端的配置文件通常是 /etc/ssh/sshd_config
,修改前务必备份!使用 sudo nano /etc/ssh/sshd_config
编辑。
-
关键安全配置项:
Port 2222
:修改默认端口 (22),将2222
替换为你选择的端口号(1024-65535),大幅减少自动化扫描攻击。PermitRootLogin no
:禁止 root 用户直接登录,先用普通用户登录,再su
或sudo
提权,增加攻击难度。PasswordAuthentication no
:禁用密码登录(在成功配置密钥登录并测试无误后再启用此项),强制使用密钥认证,彻底杜绝密码暴力破解。PubkeyAuthentication yes
:启用公钥认证(通常默认开启)。PermitEmptyPasswords no
:禁止空密码登录(默认应已禁止)。X11Forwarding no
:禁用 X11 转发(除非你明确需要图形界面转发)。ClientAliveInterval 300
和ClientAliveCountMax 3
:设置客户端活动检查,自动断开无响应的会话(300秒检查一次,最多3次失败后断开)。AllowUsers your_username
:限制允许登录的用户(将your_username
替换为允许 SSH 登录的实际用户名,可添加多个,空格分隔),白名单机制最安全。MaxAuthTries 3
:限制登录尝试次数(3 次),配合 fail2ban 效果更佳。UseDNS no
:禁用 DNS 反向解析,可以加快连接速度,尤其当服务器 DNS 配置有问题时。
-
应用配置并重启 SSH 服务:
- 保存配置文件 (
Ctrl+O
, 回车,Ctrl+X
退出 nano)。 - 在应用新配置(尤其是禁用密码登录)之前,务必确保:
- 你的公钥已正确添加到服务器的
~/.ssh/authorized_keys
文件中。 - 你已经使用密钥成功登录过一次(保持一个已登录的会话窗口打开作为“逃生通道”非常关键!)。
- 你的公钥已正确添加到服务器的
- 重启 SSH 服务:
- Ubuntu/Debian:
sudo systemctl restart ssh
- CentOS/RHEL:
sudo systemctl restart sshd
- Ubuntu/Debian:
- 重要: 重启后,立即用新配置(如新端口、密钥登录)尝试建立一个新的连接,确认能成功登录,确认无误后,再关闭之前的“逃生”会话。
- 保存配置文件 (
高级安全加固措施
- 配置防火墙 (UFW / firewalld / iptables):
- 只允许指定的 IP 或 IP 段访问 SSH 端口(如公司出口 IP、家庭 IP),这是最有效的访问控制之一。
- 只开放必要的端口(如你修改后的 SSH 端口)。
- 示例 (UFW):
sudo ufw allow from 192.168.1.0/24 to any port 2222
(允许特定内网段)sudo ufw allow from 203.0.113.5 to any port 2222
(允许特定公网 IP)sudo ufw enable
(启用防火墙)
- 安装并配置 Fail2Ban:
- 自动监控 SSH 日志,检测短时间内多次失败的登录尝试,并临时或永久地将恶意 IP 地址加入防火墙黑名单,有效抵御暴力破解。
- 安装 (Ubuntu/Debian):
sudo apt install fail2ban
- 配置:通常复制
/etc/fail2ban/jail.conf
为/etc/fail2ban/jail.local
并修改(如设置bantime
,findtime
,maxretry
等参数,确保[sshd]
或[sshd-iptables]
的enabled = true
并指向正确的port
和logpath
)。 - 重启:
sudo systemctl restart fail2ban
- 保持系统和软件更新:
- 定期运行
sudo apt update && sudo apt upgrade
(Debian/Ubuntu) 或sudo yum update
(CentOS/RHEL) 以获取安全补丁,包括 OpenSSH 的更新。
- 定期运行
- 使用非标准用户名: 避免使用
admin
,test
,user
等常见用户名。 - 定期审计日志: 查看
/var/log/auth.log
(Ubuntu/Debian) 或/var/log/secure
(CentOS/RHEL) 中的 SSH 登录记录,关注异常登录尝试。
常见问题解答 (Q&A)
- Q:连接时提示
Permission denied (publickey)
怎么办?- A:最常见原因:
- 服务器
~/.ssh/authorized_keys
文件中公钥格式错误或权限不对(确保是 600)。 - 客户端使用的私钥不对(检查
-i
参数或默认私钥是否存在)。 - 服务器
sshd_config
中PubkeyAuthentication
被设为no
。 - 用户家目录或
~/.ssh
目录权限过宽(家目录应为 755,.ssh
为 700)。 - SELinux/AppArmor 限制(较复杂,可尝试暂时禁用测试)。
- 服务器
- A:最常见原因:
- Q:修改 SSH 端口后连不上了?
- A:
- 检查防火墙是否放行了新端口。
- 检查
sshd_config
中Port
配置是否正确,是否去掉了注释 。 - 确认重启 SSH 服务 (
sudo systemctl restart sshd
)。 - 连接命令是否指定了新端口 (
ssh -p 新端口 ...
)。
- A:
- Q:忘记了密钥密码 (Passphrase) 怎么办?
- A:无法恢复,你需要生成一对新的 SSH 密钥对,将新公钥上传到服务器,并更新所有使用旧密钥的地方(如 Git 托管平台、自动化脚本),这凸显了安全保管 Passphrase 的重要性。
- Q:如何从 Windows 连接到 SSH 服务器?
- A:
- Windows 10/11 内置 OpenSSH 客户端: 在 PowerShell 或 CMD 中直接使用
ssh
命令,操作与 Linux/macOS 终端相同,需在“设置”->“应用”->“可选功能”中确认已安装。 - PuTTY: 经典第三方客户端,需要手动导入私钥 (.ppk 格式,可使用 PuTTYgen 转换)。
- Windows Terminal: 现代终端,集成了 PowerShell、CMD、WSL 等,也支持直接使用 OpenSSH。
- Windows 10/11 内置 OpenSSH 客户端: 在 PowerShell 或 CMD 中直接使用
- A:
- Q:如何传输文件?
- A:使用
scp
(Secure Copy) 或sftp
(SSH File Transfer Protocol) 命令。scp -P 2222 localfile.txt user@server:/remote/directory/
(上传)scp -P 2222 user@server:/remote/file.txt /local/directory/
(下载)sftp -P 2222 user@server
(进入交互式文件传输会话),图形化工具如 WinSCP (Windows), FileZilla (跨平台) 也支持 SFTP。
- A:使用
总结与最佳实践
配置安全的 SSH 连接并非一劳永逸,而是一个持续的过程,遵循以下核心原则:
- 强制密钥认证,禁用密码登录。
- 修改默认 SSH 端口 (22)。
- 禁止 root 用户直接登录。
- 使用防火墙严格限制访问来源 IP。
- 部署 Fail2Ban 防御暴力破解。
- 保持服务器系统和 OpenSSH 软件最新。
- 为私钥设置强壮的 Passphrase 并妥善保管。
- 定期审查日志和用户权限。
免责声明: 服务器配置操作具有一定风险,错误的配置可能导致无法访问。强烈建议在修改关键配置(尤其是禁用密码登录、修改端口)前进行充分测试,并保持一个已登录的备用会话。 对生产环境进行操作前,务必在测试环境验证,备份重要数据和配置文件是良好习惯。
最后更新: 本文内容基于当前广泛采用的最佳实践和常见 Linux 发行版(如 Ubuntu, CentOS)的配置,技术细节可能随软件版本更新而变化,请参考官方文档获取最准确信息。
引用说明:
- 本文核心配置方法基于 OpenSSH 官方文档 (
man sshd_config
,man ssh-keygen
) 及广泛认可的系统安全加固指南(如 CIS Benchmarks, NIST 建议)。- Linux 文件权限要求 (
~/.ssh
目录 700,authorized_keys
文件 600) 是 OpenSSH 强制执行的安全机制。- Fail2Ban 配置参考其官方文档及社区最佳实践。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5079.html