SSH是每一台Linux电脑的标准配置。

随着Linux设备从电脑逐渐扩展到手机、外设和家用电器,SSH的使用范围也越来越广。不仅程序员离不开它,很多普通用户也每天使用。

SSH具备多种功能,可以用于很多场合。有些事情,没有它就是办不成。本文是我的学习笔记,总结和解释了SSH的常见用法,希望对大家有用。

虽然本文内容只涉及初级应用,较为简单,但是需要读者具备最基本的"Shell知识"和了解"公钥加密"的概念。如果你对它们不熟悉,我推荐先阅读《UNIX / Linux 初学者教程》和《数字签名是什么?》。

=======================================

SSH原理与运用

作者:阮一峰

一、什么是SSH?

简单说,SSH是一种网络协议,用于计算机之间的加密登录。

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

最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信息全部加密,成为互联网安全的一个基本解决方案,迅速在全世界获得推广,目前已经成为Linux系统的标准配置。

需要指出的是,SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文针对的实现是OpenSSH,它是自由软件,应用非常广泛。

此外,本文只讨论SSH在Linux Shell中的用法。如果要在Windows系统中使用SSH,会用到另一种软件PuTTY,这需要另文介绍。

二、最基本的用法

SSH主要用于远程登录。假定你要以用户名user,登录远程主机host,只要一条简单命令就可以了。

  $ ssh user@host

如果本地用户名与远程用户名一致,登录时可以省略用户名。

  $ ssh host

SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。

  $ ssh -p 2222 user@host

上面这条命令表示,ssh直接连接远程主机的2222端口。

三、中间人攻击

SSH之所以能够保证安全,原因在于它采用了公钥加密。

整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。

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/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。

五、公钥登录

使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。

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

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

  $ ssh-keygen

运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。

运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

这时再输入下面的命令,将公钥传送到远程主机host上面:

  $ ssh-copy-id user@host

好了,从此你再登录,就不需要输入密码了。

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

  RSAAuthentication yes
  PubkeyAuthentication yes
  AuthorizedKeysFile .ssh/authorized_keys

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

  // ubuntu系统
  service ssh restart

  // debian系统
  /etc/init.d/ssh restart

六、authorized_keys文件

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

这里不使用上面的ssh-copy-id命令,改用下面的命令,解释公钥的保存过程:

  $ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

这条命令由多个语句组成,依次分解开来看:(1)"$ ssh user@host",表示登录远程主机;(2)单引号中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登录后在远程shell上执行的命令:(3)"$ mkdir -p .ssh"的作用是,如果用户主目录中的.ssh目录不存在,就创建一个;(4)'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是,将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

写入authorized_keys文件后,公钥登录的设置就完成了。

==============================================

关于shell远程登录的部分就写到这里,下一次接着介绍《远程操作和端口转发》。

(完)

SSH原理与运用:远程登录相关推荐

  1. kali linux通过ssh+putty来实现远程登录(亲测有效)

    kali linux通过ssh+putty来实现远程登录(亲测有效) 第一步:安装ssh:sudo apt-get install ssh(如果出现依赖问题,请安提示 安装之后再次进行测试) 第二步: ...

  2. 【安全知识】——SSH的两种远程登录方法详解

    作者名:Demo不是emo   主页面链接:主页传送门 博主简介:一个普通的大二学生,在CSDN写博客主要是为了分享自己的学习历程,学习方法,总结的经验等等,希望对大家有帮助 座右铭:不要让时代的悲哀 ...

  3. ubuntu 打开ssh登陆_Ubuntu 开启远程登录 SSH 的安装和配置

    SSH 为 SecureShell 的缩写,由 IETF 的网络工作小组(NetworkWorkingGroup)所制定:SSH 是一种安全协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全 ...

  4. SSH远程访问及控制——远程登录服务器并传输数据

    文章目录 一.SSH远程管理 1.SSH的概述 二.OpenSSH服务器 三.配置OpenSSH服务器 3.1.sshd_ config配置文件的常用选项设置 3.2.实例操作:配置文件的常用选项 3 ...

  5. 云原生——上云必读之SSH篇(常用于远程登录云服务器)

     " 文章通过通俗易懂的方式,介绍了SSH相关基本概念,有助于读者快速了解SSH." 传统网络服务程序缺点 传统网络服务程序(ftp/pop/telnet)在网络上用明文传送口令和 ...

  6. mac实现ssh的免密远程登录

    主要是在mac下利用自带的终端登录虚拟机中的ubuntu系统.用的是virtualbox,虚拟机网咯为NAT模式,设置端口转发,本机的10000对应虚拟机的22端口.22端口是ssh的默认端口.(如果 ...

  7. debian9 配置ssh 允许 root直接远程登录

    1,安装ssh-service apt install ssh 2,修改配置文件目录 vim /etc/ssh/sshd_config 3,修改如下 PermitRootLogin yes 4,重启服 ...

  8. cisco 请用ssh+3A认证取代telnet远程登录

    SSH 的安全性 SSH的英文全称为Secure Shell,它默认的连接端口是22.通过使用SSH,可以把所有传输的数据进行加密,这样类似上面的"中间人"***方式就不可能实现了 ...

  9. Linux之远程登录、远程拷贝命令 ssh scp

    Linux之远程登录.远程拷贝命令 ssh scp 1. 远程登录.远程拷贝命令的介绍 命令 说明 ssh 远程登录 scp 远程拷贝 2. ssh命令的使用 ssh是专门为远程登录提供的一个安全性协 ...

  10. debian 10安装ssh依赖openssh-client版本错误的解决办法及开启ssh远程登录设置

    安装 apt-get install openssh-server出现以下情况: 下列软件包有未满足的依赖关系: openssh-server : 依赖: openssh-client 依赖: ope ...

最新文章

  1. 万年历小程序(黑框)
  2. hdfs user 连接_通过API访问HDFS
  3. OpenCASCADE:使用 扩展数据交换XDE之形状和组件
  4. CRM One Order事件注册的准确位置
  5. ROC曲线与AUC区域的理解与实践
  6. python培训价目表-python培训费用多少?
  7. lombok的详细使用
  8. 9008刷机教程oppo_手机黑砖9006/9008救砖教程 通用救砖模式刷机修复方法
  9. DNS云学堂 | 行车不规范亲人两行泪,NS不规范运维两行泪
  10. windows 双开微信
  11. 企业邮箱客户端POP协议收信后,Webmail的邮件被删除,如何调整?
  12. edge保存页面html,Edge浏览器怎么保存网页 保存网页方法一览
  13. C#顺时针逆时针旋转图片
  14. jQuery带有动画的返回顶部
  15. AHRS和IMU的区别
  16. 妙控鼠标灵敏度太低怎么办
  17. 心电matlab,基于matlab检测心电信号
  18. PHP 验证码无法显示的问题
  19. 20220425二次型复习
  20. 太赫兹成像系统行业调研报告 - 市场现状分析与发展前景预测

热门文章

  1. 商汤科技通用视觉部门招聘算法研究类岗位(校招/社招/实习生)
  2. 流控制传输协议(SCTP)
  3. cgl证书(cgl证书查询官网)
  4. 蔚来汽车智能座舱Java面经(23 秋招提前批)
  5. ubuntu18.04安装PCL
  6. Android 四大组件之 Service_5_拦截电话号码
  7. 终于有人把云计算、大数据和 AI 讲明白了【深度好文】
  8. 论坛议程|COSCon'22 女性论坛(L)
  9. Android Base64的加密与解密
  10. VSCode安装教程(图文详解,简单搞定)