密码是一种简单直观,却不够安全的身份鉴别方法。说它不够安全,主要原因是对于集群中的大量服务器而言,如果要分别使用不同的密码,那么维护密码表就成为一项麻烦事了。但如果都用相同的密码,一旦密码泄漏,整个集群都陷入风险。所以不少人只好选一个折衷,为集群中的计算机使用统一密码的同时,又定时(比如每两个月)集中改一次密码。从而在便利和安全之间取得平衡。但始终,密码登录的方式是不够安全的。 在登录服务器时,SSH 支持使用密码,还支持使用证书公钥(public key)。证书公钥登录的原理是,管理员生成一对密钥,将公钥复制到服务器上,自己持有私钥并保护好私钥的内容。在需要连接服务器时,将在客户端用私钥与服务器进行一系列的登录验证后,开启安全的通信。由于公钥的公开并不会导致私钥(private key)的安全风险,所以这种登录方式并不会有泄漏风险。
PowerShell Remoting 的服务端 WinRM 支持两种无密码登录的方式。一种是使用客户端证书登录,身份验证过程与 SSH 很类似。另外它还支持借助 Active Directory 环境进行集中式登录。 要为 WinRM 开启客户端证书登录(Client Certificate),主要步骤有: 在服务端为 WinRM 启用 Client Certificate 登录功能 在服务端为 WinRM 启用 HTTPS 支持,设置防火墙规则 在客户端生成证书,并将证书的公钥(public key)导入到服务器上,并映射到指定的服务器上的用户 在客户端将证书导入本地计算机 使用证书连接到服务器 这些步骤并不复杂,却也没有像配置 SSH 服务端那么简单。所以我把这些脚本都写好了,请转到 GitHub 查看和下载。这里有一篇文章详细介绍了各步骤中要使用的命令。
除了基于 WinRM 的客户端证书登录,新版本的跨平台 PowerShell 6 还支持基于 OpenSSH 直接提供与 Linux 服务器上的 SSH 完全一致的体验。请转到官方文档了解具体配置方法,更多关于 PowerShell Remoting 的资料,还可以参考这本电子书。
在服务器上启用了 WinRM 之后,不光可以支持 PowerShell Remoting 功能,还能为 Windows 服务器提供其他众多远程管理功能。比如,著名的自动化配置软件 Ansible 就可以使用 PowerShell Remoting 一样的方式来能力,同时也很好地支持了上面介绍的客户端证书登录。 事实证明,经过上述简单的配置,也可以很轻松地对 Windows 服务器进行批量的自动化管理了。