详解linux SSH登录流程

 更新时间:2017年12月08日 08:43:52   作者:JayChen  
本篇文章通过秘匙生成等问题详细分析了linux里SSH登录流程,有需要的朋友参考一下吧。

本文给大家详细介绍了ssh 密钥登录远程服务器流程和注意事项,以下是详细内容:

密钥登录比密码登录安全,主要是因为他使用了非对称加密,登录过程中需要用到密钥对。整个登录流程如下:

远程服务器持有公钥,当有用户进行登录,服务器就会随机生成一串字符串,然后发送给正在进行登录的用户。
用户收到远程服务器发来的字符串,使用与远程服务器公钥配对的私钥对字符串进行加密,再发送给远程服务器。
服务器使用公钥对用户发来的加密字符串进行解密,得到的解密字符串如果与第一步中发送给客户端的随机字符串一样,那么判断为登录成功。
整个登录的流程就是这么简单,但是在实际使用 ssh 登录中还会碰到一些小细节,这里演示一遍 ssh 远程登录来展示下这些细节问题。

生成密钥对

使用 ssh-keygen 就可以直接生成登录需要的密钥对。ssh-keygen 是 Linux 下的命令,不添加任何参数就可以生成密钥对。

➜ ~ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jaychen/.ssh/id_rsa): #1
Enter passphrase (empty for no passphrase):      #2
Enter same passphrase again:          #3

执行 ssh-keygen 会出现如上的提示,在 #1 处这里提示用户输入生成的私钥的名称,如果不填,默认私钥保存在 /home/jaychen/.ssh/id_rsa 文件中。这里要注意两点:

生成的密钥,会放在执行 ssh-keygen 命令的用户的家目录下的 .ssh 文件夹中。即 $HOME/.ssh/ 目录下。

生成的公钥的文件名,通常是私钥的文件名后面加 .pub 的后缀。

#2 处,提示输入密码,注意这里的密码是用来保证私钥的安全的。如果填写了密码,那么在使用密钥进行登录的时候,会让你输入密码,这样子保证了如果私钥丢失了不至于被恶意使用。话是这么说,但是平时使用这里我都是直接略过。

#3 是重复 #2 输入的密码,这里就不废话了。

生成密钥之后,就可以在 /home/jaychen/.ssh/ 下看到两个文件了(我这里会放在 /home/jaychen 下是因为我使用 jaychen 用户来执行 ssh-keygen 命令)

➜ .ssh ls
total 16K
drwx------ 2 jaychen jaychen 4.0K 12月 7 17:57 .
drwx------ 9 jaychen jaychen 4.0K 12月 7 18:14 ..
-rw------- 1 jaychen jaychen 1.7K 12月 7 17:57 id_rsa.github
-rw-r--r-- 1 jaychen jaychen 390 12月 7 17:57 id_rsa.github.pub

 

生成的私钥还要注意一点:私钥的权限应该为 rw-------,如果私钥的权限过大,那么私钥任何人都可以读写就会变得不安全。ssh 登录就会失败。

首次 ssh 登录

登录远程服务器的命令是

ssh 登录用户@服务器ip

这里开始要注意两个用户的概念:

本地执行这条命令的用户,即当前登录用户,我这里演示的用户名称是 jaychen。

要登录到远程服务器的用户。

在开始登录之前,我们要首先要把生成公钥上传到服务器。

公钥的内容要保存到要登录的用户的家目录下的 .ssh/authorized_keys 文件中。假设你之后要使用 root 用户登录远程服务器,那么公钥的内容应该是保存在 /root/.ssh/authorized_keys中。注意 authorized_keys 文件是可以保存多个公钥信息的,每个公钥以换行分开。

上传完毕之后,执行

ssh root@远程服务器 ip

这个时候,如上面说的,远程服务器会发送一段随机字符串回来,这个时候需要使用私钥对字符串进行加密。而这个私钥会去执行该命令的用户的家目录下的 .ssh 目录读取私钥文件,默认私钥文件为 id_rsa 文件。即 $HOME/.ssh/id_rsa 文件。假设在生成密钥的时候对私钥进行了加密,那么这个时候就需要输入密码。

上面的流程用户登录的时候是不会感知的,ssh 在背后完成了所有的校验操作,如果密钥匹配的话,那么用户就可以直接登录到远程服务器,但是如果是首次登录的话,会出现类似下面的提示:

➜ .ssh ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
ECDSA key fingerprint is SHA256:61U/SJ4n/QdR7oKT2gaHNuGxhx98saqMfzJnzA1XFZg.
Are you sure you want to continue connecting (yes/no)?

这句话的意思是,远程服务器的真实身份无法校验,只知道公钥指纹(公钥的 MD5 值)为 61U/SJ4n/QdR7oKT2gaHNuGxhx98saqMfzJnzA1XFZg,是否真的要建立连接。出现上面的提示是因为避免存在中间人攻击。

中间人攻击

中间人攻击的前提是,你第一次登录一台远程服务器,你除了用户名、用户名对应的公钥私钥以及服务器 ip 之外,对远程服务器丝毫不了解的情况下。假设你 ssh 远程登录 192.168.1.1 的远程主机,在连接过程中被第三者拦截,第三者假冒自己为 192.168.1.1 的主机,那么你就会直接连接到其他人的服务器上。这就是中间人攻击。

为了避免中间人攻击,ssh 在首次登录的时候会返回公钥指纹,用户需要自己手动去比对你要登录的远程服务器的公钥的公钥指纹和 ssh 返回的公钥指纹是否一样。

经过比较公钥指纹,确认该服务器就是你要登录的服务器,输入 yes 之后就可以成功登录。整个登录流程结束。

known_hosts 文件

第一次登录之后,在本机的 $HOME/.ssh/ 目录下就会生成一个 known_hosts 的文件,内容类似下面

➜ .ssh cat known_hosts
192.168.1.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOPKYWolOYTDevvBR6GV0rFcI0z/DHZizN5l/ajApsgx+UcOOh51liuyBRRCIyF+BR56Le0lP0Pn6nzvLjbqMqg=

这个文件记录了远程主机 ip 和远程主机对应的公钥指纹,那么在下次登录的时候,远程主机发送过来的公钥指纹,直接和 known_hosts 文件中对应 ip 的公钥指纹比较即可。

config 配置

很多时候,我们开发可能需要连接多台远程服务器,并且需要配置 git 服务器的私钥。那么这么多的服务器不能共用一套私钥,不同的服务器应该使用不同的私钥。但是我们从上面的连接流程可以看到,ssh 默认是去读取 $HOME/.ssh/id_rsa 文件作为私钥登录的。如果想要不同的服务器使用不同的私钥进行登录,那么需要在 .ssh 目录下编写 config 文件来进行配置。

config 的配置很简单,只要指明哪个用户登录哪台远程服务器需要使用哪个私钥即可。下面给出一个配置示例。

Host github.com
 User jaychen
 IdentityFile ~/.ssh/id_rsa.github
Host 192.168.1.1
 User ubuntu
 IdentityFile ~/.ssh/id_rsa.xxx

上面 config 文件字段含义如下:

Host 指明了远程主机的 ip,除了使用 ip 地址,也可以直接使用网址。

User 指的是登录远程主机的用户。

IdentityFile 指明使用哪个私钥文件。

编写好 config 文件之后,需要把 config 文件的权限改为 rw-r--r--。如果权限过大,ssh 会禁止登录。

相关文章

  • thrift安装遇到的问题以及解决方法(必看篇)

    thrift安装遇到的问题以及解决方法(必看篇)

    下面小编就为大家带来一篇thrift安装遇到的问题以及解决方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • linux下make命令实现输出高亮的方法

    linux下make命令实现输出高亮的方法

    Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一。管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题。这篇文章主要给大家介绍了关于linux下make命令实现输出高亮的方法,需要的朋友可以参考下。
    2017-07-07
  • crontab执行时间与系统时间不一致问题解决

    crontab执行时间与系统时间不一致问题解决

    这篇文章主要给大家介绍了关于crontab执行时间与系统时间不一致问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Angular.JS中指令的命名规则详解

    Angular.JS中指令的命名规则详解

    这篇文章主要给大家介绍了关于Angular.JS中指令命名规则的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • linux系统中计划任务介绍

    linux系统中计划任务介绍

    大家好,本篇文章主要讲的是linux系统中计划任务介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Discuz 7.0伪静态ReWrite的.htaccess规则

    Discuz 7.0伪静态ReWrite的.htaccess规则

    在确定您的服务器支持伪静态ReWrite后,您可以通过修改设置.htaccess文件来实现Discuz论坛的伪静态功能
    2010-12-12
  • 关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程

    关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程

    这篇文章主要介绍了关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程,需要的朋友可以参考下
    2017-08-08
  • centos7下如何安装ftp服务

    centos7下如何安装ftp服务

    这篇文章主要介绍了centos7下如何安装ftp服务问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • linux 服务器安装gcc8的问题记录

    linux 服务器安装gcc8的问题记录

    我原本安装了gcc13.0版本,但是版本太高了,导致我安装cuda报错gcc版本太高,所以就安装低版本的gcc,下面通过本文给大家分享linux 服务器安装gcc8的问题记录,感兴趣的朋友一起看看吧
    2024-07-07
  • centos6.5下安装zabbix2.4的教程图解

    centos6.5下安装zabbix2.4的教程图解

    这篇文章主要介绍了centos6.5下安装zabbix2.4的教程图解,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11

最新评论