为VSCODE远程开发搭建最小权限Windows SSH环境
大众方法搞出来的 Windows SSH 环境,一般一登录就是管理员权限,这太危险了。开发的时候,还可能因为权限问题干扰判断。
SSH 开启
这一块教程很多,简写。
在系统中添加 Open SSH 功能,实际上就是 ssh 服务端。
登录用的密码就是密码,不是 PIN 码哦。
首先从本地测试,其他机器测试需要开防火墙。到防火墙入站规则那里去允许%SystemRoot%\system32\OpenSSH\sshd.exe
通过,不用填什么端口,Win 11 会默认填上 22 端口(并且不让改……)。
公钥登录
配置文件是C:\ProgramData\ssh\sshd_config
:
这一行:PubkeyAuthentication yes
如果被注释,就去掉注释,如果是no
改yes
;
如果不想要密码登录。找到PasswordAuthentication no
,去掉注释,确保是no
;
准备好公钥,写好与Linux一样的authorized_keys
文件,放置在你想要公钥登录的那个账号的C:\Users\你的用户名\.ssh
下,然后执行下面的命令:
icacls $env:USERPROFILE\.ssh\authorized_keys /inheritance:r /grant "sshuser:F" "SYSTEM:F"
其实就是改文件的权限,去掉继承权限啥的,在图形界面里面也能操作,但非常繁琐。
受限账号
计算机管理
-用户
,创建一个非管理员用户,设置密码,登录至少一次。
屏蔽C:\ProgramData\ssh\sshd_config
以下两行,禁止管理员公钥:
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
允许你刚才创建的普通账户(假定为sshuser
):
AllowUsers sshuser
DenyGroups administrators
可选:设置 powershell 为默认 shell
在服务器的 powershell 中执行:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
手动添加也是可以的。如果用的是 powershell core,需要用:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\PowerShell\7\pwsh.exe" -PropertyType String -Force
路径什么的,肯定人人都会改吧。
VSCODE 的特殊权限
搞完上面这些,普通的ssh登录、操作都没问题,但 VSCODE 的 Remote-SSH
在初始化的时候有一些很不用心的调用,暴露了他们自己就是用管理员 ssh 账户测试的。
如果是上面这样的受限账户,Remote-SSH 的初始化会失败,原因是 Remote-SSH
在初始化的时候会调用 WIM 接口,这玩意儿默认是没有的。其实就是看系统版本,用这个命令:
(Get-CimInstance Win32_OperatingSystem).Version
你可以自己试一下,受限账号是不能执行的,但终究只是一个系统版本号,变通方法很多,但微软就是把这个用了多年。Remote-SSH
在初始化的时候的报错涉及Cim
和权限被拒绝的就是他了。
为了执行这个,需要去“计算机管理-服务和应用程序-WMI组件”上面点右键,属性,打开一个小窗口,点“安全”,展开ROOT
,选中下面的CIMV2
,点击右下“安全设置”,“添加”, 填上使用ssh的这个账号(别忘了“检查名称”让自动补全机器名),在下方勾选“启用账户、远程启用、读取”。
还没完呢,最重要的,点击“高级”,这是可以看到你刚添加的账号那一条记录,把右边“应用于”这一列的的默认值“只是这个名字空间”改成“这个命名空间和子命名空间”,然后连续确认,关闭所有窗口。
这时候再从 VSCODE 里面初始化这个 ssh 连接就可以了。