SSH를 사용하여 SCP를 허용하지만 실제 로그인은 허용하지 않습니다


62

scp를 사용하여 파일을 검색 할 수는 있지만 실제로 SSH를 사용하여 서버에 로그인 할 수 없도록 Linux 상자 (이 경우 Centos 5.2)에서 사용자를 구성 할 수있는 방법이 있습니까?


로그인 쉘을 / bin / false로 설정하려고 시도했지만 scp가 완전히 작동하지 않습니다.
DrStalker 2009

답변:


44

rssh 쉘 ( http://pizzashack.org/rssh/ )은 정확하게이 목적을 위해 설계되었습니다.

RHEL / CentOS 5.2에는 rssh 용 패키지가 포함되어 있지 않으므로 RPM을 얻으려면 여기를 참조하십시오 . http://dag.wieers.com/rpm/packages/rssh/

이것을 사용하려면 다음과 같이 새 사용자를 위해 쉘로 설정하십시오.

useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1

.. 또는 기존 쉘의 쉘을 다음과 같이 변경하십시오.

chsh -s /usr/bin/rssh scpuser1

.. 및 편집 /etc/rssh.conf하여 rssh 쉘, 특히 주석 해제 allowscp라인 을 구성 하여 모든 rssh 사용자가 SCP에 액세스 할 수 있도록합니다.

(chroot를 사용하여 사용자를 집에 보관할 수도 있지만 다른 이야기입니다.)


정말 대단합니다. 한동안 이와 같은 것을 찾고있었습니다.
warren

6
rssh의 기본 개념은 훌륭하지만 iirc rssh는 프로그래밍 용어에서 보안의 기적이 아니 었습니다. 에 대한 간단한 구글 I 편안와 함께 나보다 ... 더 많은 결과를 얻을 수 'rssh 악용'이
wzzrd

7
scponly는 다소
비슷

scponly가 github으로 이동 한 것으로 보입니다. 승화 링크가 죽었습니다. github.com/scponly/scponly/wiki
spazm

38

나는 이것에 늦었지만 ssh 키를 사용하고 ~ / .ssh / authorized_keys 파일에 허용되는 정확한 명령을 지정할 수 있습니다.

포트 포워딩, no-pty, command = "scp 소스 대상"ssh-dss ...

올바른 명령 설정을 설정하려면 대상에서 ps를 사용해야 할 수도 있습니다.

추신 : "-v"로 test scp 명령을 실행하면 다음과 같은 것을 볼 수 있습니다

debug1: Sending command: scp -v -t myfile.txt

"-t"는 맨 끝의 프로그램에서 사용되는 문서화되지 않은 scp 옵션입니다. 이는 authorized_keys에 무엇을 넣어야하는지에 대한 아이디어를 제공합니다.

편집 : 이 StackOverflow 질문 에서 더 많은 정보 (여러 링크 포함)를 찾을 수 있습니다 .

backup_user서버 측에 이름이 지정된 사용자를위한 실제 작업 예는 다음과 같습니다 .

~backup_user/.ssh/authorized_keys 서버 측의 내용 (보안 제한이 더 있음) :

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...

~ backup_user /에 컨텐츠에 액세스 할 수있는 디렉토리로 링크하는 링크를 작성하십시오.

$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT

이제 클라이언트 측에서 다음 명령이 작동해야합니다.

scp -v  -r  -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT

이 명령의 기능 :

  • 자세한 정보를 표시합니다 ( 옵션 : -vcommand 및 authorized_keys 파일에서 모두 제거 가능 )
  • 경로 / 대상 / 데이터의 내용을 재귀 적으로 복사합니다. ( 옵션 : -r재귀 적 사본을 만들지 않으려면 command 및 authorized_keys 파일에서 모두 제거 할 수 있습니다 )
  • 포트 2222를 사용하여 서버에 연결합니다 ( 옵션 : -P 2222명령에서 제거 가능 ).
  • 연결을 자동화하기 위해 ID 파일을 사용하고 ( 선택적 : 제거 가능-i .ssh/id_rsa_key_file
  • 의 내용 path/to/data에 복사됩니다/path/to/directory/with/accessible/content/

서버에서 클라이언트로 파일 (또는 여러 개)을 복사하려면 여기에 설명 된대로 이를 처리하는 쉘 스크립트를 작성해야 합니다.


1
authorized_keys 파일을 살펴 보는 사용자를 막을 수있는 것은 무엇입니까? 사용자 자신이 소유하지 않도록 제한 할 수 있습니까?
Dan

1
@Dan-authorized_keys 파일에 대한 읽기 전용 권한을 설정할 수 있어야합니다. chmod 400 ~/.ssh/authorized_keys.
Roger Dueck

또한 ~/.bashrc(및 Bash가 실행하는 모든 것을) ~/.ssh/rc읽기 전용으로 만들어야 합니다. 그러나 악의적 인 사용자가 rsync 또는 sftp에 액세스 할 수있는 경우 여전히을 제거 ~/.bashrc하고 새 파일을 업로드 할 수 있습니다 . 보호하기가 어렵 기 때문에이 방법 ( command="...")을 사용하지 않는 것이 좋습니다 .
pts

31

나는 파티에 조금 늦었지만 ForceCommandOpenSSH 의 지시를 살펴볼 것을 제안합니다 .

Subsystem sftp internal-sftp

Match group sftponly
         ForceCommand internal-sftp

물론 이것은 SCP가 아닌 SFTP이지만 제한된 포탄보다 더 안전하게 같은 목표에 도달합니다. 또한 원하는 경우 사용자를 chroot 할 수 있습니다.


2
sftponly 사용자가 강제로 자신의 집에 chroot하도록 chrootDirectory %hAllowTcpForwarding no일치 섹션 다음에 추가하십시오 . 일치는 ssh 설정의 마지막 섹션이어야하며 그 이후의 옵션은 일치하는 사용자를위한 옵션입니다
higuita

4
ForceCommand internal-sftp -u 0077 -d /uploaddir업로드 디렉토리에 umask를 강제 적용하여 더 강화할 수 있습니다. 'ChrootDirectory'와 함께 매우 통제 된 격리 된 업로드 환경을 만듭니다. 보너스 참고 사항 : 기본 디렉토리와 umask 작동 ForceCommand하려면 Subsystem지시문이 아닌에 설정 해야합니다 .
Marcin

이 문제를 설명하는 긴 문서에서 avaiable이다입니다 debian-administration.org/article/590/...
koppor

7

scponly를 사용하는 것이 좋습니다.

이 파일은 사용자가 SCP 파일을 서버에 보내는 것처럼 들리지만 실제로는 로그인 할 수없는 제한된 쉘입니다. 소프트웨어에 대한 정보 및 소스 코드 다운로드는 여기 에서 제공되며 사전 컴파일 된 RPM 패키지는 EPEL YUM 리포지토리 .

설치가 완료되면 새로 설치 한 제한된 셸을 사용하도록 액세스를 제한하려는 각 사용자 계정을 구성해야합니다. / etc / passwd를 통해 수동으로 수행하거나 다음 명령을 사용할 수 있습니다. usermod -s /usr/bin/scponly USERNAME


나는 이것을 두 번째로한다. scponly이 목적을 위해 설계되었습니다.
UtahJarhead

1
자발적으로 죽은 것 같습니다. debian이 제거 한 것 같습니다 : packages.debian.org/search?keywords=scponly 그리고 github코드 도 죽었습니다. 후속 토론 : serverfault.com/questions/726519/…
koppor


3

파티에 늦었지만 git 사용자의 쉘을 / usr / bin / git-shell로 설정하십시오. 대화식 로그인을 허용하지 않는 제한된 쉘입니다. 'su -s / bin / bash git'또는 git 사용자 이름이 무엇이든 사용자에게 여전히 su 수 있습니다.


2

파일을 scp 만 할 수는 있지만 로그인 할 수없는 사용자를 위해 보안 ftp 서버에서 scponly 라는 의사 쉘을 사용합니다 .


2

authorized_keys 파일의 command = "..."기능을 사용하는 것이 좋은 방법입니다. ( 이 페이지 에서 나에게 제안 )

실행할 명령은 scp (및 rsync)로 시작하는 인수를 테스트하는 명령입니다.

certified_keys 파일은 다음과 같습니다.

# authorized_keys
command="/usr/local/bin/remote-cmd.sh" ssh-rsa.....== user@pewpew

remote-cmd.sh의 내용은 다음과 같습니다.

#!/bin/bash
# /usr/local/bin/remote-cmd.sh
case $SSH_ORIGINAL_COMMAND in
 'scp'*)
    $SSH_ORIGINAL_COMMAND
    ;;
 'rsync'*)
    $SSH_ORIGINAL_COMMAND
    ;;
 *)
    echo "Access Denied"
    ;;
esac

아마 여전히 사용자의 authorized_keys 파일을 보호해야 할 것 같지만 내 목적은 완전히 새로운 사용자를 만들지 않고 백업에 사용할 수있는 암호가없는 키를 가지고 있었고 키가 쉘을주지 않도록하는 것이 었습니다 (쉽게)


3
이것은 꽤 멋지지만 scp를 수행하는 명령을 실행하여 그 후 스크립트를 실행하여 전복시킬 수 있다고 생각합니다!
davidgo

exec와 함께 $ SSH_ORIGINAL_COMMAND를 앞에 붙인 @davidgo는 scp와 rsync가 여러 프로그램을 실행하려고하지 않는다고 가정 할 때 (예를 들어,이 경우 중단 될 것이라고 가정)이 취약점을 해결할 수 있습니다.
Phil

또한 ~/.ssh/authorized_keys, ~/.bashrc(및 Bash가 실행하는 모든 것) ~/.ssh/rc을 만들고 사용자에게 읽기 전용 이어야합니다 . 그러나 악의적 인 사용자가 rsync 또는 sftp에 액세스 할 수있는 경우 여전히을 제거 ~/.bashrc하고 새 파일을 업로드 할 수 있습니다 . 보호하기가 어렵 기 때문에이 방법 ( command="...")을 사용하지 않는 것이 좋습니다 .
pts

1
@pts는 rc 파일과 그 파일을 포함하는 dirs를 모두 사용자가 아닌 다른 사람이 소유하고 (아무도 아닌가) 사용자가 쓸 수 없도록 만들 수 있습니다. 그러나이 시점에서 rssh와 같은 전용을 사용하는 것이 좋습니다. 와우, 나는 이것이 나의 대답이라는 것을 깨달았다! 오래 되었군요! 하하!
Phil

잊지 마세요 ... SCP -S를 하고 -e를 rsync는 ... 사용자가 임의의 명령을 실행할 수 있습니다. 따라서 실행하기 전에 $ SSH_ORIGINAL_COMMAND 의 인수를 확인해야 합니다. 여기에 더 많은 정보 : exploit-db.com/exploits/24795

1

사용자의 로그인 쉘을 제한적인 것으로 변경하면 사용자는 scp , sftp-serverrsync 만 실행할 수 있으며 안전하지 않은 인수 (예 : scp -S ...rsync -e) 만 실행할 수 있습니다 . . 안전하지 여기를 참조 : http://exploit-db.com/exploits/24795을 ). 이러한 제한적 로그인 쉘의 예 :

이 중 하나를 chroot 또는 다른 제한된 환경 (예 : Linux의 경우 nsjail )에서 실행하여 네트워크 액세스를 비활성화하고 읽고 쓸 수있는 디렉토리를보다 쉽게 ​​(허용 된) 제어 할 수 있습니다.

내가 사용하지 않는 것이 좋습니다 command="..."~/.ssh/authorized_keys있기 때문에 (예 :주의 추가 보호하지 않고, chmod -R u-w ~악의적 인 사용자가 새 버전을 업로드 할 수있는 사용자의 경우) ~/.ssh/authorized_keys, ~/.ssh/rc또는 ~/.bashrc포함 임의의 명령을 실행할 수 있습니다 따라서합니다.


0

가장 우아한 솔루션은 아니지만 사용자에게 이와 같은 것을 던질 수 있습니다.

if [ "$TERM"  != "dumb" ]; then
  exit
fi

SCP 사용자는 '벙어리'라는 TERM을 얻었고 다른 사람들은 일반적으로 vt100을 얻습니다.

사용자가 아마도 새로운 .bashrc를 scp 할 수 있다고 생각합니다. 이것이 최고의 솔루션은 아니지만 빠르고 더러운 솔루션의 경우 효과가 있습니다.


1
이 제안 된 솔루션에 대해 강력히 권장합니다. 악의적 인 사용자가 우회하기가 너무 쉽습니다 (예 : 다른 업로드 ~/.bashrc). 또한 최신 버전의 OpenSSH가 TERM변수를 다르게 설정하거나 일부 sshd 구성 설정이 영향을 줄 수 있다는 점에서 결함이 있습니다 TERM.
pts

1
어 ... ssh -o SetEnv TERM=dumb yourserver bash??
ulidtko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.