AD 자격 증명을 수락하도록 SSH를 얻으려고합니다. 서버 세부정보
- 센트OS 8
- 서버가 도메인에 성공적으로 가입했습니다.
- Ran Realm은 AD 환경에 대한 올바른 정보를 반환했음을 발견했습니다.
- 특정 사용자를 허용하기 위해 실행이 허용된 영역
- SSH 구성 파일이 약간 수정되었습니다. 주로 루트 로그인만 방지합니다.
- 로컬 사용자 계정을 사용하여 SSH를 통해 서버에 연결할 수 있습니다.
- 사용자는 someuser라는 ID를 사용하여 검색할 수 있습니다. upn 접미사(@ad.sample.com)를 추가할 필요가 없습니다.
행동
- SSH를 통해 로그인하면 사용자 이름(AD 사용자 이름 제공)을 묻는 메시지를 표시한 다음 비밀번호(AD 사용자 비밀번호 제공)를 묻는 메시지를 표시하고, 비밀번호를 제공하면 SSH 세션이 즉시 종료됩니다. /var/log/secure 로그를 통해 들어오는 요청과 자격 증명이 수락되는 것을 볼 수 있습니다. 인증되면 세션이 즉시 닫힙니다. 잘못된 사용자 자격 증명으로 테스트한 결과 터미널 자체와 마찬가지로 보안 로그에 이 내용이 보고된 것을 볼 수 있었습니다.
- 또한 실제 서버 콘솔을 통해 로그인 시도를 테스트했는데 처음에는 로그인이 허용되었다가 즉시 다시 로그인되는 것처럼 보였습니다.
- SSH 디버깅의 흥미로운 점은 MOTD가 표시된다는 것입니다.
- 새 사용자가 SSH를 통해 로그인을 시도하면 해당 사용자의 홈 디렉터리가 생성됩니다.
SSH 디버깅의 부분 출력
[email protected]'s password:
debug3: packet_send2: adding 48 (len 72 padlen 8 extra_pad 64)
debug2: we sent a password packet, wait for reply
debug1: Authentication succeeded (password).
Authenticated to x.x.x.x ([x.x.x.x]:xx).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting
debug1: Entering interactive session.
debug1: client_input_global_request: rtype want_reply 0
debug2: callback start
debug2: fd 3 setting TCP_NODELAY
debug3: packet_set_tos: set IP_TOS 0x10
debug2: client_session2_setup: id 0
debug2: channel 0: request pty-req confirm 1
debug1: Sending environment.
debug3: Ignored env XDG_SESSION_ID
debug3: Ignored env HOSTNAME
debug3: Ignored env TERM
debug3: Ignored env SHELL
debug3: Ignored env HISTSIZE
debug3: Ignored env SSH_CLIENT
debug3: Ignored env SSH_TTY
debug3: Ignored env USER
debug3: Ignored env LS_COLORS
debug3: Ignored env MAIL
debug3: Ignored env PATH
debug3: Ignored env PWD
debug1: Sending env LANG = en_US.UTF-8
debug2: channel 0: request env confirm 0
debug3: Ignored env HISTCONTROL
debug3: Ignored env SHLVL
debug3: Ignored env HOME
debug3: Ignored env LOGNAME
debug3: Ignored env SSH_CONNECTION
debug3: Ignored env LESSOPEN
debug3: Ignored env XDG_RUNTIME_DIR
debug3: Ignored env _
debug2: channel 0: request shell confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel_input_status_confirm: type 99 id 0
debug2: PTY allocation request accepted on channel 0
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: shell request accepted on channel 0
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Tue Jun 9 some date from x.x.x.x
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype reply 0
debug2: channel 0: rcvd eow
debug2: channel 0: close_read
debug2: channel 0: input open -> closed
debug2: channel 0: rcvd close
debug3: channel 0: will not send data after close
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
#0 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cc -1)
Connection to x.x.x.x closed.
Transferred: sent 2824, received 2420 bytes, in 0.1 seconds
Bytes per second: sent 24722.5, received 21185.7
debug1: Exit status 1
우리의 sssd.conf
[sssd]
domains = ad.sample.com
config_file_version = 2
services = nss, pam
[domain/ad.sample.com]
ad_domain = ad.sample.com
krb5_realm = AD.SAMPLE.COM
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
#use_fully_qualified_names = True
use_fully_qualified_names = False
#fallback_homedir = /home/%u@%d
fallback_homedir = /home/%u
access_provider = simple
simple_allow_users = someuser
이 기능 설정에 대한 몇 가지 게시물/블로그를 확인했는데 아무것도 놓친 것이 없는 것 같습니다. sssd.conf 파일의 서비스 섹션에 SSH를 추가해 보았습니다. 아무런 차이가 없습니다.
내가 확인할 수 있는 다른 항목을 아는 사람이 있나요? 아니면 무엇이 잘못되었을 수 있나요?
답변1
확인해야 할 또 다른 사항은 access.conf 파일입니다. 설명하는 동작 중 일부는 로컬 계정을 허용하지만 유효한 그룹이나 사용자가 설정될 때까지 다른 계정을 거부하도록 설정하여 수행할 수 있습니다.
답변2
마침내 이 문제를 해결할 수 있었습니다. 한 가지 중요한 문제가 있습니다.
- 내 SSSD 구성에 사용자 셸을 정의하는 값이 없습니다.
저는 다음 게시물을 통해 이 문제를 처음 발견했습니다.SSH 디버깅에서 오류 강조 표시
특히 SSH 디버깅의 다음 줄은 문제를 나타냅니다.
client_input_channel_req: channel 0 rtype exit-status reply 0
이 링크에 따르면 이는 사용자가 쉘을 선택할 수 없음을 나타냅니다.
AD를 확인하고 loginShell 속성을 입력했지만 시스템이 이를 허용하지 않는 것 같습니다. /etc/sssd/sssd.conf 파일에 다음 줄을 추가했습니다.
override_shell = /bin/bash
shell_fallback = /bin/bash
이를 추가한 후 SSH를 사용하여 성공적으로 로그인할 수 있었습니다.
그런 다음 사용자 홈 디렉터리가 생성되지 않는 또 다른 문제에 직면했습니다. 이를 제어하는 unixHomeDirectory라는 AD 속성이 있습니다. 모든 사용자에 대해 이를 채우지는 않을 것이므로 SSSD 구성에 홈 디렉터리에 대한 재정의도 추가했습니다.
override_homedir = /home/%u
SSSD의 최종 구성은 다음과 같습니다.
[sssd]
domains = example.com
config_file_version = 2
services = nss, pam
[domain/example.com]
ad_domain = example.com
krb5_realm = example.com
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
override_shell = /bin/bash
shell_fallback = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
override_homedir = /home/%u
access_provider = simple
simple_allow_users = someuser