SSH не может создать псевдотерминал

SSH не может создать псевдотерминал

Продукт нашей компании — это приложение, работающее в контейнере. Оно прослушивает порт 2222 для установки интерфейса командной строки.

У клиента возникли проблемы с SSH. Мы никогда раньше не сталкивались с подобной проблемой и не можем ее воспроизвести с той же ОС (RHEL 7.8), версией Docker (RHEL packaged 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 <>

Погуглив это, возможно, это неправильные разрешения на: /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 ...где user-id=1000001, group-id=0 или root. Если вместо этого они запускают контейнер как root, docker run --user 0:0 ...то эта проблема не возникает. Это проблема с разрешениями где-то.

Кто-нибудь сталкивался с этим раньше?

Буду очень признателен за любые подсказки, так как у меня нет идей.

решение1

Мы обнаружили, что проблема заключалась в том, что NIS клиента настраивал tty на группу 7.

Мы настраиваем strace на ssh-процесс внутри контейнера. Когда они пытаются войти в 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 не должен завершаться ошибкой.

Связанный контент