SSH笔记

server/2025/2/5 2:53:37/

文章目录

  • SSH笔记
    • 一、远程登录相关命令
    • 二、SSH远程登录服务器认证过程
    • 三、两种认证方式安全性对比
    • 四、ssh远程连接配置文件
      • 4.1 配置文件位置
      • 4.2 客户端配置

SSH笔记

一、远程登录相关命令

  1. 远程登录命令ssh

    1. 一般格式
      ssh [-p port] [user@]remotehost
      
    2. 使用默认端口号22时,可以省略端口号
      ssh [user@]remotehost
      
    3. 如果本地登录账户的用户名与远程服务器上的用户名一致时,user@也可以省略
      ssh remotehost
      
  2. 密钥生成命令ssh-keygen

    1. 命令:ssh-keygen
    2. 功能描述:生成一对密钥,私钥默认保存在${HOME}/.ssh/id_rsa中,公钥默认保存在${HOME}/.ssh/id_rsa.pub中。
  3. 公钥拷贝命令ssh-copy-id

    1. 命令:ssh-copy-id [user@]remotehost
    2. 功能描述:将默认的公钥${HOME}/.ssh/id_rsa.pub拷贝到远程服务器的认证文件${HOME}/.ssh/authorized_keys

二、SSH远程登录服务器认证过程

  1. 版本号协商阶段

    1. 服务端打开端口22,等待客户连接
    2. 客户端通过三次握手向服务端发起TCP连接,连接建立后,服务端向客户端发送第一个报文,包括版本标志字符串,格式为“协议版本号 次协议版本号 软件版本号”。
    3. 客户端收到报文后,解析协议版本号,如果服务端的协议版本号比自己的低,且客户端能支持服务端的低版本,就使用服务端的协议号,否则使用自己的协议版本号。
    4. 客户端回复服务端一个报文,包含了客户端决定使用的协议版本号。
    5. 服务端比较客户端发过来的版本号,决定是否能同客户端交互。
    6. 如果协商成功,就进入密钥和算法协商阶段。否则服务端断开TCP连接。
  2. 密钥和算法协商阶段

    1. 服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表,加密算法列表,MAC(Message Authentication Code,消息验证码)算法列表,压缩算法列表等。
    2. 和版本协商阶段类似,服务器端和客户端根据自己和对端支持的算法来决定最终要使用的各个算法。
    3. 服务器端和客户端利用Diffie-Hellman密钥交换算法,主机密钥对等参数,生成共享的会话密钥和会话ID。会话密钥用于在后续的通信过程中两端对传输的数据进行加密和解密,而会话ID用于认证过程。
  3. 认证阶段

    1. 方式一:基于账号和口令的验证方式
      1. 服务端收到客户端的请求后,如果客户端没有服务端的公钥,服务端将自己的公钥使用共同的会话密钥加密,然后发送给客户端。客户端使用共同的会话密钥解密,然后将服务端公钥保存在${HOME}/.ssh/known_hosts文件中。
        • 因为该过程可能不安全,客户端不能确定给他发公钥的是真正的服务端,所以第一次连接时会显示一条警告消息,并展示客户端收到的公钥的指纹。客户端需要使用其他方式确认该公钥的正确性。 展示公钥指纹并询问是否继续
      2. 客户端用户服务端公钥加密用户密码等信息,然后又用共享的会话密钥加密密文,发送给服务端。
      3. 服务端分别用共享的会话密钥和私钥解密收到的密文,得到客户端发过来的用户密码等信息,用来验证其合法性。然后用共享的会话密钥加密验证成功或失败的信息,将其发送给客户端。
      4. 客户端用共享的会话密钥解密密文,如果验证成功,则认证成功,否则继续认证,直至达到认证失败上限。
    2. 方法二:基于公钥和私钥的验证方式
      1. 服务端收到客户端的请求后,如果客户端没有服务端的公钥,服务端将自己的公钥使用共同的会话密钥加密,然后发送给客户端。客户端使用共同的会话密钥解密,然后将服务端公钥保存在${HOME}/.ssh/known_hosts文件中。
        • 因为该过程可能不安全,客户端不能确定给他发公钥的是真正的服务端,所以第一次连接时会显示一条警告消息,并展示客户端收到的公钥的指纹。客户端需要使用其他方式确认该公钥的正确性。 展示公钥指纹并询问是否继续
      2. 客户端生成自己的公钥和密钥,然后将自己的公钥通过某种方法发送给服务端,服务端保存客户端的公钥在${HOME}/.ssh/authorized_keys文件中
        • 这个过程对服务器来说不安全,服务器不确定给他发公钥的是真正的客户端
        • 方法1:使用命令ssh-copy-id
        • 方法2:手动复制
      3. 服务器使用客户端的公钥加密一个256位的随机字符串,然后用共享的会话密钥加密后发给客户端。
      4. 客户端分别使用共享的会话密钥和自己的私钥加密信息。得到字符串之后将字符串和会话id合并在一起,使用MD5得到一个散列值,分别用服务器公钥和共享的会话密钥加密后发给服务器
      5. 服务器解密后得到一个MD5的散列值,服务器自己也用MD5算法计算自己手中的随机字符串和会话id的散列值,两个值比较,如果相同,则认证成功
  4. 其他阶段

三、两种认证方式安全性对比

  1. 在第二阶段,使用Diffie-Hellman算法交换密钥的时候,可能受到中间人攻击(可以参考《计算机网络第五版》第八章8.7小节)
  2. 认证阶段,第一次在服务器传输公钥该客户端时,可能会被截取,用泄漏风险。之后:
    1. 如果使用账号和口令认证,账号和密码会被加密传输,可能会被解密
    2. 如果使用共享公钥的验证方式,不会有其他敏感信息被传输,不会被中间人攻击,所以更安全

ssh_70">四、ssh远程连接配置文件

4.1 配置文件位置

  1. 客户端

    1. ${HOME}/.ssh/id_rsa:客户端私钥文件
    2. ${HOME}/.ssh/id_rsa.pub:客户端公钥文件
    3. ${HOME}/.ssh/known_hosts:保存服务器端公钥的文件,第一次连接时,会验证服务器端公钥,同意之后将其保存在这个文件内。
    4. ${HOME}/.ssh/config:用户配置文件
    5. /etc/ssh/ssh_config:全局配置文件
  2. 服务器端

    1. ${HOME}/.ssh/authorized_keys:公钥认证文件,存放客户端公钥,用于共享公钥的验证方式
    2. /etc/ssh/sshd_config:全局配置文件

4.2 客户端配置

  1. 配置文件生效优先级
    1. 命令行输入参数
    2. 用户配置文件${HOME}/.ssh/config
    3. 系统配置文件/etc/ssh/ssh/config
  2. 配置方法
    1. SSH的配置文件采用空格分割的键值形式。例如Host localhost表示键Host对应的值为localhost,常见键值对如下
      • Host: 值为通配符的模式(Pattern);该键之后的键值对,将用于匹配于该模式的主机
      • HostName: 值为真实的目标远程主机名;在值中,%h可用于命令行接收到的主机名字的转义
      • User: 值为希望登录的远程主机的用户名
      • IdentityFile: 值为希望登录时使用的密钥文件
      • Port: 值为希望登录时指定的端口号
    2. 标签
      • %%: A literal ‘%’.(转义%)
      • %C: Hash of %l%h%p%r.
      • %d: Local user’s home directory.(本地用户的家目录)
      • %h: The remote hostname.(远程主机名,Hostname部分)
      • %i: The local user ID.(本地用户id)
      • %L: The local hostname.(本地hostname)
      • %l: The local hostname, including the domain name.
      • %n: The original remote hostname, as given on the command line.
      • %p: The remote port.(远程端口号)
      • %r: The remote username.(远程用户名)
      • %T: The local tun(4) or tap(4) network interface assigned if tunnel forwarding was requested, or “NONE” otherwise.
      • %u: The local username.(本地用户名)
    3. 例子
      # 旧电脑
      # ssh guoke10086
      # 相当于
      # ssh -p 20785 -i /home/guoke-master/.ssh/id_rsa_guoke10086 guoke10086@guoke.uicp.top
      Host guoke10086HostName guoke.uicp.topUser guoke10086Port 20785IdentityFile /home/guoke-master/.ssh/id_rsa_guoke10086
      

http://www.ppmy.cn/server/165052.html

相关文章

C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?

匿名方法本质上是一种没有显式名称的方法,它可以作为参数传递给需要委托类型的方法,常用于事件处理、回调函数等场景,能够让代码更加简洁和紧凑。 使用场景 事件处理:在处理事件时,不需要为每个事件处理程序单独定义…

循环神经网络(RNN)+pytorch实现情感分析

目录 一、背景引入 二、网络介绍 2.1 输入层 2.2 循环层 2.3 输出层 2.4 举例 2.5 深层网络 三、网络的训练 3.1 训练过程举例 1)输出层 2)循环层 3.2 BPTT 算法 1)输出层 2)循环层 3)算法流程 四、循…

五、定时器实现呼吸灯

5.1 定时器与计数器简介 定时器是一种通过对内部时钟脉冲计数来测量时间间隔的模块。它的核心是一个递增或递减的寄存器(计数器值)。如果系统时钟为 1 MHz,定时器每 1 μs 计数一次。 计数器是一种对外部事件(如脉冲信号&#xff…

【huawei】云计算的备份和容灾

目录 1 备份和容灾 2 灾备的作用? ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点(RPO,Recoyery Point Objective) ② 应用恢复时间(RTO,Recoyery Time Objective) 4…

aws(学习笔记第二十七课) 使用aws API Gateway+lambda体验REST API

aws(学习笔记第二十七课) 使用aws API Gatewaylambda体验REST API 学习内容: 使用aws API Gatewaylambda 1. 使用aws API Gatewaylambda 作成概要 使用api gateway定义REST API,之后再接收到了http request之后,redirect到lambda进行执行。…

【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点

学习PyQt的必要性 PyQt是开发跨平台GUI应用的强大工具,适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求,学习PyQt都具有重要意义。 1. 跨平台GUI开发 跨平台支持:PyQt基于Qt框架,支持Windows、macOS、Linux…

【景区导游——LCA】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e5 10; const int M 2 * N; int p[N][18], d[N], a[N]; ll dis[N][18]; //注意这里要开long long int h[N], e[M], ne[M], idx, w[M]; int n, k; void add(int a, int b, …

list容器(详解)

list的介绍及使用&#xff08;了解&#xff0c;后边细讲&#xff09; 1.1 list的介绍&#xff08;双向循环链表&#xff09; https://cplusplus.com/reference/list/list/?kwlist&#xff08;list文档介绍&#xff09; 1. list是可以在常数范围内在任意位置进行插入和删除的序…