2022-01-04-通过公钥 ssh 远程连接 Windows Server

通过用户名和密码,利用 SSH 登陆远程服务器进行服务器管理时,有如下缺点:

  • 每次输入密码,很麻烦,也不极客
  • 服务器开放账号密码登陆,容易补暴力破解

我们可以通过配置公钥登陆来解决上述问题。

SSH 中各个模块作用

OpenSSH 包含一系列组件和工具,用于提供一种安全且简单的远程系统管理方法,其中包括:

  • sshd.exe,它是远程所管理的系统上必须运行的 SSH 服务器组件
  • ssh.exe,它是在用户的本地系统上运行的 SSH 客户端组件
  • ssh-keygen.exe,为 SSH 生成、管理和转换身份验证密钥
  • ssh-agent.exe,存储用于公钥身份验证的私钥
  • ssh-add.exe,将私钥添加到服务器允许的列表中,即添加到 ssh-agent 中
  • ssh-keyscan.exe,帮助从许多主机收集公用 SSH 主机密钥
  • sftp.exe,这是提供安全文件传输协议的服务,通过 SSH 运行
  • scp.exe 是在 SSH 上运行的文件复制实用工具

ssh 登陆流程

ssh-login

安装OpenSSH

如果系统中没有 openssh,需要手动安装。现在 windows10 及以上都已经自带 ssh 了。

如果需要,可以通过 Scoop 来安装 OpenSSH:

1
scoop install openssh

开放 22/tcp 端口

1
netsh advfirewall firewall add rule name="ssh" dir=in action=allow protocol=TCP localport=21

在使用 scoop 安装时,会自动打开,此步骤可以省略

启动服务

1
net start ssh-agent && net start sshd

客户端生成公钥/私钥对

在客户端打开 powershell 终端进行操作:

1
2
# 生成公/私钥对
ssh-keygen

一直 enter 即可。

生成的公私钥对保存在 c:%username%.ssh 中

配置公钥/私钥对

方法一

在客户端配置文件:

  • Windows 上是 ~/.ssh/config
  • Linux 上是 /etc/ssh/ssh_config

若没有,新建一个 config 文件,没有后缀

1
2
3
4
5
6
7
8
9
10
11
12
13
# 别名(Host):Host 和 HostName 的值可以相同
# 如 ssh aliyun,在这里等于 ssh -i C:\Users\Think\.ssh\id_rsa_aliyun [email protected]
# 用别名登录会使用别名下的配置,不用别名登录(如IP)不会使用别名下的配置
Host aliyun
User root
HostName 144.90.100.144
# 私钥文件位置
IdentityFile "~/.ssh/id_rsa_aliyun"

Host tencent
User root
HostName 100.28.144.47
IdentityFile "~/.ssh/id_rsa_tencent"

将公钥文件 id_rsa.pub 的内容追加到服务器的 ~/.ssh/authorized_keys 文件末尾

可以使用 # 号为每个公钥添加注释,方便管理。

authorized_keys:该文件为 ssh 普通用户公钥

administrators_authorized_keys:该文件为 ssh 管理员公钥

使用方式:

1
ssh aliyun -v # 使用别名进行登陆

方法二

  1. 将私钥添加到 ssh-agent

    Windows SSH 以服务的形式管理,所以 ssh-agent 是全局的,不需要每次设置。

    以下命令需要用管理员身份运行终端。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 查看 ssh-agent 服务状态,这里输出:Stopped
    Get-Service ssh-agent

    # 查看 ssh-agent 服务的启动类型,这里输出:Disabled
    Get-Service ssh-agent | Select StartType

    # 将 ssh-agent 服务的启动类型修改为 Manual(手动启动)。
    Get-Service -Name ssh-agent | Set-Service -StartupType Manual

    # 手动启动 ssh-agent 服务
    Start-Service ssh-agent

    # 将私钥加载进 ssh-agent
    ssh-add C:\Users\Think\.ssh\id_rsa

    # 显示 ssh-agent 中的公钥,验证私钥是否添加成功
    ssh-add -L
    # 服务重启后,添加的密钥仍在 agent 中

  2. 将公钥添加到服务器

    服务器中的公钥是储存在 ~/.ssh/authorized_keys 文件里面,如果该文件不存在,手动创建一个文本文件即可,然后将公钥追加到该文件末尾。

    普通用户

    1
    2
    3
    4
    5
    # Make sure that the .ssh directory exists in your server's user account home folder
    ssh username@[email protected] mkdir C:\Users\username\.ssh\

    # Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
    scp C:\Users\username\.ssh\id_ed25519.pub user1@[email protected]:C:\Users\username\.ssh\authorized_keys

    管理用户

    公钥的内容需要放在服务器上的一个名为 administrators_authorized_keys 的文本文件中,放在 C: ProgramData\ssh\ 中。OpenSSH客户端包括scp,这是一个安全的文件传输工具,可以帮助解决这个问题。

    1
    2
    3
    4
    5
    # Make sure that the .ssh directory exists in your server's user account home folder
    ssh user1@[email protected] mkdir C:\ProgramData\ssh\

    # Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
    scp C:\Users\username\.ssh\id_ed25519.pub user1@[email protected]:C:\ProgramData\ssh\administrators_authorized_keys

windows 服务器取消管理员公钥文件重定向

编辑C:\ProgramData\ssh\sshd_config文件,删除或注释(使用 #)底部的如下配置:

1
2
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

重启windows的ssh服务

1
Restart-Service sshd

关闭密码登陆

上述配置完成后,进行 ssh 测试连接,如果成功,则将密码登陆关闭。

找到位于C:\ProgramData\ssh\ssh_config 文件,将 PasswordAuthentication 设置成 no

1
2
3
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no

重启 sshd 服务

1
Restart-Service sshd

通过上面的操作,ssh 公钥登陆配置就完成了,同时还提高了系统的安全性。

致谢

本文参考以下文件,对此表示诚挚感谢!

  1. Windows SSH 免密登录详解
  2. Windows 中的 OpenSSH
  3. OpenSSH key management
  4. SSH免密登录(公钥登录)到win10(解决authorized_keys无效的问题) - KyleBlog.cn