Продукт нашей компании — это приложение, работающее в контейнере. Оно прослушивает порт 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 не должен завершаться ошибкой.