提醒:本文最后更新于 468 天前,文中所描述的信息可能已发生改变,请谨慎使用!
你似乎正在查看一篇很久远的文章。
为了你这样的访客,我特地保留了我的历史博文。不要笑话过去的我,用温柔的目光看下去吧。

什么是SSH

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。使用频率最高的场合类Unix系统,但是Windows操作系统也能有限度地使用SSH。2015年,微软宣布将在未来的操作系统中提供原生SSH协议支持。

在设计上,SSH是Telnet和非安全shell的替代品。Telnet和Berkeley rloginrshrexec等协议采用明文传输,使用不可靠的密码,容易遭到监听、嗅探和中间人攻击。SSH旨在保证非安全网络环境(例如互联网)中信息加密完整可靠。

SSH以非对称加密实现身份验证。身份验证有多种途径,例如其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录;另一种方法是人工生成一对公钥和私钥,通过生成的密钥进行认证,这样就可以在不输入密码的情况下登录。任何人都可以自行生成密钥。公钥需要放在待访问的电脑之中,而对应的私钥需要由用户自行保管。认证过程基于生成出来的私钥,但整个认证过程中私钥本身不会传输到网络中。

SSH协议有两个主要版本,分别是SSH-1和SSH-2。无论是哪个版本,核实未知密钥来源都是重要的事情,因为SSH只验证提供用户是否拥有与公钥相匹配的私钥,只要接受公钥而且密钥匹配服务器就会授予许可。这样的话,一旦接受了恶意攻击者的公钥,那么系统也会把攻击者视为合法用户。

简单地说,SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

ps:以下文中服务器均指Linux服务器

简单的SSH用法

在Linux终端输入ssh -p 1234 [email protected],Windows用户可以选择用开源软件Putty或者Xshell免费版,使用SSH更简单

详解:其中ssh代表连接指令,-p 1234代表使用1234端口连接主机(ssh的默认连接端口为22),[email protected]代表连接主机的用户名和ip地址。如果主机名与本机名相同,那么可以省略username

如果你是第一次登录对方主机,那么会收到一个提示(这里我以自己的服务器为例)

# ssh [email protected]
The authenticity of host '102.28.103.173' can't be established.
RSA key fingerprint is 90:61:57:fa:8b:06:a5:b3:a2:4b:f1:93:cc:58:f0:b4.
Are you sure you want to continue connecting (yes/no)?

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?其中,上面的90:61:57:fa:8b:06:a5:b3:a2:4b:f1:93:cc:58:f0:b4被称为"公钥指纹",因为公钥长度较长,(这里采用RSA算法,长达2048位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。

假定经过风险衡量以后,用户决定接受这个远程主机的公钥。

Are you sure you want to continue connecting (yes/no)? yes

系统会出现一句提示,表示host主机已经得到认可。

Warning: Permanently added 'host,102.28.103.173' (RSA) to the list of known hosts.

然后,会要求输入密码。

 Password:

密码正确,那么就登入了

SSH免密登录

使用密码登录,避免不了每次都必须输入密码,非常麻烦。所以我们通常使用公钥登录,可以省去输入密码的步骤。

密钥形式登录的原理是:利用密钥生成器制作一对密钥——一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。

生成SSH密钥和公钥

这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个:

ssh-keygen -t rsa

RSA是默认的加密类型.所以你也可以只输入ssh-keygen.默认的RSA长度是2048位.如果你非常注重安全,那么可以指定4096位甚至8192位的长度.

ssh-keygen -b 4096 -t rsa

生成SSH Key的过程中会要求你指定一个文件来保存密钥,按Enter键使用默认的文件就行了.然后需要输入一个密码来加密你的SSH Key.如果你想使用免密登录直接回车就好,SSH密钥会保存在home目录下的.ssh/id_rsa文件中.SSH公钥保存在.ssh/id_rsa.pub文件中.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/spirit/.ssh/id_rsa): 按Enter键
Enter passphrase (empty for no passphrase): 输入一个密码,可以留空
Enter same passphrase again: 再次输入密码,可以留空
Your identification has been saved in /home/spirit/.ssh/id_rsa.
Your public key has been saved in /home/spirit/.ssh/id_rsa.pub.
The key fingerprint is:
e1:dc:ab:ae:b6:19:b0:19:74:d5:fe:57:3f:32:b4:d0 [email protected]
The key's randomart image is:
+---[RSA 4096]----+
| .. |
| . . |
| . . .. . |
| . . o o.. E .|
| o S ..o ...|
| = ..+...|
| o . . .o .|
| .o . |
| .++o |
+-----------------+

查看.ssh/id_rsa文件就会看到,这个文件是经过加密的(encrypted).也就是用你输入的密码来加密.

less .ssh/id_rsa

将SSH公钥上传到Linux服务器

可以使用ssh-copy-id命令来完成.

ssh-copy-id [email protected]

输入远程用户的密码后,SSH公钥就会自动上传了.SSH公钥保存在远程Linux服务器的.ssh/authorized_keys文件中.

在服务器上

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

更改权限(必须)

chmod 755 ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys 

重启SSH服务

#RHEL/CentOS系统

Service sshd restart

#ubuntu系统

service ssh restart

#debian系统

/etc/init.d/ssh restart

上传完成后,SSH登录就不需要再次输入密码了.但是首次使用SSH Key登录时需要输入一次SSH密钥的加密密码.(只需要输入一次,将来会自动登录,不再需要输入密钥的密码.)

Windows系统可以用puttygen或者Xshell密钥生成向导来进行SSH公钥和私钥的生成,生成完成后放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中(使用cd /root/.ssh/

这里推荐一款非常方便的Linux工具lrzsz,如果你没有这款软件,使用apt install lrzsz或者yum install lrzsz安装即可

执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可,同样的,执行命令sz下载文件。当然,你也可以直接拖动文件到命令窗口来完成上传

然后运行如下命令,将公钥(Public Key)导入到“authorized_keys”文件:

[[email protected] ~]# cd .ssh/
[[email protected] .ssh]# ls
authorized_keys  known_hosts
[[email protected] .ssh]# rz -E
rz waiting to receive.
[[email protected] .ssh]# ls
authorized_keys  known_hosts  spirit.pub
[[email protected] .ssh]# cp authorized_keys authorized_keys.bak
[[email protected] .ssh]# cat spirit.pub >authorized_keys
[[email protected] .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAYEAybjy7/DVWxXm4lcXFA+x0bgBMi+aQ6zIzyBfFSKJEMhAhs/MxbKHOl1c1GwzPSAKLAHoR8UZSQO7QQcYKqeb8cNWR8f9NGNBCJs+e6Fpl7BvNPKfNrixnq+gT5VIz77u2RXU74JBOuwsgaEHtCU5DQhIfvAoUe64qCBuY5J6JHJV3bBlMXnqxrJQO4+4hH0dHyVzc5wmP0ngnah/6za64hk3Nd1tdER7na701geZTR5N4OqeCep+TtPcbT4RKQ1qJ5L67ET5x3uYGEKZDK4tOL2kluePd2XHRQg1qcXl87f7HkZiLIicgLU8/rB+LyUOJzywTVHvmTWTPDS1u6RmAQSLh/4VU0vEks7bIj7xTCaKjuO6UgHvxPZL1BQWj8tY6fzerdndVM5bORkAHgZ67ZJK6X+Zui4fHTkxSQ/gvzOgBylhSL3Tyc1PRlVO8L7bl9r36x7hlACHr0BrqpenrkxdMmrR4i4RoOrYaijXoPhvg5uWH+rSeUbZDDEw7S/F[[email protected] .ssh]#
[[email protected] .ssh]#chmod 755 ~
[[email protected] .ssh]#chmod 700 ~/.ssh
[[email protected] .ssh]#chmod 600 ~/.ssh/authorized_keys 

完成后重启SSH服务即可