一、新用户访问
【避免使用 sshd
等与服务内置账户冲突的名称】
一般情况下,为了系统的访问安全,不会直接使用系统管理员账户进行远程访问。
2.1 创建用户
管理员权限,执行 cmd
,执行用户添加指令,创建用户为标准用户,具体如下:
# net user username password /add >net user ggcyuser ggcyadmin@@ /add 命令成功完成。 >net user ggcyuser 用户名 ggcyuser 全名 注释 用户的注释 国家/地区代码 000 (系统默认值) 帐户启用 Yes 帐户到期 从不 上次设置密码 2021/10/5 16:54:17 密码到期 2021/11/16 16:54:17 密码可更改 2021/10/5 16:54:17 需要密码 Yes 用户可以更改密码 Yes 允许的工作站 All 登录脚本 用户配置文件 主目录 上次登录 2021/10/6 2:04:23 可允许的登录小时数 All 本地组成员 *Users 全局组成员 *None 命令成功完成。
2.2 允许新用户ssh
访问
以管理员身份编辑%programdata%\ssh\sshd_config
,文件尾部
添加配置AllowUsers
配置,相关资料请查看官方文档
:https://github.com/PowerShell/Win32-OpenSSH/wiki/sshd_config以及微软官方文档:https://docs.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_server_configuration,以下配置普通用户ggcyuser
能够进行ssh
远程访问:
# Example of overriding settings on a per-user basis #Match User anoncvs # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server AllowUsers ggcyuser
添加完成后,重新启动sshd
服务。
2.3 远程测试连接
端口为默认22
时,端口参数配置可以忽略,操作如下:
> ssh -p [port] [username]@[ip] Connecting to [ip]:[port]... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Microsoft Windows [版本 10.0.19043.1165] (c) Microsoft Corporation。保留所有权利。 [username]@[主机名称] C:\Users\[username]>
有的时候远程访问遇到问题时,可以通过查看连接输出日志进行信息排查,输出结果如下:
> ssh -p [port] [username]@[ip] -v OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
2.4 使用 ssh key
访问
执行ssh-keygen
指令,依据实际需求生成公钥和私钥,加密算法为rsa
,同时有加密密钥,此处不设置则为空,虽然这样会不安全,建议生产环境中不要使用空密码
,确认路径无误后,无脑下一步。
生成公钥私钥:
>ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (C:\Users\[username]/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in C:\Users\[username]/.ssh/id_rsa. Your public key has been saved in C:\Users\[username]/.ssh/id_rsa.pub. The key fingerprint is: SHA256:nr3jdbOpRaSZ2FOgqtOF68YMG5WvEuJEVF+jn7cbUqE [username]@[主机名称] The key's randomart image is: +---[RSA 3072]----+ | .. o . | | . . o o . | | . o.. . o | | . o+ = B | | . .S.E O . | | o ++ =.o + | | o .oB=.o + + | | . oo= .+ = + | | o..o.o.o | +----[SHA256]-----+
文件目录如下,带*.pub
为公钥,反之为私钥:
>dir 2021/08/20 18:38 <DIR> . 2021/08/20 18:38 <DIR> .. 2021/08/20 18:38 2,610 id_rsa 2021/08/20 18:38 579 id_rsa.pub 2 File(s) 3,189 bytes 2 Dir(s) 29,674,840,064 bytes free
2.4.1 标准用户和管理用户
对于标准用户
和管理用户
,两者对应的公钥在sshd
所在服务端存储位置不同。
若账户为标准用户
,C:\Users\[username]/.ssh/
目录下创建一个无后缀文件authorized_keys
,用于存放生成的公钥内容;
若账户为管理用户
,C:\Users\[username]/.ssh/
目录下创建一个无后缀文件administrators_authorized_keys
中,
笔者以标准用户为例,私钥本地保留,用于登录远程访问sshd
服务使用。
2.4.2 重启sshd
服务
使用xshell
进行测试,选择方法为Public Key
,用户名
和远程中生成账户名ggcyuser
一致,引入本地对应私钥,配置如下:
测试连接登录
2.4.3 禁用用户名密码登录
修改sshd_config
中配置,启动证书认证,重启服务再次测试
#LoginGraceTime 2m #PermitRootLogin prohibit-password #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 # 启用证书认证 PubkeyAuthentication yes # 禁用密码远程登录 PasswordAuthentication no # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2 # but this is overridden so installations will only check .ssh/authorized_keys AuthorizedKeysFile .ssh/authorized_keys
切换为用户名密码登录,提示用户名用户密码登录,表示登录已经禁用,
提示SSH
用户身份验证,反馈如下:
2.4.4 注意事项
远程访问需要,开启防火墙对应的sshd
的访问默认端口22
,尝试配置是否有效,最好是,一段步骤,一段测试,
二、日志查看
默认情况下,OpenSSH
的日志是输出到系统日志中,可以通过 事件查看器-应用程序和服务日志
中查看,对应的日志。
如果需要基于文件的日志记录,设置 sshd_config
文件中 SyslogFacility LOCAL0
,日志文件将输入到 %programdata%\ssh\logs
文件目录下。
三、常见问题
配置 ssh key
登录后,无法远程登录
使用 xshell
,提示当前密钥为注册到服务器中
,实际原因就笔者进行不断尝试和和查看日志可以发现,问题出在公钥服务端保留文件 authorized_keys
对应访问权限问题中,排查方式为开启,sshd
的本地日志输出而不是使用默认日志系统输出,修改 sshd_config
文件中的配置 SyslogFacility LOCAL0
,同时为了进一步细化输出内容,将日志的输出等级 LogLevel
,调整为 Debug3
,日志输出文件在 %programdata%\ssh\logs
目录下。
异常输出如下:
18900 2021-10-06 01:55:28.475 debug3: mm_answer_keyallowed: key_from_blob: 0000026DC6958130 18900 2021-10-06 01:55:28.475 debug1: trying public key file C:\\Users\\ggcyuser\\.ssh/authorized_keys 18900 2021-10-06 01:55:28.476 debug3: Bad permissions. Try removing permissions for user: S-1-5-21-1185597859-3763637221-3021501666-1006 on file C:/Users/ggcyuser/.ssh/authorized_keys. 18900 2021-10-06 01:55:28.476 Authentication refused. 18900 2021-10-06 01:55:28.476 debug3: mm_answer_keyallowed: publickey authentication test: RSA key is not allowed 18900 2021-10-06 01:55:28.476 Failed publickey for ggcyuser from 127.0.0.1 port 49820 ssh2: RSA SHA256:eEUla5p9V1RSHNCTP0dItkf6XRfnnsJObR3saOdkDv0 18900 2021-10-06 01:55:28.476 debug3: mm_request_send entering: type 23
核心问题出在 Bad permissions. Try removing permissions for user
,思考之后,考虑是否为文件访问权限问题,于是将多余用户权限进行删除 sshd
,删除后,再次使用 xshell
访问,将不再提示上述问题,远程能够访问成功。
正常输出如下:
2300 2021-10-06 01:43:28.775 debug3: mm_answer_keyallowed: key_from_blob: 0000016A572D2450 2300 2021-10-06 01:43:28.775 debug1: trying public key file C:\\Users\\ggcyuser\\.ssh/authorized_keys 2300 2021-10-06 01:43:28.775 debug1: C:\\Users\\ggcyuser\\.ssh/authorized_keys:1: matching key found: RSA SHA256:eEUla5p9V1RSHNCTP0dItkf6XRfnnsJObR3saOdkDv0 2300 2021-10-06 01:43:28.775 debug1: C:\\Users\\ggcyuser\\.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding 2300 2021-10-06 01:43:28.775 Accepted key RSA SHA256:eEUla5p9V1RSHNCTP0dItkf6XRfnnsJObR3saOdkDv0 found at C:\\Users\\ggcyuser\\.ssh/authorized_keys:1 2300 2021-10-06 01:43:28.775 debug3: mm_answer_keyallowed: publickey authentication test: RSA key is allowed
上述问题,引发笔者思考的是,Windows
中,对于权限的问题,往往不像 Linux
那般明显,需要进一步跟踪程序集,运行时的具体运行输出,可见一个系统中,一个成熟的日志输出,给用户和排查问题带来的好处,能够为迷惑者,指明方向。
四、参考链接
[1] OpenSSH For Windows
官方文档:
https://github.com/PowerShell/Win32-OpenSSH/wiki/sshd_config
[2]微软官方文档:
https://docs.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_server_configuration