내 Ubuntu 서버에는 두 명의 사용자와 공유 폴더가 있습니다.
writer
쓰기 권한이 있는 사용자 입니다/var/shared
. SSH 키를 사용하여 원격으로 이 폴더의 파일을 주기적으로 변경하는 애플리케이션입니다.사용자는
reader
내 허가 없이 얻을 수 있는 SSH 키를 사용하여 여러 클라이언트에서 사용되므로 이 셸에서 사용할 수 있는 명령을 제한해야 합니다.
질문:
sftp 및 rsync 프로토콜만 사용할 수 있도록 사용자가 액세스할 수 있는 명령을 제한해야 합니다 ( , , , ... reader
와 같은 표준 명령은 없습니다 ). 디렉터리만 읽을 수 있어야 하며 루트 경로여야 합니다. 예를 들어 디렉터리를 입력할 필요가 없으며 이미 sftp 또는 rsync에 있습니다 .mkdir
ls
top
/var/shared
cd
/
usermod -s
이 동작을 수행하는 사용자 에게 적용할 수 있도록 쉘 스크립트를 어떻게 작성합니까 ?reader
샘플을 찾을 수 없습니다. 경로가 동일하도록 writer
"감옥" 상태로 유지하려면 어떻게 해야 합니까 ?/var/share
노트:
나는 시도
sshd_config
하고Match
지시했습니다ForceCommand internal-sftp
.ChrootDirectory
이를 위해서는ChrootDirectory
루트가 소유해야 하며 쓰기가 불가능하고(755 이하) 지원되지 않습니다rsync
.이것을 시도했지만
rssh
로그인한 사용자의 홈 디렉토리 이외의 디렉토리에서는 작동하지 않습니다. 따라서 다른 권한을 가진 사용자를 동일한 디렉터리로 루트할 수 없습니다.command=".." ssh-rsa....
파일에서 사용을 시도했지만authorized_keys
필요한 동작을 활성화하는 방법을 모르겠습니다. 방금rrsync
스크립트에 대한 rsync 문서를 확인했습니다. 이 방법에는chroot
필요한 기능이 없습니다 .
적어도 그러한 껍질의 샘플을 나에게 줄 수 있습니까? 스크립트를 통해 이를 달성할 수 있습니까?
Bash 및 C++(필요한 경우)를 환영합니다. 출력 ldd /bin/bash
:
linux-vdso.so.1 => (0x00007fff7e9d1000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f79dfd8b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f79dfb87000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79df7bd000)
/lib64/ld-linux-x86-64.so.2 (0x000055bd0767c000)
답변1
먼저 루트가 소유해야 ChrootDirectory
하며 다른 사용자가 쓸 수 없습니다. 따라서 /var/shared
귀하의 경우에는 가치가 없습니다 ChrootDirectory
.
루트로만 쓸 수 있고 /var/shared
Linux 바인드 마운트나 일종의 심볼릭 링크 해결 방법을 통해 액세스할 수 있는 디렉토리를 생성하는 것이 좋습니다.
sftp
또는 을 제한해야 하는 경우 rsync
ssh 공개 키를 통해 시행되는 "래퍼"의 도움으로 서버의 환경 변수를 확인해야 합니다. 이 공개 키는 SSH_ORIGINAL_COMMAND
사용자가 인증된 후 채워지고 클라이언트가 수행하는 작업이 포함되어 있습니다. 연결 정보는 다음과 같습니다. 확립된. 내부적으로 있을 것이기 때문에 세션에 대해서만 IIRC가 될 것이기 때문에 변수는 비어 있을 것입니다. 서버에서 인증된 사용자로 실행하세요!ForceCommand
command
sftp
sftp-server
rsync
rsync
ssh
ssh date
date
SSH_ORIGINAL_COMMAND
이는 래퍼의 시작일 수 있습니다.
#!/usr/bin/env bash
set -eu
set -o pipefail
[[ -z "${SSH_ORIGINAL_COMMAND:-}" ]] && exit 1
case "${SSH_ORIGINAL_COMMAND}" in
"/usr/libexec/openssh/sftp-server")
exec /usr/libexec/openssh/sftp-server
;;
"rsync --server"*)
exec ${SSH_ORIGINAL_COMMAND}
;;
*)
exit 1
;;
esac
보시다시피 ssh -v
서버가 실행할 명령에 대한 정보를 제공합니다. 따라서 /tmp
래퍼의 다른 항목도 변경할 수 있습니다.
$ rsync -a -e "ssh -v" bin localhost:/tmp/ 2>&1 | grep '^debug.*Sending command:'
debug1: Sending command: rsync --server -logDtpre.iLsfxC . /tmp/