키에 연결된 비밀번호가 있는 키 기반 인증을 사용할 때 특정 사용자로 서버에 연결할 때 SSH 오류가 발생합니다.
이는 IBM i 시스템에 있습니다.
~/.ssh/authorized_keys
해당 사용자의 서버에 있는 파일 에 공개 키를 추가했습니다 . 홈 디렉토리는 ~/.ssh
디렉토리 및 /.ssh/authorized_keys
파일과 함께 소유자 이외의 누구에게도 쓰기 권한이 없습니다. 그리고 소유자는 그들 모두에 대해 적절하게 설정되었습니다. 흥미롭게도 동일한 키를 다른 사용자에게 옮기면 비밀번호가 승인됩니다. 또는 사용자 JAV에 대해 다른 사용자에게 작동하는 키 쌍을 사용하면 동일한 동작이 발생합니다. 따라서 이 문제의 원인이 되는 서버측 사용자 "JAV"에 관한 뭔가가 있는 것 같습니다.
이상한 점은 사용자에게 비밀번호를 묻는 메시지가 표시될 때까지 연결 시도가 실패하지 않는다는 것입니다. 내가 찾을 수 있는 모든 것은 파일 권한이 부정확하다는 점을 가리키지만 작업하는 사용자와 그렇지 않은 사용자 간의 관련 파일에 대한 권한을 일치시켰습니다.
JAV는 작동하지 않는 사용자입니다.
/home/JAV
및에 대한 권한 .ssh
:
bash-4.4$ pwd
/home/JAV
bash-4.4$ ls -la
total 300
drwx--S--- 4 jav 0 24576 Oct 17 14:41 .
drwxrwsrwx 102 qsys 0 61440 Oct 17 15:21 ..
-rw------- 1 jav 0 2108 Oct 17 15:32 .bash_history
-rwx------ 1 jav 0 204 Dec 18 2018 .bash_profile
-rwx------ 1 jav 0 83 May 5 2017 .bashrc
drwxrwsrwx 3 jav 0 8192 May 9 2018 .eclipse
-rwx------ 1 jav 0 559 Oct 17 16:45 .profile
-rw------- 1 jav 0 546 Oct 22 2018 .sh_history
drwx--S--- 2 jav 0 8192 Oct 17 16:55 .ssh
bash-4.4$
실패한 시도를 시도할 때 매우 자세한 출력:
┌─[dl @ PC-1802]─[~/.ssh]─[575]
└─[$]› ssh -vvv JAVDL
OpenSSH_7.6p1, OpenSSL 1.0.2n 7 Dec 2017
debug1: Reading configuration data /c/Users/dl/.ssh/config
debug1: /c/Users/dl/.ssh/config line 55: Applying options for JAVDL
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolving "mydomain.local" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to mydomain.local [10.0.15.8] port 22.
debug1: Connection established.
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/dl/.ssh/dl_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/dl/.ssh/dl_rsa-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.6
debug1: Remote protocol version 2.0, remote software version OpenSSH_8.0
debug1: match: OpenSSH_8.0 pat OpenSSH* compat 0x04000000
debug2: fd 3 setting O_NONBLOCK
debug1: Authenticating to mydomain.local:22 as 'jav'
debug3: hostkeys_foreach: reading file "/c/Users/dl/.ssh/known_hosts"
debug3: record_hostkey: found key type ECDSA in file /c/Users/dl/.ssh/known_hosts:1
debug3: record_hostkey: found key type RSA in file /c/Users/dl/.ssh/known_hosts:4
debug3: load_hostkeys: loaded 2 keys from mydomain.local
debug3: order_hostkeyalgs: prefer hostkeyalgs: [email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,rsa-sha2-512,rsa-sha2-256,ssh-rsa
debug3: send packet: type 20
debug1: SSH2_MSG_KEXINIT sent
debug3: receive packet: type 20
debug1: SSH2_MSG_KEXINIT received
debug2: local client KEXINIT proposal
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-group-exchange-sha1,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1,ext-info-c
debug2: host key algorithms: [email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,rsa-sha2-512,rsa-sha2-256,ssh-rsa,[email protected],ssh-ed25519
debug2: ciphers ctos: aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,aes256-cbc,aes192-cbc
debug2: ciphers stoc: aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc,aes256-cbc,aes192-cbc
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
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
debug2: compression ctos: none,[email protected],zlib
debug2: compression stoc: none,[email protected],zlib
debug2: languages ctos:
debug2: languages stoc:
debug2: first_kex_follows 0
debug2: reserved 0
debug2: peer server KEXINIT proposal
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
debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256,ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519
debug2: ciphers ctos: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
debug2: ciphers stoc: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
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
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
debug2: compression ctos: none,[email protected]
debug2: compression stoc: none,[email protected]
debug2: languages ctos:
debug2: languages stoc:
debug2: first_kex_follows 0
debug2: reserved 0
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: aes128-ctr MAC: [email protected] compression: none
debug1: kex: client->server cipher: aes128-ctr MAC: [email protected] compression: none
debug3: send packet: type 30
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug3: receive packet: type 31
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:7Z25Q7mljYwlFOHC0SPGiCraFwbW/Pm4ecbfLL/w29E
debug3: hostkeys_foreach: reading file "/c/Users/dl/.ssh/known_hosts"
debug3: record_hostkey: found key type ECDSA in file /c/Users/dl/.ssh/known_hosts:1
debug3: record_hostkey: found key type RSA in file /c/Users/dl/.ssh/known_hosts:4
debug3: load_hostkeys: loaded 2 keys from mydomain.local
debug3: hostkeys_foreach: reading file "/c/Users/dl/.ssh/known_hosts"
debug3: record_hostkey: found key type ECDSA in file /c/Users/dl/.ssh/known_hosts:1
debug3: load_hostkeys: loaded 1 keys from 10.0.15.8
debug1: Host 'mydomain.local' is known and matches the ECDSA host key.
debug1: Found key in /c/Users/dl/.ssh/known_hosts:1
debug3: send packet: type 21
debug2: set_newkeys: mode 1
debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug3: receive packet: type 21
debug1: SSH2_MSG_NEWKEYS received
debug2: set_newkeys: mode 0
debug1: rekey after 4294967296 blocks
debug2: key: /c/Users/dl/.ssh/dl_rsa (0x0), explicit
debug3: send packet: type 5
debug3: receive packet: type 7
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
debug3: receive packet: type 6
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug3: send packet: type 50
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,keyboard-interactive
debug3: start over, passed a different list publickey,keyboard-interactive
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /c/Users/dl/.ssh/dl_rsa
Enter passphrase for key '/c/Users/dl/.ssh/dl_rsa':
debug3: sign_and_send_pubkey: RSA SHA256:YVE0kS2H4/n5umGS4Gv0J+aWFljM4pauXG8KEe1+2YI
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,keyboard-interactive
debug2: we did not send a packet, disable method
debug3: authmethod_lookup keyboard-interactive
debug3: remaining preferred: password
debug3: authmethod_is_enabled keyboard-interactive
debug1: Next authentication method: keyboard-interactive
debug2: userauth_kbdint
debug3: send packet: type 50
debug2: we sent a keyboard-interactive packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,keyboard-interactive
debug3: userauth_kbdint: disable: no info_req_seen
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
[email protected]: Permission denied (publickey,keyboard-interactive).
┌─[dl @ PC-1802]─[~/.ssh]─[576]
└─[$]›
다음에 대한 권한 ~/.ssh/authorized_keys
:
bash-4.4$ pwd
/home/JAV/.ssh
bash-4.4$ ls -la
total 40
drwx--S--- 2 jav 0 8192 Oct 17 17:22 .
drwx--S--- 4 jav 0 24576 Oct 17 14:41 ..
-rwx------ 1 jav 0 1303 Oct 17 16:55 authorized_keys
bash-4.4$
내가 사용하는 SSH 호스트 별칭 정의:
Host JAVDL
HostName mydomain.local
Port 22
User jav
IdentityFile ~/.ssh/dl_rsa
sshd_config
또한 우리 파일에는 명시적인 거부/허용 지시문이 있다는 점에 주목하고 싶습니다 .
부분sshd_config
DenyUsers root
AllowUsers dl jav
무슨 뜻인지에 대한 어떤 표시도 찾을 수 없습니다 debug3: receive packet: type 51
. 내 인터넷 검색 기술이 부족한 것일 수도 있지만 openssh에 대한 다양한 패킷 유형이 무엇인지에 대한 참조조차 찾을 수 없습니다.RFC.
답변1
debug3: receive packet: type 51이 무엇을 의미하는지에 대한 표시를 찾을 수 없습니다. 내 인터넷 검색 기술이 부족할 수도 있지만 RFC에서도 openssh에 대한 다양한 패킷 유형이 무엇인지에 대한 참조조차 찾을 수 없습니다.
패킷 51은 RFC 4252에 설명된 대로 SSH_MSG_USERAUTH_FAILURE를 의미합니다.
https://www.rfc-editor.org/rfc/rfc4252#section-6
이는 어떤 이유로 키가 거부되었음을 의미하며, 이는 서버 로그에 기록됩니다(또는 서버에서 logLevel을 높이면 기록됩니다).
답변2
첫째, SSHD 로깅은 IBM i에서 기본적으로 활성화되지 않습니다. 설정하려면 다음 문서를 따르세요.https://www.ibm.com/support/pages/sshd-can-use-unix-syslog-facilities-logging
그런 다음 서버의 logLevel을 늘린 후 DEBUG3
다음 항목을 찾았습니다.
sshd[262719]: User jav not allowed because shell /QOpenSys/QIBM/ProdData/OPS/tools/bin/bash does not exist
해당 파일은 우리 시스템에 존재하지 않지만 bash
IBM의 YUM 저장소에서 설치한 경우에도 존재해서는 안 됩니다. 이는 bash
현재 사용되지 않는 것으로 간주되는 bash를 얻기 위해 5733OPS를 사용하는 경우 의 위치입니다 .
PASE
몇 가지 검색 후에 특정 사용자에 대한 기본 셸을 설정하는 UDF가 있다는 것을 확인했습니다 . QSYS2.SET_PASE_SHELL_INFO()
여기에 설명된 대로:http://archive.ibmsystemsmag.com/blogs/open-your-i/august-2017/tech-tip-be-like-a-turtle/. 사용자 "jav"의 값을 쿼리하고 이 값이 작동하는 사용자와 비교한 후, 사용자 "jav"의 값은 로 설정되어 있는 /QOpenSys/QIBM/ProdData/OPS/tools/bin/bash
반면 다른 모든 사용자의 값은 으로 설정되어 있음 을 발견했습니다 NULL
. 물론, 값을 로 설정한 후에는 NULL
모든 것이 예상대로 작동했습니다.
. .profile
하지만 우리는 시작 파일만 사용합니다.
모든 사용자의 값을 확인하는 쿼리:
SELECT AUTHORIZATION_NAME, PASE_SHELL_PATH
FROM QSYS2.USER_INFO;