SFTP 구성 파일 출력 문제

SFTP 구성 파일 출력 문제

SFTP 로그인이 더 이상 작동하지 않고 오류 127이 발생한 후 SSH 연결이 /etc/profile.d/에 설치된 스크립트를 통해 일부 출력을 생성한 것을 발견했습니다.

이전 버전의 sshd에는 "UseLogin"이라는 옵션이 기본적으로 "no"로 설정되어 있어 구성 파일의 내용이 실행되지 않았습니다. 해당 옵션은 더 이상 존재하지 않으며 기본 동작이 변경된 것으로 보입니다.

sshd_config에서 이제 교체되었습니다.

Subsystem  sftp  /usr/lib/ssh/sftp-server

통과

Subsystem sftp  internal-sftp

이것이 더 잘 작동하는 것 같습니다(SFTP가 작동 중입니다).

그러나 우리 모두 알고 있듯이 작동 이유를 이해하지 못한다면 아직 해결되지 않은 것입니다.

누군가 이것을 설명할 수 있나요? 더 나은 "수정"을 제안할까요?

고쳐 쓰다SLES15.4(openssh-server-8.4p1)

답변1

SFTP는 SSH를 전송 수단으로 사용합니다. 모든 SFTP 클라이언트는 SSH 서버가 SFTP 서버(예: )와의 통신을 설정하기를 원합니다 sftp-server.

적어도 OpenSSH에서는 SSH 서버가 무언가를 실행하라는 지시를 받으면 대상 사용자의 셸을 사용하여 그렇게 합니다.

Subsystem …하위 시스템(사용자 정의 하위 시스템일 수도 있음)은 에 항목을 추가하여 정의할 수 있습니다 sshd_config. 그런 경우에도 제공된 명령은 사용자의 셸에서 실행됩니다. 표준 하위 시스템이 로 지정되면 sftp이런 일이 발생합니다 /usr/lib/ssh/sftp-server.

SFTP 클라이언트가 SFTP 서버와 통신하려고 할 때 셸(또는 다른 것)이 일부 "가비지"를 인쇄하면 SFTP 프로토콜 범위를 벗어나 통신이 중단됩니다.

SSH 서버가 사용자의 셸을 사용하는 한 모든 것이 완전히 안정적으로 작동하도록 하는 옵션은 없습니다. 이 때문입니다일반적으로 말하면:

  1. 사용자의 쉘은 무엇이든 될 수 있습니다.
  2. 정상적인 쉘이라도 일부 파일을 얻을 수 있습니다. 일부 셸에는 이 작업을 수행하지 말라고 지시할 수 있지만 이식 가능한 옵션이 없으며 클라이언트는 셸을 호출할 때 SSH 서버에 사용자 지정 옵션을 사용하도록 지시할 수 없습니다.
  3. 소스 파일은 무언가를 인쇄할 수도 있고 무언가를 인쇄하는 것을 실행할 수도 있습니다.

사용자 셸을 피하는 유일한 방법은 SSH 서버에서 내부적으로 처리되는 하위 시스템을 사용하는 것입니다. AFAIK sshd현재 OpenSSH의 유일한 내부 하위 시스템은 internal-sftp.

internal-sftp쉘에 의존하지 않으므로 문제를 해결했습니다.

또 다른 수정 방법은 SFTP 서버 이외의 다른 서버가 SSH 서버에서 제공하는 표준 스트림을 사용하는지 확인하는 것입니다. 해결 방법에는 사용자의 셸을 침묵시키는 것이 포함됩니다.그리고쉘은 실제 요청된 명령을 실행하고 있습니다(예 /usr/lib/ssh/sftp-server: 서버에 대한 루트 액세스 권한이 있는 사람이나 사용자 자신이 쉽게 손상될 수 있습니다).

비교를 위한 몇 가지 흥미로운 사례:

답변2

그것은 중요하지 않습니다.

LD_LIBRARY_PATH=/some/path누군가가 오래된 라이브러리(예: libcrypto)를 포함하는 / some/path 에 들어가서 /etc/profile.d/xxx고대의 작업을 수행했습니다. 재미없다고만 말씀드리겠습니다. 이것은 또한 sftp-server를 깨뜨리는 것입니다.

/usr/lib/ssh/sftp-server: symbol lookup error: /usr/lib/ssh/sftp-server: undefined symbol: EVP_KDF_CTX_new_id, version OPENSSL_1_1_1d

고쳐 쓰다profile.d에서 생성된 출력이 여전히 존재하기 때문에 위 문제를 해결하면 sftp-server가 다시 작동할지는 확실하지 않습니다. 나는 그것을 시도하지 않았습니다. 고정된 오류/종료 코드 127이 있을 수 있지만 다른 오류가 생성될 수 있습니다.

내부적으로 sftp는 잘못된 라이브러리를 사용하지도 않고 로그인 쉘을 생성하지도 않기 때문에(자세한 내용은 @kamil-maciorowski의 답변 참조) 이것이 유일한 탈출구일 수 있습니다. 특정 uid(예: uid 0이 아닌 경우)에 대해서만 실행되도록 profile.d의 스크립트를 조정하는 경우를 제외하면 어떤 경우에는 출력이 생성되지 않습니다.

관련 정보