SSH学习笔记

登录的基本原理

非对称加密

SSH是基于非对称加密实现的。

非对称加密的特点

  • 秘钥由公钥跟私钥组成
  • 公钥会分发到需要发起通信的多个网络节点。图中的TopGun既是这样的节点
  • 私钥会存储在Server端,不会到处分发
  • 使用公钥加密的内容,只有私钥才能解密
  • TopGun发起通信时,使用公钥加密。即便被中间人截获,也无法解密内容,因为他没有私钥
  • Server使用私钥对密文进行解密,获得通信内容

SSH流程

  1. 第一次登陆时,remote server会将自己的公钥下发给client端。同时提示client如下信息

    The authenticity of host 'ssh-server.example.com (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)? 
    

    客户端选yes后,会将远程主机的host, ip,公钥放置到自己的.ssh/known_hosts文件中,这使得后续登录,可以省去第一步。一个典型的know_hosts文件样例

    ldn01.jamieweb.net,139.162.222.67 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4bVleGrAZFttdMBen/ExLWbUUr5UaaX3Wd8U4nwH6LEaOMxuYu2cyrBuwIVZ9gjSoI0fEWhe345HeQJbdNzE/rd5ojebtS9bQiAB9+GVNKHxemBP01M0OaZJVA/GJnSzjdoEfrCGG8SWIDPQjY02yTQwgQHW5zYlr12Hq3FjKzofJ1Q2PSWbCy3crsA/R4vPHRVLPd8RDj+EXWVwvFgTHriuQWnt9Q/djy1LOPrqNgHn1n17cIED1M0zgXpImoLNC+Z44DmopVdmtwRW57IkedktWQdpCNRYTyOj/as/xn5YStXIWwxila16NYeq6O7zqoedWPiad6qnFloobOcft
    nyc01.jamieweb.net,157.230.83.95 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8Gh3exdEvvWqZHdbBogN3kbfutx3af0oO9dof1L+4vFsA8xmMOURjdB/BF9uF44i+1yosOhxh+k0Kjgeo0JAjPWy8e94SpEn2oUFJ3/9y1QzpWR81aAi/B9gSX9KR6uDys1yIhjjBKE0omP6vvSSVndY7BkxXnxBsmvWqeCWP59tFFDVFADG4FLRQW6IPUlD3mJLXxzsbsBUP4x67TAFeHynL/ZyImSlHXWBow3hWopwPouqQpkcIcUZxdt8zR9xmAiEwk8wUDWQg5aMoYp2a8zy7fuUL6PXyomRpoVWKHyZposl1cmST88NXjK+J14oWPHzKAd7zcY29XOXSbKnR
    
  2. 客户端基于该公钥,加密自己的登录密码,发送给remote server 。 remote server基于自己的私钥,解密消息,获得client发送的密码,完成认证。由于私钥只有server端有,所以即便中间人攻击,拿刀消息,也无法解密获取client发送的密码

安全风险

在第一次登录时,server下发自己的公钥,client需要信任并存储该公钥,这一步如果被中间人攻击,中间人下发了自己的公钥。从而能够获取到client的登录密码, 中间人再作为client去跟remote server完成登录

公钥免密登录

前面SSH登录中,每次都要输入自己的密码,很繁琐。可以继续利用非对称加密的原理。client自己也生成一组密钥对。将公钥上传至remote server。这样client和server双方,彼此都有一组公私密钥对,整个登录过程,都可以加密进行,而不需要密码。具体步骤。

配置步骤

client使用ssh-keygen命令,生成一组公私密钥对。生成后一般在.ssh文件夹下,其中id_rsa为私钥,id_rsa.pub为公钥,将公钥上传至remote server 。这一步仅需做一次。

client的公钥上传后,一般存在server 端的/.ssh/authorized_keys文件中。

将公钥上传至server 的authorized_keys文件的方法有几种

  • 方式1,直接将公钥内容,拷贝到server的.ssh/authorized_keys文件中去。拷贝可以使用命令ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub,也可以直接登录到server,然后手动编辑authorized_keys文件。
  • 方式2,使用命令ssh-copy-id user@host

登录认证步骤

  1. Client将自己的公钥存放在Server上,追加在文件authorized_keys中。
  2. Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey(R)
    ,然后将加密后信息发送给Client。
  3. Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
  4. Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
  5. Server端会最后比较Digest1和Digest2是否相同,完成认证过程。

ssh服务的管理

.ssh目录结构

.ssh 文件像user的.profile一样,是跟用户相关的。也即root和ops这两个用户,其.ssh的路径和其下的内容是不一样的。.ssh文件的目录结构

  • id_rsa 私钥
  • id_rsa.pub 公钥
  • known_hosts 存储了本机做为client,与多个server通信时,多个server的公钥
  • authorized_keys 存储了本机作为server时,多个client的公钥,以使得client能免密登录

centos中ssh守护进程的管理

查询守护进程的状态service sshd status
重启service sshd restarts
启动service sshd start
停止service sshd stop

一般更改了/etc/ssh/sshd_config文件,则需要重启sshd服务

一些远程登录的配置异常

错误1

 Authentication refused: bad ownership or modes for file /somepath/.ssh/authorized_keys

这个错误的原因是,SSH server会在有登录访问请求时,检查authorized_keys文件的权限是否配置正确,具体来说,就是不能开放给除当前用户意外的其它用户写权限。所以解决办法很简单。确认下authorized_keys文件的group和Others是否写权限,有的话,直接去掉

chmod g-w authorized_keys

之所以有这个限制原因是,一个.ssh文件应该只跟对应的用户相关,相当于用户的profile,该文件的编辑权限,应该只有当前用户,和root可以去编辑。而不能允许其它用户去编辑,否则其它用户可以很容易的添加一些不恶意的client的公钥到该文件,使得恶意的client可以登录到该server。

当然,你可以不改authorized_keys的权限,而是把/etc/ssh/sshd_config配置文件中的StrictModes 设为no ,从而使得sshd不对文件的权限做校验,但非常不建议这么做。

参考链接

https://www.jianshu.com/p/33461b619d53
https://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
https://www.daveperrett.com/articles/2010/09/14/ssh-authentication-refused/
https://tldp.meulie.net/en/solrhe/chap15sec122.html

原文地址:https://www.cnblogs.com/niceshot/p/13019823.html