zoukankan      html  css  js  c++  java
  • Linux SSH基于密钥交换的自动登陆原理简介及配置说明

    一、原理简介

    SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key)。公钥用于对数据进行加密,而且只能用于加密。而私钥只能对使用所匹配的公钥,所加密过的数据进行解密。私钥需要用户单独妥善保管。SSH 客户端使用私钥向服务器证明自已的身份。而公钥是公开的,可以按需将其配置到目标服务器上自己的相应帐号中。
    在进行 SSH 登录认证时,进行私钥和公钥协商。如果匹配,则身份得以证明,认证成功,允许登录。否则,将会继续使用密码验证等其它方式进行登录校验。SSH 证书验证登录配置及登录协商过程,如下证书校验交互登录流程示意图所示:

    各步骤补充说明如下:
    生成证书
    客户端生成密钥对。
    将公钥信息写入目标服务器、目标账户的配置文件。该操作隐含表示了客户端拥有对目标服务器的控制权。
    协商交互过程
    1.  客户端向目标服务器发送登录请求。在SSH 服务启用了证书验证登录方式后,会优先通过证书验证方式进行登录验证。 
    2. 目标服务器根据 SSH 服务配置,在用户对应目录及文件中读取到有效的公钥信息。
    3. 目标服务器生成一串随机数,然后使用相应的公钥对其加密。
    4. 目标服务器将加密后的密文发回客户端。
    5. 客户端使用默认目录或 -i 参数指定的私钥尝试解密。
    6. 如果解密失败,则会继续尝试密码验证等其它方式进行登录校验。如果解密成功,则将解密后的原文信息重新发送给目标服务器。意思类似于: “看,这是这段话的原文。我能读懂发过来的密文,我拥有服务器的控制权,请让我登录。”
    7. 目标服务器对客户端返回的信息进行比对。如果比对成功,则表示认证成功,客户端可以登录。如果对比失败,则表示认证失败,则会继续尝试密码验证等其它方式进行登录校验。
     

    二、自动登录配置

    生成密钥对

    SSH 协议 V1只使用 RSA 算法,而 SSH 协议V2 对 RSA 算法和 DSA 算法都支持。目前所有OpenSSH 版本都应该对两种算法都支持。两种算法的密钥的生成指令和使用方法相同,本文仅以 RSA 算法为例进行相关说明。
    生成密钥对的时候,可以按需决定是否设置密码。但需要注意的是,如果设置了密码,还需结合 ssh-agent 代理和 ssh-add 配置才能实现自动登录。同时,相关配置只对 ssh-agent 启动的相应 shell 生效,用户退出后重新登录时还需重新配置。所以,为简便起见,本文以常见的、不配置密码的情况进行说明。
    可以在任意支持环境下生成密钥对。Windows 和 Linux 环境下,配置分别说明如下。

    Windows环境下生成密钥对

    在 Windows 环境下,通常借助各种应用软件来创建和管理密钥对。以常见的NetSarang Xshell为例,请执行如下步骤创建密钥对:
    打开Xshell程序。
    单击 工具 > 用户密钥管理者 ,再点击 生成 。
    在打开的密钥创建向导中,选择默认的 RSA 密钥算法及密钥长度(默认 2048 位)后,点击 下一步 。
    程序生成密钥对后,点击 下一步。
    如前面所述,密钥加密密码留空:

    点击 下一步,会弹出确认信息,点击 是 确认。
    复制或者点击 保存为文件 对公钥信息进行保存。
    点击 完成 ,在 用户密钥管理者 列表中能看到相应的密钥信息。

    Linux环境下生成密钥对

    在 Linux 环境下,通常使用系统自带的 ssh-keygen 软件来创建和管理密钥对。请执行如下步骤创建密钥对:
    以任意具有 ssh-keygen 执行权限的用户登录服务器。
    使用如下指令,基于 rsa 算法创建密钥对:

    ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):                → 默认保存路径和文件名,可以按需修改。
    Enter passphrase (empty for no passphrase):                             → 如前面所述,不设置密码,回车确认即可。
    Enter same passphrase again:                                 → 不设置密码,回车确认即可。
    Your identification has been saved in /root/.ssh/id_rsa.        → 创建的私钥文件。
    Your public key has been saved in /root/.ssh/id_rsa.pub.        → 创建的公钥文件。
    The key fingerprint is:
    17:b8:0e:76:cb:57:21:3b:f2:bb:8b:a2:42:2b:54:be root@iZ233gr74jvZ
    The key's randomart image is:
    +--[ RSA 2048]----+
    |                 |
    |         .       |
    |        . o .    |
    |   .     . + .   |
    |  o   o S + .    |
    | ... . = = o     |
    |.. ..   + o      |
    |. oE  .  o .     |
    | . ... .. +o     |
    +-----------------+
    说明:
    如果 .ssh 目录不存在,程序会自动创建。
    生成的密钥对默认保存在当前用户家目录下的 .ssh 文件夹中,文件名默认为 id_rsa(私钥) 和 id_rsa.pub(公钥)。用户可以按需设置保存路径和文件名。

    密钥配置

    生成密钥对后,进行如下处理:

    私钥的处理

    私钥用于信息校验,请确保安全。可以将私钥上传到其它源服务器上,或者直接参阅前述说明创建新的密钥对。

    公钥的处理

    公钥信息需要写入目标服务器、目标用户的配置文件中,默认配置文件为对应用户家目录下 .ssh 文件夹中的 authorized_keys,即:
    ~/.ssh/authorized_keys
    可以复制公钥信息后,直接通过 vi 等编辑器将其写入上述文件。或者通过如下指令,在源服务器上配置写入:
    cat ~/.ssh/id_rsa.pub | ssh <用户名>@<目标服务器IP> 'cat >> ~/.ssh/authorized_keys'; 比如: cat ~/.ssh/id_rsa.pub | ssh root@120.26.38.248 'cat >> ~/.ssh/authorized_keys';
     
    注意:
    该操作由于需要登录目标服务器才能完成,所以隐含表示了客户端拥有对目标服务器的控制权。
    如果修改了默认的目录或文件名,则需要同步修改SSH 服务配置文件(默认为/etc/ssh/sshd_config)中的AuthorizedKeysFile 参数,否则会因找不到公钥信息而导致自动登录失败。

    三、参数与权限检查确认

    要顺利完成自动登录,还需对SSH 服务相关参数及关联文件、文件夹的权限进行确认或调整。

    SSH服务参数设置

    SSH 服务默认开启了证书认证支持。编辑 SSH 服务配置文件(默认为/etc/ssh/sshd_config),确保如下参数没有显示的置为 no。否则,将参数值修改为yes,或者整个删除或注释(在最开头添加 # 号)整行配置。比如:

    #RSAAuthentication yes
    #PubkeyAuthentication yes
    同时,如前面所述,如果修改了默认的公钥路径或文件名,还需确保 AuthorizedKeysFile 参数值配置的信息与其一致。
    注意:如果对相关参数做了修改,需要重启 SSH 服务生效。

    相关权限设置

    SSH 服务证书验证方式登录,对相关目录和文件的权限有要求。权限配置异常可能会导致登录失败。
    • .ssh 目录的权限配置
    使用如下指令,确保 $HOME/.ssh 目录只有所有者才有权写入:

    chmod 700 ~/.ssh
    • authorized_keys 文件的权限配置
    使用如下指令,确保其它用户对 authorized_keys 文件没有修改权限:
    chmod 600 ~/.ssh/authorized_keys
    • 进一步安全配置
    进一步的安全设置可以将 authorized_keys 文件权限配置为 400(其他用户没有任何权限),并对其及 .ssh 目录添加 immutable 位权限(防止文件被修改):
    chmod 400 ~/.ssh/authorized_keys
    chattr +i ~/.ssh/authorized_keys
    chattr +i ~/.ssh

    四、自动登录

    完成上述配置后,在客户端即可免密码直接登录。说明如下:

    Windows环境自动登录

    Window 环境下,还是以常见的NetSarang Xshell为例,请执行如下配置进行自动登录:
    单击 文件 > 属性,打开主机属性配置窗口。
    点击 连接 > 用户身份验证,如下图所示,将 方法 设置为 Public Key;将 用户名 设置为已经设置了证书登录的相应用户名;将 用户密钥 设置为对应的私钥。最后,点击 确定。

    再次连接相应服务器时,无需密码输入用户名和密码,即可自动登录。

    Linux环境自动登录

    Linux 环境下,在客户端直接通过 ssh 软件免密码登录:
    ssh <用户名>@<目标服务器>
    
    比如:
    ssh root@192.168.0.1
    
    如果修改了私钥路径或文件名,则需要通过 –i 参数进行指定:
    ssh –i <私钥路径及文件名> <用户名>@<目标服务器>
    
    比如:
    ssh -i /bak/my_rsa user@192.168.0.1
     
     
     
     
     

  • 相关阅读:
    c#调用dll,::CoInitialize(NULL)出错
    使用 Anthem.NET 的常见回调(Callback)处理方式小结
    主题和皮肤学习
    得到任意网页源代码 (利用WebClient和WebRequest类)
    HTML marquee标签详解
    制作一个简单的天气预报
    CSS中的类class和标识id选择符(.和#号)
    String split '.'
    Map 的 clear() 方法会清空 Map对象
    sqLite 执行查询语句时报错__及SimpleCursorAdapter
  • 原文地址:https://www.cnblogs.com/hwlong/p/10104749.html
Copyright © 2011-2022 走看看