弊社の製品はコンテナ内で実行されるアプリケーションです。コマンド ライン インターフェイスを確立するためにポート 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 tty
NIS が tty をグループ 7 に設定していることがわかりました。
コンテナが root として実行されている場合 (docker run で --user が指定されていない場合)、または docker コンテナがホスト ネットワークを使用していない場合、この失敗は発生しません。
これを修正するには、NIS 設定がコンテナに漏洩しないようにする必要があります。そのため、コンテナ内の /etc/nsswitch.conf を編集し、、、およびエントリnis
を削除します。passwd
shadow
group
これで、ssh セッションが起動されると、コンテナ内の /dev/pts/<> がコンテナ グループ (「正しい」グループ) で作成され、chown が失敗しなくなります。