On Windows 10 1809, I have enabled the in-built SSH server, and have configured it.
On another machine, I have used WinSCP and PuTTy generator to generate an authentication key. I copied the public key portion and appended that to the .ssh\authorized_keys file of my SSH server user. I fixed file permissions as required, to only my user, i.e., the logged in user, for the key file.
On the client machine, I used the .PPK private key, with WinSCP to try and connect into an SFTP session with my server, but I get a message that the server refused the key which I had selected.
I am able to authenticate using password, but the key pair isn't working out. Digging through the sshd logs generated on the server, I see this:
10200 2019年06月07日 01:38:16.376 debug1: attempt 1 failures 0 [preauth]
10200 2019年06月07日 01:38:16.376 debug2: input_userauth_request: try method publickey [preauth]
10200 2019年06月07日 01:38:16.376 debug1: userauth_pubkey: test pkalg ssh-rsa pkblob RSA SHA256:B6s0omPbz6HJB2cIZf3+5MKHU42wp+JfOTyAM+EVqoY [preauth]
10200 2019年06月07日 01:38:16.376 debug2: userauth_pubkey: disabled because of invalid user [preauth]
I am not sure what happened here, and if this is the reason why connection was refused. Firewall cannot be an issue since I am able to log into the server using password authentication. The client machine, and WinScp are being recognized on the server, it's just that the server refuses the provided key.
Is the key generated by PuTTy (or the key content copied with public key) not supported in either place? There's no passphrase associated with the key, but I don't suppose that should be an issue.
There's only one user on the server machine, which is the logged in user. The sshd service is running under LOCAL SYSTEM account. Should it run under a user account (I tried that but the service does not start at all, Event logs complain of a missing privilege...)
EDIT - More information
I commented out the following in sshd_config:
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
But now, a connection attempt complains that authorized_keys has bad permission. The machine only has one user, and the authorized_keys within the .ssh folder of that user only that one user access. I tried using Repair-AuthorizedKeyPermission on the key file, which added SYSTEM and sshd (NT Service user) as users to the key file, sshd having read access. But now, a connection attempt complains that bad permission has been set for user S-1-5-80 which is the same NT Service user sshd added by Repair-AutorizedKeyFile. Removing read permission (only permission) for this user again gives the old error, saying Access Denied.
EDIT - sshd.exe Logs from a connection attempt :
> 2696 2019年06月10日 03:57:09.020 debug2: fd 3 setting O_NONBLOCK
>
> 2696 2019年06月10日 03:57:09.020 debug3: sock_set_v6only: set socket 3
> IPV6_V6ONLY
>
> 2696 2019年06月10日 03:57:09.020 debug1: Bind to port 22 on ::.
>
> 2696 2019年06月10日 03:57:09.020 Server listening on :: port 22.
>
> 2696 2019年06月10日 03:57:09.020 debug2: fd 4 setting O_NONBLOCK
>
> 2696 2019年06月10日 03:57:09.020 debug1: Bind to port 22 on 0.0.0.0.
>
> 2696 2019年06月10日 03:57:09.020 Server listening on 0.0.0.0 port 22.
>
> 2696 2019年06月10日 03:57:35.475 debug3: fd 5 is not O_NONBLOCK
>
> 2696 2019年06月10日 03:57:35.477 debug3: spawning
> "C:\\WINDOWS\\System32\\OpenSSH\\sshd.exe" "-R"
>
> 2696 2019年06月10日 03:57:35.483 debug3: send_rexec_state: entering fd = 8
> config len 287
>
> 2696 2019年06月10日 03:57:35.484 debug3: ssh_msg_send: type 0
>
> 2696 2019年06月10日 03:57:35.485 debug3: send_rexec_state: done
>
> 9428 2019年06月10日 03:57:35.556 debug1: inetd sockets after dupping: 3, 3
>
> 9428 2019年06月10日 03:57:35.556 Connection from 130.147.168.135 port
> 64534 on 161.85.17.107 port 22
>
> 9428 2019年06月10日 03:57:35.556 debug1: Client protocol version 2.0;
> client software version WinSCP_release_5.15.2
>
> 9428 2019年06月10日 03:57:35.556 debug1: no match: WinSCP_release_5.15.2
>
> 9428 2019年06月10日 03:57:35.556 debug1: Local version string
> SSH-2.0-OpenSSH_for_Windows_7.7
>
> 9428 2019年06月10日 03:57:35.556 debug2: fd 3 setting O_NONBLOCK
>
> 9428 2019年06月10日 03:57:35.568 debug3: spawning
> "C:\\WINDOWS\\System32\\OpenSSH\\sshd.exe" "-y"
>
> 9428 2019年06月10日 03:57:35.572 debug2: Network child is on pid 6944
>
> 9428 2019年06月10日 03:57:35.573 debug3: send_rexec_state: entering fd = 6
> config len 287
>
> 9428 2019年06月10日 03:57:35.573 debug3: ssh_msg_send: type 0
>
> 9428 2019年06月10日 03:57:35.575 debug3: send_rexec_state: done
>
> 9428 2019年06月10日 03:57:35.575 debug3: ssh_msg_send: type 0
>
> 9428 2019年06月10日 03:57:35.576 debug3: ssh_msg_send: type 0
>
> 9428 2019年06月10日 03:57:35.576 debug3: preauth child monitor started
>
> 9428 2019年06月10日 03:57:35.607 debug1: list_hostkey_types:
> ssh-rsa,rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519
> [preauth]
>
> 9428 2019年06月10日 03:57:35.607 debug3: send packet: type 20 [preauth]
>
> 9428 2019年06月10日 03:57:35.607 debug1: SSH2_MSG_KEXINIT sent [preauth]
>
> 9428 2019年06月10日 03:57:35.794 debug3: receive packet: type 20 [preauth]
>
> 9428 2019年06月10日 03:57:35.794 debug1: SSH2_MSG_KEXINIT received
> [preauth]
>
> 9428 2019年06月10日 03:57:35.795 debug2: local server KEXINIT proposal
> [preauth]
>
> 9428 2019年06月10日 03:57:35.796 debug2: KEX algorithms:
> curve25519-sha256,[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
> [preauth]
>
> 9428 2019年06月10日 03:57:35.797 debug2: host key algorithms:
> ssh-rsa,rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519
> [preauth]
>
> 9428 2019年06月10日 03:57:35.798 debug2: ciphers ctos:
> [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
> [preauth]
>
> 9428 2019年06月10日 03:57:35.798 debug2: ciphers stoc:
> [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
> [preauth]
>
> 9428 2019年06月10日 03:57:35.798 debug2: MACs ctos:
> [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1
> [preauth]
>
> 9428 2019年06月10日 03:57:35.798 debug2: MACs stoc:
> [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1
> [preauth]
>
> 9428 2019年06月10日 03:57:35.798 debug2: compression ctos: none [preauth]
>
> 9428 2019年06月10日 03:57:35.798 debug2: compression stoc: none [preauth]
>
> 9428 2019年06月10日 03:57:35.799 debug2: languages ctos: [preauth]
>
> 9428 2019年06月10日 03:57:35.799 debug2: languages stoc: [preauth]
>
> 9428 2019年06月10日 03:57:35.799 debug2: first_kex_follows 0 [preauth]
>
> 9428 2019年06月10日 03:57:35.799 debug2: reserved 0 [preauth]
>
> 9428 2019年06月10日 03:57:35.799 debug2: peer client KEXINIT proposal
> [preauth]
>
> 9428 2019年06月10日 03:57:35.799 debug2: KEX algorithms:
> [email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,rsa2048-sha256,rsa1024-sha1,diffie-hellman-group1-sha1
> [preauth]
>
> 9428 2019年06月10日 03:57:35.799 debug2: host key algorithms:
> ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa,ssh-dss [preauth]
>
> 9428 2019年06月10日 03:57:35.799 debug2: ciphers ctos:
> aes256-ctr,aes256-cbc,[email protected],aes192-ctr,aes192-cbc,aes128-ctr,aes128-cbc,[email protected],blowfish-ctr,blowfish-cbc,3des-ctr,3des-cbc,arcfour256,arcfour128
> [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: ciphers stoc:
> aes256-ctr,aes256-cbc,[email protected],aes192-ctr,aes192-cbc,aes128-ctr,aes128-cbc,[email protected],blowfish-ctr,blowfish-cbc,3des-ctr,3des-cbc,arcfour256,arcfour128
> [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: MACs ctos:
> hmac-sha2-256,hmac-sha1,hmac-sha1-96,hmac-md5,[email protected],[email protected],[email protected],[email protected] [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: MACs stoc:
> hmac-sha2-256,hmac-sha1,hmac-sha1-96,hmac-md5,[email protected],[email protected],[email protected],[email protected] [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: compression ctos: none,zlib
> [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: compression stoc: none,zlib
> [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: languages ctos: [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: languages stoc: [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: first_kex_follows 0 [preauth]
>
> 9428 2019年06月10日 03:57:35.800 debug2: reserved 0 [preauth]
>
> 9428 2019年06月10日 03:57:35.801 debug1: kex: algorithm:
> [email protected] [preauth]
>
> 9428 2019年06月10日 03:57:35.801 debug1: kex: host key algorithm:
> ssh-ed25519 [preauth]
>
> 9428 2019年06月10日 03:57:35.801 debug1: kex: client->server cipher:
> aes256-ctr MAC: hmac-sha2-256 compression: none [preauth]
>
> 9428 2019年06月10日 03:57:35.801 debug1: kex: server->client cipher:
> aes256-ctr MAC: hmac-sha2-256 compression: none [preauth]
>
> 9428 2019年06月10日 03:57:35.801 debug1: expecting SSH2_MSG_KEX_ECDH_INIT
> [preauth]
>
> 9428 2019年06月10日 03:57:35.834 debug3: receive packet: type 30 [preauth]
>
> 9428 2019年06月10日 03:57:35.843 debug3: mm_key_sign entering [preauth]
>
> 9428 2019年06月10日 03:57:35.843 debug3: mm_request_send entering: type 6
> [preauth]
>
> 9428 2019年06月10日 03:57:35.843 debug3: mm_key_sign: waiting for
> MONITOR_ANS_SIGN [preauth]
>
> 9428 2019年06月10日 03:57:35.843 debug3: mm_request_receive_expect
> entering: type 7 [preauth]
>
> 9428 2019年06月10日 03:57:35.843 debug3: mm_request_receive entering
> [preauth]
>
> 9428 2019年06月10日 03:57:35.843 debug3: mm_request_receive entering
>
> 9428 2019年06月10日 03:57:35.843 debug3: monitor_read: checking request 6
>
> 9428 2019年06月10日 03:57:35.843 debug3: mm_answer_sign
>
> 9428 2019年06月10日 03:57:35.846 debug3: mm_answer_sign: hostkey proof
> signature 0000029369ED8600(83)
>
> 9428 2019年06月10日 03:57:35.846 debug3: mm_request_send entering: type 7
>
> 9428 2019年06月10日 03:57:35.846 debug2: monitor_read: 6 used once,
> disabling now
>
> 9428 2019年06月10日 03:57:35.846 debug3: send packet: type 31 [preauth]
>
> 9428 2019年06月10日 03:57:35.846 debug3: send packet: type 21 [preauth]
>
> 9428 2019年06月10日 03:57:35.846 debug2: set_newkeys: mode 1 [preauth]
>
> 9428 2019年06月10日 03:57:35.846 debug1: rekey after 4294967296 blocks
> [preauth]
>
> 9428 2019年06月10日 03:57:35.846 debug1: SSH2_MSG_NEWKEYS sent [preauth]
>
> 9428 2019年06月10日 03:57:35.846 debug1: expecting SSH2_MSG_NEWKEYS
> [preauth]
>
> 9428 2019年06月10日 03:57:36.356 debug3: receive packet: type 21 [preauth]
>
> 9428 2019年06月10日 03:57:36.356 debug1: SSH2_MSG_NEWKEYS received
> [preauth]
>
> 9428 2019年06月10日 03:57:36.356 debug2: set_newkeys: mode 0 [preauth]
>
> 9428 2019年06月10日 03:57:36.356 debug1: rekey after 4294967296 blocks
> [preauth]
>
> 9428 2019年06月10日 03:57:36.356 debug1: KEX done [preauth]
>
> 9428 2019年06月10日 03:57:36.399 debug3: receive packet: type 5 [preauth]
>
> 9428 2019年06月10日 03:57:36.399 debug3: send packet: type 6 [preauth]
>
> 9428 2019年06月10日 03:57:36.435 debug3: receive packet: type 50 [preauth]
>
> 9428 2019年06月10日 03:57:36.435 debug1: userauth-request for user
> TestUser service ssh-connection method none [preauth]
>
> 9428 2019年06月10日 03:57:36.435 debug1: attempt 0 failures 0 [preauth]
>
> 9428 2019年06月10日 03:57:36.435 debug3: mm_getpwnamallow entering
> [preauth]
>
> 9428 2019年06月10日 03:57:36.436 debug3: mm_request_send entering: type 8
> [preauth]
>
> 9428 2019年06月10日 03:57:36.436 debug3: mm_getpwnamallow: waiting for
> MONITOR_ANS_PWNAM [preauth]
>
> 9428 2019年06月10日 03:57:36.436 debug3: mm_request_receive_expect
> entering: type 9 [preauth]
>
> 9428 2019年06月10日 03:57:36.436 debug3: mm_request_receive entering
> [preauth]
>
> 9428 2019年06月10日 03:57:36.436 debug3: mm_request_receive entering
>
> 9428 2019年06月10日 03:57:36.436 debug3: monitor_read: checking request 8
>
> 9428 2019年06月10日 03:57:36.436 debug3: mm_answer_pwnamallow
>
> 9428 2019年06月10日 03:57:36.439 debug2: parse_server_config: config
> reprocess config len 287
>
> 9428 2019年06月10日 03:57:36.439 debug3: checking match for 'Group
> administrators' user TestUser host 130.147.168.135 addr
> 130.147.168.135 laddr 161.85.17.107 lport 22
>
> 9428 2019年06月10日 03:57:36.446 debug3: LsaLogonUser Succeeded
> (Impersonation: 0)
>
> 9428 2019年06月10日 03:57:36.448 debug1: user TestUser matched group list
> administrators at line 84
>
> 9428 2019年06月10日 03:57:36.448 debug3: match found
>
> 9428 2019年06月10日 03:57:36.448 debug3: reprocess config:85 setting
> AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
>
> 9428 2019年06月10日 03:57:36.449 debug3: mm_answer_pwnamallow: sending
> MONITOR_ANS_PWNAM: 1
>
> 9428 2019年06月10日 03:57:36.449 debug3: mm_request_send entering: type 9
>
> 9428 2019年06月10日 03:57:36.450 debug2: monitor_read: 8 used once,
> disabling now
>
> 9428 2019年06月10日 03:57:36.450 debug2: input_userauth_request: setting
> up authctxt for TestUser [preauth]
>
> 9428 2019年06月10日 03:57:36.450 debug3: mm_inform_authserv entering
> [preauth]
>
> 9428 2019年06月10日 03:57:36.450 debug3: mm_request_send entering: type 4
> [preauth]
>
> 9428 2019年06月10日 03:57:36.451 debug3: mm_request_receive entering
>
> 9428 2019年06月10日 03:57:36.451 debug3: monitor_read: checking request 4
>
> 9428 2019年06月10日 03:57:36.451 debug3: mm_answer_authserv:
> service=ssh-connection, style=
>
> 9428 2019年06月10日 03:57:36.451 debug2: monitor_read: 4 used once,
> disabling now
>
> 9428 2019年06月10日 03:57:36.451 debug2: input_userauth_request: try
> method none [preauth]
>
> 9428 2019年06月10日 03:57:36.452 debug3: userauth_finish: failure
> partial=0 next methods="publickey,password,keyboard-interactive"
> [preauth]
>
> 9428 2019年06月10日 03:57:36.452 debug3: send packet: type 51 [preauth]
>
> 9428 2019年06月10日 03:57:36.453 debug3: receive packet: type 50 [preauth]
>
> 9428 2019年06月10日 03:57:36.453 debug1: userauth-request for user
> TestUser service ssh-connection method publickey [preauth]
>
> 9428 2019年06月10日 03:57:36.453 debug1: attempt 1 failures 0 [preauth]
>
> 9428 2019年06月10日 03:57:36.454 debug2: input_userauth_request: try
> method publickey [preauth]
>
> 9428 2019年06月10日 03:57:36.454 debug1: userauth_pubkey: test pkalg
> ssh-rsa pkblob RSA SHA256:ospJEFHH81sy96YBMFEySGGUokk1KZHV+AbgNTFRrjE
> [preauth]
>
> 9428 2019年06月10日 03:57:36.455 debug3: mm_key_allowed entering [preauth]
>
> 9428 2019年06月10日 03:57:36.455 debug3: mm_request_send entering: type 22
> [preauth]
>
> 9428 2019年06月10日 03:57:36.455 debug3: mm_request_receive entering
>
> 9428 2019年06月10日 03:57:36.455 debug3: monitor_read: checking request 22
>
> 9428 2019年06月10日 03:57:36.456 debug3: mm_answer_keyallowed entering
>
> 9428 2019年06月10日 03:57:36.456 debug3: mm_answer_keyallowed:
> key_from_blob: 0000029369F0D8B0
>
> 9428 2019年06月10日 03:57:36.456 debug1: trying public key file
> __PROGRAMDATA__/ssh/administrators_authorized_keys
>
> 9428 2019年06月10日 03:57:36.456 debug3: Failed to open
> file:C:/ProgramData/ssh/administrators_authorized_keys error:2
>
> 9428 2019年06月10日 03:57:36.456 debug1: Could not open authorized keys
> '__PROGRAMDATA__/ssh/administrators_authorized_keys': No such file or
> directory
>
> 9428 2019年06月10日 03:57:36.456 debug3: mm_answer_keyallowed: publickey
> authentication test: RSA key is not allowed
>
> 9428 2019年06月10日 03:57:36.456 Failed publickey for TestUser from
> 130.147.168.135 port 64534 ssh2: RSA SHA256:ospJEFHH81sy96YBMFEySGGUokk1KZHV+AbgNTFRrjE
>
> 9428 2019年06月10日 03:57:36.456 debug3: mm_request_send entering: type 23
>
> 9428 2019年06月10日 03:57:36.457 debug3: mm_key_allowed: waiting for
> MONITOR_ANS_KEYALLOWED [preauth]
>
> 9428 2019年06月10日 03:57:36.457 debug3: mm_request_receive_expect
> entering: type 23 [preauth]
>
> 9428 2019年06月10日 03:57:36.457 debug3: mm_request_receive entering
> [preauth]
>
> 9428 2019年06月10日 03:57:36.457 debug2: userauth_pubkey: authenticated 0
> pkalg ssh-rsa [preauth]
>
> 9428 2019年06月10日 03:57:36.457 debug3: userauth_finish: failure
> partial=0 next methods="publickey,password,keyboard-interactive"
> [preauth]
>
> 9428 2019年06月10日 03:57:36.457 debug3: send packet: type 51 [preauth]
>
> 9428 2019年06月10日 03:57:36.482 debug3: receive packet: type 50 [preauth]
>
> 9428 2019年06月10日 03:57:36.482 debug1: userauth-request for user
> TestUser service ssh-connection method keyboard-interactive [preauth]
>
> 9428 2019年06月10日 03:57:36.482 debug1: attempt 2 failures 1 [preauth]
>
> 9428 2019年06月10日 03:57:36.482 debug2: input_userauth_request: try
> method keyboard-interactive [preauth]
>
> 9428 2019年06月10日 03:57:36.482 debug1: keyboard-interactive devs
> [preauth]
>
> 9428 2019年06月10日 03:57:36.483 debug1: auth2_challenge: user=TestUser
> devs= [preauth]
>
> 9428 2019年06月10日 03:57:36.483 debug1: kbdint_alloc: devices ''
> [preauth]
>
> 9428 2019年06月10日 03:57:36.483 debug2: auth2_challenge_start: devices
> [preauth]
>
> 9428 2019年06月10日 03:57:36.483 debug3: userauth_finish: failure
> partial=0 next methods="publickey,password,keyboard-interactive"
> [preauth]
>
> 9428 2019年06月10日 03:57:36.483 debug3: send packet: type 51 [preauth]
5 Answers 5
As of Windows 10 v1809, the default config (found in %ProgramData%/ssh/sshd_config) defines a separate AuthorizedKeysFile for administrator users:
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
This means any user who is in the special Windows Administrators group (SID S-1-5-32-544) will not look at the %UserProfile%/.ssh/authorized_keys file but will rather look at %ProgramData%/ssh/administrators_authorized_keys.
You have a few options:
- Use a non-administrator user, or
- Comment out those two lines from the bottom of
sshd_config, which will then revert back to the default per-userAuthorizedKeysFile, or - Add your keys to the (global!)
administrators_authorized_keysfile
My recommendation is to use a non-admin user if possible, or modify the config otherwise. A global key that is accepted for any account in the Administrators group sounds like unnecessary complexity.1
1 In a default config it is always possible to impersonate any other user from an admin user, since an admin user generally implies full root-level control in Windows. That might be their rationale for this default. But of course it makes configuration of a multi-user system rather confusing, where some (non-admin) users have their own authorized keys in a standard location while other (admin) users must share a single nonstandard authorized key list.
I believe there are no security benefits to such a configuration, apart from making it obvious that all admins can impersonate each other.
A future release may create user-specific folders under %ProgramData/ssh.
This is somewhat explored here: https://github.com/PowerShell/Win32-OpenSSH/issues/1324
-
Thank you for your answer. I did comment out the lines from the
sshd-configfile, butsshd logscomplain that it could not access theauthorized_keysfile because of permission, despite the fact that only the logged in user, which is the admin, has permission. I tried usingRepair-AuthorizedKeyPermission -FilePath $home\.ssh\authorized_keys, which addedNT Service user sshdto the list of users, apart from SYSTEM, and tried again, but this time, I got an error saying Bad Permission for userS-1-5-80,which is theNT service sshdthat was added byRepair AuthorizedKeyPermissionuser1173240– user11732402019年06月11日 04:10:58 +00:00Commented Jun 11, 2019 at 4:10 -
2@user1173240 It works for me on a clean Win10 v1903 (preview) install. What did you do earlier where you said "I fixed file permissions as required, to only my user, i.e., the logged in user, for the key file."? The default, valid, permissions are fully inherited (
authorized_keysinherits from.sshwhich inherits from the user profile), which by default allowsFull controltoSYSTEM,Administrators, and the specific user. This is generally considered a safe config - there's generally no point disallowing access toSYSTEMet al. since they can always override it.Bob– Bob2019年06月11日 04:17:41 +00:00Commented Jun 11, 2019 at 4:17 -
1The only things that shouldn't happen are making
id_rsa(private key) world/group-accessible (this is default, so don't addEveryoneand you're fine) orauthorized_keysworld/group-writable (again, this is default - in fact, default is stricter; in Linux makingauthorized_keysworld-readable is usually considered fine, equivalent to addingReadtoEveryoneon Windows, with traverse on parent folders).Administratorsgroup, which by default has access, is generally fine since they can usually elevate toSYSTEManyway.Bob– Bob2019年06月11日 04:36:19 +00:00Commented Jun 11, 2019 at 4:36 -
2@user1173240 So, a previous version (which you may be running) incorrectly added
sshdrather thanSYSTEM, hence the advice to removesshd. Keep in mind GitHub issues may be outdated. The current version allows/keeps any access/ownership from user/Administrators/SYSTEMand adds (if missing)Full ControltoSYSTEM. RemovingSYSTEM, evidently, breaks things. At this point resetting it to default inherited values is easiest, and should be safe.Bob– Bob2019年06月11日 05:09:39 +00:00Commented Jun 11, 2019 at 5:09 -
2It works. But I have to say, Windows documentation is always bad. Open source wins in part by good documentation.silencej– silencej2020年05月03日 15:28:46 +00:00Commented May 3, 2020 at 15:28
OpenSSH on Windows 10 requires additional configuration to recognize authorized_keys:
- Save your
authorized_keysinto the fileC:\ProgramData\ssh\administrators_authorized_keyswith no extension - Use the below PowerShell script to set the correct permissions on the file
$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys
$acl.SetAccessRuleProtection($true, $false)
$administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow")
$systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow")
$acl.SetAccessRule($administratorsRule)
$acl.SetAccessRule($systemRule)
$acl | Set-Acl
This, effectively, grants Full Control privileges to the administrators_authorized_keys file to both Administrators and SYSTEM.
If you don't do this, and instead only place the file in the .ssh folder for the user, you'll either get prompted for your password (instead of using the key file), or your connection will fail with "Too many authentication attempts".
References:
-
2Thanks for this. Adding the administrators_authorized_keys file didn't work for me until I ran the powershell script you provided. Now it worksmattgately– mattgately2022年01月24日 21:20:08 +00:00Commented Jan 24, 2022 at 21:20
-
I get an error when running
$acl.SetAccessRule($administratorsRule):Exception calling "SetAccessRule" with "1" argument(s): "Some or all identity references could not be translated." At line:1 char:1 + $acl.SetAccessRule($administratorsRule) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : IdentityNotMappedExceptionTyilo– Tyilo2024年10月09日 11:55:51 +00:00Commented Oct 9, 2024 at 11:55 -
I had a Danish windows installations, so I needed to use
$administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administratorer","FullControl","Allow"), however ssh with key auth still didn't work with this.Tyilo– Tyilo2024年10月09日 12:34:31 +00:00Commented Oct 9, 2024 at 12:34
Try to put more details here, if anyone has installed a built-in openssh server in Windows 10 (build 1809 or later, or Server 2016), whether or not following Microsoft's documents: Installation, Configuration and Key management. Seems they're pretty old or sort of incomplete and need updating.
After installation of this service, start it, you should connect it from your localhost via ssh username@localhost, assuming your Windows login name is username. But we want key based authentications and we must fail only according to Microsoft documents listed above:
- We can't rely on
Repair-AuthorizedKeyPermissionto fixauthorized_keys's permission, since we can't installOpenSSHUtilsmodule for now. Reason here, seems the signature is outdated. - As @Bob indicated, we have to comment something in
sshd_configif we don't setup key pair for Administrators.
If you just want use a single user's key based authentication, we just have to do as follows (Administrator privilege is required, all based on default built-in openssh server installation):
- Since we can't install
OpenSSHUtilsmodule, we set the permissions manually. Checkauthorized_keys's ownership and permissions:
PS C:\>(get-acl .\users\username\.ssh\authorized_keys).owner
username
PS C:\>icacls .\users\username\.ssh\authorized_keys
ssh_host_dsa_key BUILTIN\Administrators:(F)
username:(F)
otheruser1:(IR)
otheruser2:(R)
- Set correct ownership and permissions for
authorized_keys:
PS C:\>icacls .\users\username\.ssh\authorized_keys /inheritance:r
PS C:\>icacls .\users\username\.ssh\authorized_keys /remove otheruser2
- Search for and comment group matching policy in
sshd_config:
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
- (Optional) Enable key based authentication. Search for and change the text to:
PubkeyAuthentication yes
- (Optional) Disable password based authentication. Search for and change the text to:
PasswordAuthentication no
- Copy and paste the user's public key into
authorized_keyswho you want to connect as. - Restart
sshdservice. Now you should connect to this host with key authentications.
Consult following links for more detailed contents (this answer comes from):
Just to help someone like me who might be struggling to make public key authentication work for Administrator.
Make sure that only Administrators and SYSTEM can access C:\ProgramData\ssh\administrators_authorized_keys.
Basically you need to have the following security settings on your file:
In my case the file had also inherited permissions (so Authenticated Users could also access it) and as a result I was getting Failed publickey for Administrator error in sshd logs and could only login via password. Lost a couple hours trying to figure out why it wasn't working :-/
-
1So the key, is to disable inheritance for the administrator_authorized_key file, in programdata folder via the Advanced buttonKevin– Kevin2021年07月06日 03:10:50 +00:00Commented Jul 6, 2021 at 3:10
-
Yeah this is it, just needed to remove other usersdavispuh– davispuh2024年01月15日 13:09:42 +00:00Commented Jan 15, 2024 at 13:09
Thanks to the links provided by @user159960 I saw that I hadn't enabled ssh-agent, enabling that made key based login work.
Set-Service -Name ssh-agent -StartupType ‘Automatic’
Set-Service -Name sshd -StartupType ‘Automatic’
Start-Service ssh-agent
Start-Service sshd
I also noticed that my C:\ProgramData\ssh\administrators_authorized_keys had a non-administrator owner, once I corrected that I could ssh into my admin account.
-
1Why would you need to enable the agent on the server-side in order to authenticate?0xC0000022L– 0xC0000022L2024年07月10日 20:30:09 +00:00Commented Jul 10, 2024 at 20:30
userauth_pubkey: disabled because of invalid userThere's something wrong with the account on the server. There may be earlier log entries from sshd which indicate the actual problem. Please edit your question to include all of the sshd log entries from a connect attempt.Authorized_Keysfile is saved in the .ssh folder within the user's directory. The same location is mentioned in the sshd_config file within Program Data. The user logged in is the same whose local directory the keys file is saved in.Authorized_Keysfile is present in <System Drive>\Users\MyLoggedInAdministratorUser\.ssh folder. Its contents are those which are copied fromWinSCPPuTTygenerated key - public key area. It begins withssh-rsafollowed by a bunch of alphanumeric letters, and ends withrsa-key-20190607. I hope that is correct. I'll update the question to provide the additional information requested as soon as I have it.authorized_keys. But simply, because when you login, you assume a role/permissions of some local user (local as of the server).