SSH 的工作原理是什么?如何加固 SSH 服务?
SSH (Secure Shell) 是目前互联网上最常用的安全网络协议,主要用于远程登录系统、执行命令和传输文件。它取代了不安全的 Telnet 和 FTP。
以下是关于 SSH 工作原理的详细解释,以及如何加固 SSH 服务的完整指南。
第一部分:SSH 的工作原理
SSH 的核心在于利用加密技术建立一个安全的通道。它的工作过程主要分为三个阶段:
1. 版本协商与算法协商 (Handshake)
- 连接建立:客户端(Client)向服务器(Server)发起 TCP 连接(默认端口 22)。
- 版本协商:双方互通版本号,确保协议兼容(目前主流是 SSH-2)。
- 算法协商:双方协商接下来要使用的加密算法(如 AES)、哈希算法(如 SHA-2)和密钥交换算法(如 Diffie-Hellman)。
2. 密钥交换与服务器认证 (Key Exchange)
这是 SSH 安全的基石,目的是在不安全的网络中协商出一个会话密钥(Session Key)。
- 服务器身份验证:服务器将自己的主机公钥(Host Key)发给客户端。客户端会检查这个公钥是否在自己的
~/.ssh/known_hosts文件中。- 如果是第一次连接,系统会提示用户核对指纹(Fingerprint),确认后保存。这主要为了防止中间人攻击(MITM)。
- 生成会话密钥:利用 Diffie-Hellman (DH) 算法,双方在不直接传输密钥的情况下,各自计算出相同的会话密钥。
- 后续通信:此后所有传输的数据都使用这个“会话密钥”进行对称加密(速度快)。
3. 用户认证 (User Authentication)
通道建立后,服务器需要验证“你是谁”。主要有两种方式:
密码认证(Password Authentication):
- 客户端将用户输入的密码加密后发送给服务器。
- 服务器解密并验证。
- 缺点:容易受到暴力破解攻击。
公钥认证(Public Key Authentication):
- 这是基于非对称加密的。
- 用户事先在客户端生成一对密钥(公钥+私钥),并将公钥上传到服务器的
~/.ssh/authorized_keys文件中。 - 流程:
- 客户端发起认证请求。
- 服务器生成一个随机字符串(Challenge),用用户的公钥加密,发给客户端。
- 客户端用自己的私钥解密,得到原始字符串,再发回给服务器。
- 服务器比对一致,允许登录。
- 优点:私钥永不离身,极其安全,不怕暴力破解。
第二部分:如何加固 SSH 服务
SSH 是黑客攻击服务器的首选入口(尤其是暴力破解)。以下是加固 SSH 的最佳实践,按重要性排序。
注意:在修改配置前,请保持一个活动的 SSH 会话,防止配置错误导致自己被锁在外面。
配置文件通常位于:/etc/ssh/sshd_config
1. 基础配置加固(必须做)
禁止 Root 用户直接登录
Root 权限太大,且用户名是固定的,容易被针对。应使用普通用户登录后通过sudo提权。bashPermitRootLogin no禁用密码认证,强制使用密钥登录
这是防止暴力破解最有效的方法。一旦禁用密码,黑客就算试出密码也无法登录。bashPasswordAuthentication no PubkeyAuthentication yes禁止空密码登录
bashPermitEmptyPasswords no
2. 网络与访问控制
修改默认端口
将默认的 22 端口改为高位非常用端口(如 22222)。虽然这属于“隐匿式安全”(Security by Obscurity),但能过滤掉 99% 的自动化扫描脚本。bashPort 22222记得在防火墙放行新端口。
限制允许登录的用户/组
只允许特定用户登录,拒绝其他所有用户。bashAllowUsers myuser anotheruser # 或者 AllowGroups sshusers安装 Fail2Ban
Fail2Ban 是一个入侵防御软件。它会监控 SSH 日志,如果发现某个 IP 多次尝试登录失败,会自动修改防火墙规则(iptables/firewalld)封禁该 IP。- 安装命令(Ubuntu/Debian):
sudo apt install fail2ban
- 安装命令(Ubuntu/Debian):
3. 进阶安全配置
启用双因素认证 (2FA/MFA)
结合 Google Authenticator。即使私钥被盗,黑客没有你的手机动态码也无法登录。- 需要安装
libpam-google-authenticator并配置 PAM 模块。
- 需要安装
设置空闲超时自动断开
防止管理员离开电脑后,SSH 会话被他人利用。bashClientAliveInterval 300 # 300秒检测一次 ClientAliveCountMax 0 # 检测失败0次即断开使用强加密算法
禁用老旧、不安全的加密算法(如 SHA1, RC4)。bash# 示例(具体取决于SSH版本) KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com使用堡垒机 (Jump Server)
对于企业环境,不要将所有服务器的 SSH 端口暴露在公网。只暴露一台“堡垒机”,所有连接必须先跳到堡垒机,再由堡垒机访问内部服务器。
4. 总结:加固清单
- 生成 SSH 密钥对,上传公钥。
- 编辑
/etc/ssh/sshd_config:Port <非22>PermitRootLogin noPasswordAuthentication noAllowUsers <你的用户名>
- 重启 SSH 服务:
sudo systemctl restart sshd - 配置防火墙(UFW/IPTables)放行新端口。
- 安装并配置 Fail2Ban。
通过以上步骤,你的 SSH 服务将变得固若金汤,普通的扫描和暴力破解将完全失效。