zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    基于 Docker 安装 RocketMQ
    167. 两数之和 II
    阿里云的使用
    自动关机程序
    C语言学习关于数据类型的一些知识点(初学者)
    关于C语言学习的一些感想(初学者)
    c# 第14节 字符方法、转义字符、字符串的方法
    c# 第13节 迭代语句、while、do...while、for、foreach、goto
    c# 第12节 分支语句if、switch、三位运算符
    c# 第11节 运算符大全
  • 原文地址:https://www.cnblogs.com/niceshot/p/13019823.html
Copyright © 2011-2022 走看看