SSH学习笔记

来源:互联网 发布:吃奶酪 知乎 编辑:程序博客网 时间:2024/06/18 04:46

使用SSH从前端机下载MR处理后的日志,发现在日常工作中,只是会用却不了解其背后的交互。所以花点时间记录一下。

SSH基础理解

It is not a command interpreter, nor does it provide wildcard expansion, command history, and so forth. Rather, SSH creates a channel for running a shell on a remote computer, in the manner of the Unix rsh command, but with end-to-end encryption between the local and remote computer.

一、基础组成

- client、client-user- server、server-user

如果client和server端用户相同,那么-l参数可以省略,也可以写成下面这样子:

# 1.ssh -l pat shell.isp.com# 2. ssh pat@shell.isp.com

二、SSH验证的简单介绍

An RSA key consists of two parts: the exponent and the modulus. The modulus is the long number in the public key (.pub) file

- client向server端请求(用户A想访问server系统下的账户B),该请求中包含public-key的modulus- server读取B账户,查找是否存在匹配的public-key。如果不存在,请求失败。- server端生成一个256 bit的字符串,用匹配的public-key加密发给client- client端用自己的私钥解密数据,然后和当前的session identifier HASH生成md5值发给server- server重新计算md5值,跟client进行比较

整个过程中client端的private key别用于向server端证明身份。同时我们有必要保证private key的安全,最好在生成的时候指定密码。

三、注意事项

如果第二次运行ssh-keygen导致identity和identity.pub被覆盖,是一件很头疼的事情
  1. 你其实可以生成任意多个key pair,
  2. 如果你仅仅是想修改密码,那就仅仅修改密码,不需要覆盖当前的key pair
ssh-keygen -p       //ssh1ssh-keygen -e       //ssh2
  1. ssh过程中查看具体原因
ssh -v shell.com

四、概括

数据完整性(reply attack)

因为数据加密的缘故,对手并不能自己生成数据包。但却可以监听通道,拷贝你发送的数据包,之后重新回复,类似于接口防重放。因此,数据完整性还要应用于整个数据流。

五、之前混淆的地方

  1. clinet免密码登录server,应该由哪一方生成公私钥,并放到哪一方呢?

    client生成公私钥,并将id_rsa.pub中公钥的内容拷贝到server端。 
  2. client ssh登录server端,术语称为公钥登录。如下几步【之前的错误理解】:

    • 用户将自己的公钥存储在远程主机
    • 登录的时候,远程主机向用户发送一段随机的字符串,用户用自己的私钥“签名”后再发送回来。
    • 远程主机用事先存储的公钥进行解密。如果成功,证明用户可信,直接登录。
    • 客户端私钥加密主要用于验证客户端的身份。
    • 远程主机是如何查找对应的解密公钥的?有一种说法是说:公钥是远程主机请求时携带的。

执行的指令:

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

ssh-keygen基本用法

使用 ssh-kengen 会在~/.ssh/目录下生成两个文件,不指定文件名和密钥类型的时候,默认生成的两个文件是:

  • id_rsa
  • id_rsa.pub

第一个是私钥文件,第二个是公钥文件。生成ssh key的时候,可以通过 -f 选项指定生成文件的文件名,如下:

> ssh-keygen -f test -C "test key" 

如果没有指定文件名,会询问你输入文件名:

> ssh-keygenGenerating public/private rsa key pair.Enter file in which to save the key (/home/huqiu/.ssh/id_rsa):

你可以输入你想要的文件名,这里我们输入test。输入之后,会询问你是否需要输入密码。输入密码之后,以后每次都要输入密码。请根据你的安全需要决定是否需要密码,如果不需要,直接回车:

> ssh-keygen -t rsa -f test -C "test key"Generating public/private rsa key pair.Enter passphrase (empty for no passphrase):Enter same passphrase again:

结果

> ll test*testtest.pub

备注:

上面生成的命令中,-C选项是公钥文件中的备注:

文件的权限

为了让私钥文件和公钥文件能够在认证中起作用,请确保权限正确。对于.ssh 以及父文件夹,当前用户用户一定要有执行权限,其他用户最多只能有执行权限。对于公钥和私钥文件也是: 当前用户一定要有执行权限,其他用户最多只能有执行权限。

known_hosts

被设计用来避免中间人攻击(对手修改client本地的naming server)但从技术上说,除非管理员手动将可信任的server添加到know host,否则还是无法避免攻击(第一次用户确认信任,但却是一个目前可以别接受的)

known hosts机制主要用于ssh开始时client验证server身份。因为server端有一个host key
作为唯一的ID,用于给客户端标识自己的身份。

Host key not found from the list of known hosts.Are you sure you want to continue connecting (yes/no)?

用户回答yes之后,客户端就会将服务端的host key存储到用户的known_host文件中。

 WARNING: HOST IDENTIFICATION HAS CHANGED! 

对于server标识被修改的情况,为了避免被攻击,ssh不会自动更新known host,需要用户手动来确认更新。

参考文章:
[1]. https://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch02_03.htm

[2]. https://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch03_04.htm

0 0