답변:
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를 사용하여 사용자를 집에 보관할 수도 있지만 다른 이야기입니다.)
나는 이것에 늦었지만 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
이 명령의 기능 :
-v
command 및 authorized_keys 파일에서 모두 제거 가능 )-r
재귀 적 사본을 만들지 않으려면 command 및 authorized_keys 파일에서 모두 제거 할 수 있습니다 )-P 2222
명령에서 제거 가능 ).-i .ssh/id_rsa_key_file
path/to/data
에 복사됩니다/path/to/directory/with/accessible/content/
서버에서 클라이언트로 파일 (또는 여러 개)을 복사하려면 여기에 설명 된대로 이를 처리하는 쉘 스크립트를 작성해야 합니다.
chmod 400 ~/.ssh/authorized_keys
.
~/.bashrc
(및 Bash가 실행하는 모든 것을) ~/.ssh/rc
읽기 전용으로 만들어야 합니다. 그러나 악의적 인 사용자가 rsync 또는 sftp에 액세스 할 수있는 경우 여전히을 제거 ~/.bashrc
하고 새 파일을 업로드 할 수 있습니다 . 보호하기가 어렵 기 때문에이 방법 ( command="..."
)을 사용하지 않는 것이 좋습니다 .
나는 파티에 조금 늦었지만 ForceCommand
OpenSSH 의 지시를 살펴볼 것을 제안합니다 .
Subsystem sftp internal-sftp
Match group sftponly
ForceCommand internal-sftp
물론 이것은 SCP가 아닌 SFTP이지만 제한된 포탄보다 더 안전하게 같은 목표에 도달합니다. 또한 원하는 경우 사용자를 chroot 할 수 있습니다.
chrootDirectory %h
및 AllowTcpForwarding no
일치 섹션 다음에 추가하십시오 . 일치는 ssh 설정의 마지막 섹션이어야하며 그 이후의 옵션은 일치하는 사용자를위한 옵션입니다
ForceCommand internal-sftp -u 0077 -d /uploaddir
업로드 디렉토리에 umask를 강제 적용하여 더 강화할 수 있습니다. 'ChrootDirectory'와 함께 매우 통제 된 격리 된 업로드 환경을 만듭니다. 보너스 참고 사항 : 기본 디렉토리와 umask 가 작동 ForceCommand
하려면 Subsystem
지시문이 아닌에 설정 해야합니다 .
scponly를 사용하는 것이 좋습니다.
이 파일은 사용자가 SCP 파일을 서버에 보내는 것처럼 들리지만 실제로는 로그인 할 수없는 제한된 쉘입니다. 소프트웨어에 대한 정보 및 소스 코드 다운로드는 여기 에서 제공되며 사전 컴파일 된 RPM 패키지는 EPEL YUM 리포지토리 .
설치가 완료되면 새로 설치 한 제한된 셸을 사용하도록 액세스를 제한하려는 각 사용자 계정을 구성해야합니다. / etc / passwd를 통해 수동으로 수행하거나 다음 명령을 사용할 수 있습니다. usermod -s /usr/bin/scponly USERNAME
scponly
이 목적을 위해 설계되었습니다.
MySecureShell을 사용하여이 작업을 수행합니다. 다른 제한 사항도 구성 할 수 있습니다.
https://github.com/mysecureshell/mysecureshell
SFTP / SCP 로의 연결 만 제한합니다. 쉘 액세스가 없습니다.
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 파일을 보호해야 할 것 같지만 내 목적은 완전히 새로운 사용자를 만들지 않고 백업에 사용할 수있는 암호가없는 키를 가지고 있었고 키가 쉘을주지 않도록하는 것이 었습니다 (쉽게)
~/.ssh/authorized_keys
, ~/.bashrc
(및 Bash가 실행하는 모든 것) ~/.ssh/rc
을 만들고 사용자에게 읽기 전용 이어야합니다 . 그러나 악의적 인 사용자가 rsync 또는 sftp에 액세스 할 수있는 경우 여전히을 제거 ~/.bashrc
하고 새 파일을 업로드 할 수 있습니다 . 보호하기가 어렵 기 때문에이 방법 ( command="..."
)을 사용하지 않는 것이 좋습니다 .
사용자의 로그인 쉘을 제한적인 것으로 변경하면 사용자는 scp , sftp-server 및 rsync 만 실행할 수 있으며 안전하지 않은 인수 (예 : 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
포함 임의의 명령을 실행할 수 있습니다 따라서합니다.
가장 우아한 솔루션은 아니지만 사용자에게 이와 같은 것을 던질 수 있습니다.
if [ "$TERM" != "dumb" ]; then
exit
fi
SCP 사용자는 '벙어리'라는 TERM을 얻었고 다른 사람들은 일반적으로 vt100을 얻습니다.
사용자가 아마도 새로운 .bashrc를 scp 할 수 있다고 생각합니다. 이것이 최고의 솔루션은 아니지만 빠르고 더러운 솔루션의 경우 효과가 있습니다.
~/.bashrc
). 또한 최신 버전의 OpenSSH가 TERM
변수를 다르게 설정하거나 일부 sshd 구성 설정이 영향을 줄 수 있다는 점에서 결함이 있습니다 TERM
.
ssh -o SetEnv TERM=dumb yourserver bash
??