学习:深入了解SSH

ssh

有商业和开源版本,其中openssh是开源中最流行的。

ssh历史

1995 年 7 月, 芬兰学者Tatu Ylonen 以免费软件的形式将一套保护信息传输的程序(也就是 SSH )发布出去。程序很快流行,到年底已经有两万用户,遍布五十国家。所以在年底时,他创立了 SSH 通信安全公司来继续开发和销售 SSH,所以它变成了专有软件。在 1999 年,瑞典程序员基于 SSH 最后一个开源的版本 1.2.12 开发了 OSSH,之后 OpenBSD 开发者在 OSSH 的基础上进行大量修改,形成了 OpenSSH,它是目前唯一一种最流行的 SSH 实现,成为了所有操作系统的默认组件。

用法

生成密钥

ssh-keygen

用生成、管理和转换身份验证密钥。

参数说明:

  • -b bits 指定要创建的秘钥中的位数,默认 2048 位,值越大,密码越复杂
  • -C comment 注释,在 id_rsa.pub 中末尾
  • -t rsa/dsa等 指定要创建的秘钥类型,默认为 RSA
  • -f filename 指定公私钥的名称,会在 $HOME/.ssh 目录下生产私钥 filename 和公钥 filename.pub
  • -N password 指定使用秘钥的密码,使得多人使用同一台机器时更安全

常用命令:

# 生成公私钥,默认文件为 ~/.ssh/id_rsa
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" id_rsa:私钥
id_rsa.pub:公钥

管理私钥

ssh-agent和ssh-add

用于管理私钥,一般情况下会使用ssh-keygen生成的(没有密码的)私钥作为默认私钥,此时没有必要使用ssh-agent,当出现以下两种情况时则需要使用:

  • 使用不同的私钥连接不同的主机时,需要手动指定对应的私钥。(ssh-agent能帮助选择对应的私钥进行认证)
  • 当私钥设置了密码时,又需要频繁的使用私钥进行认证。(ssh-agent能帮助免去重复输入密码)
# 启动代理
eval `ssh-agent`
# 关闭代理
ssh-agent -k
# 在 ~/.bashrc 中加入以下来实现登陆自动启动 ssh-agent,退出自动 kill 掉程序
eval $(ssh-agent -s) > /dev/null
trap 'test -n "$SSH_AGENT_PID" && eval `/usr/bin/ssh-agent -k` > /dev/null' 0 # 查看代理中的私钥
ssh-add -l
# 查看代理中私钥对应的公钥
ssh-add -L
# 移除指定的私钥
ssh-add -d /path/of/key/key_name
# 移除所有的私钥
ssh-add -D

发送公钥

ssh-copt-id

在登陆时,将公钥放在(绑定)要登陆的服务器上。(云服务器大都默认关闭密钥登陆 PasswordAuthentication no)

# 发送公钥的两种方式(等价)
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

登陆

登陆配置

SSH 登陆服务器需要知道服务器的主机地址(主机名或主机 IP 地址),用户名和密码,有时还要指定端口号(默认 22 ),一般使用的登陆命令如下:

# 登陆目标服务器( 172.17.132.120 )
ssh -p 58422 user@172.17.132.120
# 通过跳板机登陆目标服务器( 172.17.132.120 )
ssh -p 58422 user@jumper.example.com ssh user@172.17.132.120
# 端口映射
ssh -p 58422 user@jumper.example.com -fNL 5433:172.17.132.120:5432 -N

通过设置$$HOME/.ssh/config$ ,可以使用别名直接登陆。

# 登陆目标服务器( 172.17.132.120 )
ssh target
# 通过跳板机登陆目标服务器( 172.17.132.120 )
ssh jump_target
# 端口映射
## 登陆时通过 LocalForward 配置
ssh jump_target
## 使用-L来实现本地端口映射
ssh -C -N -g -L 5433:127.0.0.1:5432 jump_target # 通用配置,所有配置都使用
Host *
AddKeysToAgent yes # 将私钥添加到ssh-agent中
UseKeychain yes # 保存密码到agent中
ServerAliveInterval 10 # 连接心跳间隔10s
ServerAliveCountMax 3 # 重连次数为3
# target配置
Host target
HostName 172.17.132.120
User user
Port 58422
IdentityFile ~/.ssh/id_rsa
# 跳板机配置
Host jumper
HostName jumper.example.com
User user
Port 58422
IdentityFile ~/.ssh/id_rsa
Host jump_target
HostName 172.17.132.120
User user
Port 22
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh user@jumper -W %h:%p 2>/dev/null
LocalForward 5433 localhost:5432 # 本地5433映射到jump_target的5432

一般在做远程开发时,VS Code 的 Remote 插件会读取本地的配置文件 $HOME/.ssh/config,所以可以在本地匹配好,直接登陆。

首次登陆

一般在 $HOME/.ssh 目录下除了公私钥文件,config 配置文件,authorized_keys 认证文件外,还有一个 known_hosts 文件, 这个文件记录了远程主机 ip 和远程主机对应的公钥指纹

我们在第一次登陆(密码或秘钥登陆)服务器时,会有如下的提示界面:

### SSH 首次登陆的提示
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:HosOqhcUmbB7QG81yCuDPkvxTgot+vpple+czXPrEug.
ECDSA key fingerprint is MD5:fd:d7:e1:2c:42:4e:b4:2d:a3:21:4d:d1:c4:74:64:2d.
Are you sure you want to continue connecting (yes/no)?

此时 known_hosts 并没有 127.0.0.1 这台机器的指纹信息,所以显示这个提示来让我们确认这个指纹是否是目标机器的 ECDSA 算法的指纹。 当我们输入 yes 确认后,在下次登录的时候,远程主机发送过来的公钥指纹,直接和 known_hosts 文件中对应 ip 的公钥指纹比较即可。

# 本机查看服务器 172.17.132.120 的所有公钥(要与服务器上 /etc/ssh 下面的公钥 *.pub 一致)
ssh-keyscan -p 22 172.17.132.120 # 查看服务器公钥 ecdsa 的指纹 -E md5/sha256 指纹 hash 算法
ssh-keygen -E md5 -lf /etc/ssh/ssh_host_ecdsa_key.pub
## 256 MD5:84:3d:9c:6e:75:f2:6b:b2:0b:40:aa:d6:29:2f:b4:40 no comment (ECDSA)
## 256 SHA256:ZoGnph63gnKLC9wQYrHYVU8ROTf6+K9LKAjn+jrXB2o no comment (ECDSA) # 从客户端查看服务器公钥 ecdsa 的指纹(初次登陆时要验证的指纹)
ssh-keyscan -t ecdsa -p 22 172.17.132.120 |ssh-keygen -lf - # 公钥转换成特定指纹 hash 算法的指纹
awk '{print $2}' /etc/ssh/ssh_host_ecdsa_key.pub | base64 -d|openssl sha256 -binary |base64

known_hosts 这个文件是客户端验证服务端身份的重要依据。每次客户端向服务端发起连接请求时,不仅服务端要验证客户端的合法性,客户端也需要验证服务端的身份。

客户端就是通过 known_hosts 中的公钥指纹来验证服务器是否发生了变化,它在一定程度上能避免中间人攻击,除了第一次登陆,因为那时 known_hosts 中还没有服务器的身份信息,所以对于首次提示的登陆指纹信息还是需要和服务器比对,最安全保险的做法是第一次登陆就使用秘钥登陆。

登录流程

  1. 版本号协商阶段
  2. 密钥和算法协商阶段
  3. 认证阶段
  4. 会话请求阶段
  5. 会话交互阶段

登陆方式分为密码登陆和密钥登录。

  • 密码登陆
  1. 客户端使用密钥和算法协商阶段生成的会话密钥加密账号和密码(口令)、认证方式,将结果发送给服务器。
  2. 服务端使用获得的会话密钥解密报文,得到账号和口令。
  3. 服务端对这个账号和口令进行判断,如果失败,向客户端发送认证失败报文,其中包含了可以再次认证的方法列表。
  4. 客户端从认证方法列表中选择一种方法进行再次认证。
  5. 这个过程反复进行,直到认证成功或者认证次数达到上限,服务端关闭本次TCP连接。

  • 密钥登录
  1. 客户端使用密钥和算法协商阶段生成的会话密钥加密账号、认证方法、id_rsa.pub,将结果发送给服务端。
  2. 服务端使用会话密钥解密报文,得到账号、id_rsa.pub。服务端在 $HOME/.ssh/authorized_keys 中找对应的公钥,如果没有找到,发送失败消息给客户端;如果找到,比较客户发送过来的这个公钥和找到的公钥,如果内容相同,服务端生成一个随机的字符串,简称“质询”,然后使用找到的公钥加密这个质询,然后使用会话密钥再次加密
  3. 服务端把这个双重加密的数据发送给客户端。
  4. 客户端使用会话密钥解密报文,然后使用 id_rsa 再次解密数据,得到质询。
  5. 客户端使用会话密钥加密质询,发送给服务端。
  6. 服务端使用会话密钥解密报文,得到质询,判断是不是自己生成的那个质询,如果不相同,发送失败消息给客户端,如果相同,认证通过。

免密安全传输

scp/rsync/sftp 都可以基于 SSH 来进行免密安全传输。

# 从本地同步 src.tar.gz 文件到远程服务器 jump_target 的目录 /path/to/des/
scp src.tar.gz jump_target:/path/to/des/
rsync -avz src.tar.gz jump_target:/path/to/des/
sftp登录 & lcd src.tar.gz /path/to/des # 从远程服务器 jump_target 的文件 /path/to/src.tar.gz 到本地
scp jump_target:/path/to/src.tar.gz .
rsync -avz jump_target:/path/to/src.tar.gz .
sftp登录 & put /path/to/des/src.tar.gz

深入了解SSH的更多相关文章

  1. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  2. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  3. 记录一则Linux SSH的互信配置过程

    需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置登录用户的互信 1.各节点ssh-keygen生成RSA密钥和公钥 ssh-keygen -q -t rsa -N ...

  4. SSH免手动输入密码和设置代理

    通过使用sshpass将密码写入命令里,直接执行,免去手动密码输入的步骤命令如下: sshpass -p password_abc ssh user_abc@ssh_host -p ssh_port ...

  5. github免输用户名/密码SSH登录的配置

    从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...

  6. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  7. mac下生成ssh keys 并上传github仓储

    使用github仓储需要本机生成一个公钥key 添加到自己的git账户SSH keys中   mac 生成方法:   1. 打开终端 输入   ssh-keygen 然后系统提示输入文件保存位置等信息 ...

  8. Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)

    第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...

  9. 树莓派3B的食用方法-1(装系统 网线ssh连接)

    首先要有一个树莓派3B , 在某宝买就行, 这东西基本上找到假货都难,另外国产和英国也没什么差别,差不多哪个便宜买哪个就行. 不要买店家的套餐,一个是配的东西有些不需要,有的质量也不好. 提示:除了G ...

  10. linux启动SSH及开机自动启动

    本文地址 分享提纲: 1.查看是否启动 2. 设置自动启动 1.[查看是否启动] 启动SSH服务 “/etc/init.d/sshd start”.然后用netstat -antulp | grep ...

随机推荐

  1. 基于Java+SpringBoot心理测评心理测试系统功能实现四

    一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...

  2. Groovy基础语法!

    Groovy是什么语言? Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python.Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好 ...

  3. 低功耗4G模组Air780E快速入门:固件的远程升级

    ​ 今天我们学习Air780E快速入门之固件的远程升级,小伙伴们,学起来吧! 一.生成差分包 合宙的远程升级支持使用合宙云平台和自建服务器,此例程使用的是合宙云平台. 1.1 准备新旧版的core和脚 ...

  4. 什么是静态方法?@staticmethod装饰器怎么用?

    填坑(@staticmethod装饰器----静态方法声明) > 在学习的时候看到很多人都在用@Staticmethod这个装饰器来修饰类方法,这就让我好奇了这个独特的装饰器到底是个啥?咋就受到 ...

  5. Struts2漏洞复现

    Struts2漏洞复现 靶场环境:/vulhub/struts2大多都是OGNL注入 是什么: Struts2是一个基于MVC设计模式的Web应用框架 识别: 1.通过网页后缀来进行判断,如.do或者 ...

  6. 关于template标签用法总结(含vue中的用法总结)

    一.html5中的template标签html中的template标签中的内容在页面中不会显示.但是在后台查看页面DOM结构存在template标签.这是因为template标签天生不可见,它设置了d ...

  7. Vue.js 组件数据交互

    1.前言 本节讲述组件之间如何进行数据交互 2.props属性与非 prop 的属性 父组件通过属性绑定的形式传值给子组件,这种传值分2种 类别 含义 说明 props 子组件本身已经通过props定 ...

  8. .NET Core 基于 IHostedService 实现后台定时任务

    .NET Core 基于 IHostedService 实现后台定时任务 迷恋自留地 NET Core 2.0 引入了 IHostedService ,基于它可以很方便地执行后台任务,.NET Cor ...

  9. 虚拟机 ubuntu18 树莓派4 QT5.14.2 交叉编译

    编译过程主要参考了 <为树莓派4交叉编译QT5.14.2(带EGLFS支持)>,可以按照教程一步一步进行,在整个过程中,有2个地方需要注意. 1. sudo rpi-update 因为网络 ...

  10. 鸿蒙UI开发快速入门 —— part09: 应用级状态管理LocalStorage & AppStorage

    1.说在前面的话 前面几个章节中介绍的装饰器(@State.@Props.@Link.@Provide.@Consume.@Observed.@ObjectLink)仅能在页面内,即一个组件树上共享状 ...