SSHが擬似端末の作成に失敗する

SSHが擬似端末の作成に失敗する

弊社の製品はコンテナ内で実行されるアプリケーションです。コマンド ライン インターフェイスを確立するためにポート 2222 をリッスンします。

顧客が SSH に関する問題を抱えていますが、この問題はこれまで発生したことがなく、まったく同じ OS (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 の権限が正しくない可能性があります。ただし、ここでは正しいです。

もう 1 つの可能性は、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 ...user-id=1000001、group-id=0、または root を使用して実行されています。代わりに、コンテナーを root として実行するとdocker run --user 0:0 ...、この問題は発生しません。どこかに権限の問題があります。

これまでにこれに遭遇した人はいますか?

アイデアがないので、何かヒントがあればいただければ幸いです。

答え1

問題は、顧客の NIS が tty をグループ 7 に設定していることにあることがわかりました。

コンテナ内の ssh プロセスに strace を設定しました。ssh でログインしようとすると、openpty() が chown を試行して失敗します。strace ログに次のように表示されます。

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

すると、getent group | grep ttyNIS が tty をグループ 7 に設定していることがわかりました。

コンテナが root として実行されている場合 (docker run で --user が指定されていない場合)、または docker コンテナがホスト ネットワークを使用していない場合、この失敗は発生しません。

これを修正するには、NIS 設定がコンテナに漏洩しないようにする必要があります。そのため、コンテナ内の /etc/nsswitch.conf を編集し、、、およびエントリnisを削除します。passwdshadowgroup

これで、ssh セッションが起動されると、コンテナ内の /dev/pts/<> がコンテナ グループ (「正しい」グループ) で作成され、chown が失敗しなくなります。

関連情報