《使用安全外壳 (SSH) 的交互和自动化访问管理的安全性》笔记

    主机访问其他主机,经常有很高的特权。不幸的是,对自动化和交互式机器对机器的访问控制几乎没有规划和监督。相反,此类访问是由系统管理员、供应商和其他项目的一部分的集成人员临时添加和配置的,而不需要 正规的访问控制生命周期管理(例如,标准化的供应和终止过程、访问令牌管理(例如,周期性密码更改))。本出版物探讨了基于SSH的访问管理领域,重点讨论了安全问题以及如何最好地解决这些问题。

    secureshell(SSH)是一种协议,用于安全地登录到远程主机并在该主机上执行命令(例如,管理命令)。SSH协议与早期的远程管理协议(如 telnet、remote shell(rsh)、remote login(rlogin)和remote copy(rcp))的区别在于,它内置了对健壮的安全特性的支持,如安全的用户和设备身份验证以及传输加密。SSH几乎完全取代了这些不安全的远程管理协议

    SSH协议是典型的客户机/服务器体系结构。主机A上的SSH客户端应用程序启动到主机B上的SSH服务器应用程序的连接。这两个主机协商传输的加密算法,然后为服务器主机(主机B)2建立会话密钥并执行设备身份验证,最后将 客户端(或用户)身份验证凭据(例如用户名和密码)发送到服务器。假设此身份验证成功,则可以说在主机之间建立了SSH连接,可以使用。

    SSH有三种常见的用例:

交互式 使用:SSH 用于远程管理和配置Unix和Linux计算机、网络设备以及各种其他类型的主机。 SSH还用于远程运行应用程序(特别是基于文本的传统应用程序)

文件传输.SSH 作为安全复制(SCP)和安全文件传输协议(SFTP)协议的基础。 这些协议用于在主机之间传输文件,同时利用SSH内置的安全功能。

点对点 隧道:SSH 可用于实现虚拟专用网(VPN)隧道,以保护两台主机之间传输的数据。 这些主机中的一个或两个可能充当其后面其他主机的网关。

-> 1、服务器认证( 其它渠道获得的预存在 known hosts中 的服务器 公钥进行一致性比较完成认证

SSH的机密性和完整性依赖于SSH服务器和客户端的强身份验证。客户端对SSH服务器的身份验证是基于公钥密码系统使用( SSH客户端显式信任的)公钥( public keys)或使用由证书颁发机构颁发的证书(certificates ) 完成认证——公钥比证书更常用。

1.User1发起首次登录到HostB: ssh User1@HostB,第一次提示,人工确认后按步骤5保存公钥-IP对信息到 user1的known hosts文件中。

2.HostA连接到HostB

3.HostB将自己的公钥发给HostA: 非加密连接

4.来自HostB的公钥显示为用于User1。User1通过将它与通过不同通信通道接收的 值进行比较,验证它是否是HostB的正确公钥。(比较不同渠道获得的公钥,一致证明HostB就是它自己)——用户和管理员必须小心确保每个服务器的公钥 正确, 且存储的known host keys是可被信任的,以防止中间人攻击。在此外,如果攻击者能够获得服务器的私有密钥副本,也可以发起中间人攻击钥匙。应该限制 用户更改known host key配置的权限。此外,应该对known hosts files 进行哈希处理,以最小化潜在攻击者可用的信息。

5.HostA将HostB的公钥 以及对应HostB的名称(IP或主机名)存储在user1的known hosts文件中,以便在将来的连接中对HostB进行身份验证,而不提示用户验证该密钥是否是HostB的正确公钥。

6.hostA使用HostB的公钥 对HostB进行身份验证,并与HostB建立 加密连接

注:如果User1帐户正由自动化进程使用,在第一次连接时检查公钥的用户通常是自动化进程的管理员。为了避免这个过程,管理员可以用 HostB的公钥预填充known hosts文件。

如果服务器上支持多种算法(例如RSA、DSA、ECDSA),SSH服务器可能有多个公钥/私钥对


2.1、客户机认证

    客户端身份验证是指对交互用户(管理员和其他用户)或在SSH客户端上运行的自动化进程的身份验证。对服务器上的特定帐户进行身份验证。

    SSH协议支持多种用户身份验证机制,包括密码、基于主机的身份验证、Kerberos和公钥身份验证。全部这些认证方法基本上依赖于一些秘密信息,当用于自动访问时,此机密信息必须存储在本地或以其他易于访问方式保存。一个可以在每个SSH上启用一个或多个客户端身份验证方法服务器。每个身份验证方法的优点和缺点是安全性和灵活性这些优点/缺点对于交互用户和自动化用户来说往往是不同的流程、组织必须仔细评估并选择已批准在其环境中使用的客户端身份验证方法,禁用其他方法。本节简要讨论这些形式的客户端身份验证,重点讨论它们对交互式用户和自动化流程的相关性和适当性。

->2.2、密码认证

    SSH中有两种口令认证机制:基本口令认证和键盘交互认证。基本密码验证是SSH协议标准定义的传统方法。键盘交互认证在大多数现代环境中使用。 LDAP 可以用来代替本地凭证数据库(例如,密码文件)。通过密码和键盘交互身份验证,用户名、密码和质询响应通过加密的SSH连接从客户机(HostA)发送到服务器(HostB)。这可以保护通过网络传输的凭据,但它们仍然会受到中间人攻击的影响。


1.User1发起登录到HostB

2.hostA使用存储在User1的known hosts文件中的HostB的公钥密钥 来认证HostB,并与HostB建立加密连接。

3.User1被提示输入用户名和密码,以及HostB可能需要的其他凭据(用于键盘交互身份验证)。

4.凭据使用 加密的连接被发送到HostB HostB使用User1提供的凭据来认证User1。

对于自动化过程,通常不建议使用密码身份验证,因为它不提供其他身份验证方法(尤其是公钥身份验证)可用的访问控制级别。

2.3、 基于主机的身份验证

    基于主机的身份验证使用服务器主机(HostA)的host key( 公钥, 主机密钥用于验证主机(机器)本身,而不是用户或帐户)——该秘钥 通常由客户端使用来验证服务器的身份——从而将该服务器(HostA)验证到另一个服务器(HostB)上,并为客户端服务器(HostA)上的用户(User1)的身份提供担保。配置文件(.shosts)可与目标服务器(HostB)上的任何用户帐户一起使用,以指定哪些主机上的用户可以登录到该帐户而无需进一步验证。

1.HostB的管理员将HostA的公钥放入HostB上的knownhosts文件,并配置shosts(例如~/.shosts或类似shosts)允许 主机A的用户1进行身份验证。

2.User1开始登录HostB.

3.HostA使用来自HostB中对应HostA的host key验证HostB.

4.HostB确认在shosts配置中,User1有权从HostA访问HostB上的目标帐户。

    基于主机的身份验证不允许对访问时可以在目标服务器上执行的操作配置命令限制。因此,不建议使用自动访问主机-基于身份验证不建议用于交互式用户,因为它不提供交互式登录,这通常被认为是不好的做法,特别是对于具有提升权限的帐户

2.4、Kerberos身份验证

    Kerberos(通常与基于LDAP的目录(如Active directory)一起)在Windows域或Kerberos域中实现单点登录,一旦用户使用Kerberos对帐户进行了身份验证,就可以登录到具有相同帐户名且位于相同域(启用Kerberos身份验证)中的任何其他服务器,而无需进一步的身份验证。

Kerberos在身份验证票证中包含用户的IP地址,以确保攻击者无法复制和重用这些票证系统。 为了方便自动化进程的身份验证,许多SSH Kerberos实现提供了将凭据存储在客户机上名为keytab文件的文件中的选项。 这使得无需用户干预即可自动登录。 Kerberos很少用于自动化进程,因此不建议使用Kerberos,因为它具有隐式访问的风险,并且缺少命令限制。

-> 2.5、公钥认证

    SSH中的公钥验证使用用户密钥或证书来验证连接——其中用户密钥是最常用的方法。可以为交互式用户和自动化进程配置这样的密钥,它们授权用户或进程访问信息系统中的用户帐户系统交互SSH客户端(HostA)上的用户或自动进程有一个称为身份密钥 identity key的用户密钥( User Key: authorized keys公钥 或 identity keys私钥),通常是RSA或DSA私钥,并且服务器(HostB)必须将相应的公钥配置为 user Account的授权密钥,以便提供对该帐户的访问。然后,任何拥有 identity key( 在SSH协议中用于身份验证的 私钥 ;授予对相应公钥已配置为授权密钥的帐户的访问权)的用户或进程都可以登录到服务器上的该用户帐户,并在为该帐户配置的权限下执行操作。


  1. User1或管理员为User1生成一个identity key私钥(和相应的public key公钥as an authorized key)。

  2. HostB管理员将User1的公钥作为授权密钥 authorized key( 一种 公钥 ,被配置为授权任何能够在SSH协议中使用相应私钥( identity key)的人访问帐户存储在HostB上的User1帐户中。

  3. User1开始登录HostB.

  4. HostA连接到HostB,并使用user1的 identity key尝试将 User1验证到HostB( HostA使用 identity key加密 User 1账户信息并发给 HostB

  5. HostB 使用存储在HostB上User1的帐户中的 authorized key 授权密钥(公钥)认证User1。 HostB 使用 authorized key 解密由 identity key加密的 User 1 账户信息得到User1账户信息内容

    公钥认证的一个重要优点是它不创建隐式的信任关系,只创建明确定义的信任关系,并且可以通过检查目标主机来可靠地确定允许的访问。

Public Key Authentication using PuTTY and WinSCP:

https://www.jscape.com/blog/bid/38946/Public-Key-Authentication-using-PuTTY-and-WinSCP

https://www.jscape.com/download-jscape-mft-server

https://blog.csdn.net/Noob_f/article/details/78944944(PuTTY密钥认证)

WinSCP是一个支持SSH的SCP文件传输软件:

PS C:\windows\system32> choco install winscp        ——ok!

   winscp v5.17.9 [Approved]

   winscp package files install completed. Performing other installation steps.

   The install of winscp was successful.

   Software install location not explicitly set, could be in package or default install location if installer.

由于SSH的标准中,并没有固定密钥文件的格式。而 Putty使用的私钥格式和OpenSSH生成的有点不同

https://www.jb51.net/article/70036.htm

2.6、用户身份验证摘要

3、基于SSH的访问中的漏洞

4、管理建议做法

5、基于SSH的访问管理规划与实现

6、 解决方案规划和部署

附录:

Public and Private Key:

公钥和私钥是两个非常大的数字(通过高等数学)具有独特的关系,即 用一个数字(密钥)加密的信息只能用另一个数字(密钥)解密反之亦然。为了利用这一特性进行安全操作,一旦在数学上选择(生成)了两个数字,一个是保密的(私钥),另一个是共享的(公钥)。然后,私钥的持有者可以向拥有公钥的另一方进行身份验证。或者,一方可以使用公钥向相应私钥的持有者发送机密消息。对于SSH,身份密钥是私钥,授权密钥是公钥。

SSH Client:

允许用户或自动进程远程访问SSH服务器的软件实现。SSH客户机负责可靠地执行确保安全连接所需的所有操作,包括生成标识密钥、提示用户验证主机密钥、验证和建立与SSH服务器的加密连接、提示用户提供凭据、执行公钥验证等。

SSH Server:

一种软件实现,使SSH能够从SSH客户机访问系统。SSH服务器可以包含在操作系统或设备中,也可以是附加软件。SSH服务器通常是一组复杂的软件模块,负责执行大量任务,包括强制执行已配置的SSH设置、验证用户、限制对某些用户和组的访问、确保安全连接、与其他系统(如PAM和Kerberos)交互、执行文件传输等。

Known Hosts File:

与包含一个或多个主机密钥的特定帐户关联的文件。 每个主机密钥都与SSH服务器地址(IP或主机名)相关联,以便在启动连接时对服务器进行身份验证。第一次连接到SSH服务器的用户或管理员负责验证该服务器提供的主机密钥是否是实际密钥(不是恶意密钥),然后再将其放入已知的hosts文件中。

Host Key:

一种 公钥,用于在SSH协议中向希望与其通信的主机验证主机(每个主机通常也有自己的专用主机密钥)。一些主机可能有多个主机密钥(例如,每个算法一个主机密钥)。主机密钥用于验证主机(机器)本身,而不是用户或帐户,而身份密钥和授权密钥则与验证用户/帐户以及授权访问主机上的帐户有关.

Authorized Key:

一种 公钥,被配置为授权任何能够在SSH协议中使用相应私钥(身份密钥)的人访问帐户。 授权密钥可以配置有某些限制,最显著的是强制命令( Forced Command)和源限制(Source Restriction)。

Forced Command:

为授权密钥配置的一种限制,在使用该密钥登录时 阻止执行指定命令以外的命令。在一些SSH实现中,可以通过在 授权密钥文件中使用“command=”限制来配置强制命令。

Source Restriction:

为授权密钥配置的一种限制,用于 限制使用该密钥进行登录的IP地址或主机名。在一些SSH实现中,可以通过在授权密钥文件中使用“from=”限制来配置源限制。

Authorized Keys File:

与存储一个或多个 Authorized Keys(授权密钥)和可选 限制的特定帐户相关联的文件。SSH服务器上允许公钥身份验证的每个帐户都有一个唯一的授权密钥文件。

Identity Key:

在SSH协议中用于身份验证的 私钥;授予对相应公钥已配置为授权密钥的帐户的访问权。

User Key(含 authorized keys公钥 and identity keys私钥):

用于通过SSH协议授予对用户帐户的访问权限的密钥(与主机密钥相反,User Key不授予对任何内容的访问权限,而是用于验证主机)。(授权密钥和身份密钥) authorized keys and identity keys都是用户密钥。用户密钥相当于访问令牌。

Passphrase:

用于保护身份密钥(identity key)的密码。在用户或管理员输入密码短语后,密码短语将在数学上转换为大数字,作为用于加密身份密钥的密钥。为了解密身份,必须再次输入密码短语,以便为解密重新生成相同的密钥。

请使用浏览器的分享功能分享到微信等