跳转至

笔记:ssh 相关

TODO: 重新整理一下再写,有点乱

SSH(Secure SHell)是一个网络协议,用于加密方式远程登录到服务器,以及在服务器之间进行加密的数据传输。

参考文献
  1. CSDN:ssh-keygen 的 详解
  2. 博客园:Linux ssh命令详解
  3. 知乎:一文彻底搞懂SSH连接过程

非对称加密

非对称加密是一种加密方法,它使用一对密钥:公钥私钥。公钥可以公开分享,而私钥则必须保密。基本性质有四条:

  1. 私钥加密的数据能被公钥解密
  2. 公钥加密的数据也能被私钥解密
  3. 公钥加密的数据不能被公钥解密
  4. 无法(或计算上不支持)从被加密数据中逆推出私钥

基于这四条性质,这个系统中能进行以下两件事:

  1. 加密:发送方使用接收方的公钥加密信息。只有拥有对应私钥的接收方才能解密这些信息。
  2. 数字签名:发送方使用自己的私钥对信息进行签名,并发布公钥。任何人都可以使用发送方的公钥来验证签名,确保信息的完整性和来源。

性质 2-4. 保证发送方的数据只能被接收方解密,只要安全地获取对方的公钥就能保证发出的信息只会被对方收到。当双方互相持有对方的公钥时,就能保证双方通信的安全性,从而保证了系统内通信的安全性。性质 1、4. 保证了接收方能够验证发送方信息的完整性,因为如果有人篡改了信息,无论是被签名的信息还是公钥,都会导致接收方无法解密,从而知道信息被篡改。

补充:数字签名只能确认信息的内容是发送方想要发送的内容,但发送方发送的内容是否可信是另一个问题,因此在大型网络中通常会引入第三方监察,诞生了 CA 证书机制来应对这一问题。

摘要算法

  1. 质询:

了解非对称加密和摘要算法后,下面的内容就非常简单了。

ssh

见参考文献 2.(有改动)

ssh 服务是一个守护进程(demon),系统后台监听客户端的连接,ssh 服务端的进程名为 sshd,负责实时监听客户端的请求(IP 22端口),包括公钥交换等信息。

ssh 服务端由2部分组成: openssh(提供 ssh 服务) 和 openssl(提供加密的程序)

服务器启动的时候自己产生一个公钥(768bit),本地的 ssh 客户端发送连接请求到 ssh 服务器,服务器检查连接点客户端发送的数据和 IP 地址,确认合法后发送公钥(768bit)给客户端,此时客户端将本地私钥(256bit)和服务端的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输

ssh-keygen

ssh-keygen 是一个用于生成、管理和转换认证密钥的工具,支持 RSA 和 DSA 两种密钥类型。

命令格式

ssh-keygen -t [rsa|dsa] [选项]

具体操作流程

  1. 登录客户机(如A机器)。
  2. 生成密钥对
ssh-keygen -t rsa

这会生成两个文件:id_rsa(私钥文件)和 id_rsa.pub(公钥文件)。

  1. 复制公钥到目标机(如B机器)的 .ssh 目录,并追加到 authorized_keys 文件中:
cat id_rsa.pub >> ~/.ssh/authorized_keys
  1. 设置文件和目录权限
chmod 600 authorized_keys
chmod 700 -R .ssh

确保 .ssh 目录和 authorized_keys 文件只有用户自己有写权限。

一些具体场景

单向登录

  • 目的:使客户机(A)能够无需密码登录到目标机(B)。
  • 操作:在客户机上生成密钥对,并将公钥复制到目标机的 authorized_keys 文件中。

双向登录

  • 目的:使两台机器能够互相无需密码登录。
  • 操作:在两台机器上分别生成密钥对,并将对方的公钥复制到自己的 authorized_keys 文件中。

权限设置

  • 目的:确保安全,防止未授权访问。
  • 操作:设置 authorized_keys.ssh 目录的权限,防止其他用户访问。

错误处理

  • 常见错误:权限设置不当、密钥未正确复制等。
  • 解决方法:检查权限设置,确保密钥文件正确复制到目标位置。

更新SSH密钥

  • 目的:更新密钥以增强安全性或修复权限问题。
  • 操作
ssh-keygen -t dsa
scp ~/.ssh/id_dsa.pub [YOUR_USER_NAME]@10.38.116.33:authorized_keys
ssh [YOUR_USER_NAME]@10.38.116.33

配置SSH客户端

  • 目的:简化SSH登录操作。
  • 操作:编辑 ~/.ssh/config 文件,添加以下内容:
host 10.38.116.33
user [YOUR_USER_NAME]

这样,你可以通过 ssh 10.38.116.33 直接登录,而不需要每次都输入用户名。