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 登陆流程
安装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 | # 生成公/私钥对 |
一直 enter 即可。
生成的公私钥对保存在 c:%username%.ssh 中
配置公钥/私钥对
方法一
在客户端配置文件:
- Windows 上是
~/.ssh/config
- Linux 上是
/etc/ssh/ssh_config
若没有,新建一个
config
文件,没有后缀
1 | # 别名(Host):Host 和 HostName 的值可以相同 |
将公钥文件 id_rsa.pub
的内容追加到服务器的
~/.ssh/authorized_keys
文件末尾
可以使用 #
号为每个公钥添加注释,方便管理。
authorized_keys:该文件为 ssh 普通用户公钥
administrators_authorized_keys:该文件为 ssh 管理员公钥
使用方式:
1 | ssh aliyun -v # 使用别名进行登陆 |
方法二
将私钥添加到 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 中将公钥添加到服务器
服务器中的公钥是储存在
~/.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 | Match Group administrators |
重启windows的ssh服务
1 | Restart-Service sshd |
关闭密码登陆
上述配置完成后,进行 ssh 测试连接,如果成功,则将密码登陆关闭。
找到位于C:\ProgramData\ssh\ssh_config
文件,将
PasswordAuthentication
设置成 no
1 | # To disable tunneled clear text passwords, change to no here! |
重启 sshd
服务
1 | Restart-Service sshd |
通过上面的操作,ssh 公钥登陆配置就完成了,同时还提高了系统的安全性。
致谢
本文参考以下文件,对此表示诚挚感谢!