详解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 会禁止登录。

您可能感兴趣的文章:

  • 个性化修改Linux登录时的字符界面
  • linux系统下的ssh登录和配置方法
  • Linux学习第一天——ssh登录和软件安装详解
  • Linux配置远程SSH无密码登录
  • Linux下实现免密码登录(超详细)
  • linux ssh 别名登录小技巧
  • 更改linux用户登录shell的操作方法
  • Linux管理员手册(6)--登录和注销
  • 教你如何修改Linux远程登录欢迎提示信息
(0)

相关推荐

  • 个性化修改Linux登录时的字符界面

    如果采用root账号登录编辑/etc/bashrc内容,那所有其他帐号登录都会提示相同的内容,如果想每个用户进行配置,那就去每个帐号的目录下去配置吧.这里提供改一个文件所有帐号都能看到的个性显示内容. 复制代码 代码如下: vim /etc/bashrc #在顶部添加以下内容: c2="$(tput bold)$(tput setaf 2)"echo "$c2  _     _            _                 ___ "echo "

  • linux系统下的ssh登录和配置方法

    一 ssh的两种登录方式 1密码登录: [root@westos Desktop]# ssh root@192.168.122.26 Address 192.168.122.26 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT! root@192.168.122.26's password: Last login: Tue Jan 17 13:27:29 2017 from

  • Linux管理员手册(6)--登录和注销

    说明当一个用户登录和注销时发生了什么.较详细地说明后台进程的各种交互.log文件.配置文件等 通过终端登录 首先,init 确认有一个getty 程序提供给终端连接(或控制台). getty 侦听终端等候用户告知它要登录 (这通常意味着用户必然键入些什么).当它注意到一个用户,getty 输出一个欢迎信息(存在/etc/issue 中),并提示用户名,最后运行login 程序. login 作为一个参数得到用户名,并提示用户输入口令.如果正确,login 启动给此用户设置的shell:否则退出并

  • linux ssh 别名登录小技巧

    为了方便登录服务器,我们一般使用putty.SecureCRT等等工具.在终端如何通过服务器别名来进行登录呢? 可以创建~/.ssh/config 文件并为每台服务器指定登录信息和验证方法,如下所示: $ vim ~/.ssh/config Host www HostName www.ttlsa.com Port 22 User root IdentityFile ~/.ssh/id_rsa.pub IdentitiesOnly yes Host bbs HostName 115.28.45.1

  • 更改linux用户登录shell的操作方法

    1.查看机器安装了哪些shell? 有两种方法可以查看. 第一种: [rocrocket@wupengchong ~]$ chsh -l  /bin/sh /bin/bash /sbin/nologin /bin/zsh 第二种: [rocrocket@wupengchong ~]$ cat /etc/shells  /bin/sh /bin/bash /sbin/nologin /bin/zsh 其实chsh -l也是来查看这个文件. 2.查看当前正在使用的shell是哪个? [rocrock

  • Linux下实现免密码登录(超详细)

    1.Linux下生成密钥 ssh-keygen的命令手册,通过"man ssh-keygen"命令: 通过命令"ssh-keygen -t rsa" 生成之后会在用户的根目录生成一个 ".ssh"的文件夹 进入".ssh"会生成以下几个文件 authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥 id_rsa : 生成的私钥文件 id_rsa.pub : 生成的公钥文件 know_hosts

  • Linux配置远程SSH无密码登录

    本文实例为大家分享了jaLinux配置远程SSH无密码登录的方法,供大家参考,具体内容如下 系统:CentOS 6.8 主机1:192.168.0.177 主机2:192.168.0.178 工具介绍: ssh-keygen:创建公钥和密钥 ssh-copy-id:把生成的公钥复制到192.168.0.178主机上的authorized_keys文件上, ssh-copy-id也会给远程主机的用户主目录(/home)和/root/.ssh和/root/.ssh/authorized_key设置合

  • Linux学习第一天——ssh登录和软件安装详解

    操作环境: Ubuntu 16.04 in10系统,使用putty_V0.63 本身学习Linux就是想在服务器上使用的.实际情况,可能我很难直接到坐在服务器前,使用界面操作系统.事实上,界面对于服务器来说就是一个多于的内容.于是Linux的桌面就像一个程序一样,可以卸载.卸载后怎么用呢?使用shell命令.在哪里使用呢?当然是在遥远的另一方. 于是,我学习的第一个内容就是远程访问Linux系统,进行一系列操作. 远程访问方式很多,我不做孔乙己,所以随便选择一种简单点的入手. SSH(Secur

  • 教你如何修改Linux远程登录欢迎提示信息

    无论何时登录公司的某些生产系统,你都会看到一些登录消息.警告或关于你将登录或已登录的服务器的信息,如下所示.这些是登录导语login banner. 在本文中,我们将教你如何配置它们. 你可以配置两种类型的提示信息. 用户登录前显示的提示信息(在你选择的文件中配置,例如 /etc/login.warn) 用户成功登录后显示的提示信息(在 /etc/motd 中配置) 如何在用户登录前连接系统时显示消息 当用户连接到服务器并且在登录之前,这个消息将被显示给他.意味着当他输入用户名时,该消息将在密码

  • 详解linux SSH登录流程

    本文给大家详细介绍了ssh 密钥登录远程服务器流程和注意事项,以下是详细内容: 密钥登录比密码登录安全,主要是因为他使用了非对称加密,登录过程中需要用到密钥对.整个登录流程如下: 远程服务器持有公钥,当有用户进行登录,服务器就会随机生成一串字符串,然后发送给正在进行登录的用户. 用户收到远程服务器发来的字符串,使用与远程服务器公钥配对的私钥对字符串进行加密,再发送给远程服务器. 服务器使用公钥对用户发来的加密字符串进行解密,得到的解密字符串如果与第一步中发送给客户端的随机字符串一样,那么判断为登

  • 详解Linux使用shell+expect远程登录主机

    详解Linux使用shell+expect远程登录主机 最近使用Ubuntu系统想远程登录自己的vps主机,但是感觉自带的远程登录软件不太好使.于是乎想着怎么使用shell脚本来登录,于是Google之后整理了一下,记录一下,方便以后用到. 1.准备工作:安装expect for Ubuntu sudo apt-get update sudo apt-get install expect for Centos yum install expect 2.新建脚本粘贴以下内容 #!/usr/bin/

  • 详解Linux下的sudo及其配置文件/etc/sudoers的详细配置

    详解Linux下的sudo及其配置文件/etc/sudoers的详细配置 1.sudo介绍 sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等.这样不仅减少了root用户的登陆 和管理时间,同样也提高了安全性.Sudo不是对shell的一个代替,它是面向每个命令的. 它的特性主要有这样几点: § sudo能够限制用户只在某台主机上运行某些命令. § sudo提供了丰富的日志,详细地记录了每个用

  • 详解Linux中查看jdk安装目录、Linux卸载jdk、rpm命令、rm命令参数

    一.查看jdk安装目录 [root@node001 ~]# whereis java java: /usr/bin/java /usr/local/java #java执行路径 [root@node001 ~]# which java /usr/bin/java #查看JDK安装路径 [root@node001 ~]# echo $JAVA_HOME /usr/local/java/jdk1.7.0_80 [root@node001 ~]# echo $PATH /usr/local/sbin:

  • 详解linux 驱动编写(sd卡驱动)

    随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多.那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的? 1.代码目录地址 drivers/mmc 2.基本结构 从mmc的代码结构可以看得出,主要分为两个部分,其中core为协议部分,host为各个soc的适配部分 host是我们需要真正关心的代码 3.以s3c为例,观察makefile obj-$(CONFIG_MMC_SDHCI_S3C) += sdhci-s3c.o ...... obj-$(CONFIG_MMC_S3

  • 详解Linux索引节点inode

    1.inode简介 理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB).操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block).这种由多个扇区组成的"块",是文件存取的最小单位."块"的大小,最常见的是4KB,即连续八个 sector组成一个 block.文件数据都储

  • 详解Linux使用ss命令结合zabbix对socket做监控

    前言 这里我们使用zabbix对其进行监控,使用的是ss命令,不使用netstat命令,因为ss的速度快很多,不信的话可以去测一下哈,一台机器的socket越多,对比越明显.而且ss命令能显示更多的内容,其实我对这两个命令不是特别的熟悉,通过man ss可以看到: 一.ss命令 ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain socket

  • 详解Linux服务器最多能开放多少个端口

    目录 端口相关的概念: 端口与服务的关系 1:nmap工具检测开放端口 2:netstat 工具检测开放端口 3:lsof 工具检测开放端口 4:ss 工具检测开放端口 5: 使用telnet检测端口是否开放 6:netcat工具检测端口是否开放 关闭端口和开放端口 端口相关的概念: 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口,如RJ-45端口.SC端口等等.逻辑端口是指

  • 详解Linux 主机网络接入配置

    详解Linux 主机网络接入配置 前言: 网络配置是我们在安装好操作系统之后,需要解决的第一步.现时代没有接入网络的主机已然等同于一堆废铁.在网络配置的过程中,通常我们需要配置本机IP地址,缺省网关,DNS,主机名等等.本文主要描述在Linux环境下,主要以传统命令行方式讲解如何将主机接入网络.对于网路配置的新命令如ip,nmcli等等在以后的文章中描述. 一.网络配置概述 主机接入互联网前提:遵循TCP/IP协议栈 配置主机接入TCP/IP网络需要配置的内容:   IP/Netmask   路

  • 详解Linux命令中的正则表达式

    命令中的正则表达式 如果要在命令输出或文本中筛选内容时使用模糊查找,就需要使用正则表达式.正则表达式是一套由多个元字符组成的模糊查找模式,使用正则表达式可以快速查找和定位文本中指定的内容. 1.单字符匹配符.  正则表达式主要由一些元字符和匹配模式组成 单字符匹配符可以匹配任意单个字符,这个字符的功能和文件名匹配符中的?功能相同 使用正则表达式查找文本,首先需要使用元字符组成一个查找模式 (1)使用查找模式时,通常将其放入两个斜杠//中,然后再放入命令,例如要在一个文本中查找匹配模式/.i...

随机推荐