Centos

使用 AD 憑據時成功驗證後 SSH 斷開連接

  • September 16, 2020

我正在努力讓 SSH 接受 AD 憑據。伺服器詳情

  • CentOS 8
  • 伺服器已成功加入域
  • Ran 領域發現哪個返回了有關我們的 AD 環境的正確資訊
  • 領域許可執行以允許特定使用者
  • SSH 配置文件稍作修改。它主要只阻止root登錄。
  • 使用本地使用者帳戶通過 SSH 連接到伺服器有效。
  • 使用 id someuser 可以查找使用者。我不需要附加 upn 後綴 (@ad.sample.com)。

行為

  • 通過 SSH 登錄時,它會提示輸入使用者名(提供 AD 使用者名),然後是密碼(提供 AD 使用者密碼),在提供密碼後,SSH 會話會立即終止。我可以看到通過 /var/log/secure 日誌傳入的請求,並且可以看到憑據已被接受。一旦它通過身份驗證,會話就會立即關閉。我為使用者使用了錯誤的憑據進行了測試,並且可以看到安全日誌中報告了這一點,就像終端本身一樣。
  • 我還測試了嘗試通過實際的伺服器控制台登錄,它最初似乎讓我進入,然後立即引導我重新登錄。
  • SSH 調試的有趣之處在於 MOTD 是可見的。
  • 當新使用者嘗試通過 SSH 登錄時,會創建他們的主目錄。

SSH 調試的部分輸出

someuser@x.x.x.x'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

我已經檢查了幾篇關於設置的文章/部落格,我認為我沒有錯過任何東西。我應該提到我已經嘗試將 SSH 添加到 sssd.conf 文件的服務部分。它沒有任何區別。

有誰知道我還能檢查什麼?或者可能有什麼問題?

我終於能夠解決這個問題。有一個主要問題:

  • 我的 SSSD 配置缺少定義使用者 shell 的值

我最初是通過以下文章收到此問題的警告:在 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 成功登錄。

然後我遇到了另一個問題,使用者主目錄沒有被創建。有一個 AD 屬性可以控制它,稱為 unixHomeDirectory。我們不會為所有使用者填充此內容,因此我也在 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

要檢查的另一件事是您的 access.conf 文件。您描述的某些行為可以通過允許本地帳戶但拒絕其他帳戶的設置來完成,直到設置了有效的組或使用者。

引用自:https://unix.stackexchange.com/questions/591966