rssh를 사용하여 개인 apt 저장소 제한 - apt-get이 /bin/sh를 시도하는 이유는 무엇입니까?

rssh를 사용하여 개인 apt 저장소 제한 - apt-get이 /bin/sh를 시도하는 이유는 무엇입니까?

SSH를 통해 개인 저장소를 설정하려고 합니다. 내 sources.list.d/포함 항목

deb ssh://user@host:/repo ./ 

사용자는 호스트의 인증서 전용 계정입니다. apt-get update잘 작동합니다.

그러나 다운로드 저장소에 대한 액세스를 제한하고 싶습니다. 즉, 셸 액세스를 비활성화하고 싶습니다. 사용자 셸을 rssh로 설정하고 scp 및 sftp만 허용하면 업데이트가 중단됩니다.

에서 /var/log/syslog:

user user attempted to execute forbidden commands
command: /bin/sh

apt가 저장소 시스템에 대한 쉘 액세스를 요구하는 이유는 무엇이며 이를 방지할 수 있는 방법이 있습니까?

apt-transport-sftp에 대한 github 저장소가 있다는 것을 알았고 살펴볼 수도 있지만 사용자 편의를 위해 더 일반적인 패키지를 사용하는 것이 좋습니다.

답변1

APT는 원격으로 무엇을 합니까?

테스트 계정을 설정하고 apt간단한 스크립트를 사용하여 저장소 소유자의 셸 대신 원격 서버에서 실행되는 모든 명령을 기록했습니다. apt잘 알려진 파일의 전체 경로를 찾기 위해 원격 쉘이 생성되는 것 같습니다 ::

2015-09-14: Executing 'sh -c /bin/sh'; input and output follows:
find /tmp/repo/./InRelease -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Release.gpg -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Release -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Packages.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./it_CH.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./it.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./en.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Packages.xz -follow -printf '%s\n' 2> /dev/null || echo

...

따라서 repo 사용자가 수행할 수 있는 작업에 대한 제한을 전달할 수 없다고 생각합니다 rssh. (1) 실행될 명령이 STDIN을 통해 원격 셸로 전달되고(SSH의 원격 실행 기능과 반대) (2) 명령은 쉘 파이프입니다.

해결책?

저장소 사용자가 원격으로 수행할 수 있는 작업을 여전히 제한하고 싶다면 다음 두 가지 방법이 있다고 생각합니다.

  • repo 사용자의 쉘을 다음으로 설정하십시오. rbash 대신, $PATH실행해야 하는 명령만 포함된 사용자 정의 설정을 제공하십시오. (반드시 설정하십시오 $PATH(파일을 다음 위치에서 시작하십시오.)할 수 없다저장소 사용자로부터 쓰기. ) 그래도 액세스 자격 증명이 있는 사람은 누구나 시스템의 모든 파일을 읽을 수 있는 가능성이 남아 있습니다.

  • 저장소 파일과 APT에 필요한 모든 명령만으로 chroot 감옥을 생성하고 저장소 사용자의 쉘을 실행되는 스크립트 또는 프로그램으로 설정합니다 chroot /jail "$@".

기록 apt-get update작업

원격으로 수행된 작업을 기록하는 데 사용하는 스크립트는 다음과 같습니다.

#!/bin/sh

echo "$(date -I): executing 'sh $@'; input and output follows" >> /tmp/sh.log
tee -a /tmp/sh.log | /bin/sh "$@" | tee -a /tmp/sh.log

답변2

이것을 피할 수 있는 방법은 없습니다.

기본 ssh 방법을 사용하려면 apt원격 서버에 로그인하고, 쉘 액세스 권한을 얻기 위해 호출하고 , 일부 작업을 수행하기 위해 /bin/sh일부 GNU 유틸리티(예: )를 사용해야 합니다 .finddd

이것적절한 소스 코드이것을 확인했습니다:

 157       Args[i++] = "/bin/sh";
 158       Args[i] = 0;
 159       execvp(Args[0],(char **)Args);
 160       exit(100);

(놀랍게도 더 이상 사용되지 않는 것으로 표시된 with 옵션을 apt여전히 사용하고 있습니다 )find-follow

관련 정보