SSH 無法創建偽終端
我們公司的產品是在容器中執行的應用程序。它偵聽埠 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 應該不會失敗。