Ssh

SSH 無法創建偽終端

  • January 11, 2021

我們公司的產品是在容器中執行的應用程序。它偵聽埠 2222 以建立命令行界面。

客戶遇到 SSH 問題,我們以前從未見過此問題,並且無法使用完全相同的作業系統(RHEL 7.8)、Docker 版本(RHEL 打包 1.13.1)+容器(我們的應用程序,相同版本)重現。

當他們這樣做時:

ssh -p 2222 <user>@<ip>

他們在客戶端看到的錯誤是:

server refused to allocate pty或者PTY allocation request failed on channel 0

我們的應用程序(伺服器)中的錯誤日誌是:

openpty: Operation not permitted
session_pty_req: session 0 alloc failed
pam_unix(sshd:session): session closed for user <>

Google搜尋,可能是以下權限不正確:/dev/pts,或/dev/pts/ptmx,或/dev/ptmx。但他們在這裡是正確的。

另一種可能性是安裝的 devpts 缺少 gid=5。我檢查了一下,主機和容器上的掛載看起來都是正確的。

# Host
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
# Container
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666 0 0

我已經對照客戶的系統交叉檢查了我的系統。這一切看起來都匹配,但顯然有些地方是錯誤的。

另一個數據點:目前他們使用docker run --user 100001:0 ...where user-id=1000001, group-id=0 或 root 執行容器。相反,如果他們以 root 身份執行容器,docker run --user 0:0 ...則不會發生此問題。這是某個地方的權限問題。

有沒有人遇到過這個?

任何提示將不勝感激,因為我沒有想法。

我們發現問題是客戶的 NIS 將 tty 設置為組 7。

我們在容器內的 ssh 程序上設置了 strace。當他們嘗試 ssh 時,openpty() 將嘗試 chown 並失敗,我們在 strace 日誌中看到了這一點:

chown("/dev/pts/0", 1000001, 7)         = -1 EPERM (Operation not permitted)

然後當我們這樣做時,getent group | grep tty我們看到 NIS 將 tty 設置為第 7 組。

如果容器以 root 身份執行(–user 未在 docker run 中指定),或者 docker 容器未使用主機網路,則不會發生此故障。

為了解決這個問題,我們需要確保 NIS 設置不會洩露到容器中,因此在容器中編輯 /etc/nsswitch.conf,並刪除、nis和條目。passwd``shadow``group

現在,當啟動 ssh 會話時,容器中的 /dev/pts/<> 將使用容器組(“正確”組)創建,並且 chown 應該不會失敗。

引用自:https://serverfault.com/questions/1048883