SSH基本原理及linux中无密码登录

一、什么是ssh

1.定义

ssh是secure shell的缩写,从字面意思就可以看出就是非常安全的shell,它主要用于对加密计算机之间传输的文件进行加密,从而达到安全传输的目的。

2.出现的意义

以前的网络传输协议,比如ftp、telnet在实际上都是不安全的,因为它们之间的数据都是以明文的方式传输的,如果有人在中间截取数据,就会导致数据的暴露。而通过ssh加密数据传输,即使被别人截取到,也因为是加密的而不会导致数据的暴露。

使用ssh还有一个好处就是它传输的数据都是它传输的数据都是进过压缩的,可以提高传输数据的速度。

3.ssh提供的两种安全验证的登录方式

1)密码(口令)验证:用服务器中本地系统的用户登录,并进行密码验证。在传输数据的时候数据都是加密的,但是不能保证你正在连接的服务器就是你要连接的那个服务器,可能会有别的服务器冒充正真的服务器,也就是所谓的“中间人”攻击

2)秘钥对验证:这种方式需要提供相匹配的秘钥信息,通常需要在客户端自己创建一对秘钥,并把公钥放在需要访问的服务器的指定位置上。具体的过程就是如果你要连接到你要连接的服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求后,先在服务器自己上你的主目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个公钥一致,服务器就用公钥加密“质询”并把它发送给客户端软件。客户端软件收到“质询”后就可以用你的私钥解密再把它发送给服务器。

 当密码验证和私钥验证都启动时,服务器将优先使用秘钥验证。

 

二、ssh的应用

ssh是比较可靠的,利用ssh协议可以有效的防止远程管理和传输过程中信息和数据泄漏的问题。以下应用都是我从网上找的,如果还有请大家多多指教

1、服务器间跳转:有些时候,你可能无法直接连接到某台服务器,而需要使用一台中间服务器进行中转。首先确保你已经为服务器配置了公钥访问,并开启了agent forwarding。

2、省去用户名

3、主机别名

4、省略主机名

5、连接中转:有时候你可能需要从一个服务器连接到另外一个服务器,比如在两个服务器之间直接传输数据,而不用通过本地电脑中转。

6、免密码登录,这是我们今天主要说的。

7、长连接:如果你发现自己每天需要连接到同一个服务器无数次,那么长连接就会很有用。通过设置连接被保持的时间(ControlPersist 4h),使连接在设置时间内在服务其中有保存,即使在你退出服务器之后,这条连接依然可以重用。因此,在你下一次(设置时间之内)登录服务器时,你会发现以闪电般的速度建立完成,这个选项对于通过scp拷贝多个文件提速尤其明显,因为你不在需要为每个文件做单独的认证了。

8、多连接共享:如果你需要在多个窗口中打开同一个服务器的连接,而不想每次都输入用户名密码,或是等待连接建立,那么你可以配置ssh的连接共享选项,在本地打开你的ssh配置文件通常它们位于~/.ssh/config。然后添加下面2行:

ControlMaster auto

ControlPath /tmp/ssh_mux_%h_%p_%r

试试断开你与服务器的连接,并建立一条新连接,然后打开一个新窗口,再创建一条连接,你会发现,第二条连接几乎是在瞬间就建立好了。

还有好些应用,你都可以在网上找到,这里我就不多说了。

 

三、无密码登录(公钥登录)

    1.通常ssh密码登录过程一般都是

1)用户向所要登录的远程主机发送登录请求;

2)远程主机收到用户的登录请求,把自己的公钥发给用户;

3)用户使用这个公钥,将登录密码加密后,发送到远程主机;

4)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

在linux中,如果你是第一次通过ssh登录远程主机,会出现下面的提示:

$ ssh user@host 
The authenticity of host 'host (12.18.429.21)' can't be established. 
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. 
Are you sure you want to continue connecting (yes/no)?

这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续吗?

所谓的“公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将他变成128位的指纹。上列中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.再进行比较,就容易多了。

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

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

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

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

然后,会要求输入密码。

Password: (enter password)

如果密码正确,就可以登录了。

当远程主机的公钥被接受以后,它就会被保存在用户home目录的$HOME/.ssh/known_hosts文件之中。下次再连接这台远程主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

如果远程主机重新装过系统或因为别的原因,导致ssh指纹改变,你需要把.ssh目录下的know_hosts文件中相应远程主机IP一致的指纹删除,再通过ssh登录一次回答yes,重新认证一次方可登录。注意.ssh是目录是以“.”开头的隐藏目录,需要#ls -a参数才能看到。而且这个目录的权限必须是700,并且用户的home目录也不能给其他用户写权限,否则ssh服务器会拒绝登录。如果发生不能登录的问题,请查看服务器上的日志文件/var/log/secure。通常能很快找到不能登录的原因。

2、公钥登录(免密码登录)

使用密码登录,每次都必须输入密码,感觉会很麻烦。尤其是在密码超级复杂,维护的服务器又比较多的情况下,这个时候用公钥登录就显得很轻松了。

所谓“公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机就会向用户发送一段随机字符串,用户用自己的私钥加密后,再发出来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。

要想用公钥登录,用户就必须自己创建一对秘钥,并把公钥放在需要访问的服务器上。

主要的步骤为:

1)在客户端生成一对秘钥

2)将公钥传输至服务器端某用户的家目录下.ssh/authorized_keys文件中(多个公钥需要进行追加)

3)登录测试

第一步:客户端生成秘钥

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

[root@localhost ~]# ssh-keygen 

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa): 

Enter passphrase (empty for no passphrase):         

Enter same passphrase again: 

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

35:dd:d8:49:05:be:e9:7e:89:b7:86:e2:96:17:a0:2b root@localhost.localdomain

The key's randomart p_w_picpath is:

+--[ RSA 2048]----+

|              oo.|

|           . * . |

|          o o =  |

|         . o   o |

|        S . . o  |

|         .   o   |

|          . . = .|

|       E . + = +.|

|        . o.o +o.|

+-----------------+

 

[zbj@web ~]$ ls -l .ssh

total 8

-rw------- 1 zbj zbj 1675 Feb 14 14:29 id_rsa

-rw-r--r-- 1 zbj zbj  389 Feb 14 14:29 id_rsa.pub

运行上面的命令以后,系统就会出现一系列提示,可以一路回车。其中有一个问题就是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个(设置私钥口令的目的是防止私钥被盗用),但是设置之后利用私钥连接也需要输入密码。

运行结束后,再$HOME/.ssh/目录下,会生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。再一次强调用户自己的目录(~/.ssh)必须不能有其他人可改写的权限,.ssh目录的权限必须是700,即除了用户自己,其他人没有任何读写查看该目录的权限。否则ssh服务器会拒绝登录。把产生的公钥上传到需要登录的服务器的对应用户目录的home目录的.ssh目录下。

ssh服务器端默认的公钥文件是用户home目录下.ssh目录下的authorized_keys文件,因此需要把产生的公钥以这个文件名放到服务器的$HOME/.ssh/目录下,这个文件中可以存放多个客户端的公钥文件,就好比一个大门上可以上很多锁,可以有不同的钥匙来尝试开锁,只要有个锁被打开,门就可以开了。公钥~/.ssh/authorized_keys必须是600权限,否则ssh服务器会拒绝用户登录。

第二步:将生成的公钥文件上传到远程主机

$ ssh-copy-id user@host(IP)

在这之后,你登录这台远程主机,就不用再输入密码了。

如果还是不行,就打开远程主机的/etc/ssh/sshd_config这个文件,检查下面几行前面的“#”注释是否被取掉。

RSSAuthentication yes

pubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

然后,重启远程主机的ssh服务。

关于authorized_keys文件:

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。公钥就是一段字符串,只要把它追加在authorized_keys文件的末尾就行了。