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 <>

인터넷 검색에 따르면 /dev/pts, /dev/pts/ptmx 또는 /dev/ptmx에 대한 권한이 잘못되었을 가능성이 있습니다. 하지만 여기서는 그 말이 맞습니다.

또 다른 가능성은 devpt 마운트에 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 또는 루트를 사용하여 컨테이너를 실행합니다 . 대신 컨테이너를 루트로 실행하면 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로 설정하는 것을 확인했습니다.

컨테이너가 루트(--docker run에 사용자가 지정되지 않음)로 실행 중이거나 docker 컨테이너가 호스트 네트워킹을 사용하지 않는 경우에는 이 실패가 발생하지 않습니다.

이 문제를 해결하려면 NIS 설정이 컨테이너로 유출되지 않는지 확인해야 하므로 컨테이너 내에서 /etc/nsswitch.conf를 편집하고 , 및 항목 에 nis대해 제거합니다 .passwdshadowgroup

이제 ssh 세션이 시작되면 컨테이너의 /dev/pts/<>가 컨테이너 그룹("올바른" 그룹)과 함께 생성되며 chown이 실패하지 않아야 합니다.

관련 정보