什么是SSH?安全外壳协议基础详解

服务器管理员每天都要敲的那条命令,ssh背后到底在做什么,一起来看看。

SSH(安全外壳协议)是什么

SSH是一种把客户端与服务器之间的整个通信通道都加密的协议,即使有人在中途截获了流量,也无法看懂内容。它默认使用TCP 22端口,是管理Linux/Unix服务器、连接云主机、进行远程开发工作时事实上的标准方式。

为什么用SSH取代Telnet

在SSH之前广泛使用的Telnet,会把包括登录用户名和密码在内的所有数据完全不加密地明文传输。同一网段内的任何人只需查看流量,就能截获登录凭据和命令内容。正是为了解决这个问题,SSH应运而生,如今Telnet基本已不再用于远程管理。

密码认证与公钥认证

除了用用户名和密码登录之外,更安全、更推荐的方式是公钥认证——私钥只保存在自己的电脑上,只把对应的公钥注册到服务器上。登录时服务器会用公钥加密一段挑战信息,只有持有私钥的一方才能解密,从而在完全不传输密码的情况下证明身份,大幅降低了遭受暴力破解登录攻击的风险。因此不少服务器管理员会干脆完全禁用密码登录,只允许公钥认证。

SSH还能做什么

SSH的用途远不止远程执行shell命令:SCP和SFTP可以在同一条加密连接上传输文件,端口转发(隧道)能把远程的某个端口安全地映射到本地机器,Git访问远程仓库时也依赖SSH密钥认证——这些都建立在SSH协议之上。

管理SSH密钥时值得养成的好习惯

务必为私钥单独设置密码短语(passphrase),因为没有密码短语保护的私钥一旦泄露就能被立即冒用。第一次连接某台服务器时,如果它的主机密钥指纹显得陌生,不要不假思索地直接接受——通过可信渠道核实这个指纹,是防止被诱导连接到伪造服务器的基本防线。不再使用或怀疑已泄露的密钥,应立即从服务器的authorized_keys中删除。

SSH端口转发(隧道)的原理

假设有一个只能在内网中访问的数据库管理面板。通过SSH登录到一台能访问该内网的服务器,并设置本地端口转发后,就可以像在自己电脑上直接访问该服务一样使用它。由于这些流量全部经过已经加密的SSH连接,这成为一种无需搭建完整VPN、就能安全访问某一个特定内部服务的实用方法。

第一次连接的那一刻发生了什么

第一次连接一台新服务器时,SSH会显示该服务器的主机密钥指纹,并要求你确认后才能继续——这正是SSH防范中间人攻击悄悄替换成伪造服务器的方式。一旦你接受,该指纹就会保存在本地,之后如果出现不匹配的情况(比如有人正在截获你的连接),系统会发出强烈警告,而不是悄无声息地直接连接。

让SSH省心得多的配置文件

与其每次都输入一长串用户名、主机名、端口和密钥文件,不如用~/.ssh/config文件为每台服务器设置一个简短的别名,以后只需输入"ssh myserver"即可连接。这项设置只需花几分钟,一旦你经常需要连接一两台以上的服务器,很快就能省下不少时间。

常见问题

把SSH默认端口(22)改掉,真的会更安全吗?

改端口本身并不会从根本上提升安全等级,但确实能减少那些无差别扫描并攻击22端口的自动化机器人的骚扰。这只是一个次要的辅助手段——禁用密码登录、只允许公钥认证的做法要重要得多。

SSH和VPN是一回事吗?

不是,两者解决的是不同的问题。SSH专注于安全地访问和隧道连接某个特定的服务器或服务,而VPN通常会把设备的全部(或大部分)网络流量都路由到一条加密路径上,涉及的范围要广得多。